Skip to content

Conversation

@shahor02
Copy link
Collaborator

No description provided.

@github-actions
Copy link
Contributor

REQUEST FOR PRODUCTION RELEASES:
To request your PR to be included in production software, please add the corresponding labels called "async-" to your PR. Add the labels directly (if you have the permissions) or add a comment of the form (note that labels are separated by a ",")

+async-label <label1>, <label2>, !<label3> ...

This will add <label1> and <label2> and removes <label3>.

The following labels are available
async-2023-pbpb-apass4
async-2023-pp-apass4
async-2024-pp-apass1
async-2022-pp-apass7
async-2024-pp-cpass0
async-2024-PbPb-apass1
async-2024-ppRef-apass1
async-2024-PbPb-apass2
async-2023-PbPb-apass5

@shahor02
Copy link
Collaborator Author

@miranov25 this is still incomplete PR to add extra residuals (at the moment for extrapolated ITS tracks only).
Before I debug and clean it up, please confirm that it is ok:

  1. to be compatible with current code using unbinned residuals, for every track I am 1st storing TPC residuals as it is now, then TRD (with res.row = TRD_layer + 160), then TOF with res.row = 170, then ITS residuals from the outermost to the innermost layer with res.row = 180.
  2. the trackInfo.idxFirstResidual will point on 1st TPC cluster entry (as now) and trackInfo.nResiduals will provide the number of TPC residuals only (as now). Additional trackInfo.nExtResiduals will provide the number TRD, TOF and ITS residuals stored after the TPC ones, so all residuals of the track can be accessed as:
    res[trackInfo.idxFirstResidual] ... res[trackInfo.idxFirstResidual + trackInfo.nExtResiduals-1];
  3. Extra vector xalp will provide sector X and alpha (for ITS clusters) where the external det. residuals were evaluated.

@miranov25
Copy link
Contributor

Hello @shahor02,
thank you for the pull request and the detailed explanation.

For points 1 and 2: clear to me — this looks fine and should remain backward-compatible (though having a getter here would also be useful).

For point 3, it’s still not fully clear how this is implemented. In the code diff I couldn’t find it — are these two separate vectors for X and alpha?

My assumption was that we could reuse row and sector to encode the ITS layer and chip ID, and then provide simple getters for X and the rotation alpha. What would you prefer here? Perhaps you had a reason to store X and alpha explicitly instead of relying on static getters from the ITS geometry?

@shahor02
Copy link
Collaborator Author

@miranov25 I haven't yet added then x, alpha.
I can instead use row and sec to encode the chip id (will require concatenation of these bytes) but then, to use it, one will need to go via initialization of the CCDB +!some helper classes. The same will be true for TRD and TOF points: the explicitn info on the layer and sector will need to be sacrificed for the module and strip id resp.
Let me know what do you prefer.

@miranov25
Copy link
Contributor

Hello @shahor02,

For the Alpha and X getters, I suggest using an interface that will also allow their usage in TTree::Draw queries.

  • UnbinnedResid::getAlpha() looks fine.
  • For X, I don’t see a generic getter in the public interface — only UnbinnedResid::getTOFX().

Would it make sense to add a general getX() accessor for consistency and standard approach for residuals?

@shahor02
Copy link
Collaborator Author

@miranov25 it is not over yet.

@shahor02 shahor02 force-pushed the pr_tpcExtRes branch 2 times, most recently from 478affe to aef833b Compare August 19, 2025 15:59
@shahor02
Copy link
Collaborator Author

@miranov25 I've tested code, seems to be fine, you can find a small tree extracted from the MC:
https://cernbox.cern.ch/s/xHPdTBxJfXVvExt (or https://cernbox.cern.ch/files/spaces/eos/user/s/shahoian/tmp1/o2tpc_residuals_LHC25b8a_v6_559827.root)

The for the interface see the commir description, example is:

o2::tpc::UnbinnedResid::init(-1);  // optional 
unbinnedResid->Draw("res.dy*20/0x7fff :  getX() : getDetID()","trackInfo.sourceId==15","colz");
image

@shahor02 shahor02 marked this pull request as ready for review August 19, 2025 16:05
@miranov25
Copy link
Contributor

Hello @shahor02,

Sorry for the late reply. The residuals in your figure look qualitatively as I expected.

Regarding the test with the data: unfortunately I am not able to access the file — I get a permission denied both via CERNBox and via scp.

(venv11) Apptainer> scp mivanov@lxplus.cern.ch:/eos/user/s/shahoian/tmp1/o2tpc_residuals_LHC25b8a_v6_559827.root .
(mivanov@lxplus.cern.ch) Password:
scp: /eos/user/s/shahoian/tmp1/o2tpc_residuals_LHC25b8a_v6_559827.root: Operation not permitted

The file definitely exists on EOS (I can list it from lxplus):

[mivanov@lxplus981 ~]$ ls /eos/user/s/shahoian/tmp1/o2tpc_residuals_LHC25b8a_v6_559827.root
/eos/user/s/shahoian/tmp1/o2tpc_residuals_LHC25b8a_v6_559827.root

But when I try to copy it to GSI, I get:

[mivanov@lxplus981 ~]$ scp /eos/user/s/shahoian/tmp1/o2tpc_residuals_LHC25b8a_v6_559827.root miranov@lxlogin.gsi.de:~/o2tpc_residuals_LHC25b8a_v6_559827.root
miranov@lxlogin.gsi.de's password:
Couldn't open local file "/eos/user/s/shahoian/tmp1/o2tpc_residuals_LHC25b8a_v6_559827.root" for reading: Operation not permitted
failed to upload file /eos/user/s/shahoian/tmp1/o2tpc_residuals_LHC25b8a_v6_559827.root to o2tpc_residuals_LHC25b8a_v6_559827.root

Not sure what the issue is — maybe the file permissions on EOS?

@miranov25
Copy link
Contributor

Hello @shahor02,

If the format is backward compatible, could we switch to the new unbinned residuals? I am asking in the context of the ongoing MC closure test production.

I will be on holiday starting tomorrow (for one week), but I would like to get access to the data when I return. Once the permissions are fixed, I will check the unbinned residuals.

Marian

@shahor02
Copy link
Collaborator Author

@miranov25 For me both ways of fetching from the cernbox work. I've copied the file to /alice/cern.ch/user/s/shahoian/forMI/o2tpc_residuals_LHC25b8a_v6_559827.root, try this way.

The format is backward compatible. Will merge this PR once you check the residuals.

@miranov25
Copy link
Contributor

miranov25 commented Aug 22, 2025

Hello @shahor02,

From AliEn I can access the data now, and I am checking them. Here are my first observations (I can not use getters for a moment, this I can not comment):

Looking at the TOF residuals, I suggest adding TOF Δt and TOF nsigma to the trackData tree. This would have two advantages:

  1. It provides the $p_T$-scaling constraint.
  2. It can be used for outlier tagging.

If I understand correctly, the data you provided are from the MC closure test. As I mentioned earlier, I was surprised to see the TOF shifted by ~1.2 cm. Is there really no residual misalignment in the MC data? At the beginnig I suspected energy loss correction, but this is not consitent with TRD

Interestingly, the TRD shows a bias in the opposite direction.
This suggests that we may also need additional outlier-filtering information for TRD tracklets. I already have a candidate quantity: the difference between the TRD tracklet angle and the reconstructed track angle. This should suppress the background by a large factor.

Clearly, such long tails will affect the quality of the calibration using the TRD, so we should address this by providing extra information in the trackData tree:

  • Tracklet angle per layer
  • Track angle per layer

It would be better to add these before running the next test, and I assume this should be relatively straightforward to implement.

I don’t think this is the only issue in the TRD, but certainly one of the important ones. Later I will check it in the production, hopefully using the trackData criteria I described above.

TRD residulas -tail 2 cm

image

TOF residuals - bias 1.2 cm

image

@shahor02
Copy link
Collaborator Author

@miranov25 indeed, conditioning interactive drawing by the trackInfo will not work w/o flattening.
There was a bug in the indexing which I've now fixed. I put a new small tree to /alice/cern.ch/user/s/shahoian/toMI/o2tpc_residuals_1731271904120_1731272504119_0_843410.root

I don't know how to put in these trees TOF measured - expected or nsigma, this requires determination of Time0, i.e. matching to FT0 etc. I don't want to do such analysis in the residuals extraction. A crude cut on the time-of-flight (as a difference between the track time and TOF signal time) is already applied at the matching stage.

Concerning the TOF rphi bias: I assume this is an artefact of evaluating residual at TOF cluster.getX() wrt cluster.getY() instead of doing it wrt pad center as it is done in the TOF matching (where no bias is seen).
Question to @noferini : why track.propagateTo(tof_cl.getX()) then getting residual = track.getY() - tof.getY() produces biased residuals (for extrapolation of ITS track (red) and ITS-TPC outer refitted with TRD (blue))
image

while for the same data the residuals extracted from the TOFMatchInfo.mDXatTOF of the o2match_tof_itstpc.root tree are unbiased
image
?

@noferini
Copy link
Collaborator

Hi @shahor02 ,
I try to answer to

Concerning the TOF rphi bias: I assume this is an artefact of evaluating residual at TOF cluster.getX() wrt cluster.getY() >>instead of doing it wrt pad center as it is done in the TOF matching (where no bias is seen).
Question to @noferini : why track.propagateTo(tof_cl.getX()) then getting residual = track.getY() - tof.getY() produces >>biased residuals (for extrapolation of ITS track (red) and ITS-TPC outer refitted with TRD (blue))
hoping I understood the question properly.

Assuming
DeltaZ along Z
DeltaX along the strip direction (not exactly rphi, X = rphi only for eta = 0)
DeltaY along the orthogonal direction of X (same comment here, not exacly the radius direction)

In TOF matching propagation is done to miinimize DeltaY (-> 0)
In your propagation you propagate to X (I guess it is the radial direction)

As I mentioned Y in my local coordinate space and X in (your) sector coordinate space are the same only for eta=0 since TOF strips in general are tilted. This means that you are not really extrapolating to the TOF pad center (or at least this is my guess).

If you think I didn't interpret correctly the problem let me know.

Cheers,
Francesco

@shahor02
Copy link
Collaborator Author

Hi @noferini
Thanks! The code is here:

const auto& clTOF = mRecoCont->getTOFClusters()[gidTableFull[GTrackID::TOF]];
const float clTOFAlpha = o2::math_utils::sector2Angle(clTOF.getCount());
if (trkWork.getAlpha() != clTOFAlpha && !trkWork.rotate(clTOFAlpha)) {
LOG(debug) << "Failed to rotate into TOF cluster sector frame";
stopPropagation = true;
break;
}
if (!propagator->PropagateToXBxByBz(trkWork, clTOF.getX(), mParams->maxSnp, mParams->maxStep, mMatCorr)) {
LOG(debug) << "Failed final propagation to TOF radius";
break;
}
float tgPhi = trkWork.getSnp() / std::sqrt((1.f - trkWork.getSnp()) * (1.f + trkWork.getSnp()));
auto dy = clTOF.getY() - trkWork.getY();

The same is used to constrain the tracks by TOF in the interpolated residuals

const int clTOFSec = clTOF.getCount();
const float clTOFAlpha = o2::math_utils::sector2Angle(clTOFSec);
if (!trkWork.rotate(clTOFAlpha)) {
LOG(debug) << "Failed to rotate into TOF cluster sector frame";
return;
}
float clTOFX = clTOF.getX();
std::array<float, 2> clTOFYZ{clTOF.getY(), clTOF.getZ()};
std::array<float, 3> clTOFCov{mParams->sigYZ2TOF, 0.f, mParams->sigYZ2TOF}; // assume no correlation between y and z and equal cluster error sigma^2 = (3cm)^2 / 12
if (!propagator->PropagateToXBxByBz(trkWork, clTOFX, mParams->maxSnp, mParams->maxStep, mMatCorr)) {
LOG(debug) << "Failed final propagation to TOF radius";
return;
}
// TODO: check if reset of covariance matrix is needed here (or, in case TOF point is not available at outermost TRD layer)
if (!trkWork.update(clTOFYZ, clTOFCov)) {
, so if the code above is wrong, then also the TOF constraint is wrong...

So, the clusters are basically useless for track extrapolation, except providing the principal pad ID?

Thas said, I don't see better residuals also at Z=0:
image

@noferini
Copy link
Collaborator

Hi @shahor02 ,
I saw that you rotate the track in the TOF cluster sector frame.
If you do that and propagate I think you should rotate in the same frame also the TOF cluster coordinates (They are provided in the sector frame). This should change both X and Y of the TOF cluster
Cheers,
Francesco

@miranov25
Copy link
Contributor

Hello @noferini,

Could you also help @shahor02 with the TOF time determination? I remember you had implemented something similar before in the time series.

Please see Ruben’s comment here for context:
#14592 (comment)

We don’t need perfect time resolution for this purpose — just enough for fake tagging. A resolution of order 100–200 ps would be sufficient.

Regards
Marian

@shahor02
Copy link
Collaborator Author

Hi @shahor02 , I saw that you rotate the track in the TOF cluster sector frame. If you do that and propagate I think you should rotate in the same frame also the TOF cluster coordinates (They are provided in the sector frame). This should change both X and Y of the TOF cluster Cheers, Francesco

Sorry @noferini , I don't understand: why should I rotate the cluster if it is already in the sector frame (and it is indeed according to this code

int det[5];
Geo::getVolumeIndices(c.getMainContributingChannel(), det);
float pos[3];
Geo::getPos(det, pos);
Geo::rotateToSector(pos, c.getSector());
c.setXYZ(pos[2], pos[0], pos[1]); // storing coordinates in sector frame: note that the rotation above puts z in pos[1], the radial coordinate in pos[2], and the tangent coordinate in pos[0] (this is to match the TOF residual system, where we don't use the radial component), so we swap their positions.
) ?
Note that for the constraint with TOF when fitting track inwards to extract the interpolated TPC residuals, the TOF is the 1st detector updating the track, so strictly speaking, the track position at this stage is not known, hence the minimization of deltaY makes no sense (though in reality we are using tpcOut propagation to TOF).

@noferini
Copy link
Collaborator

Hi @shahor02 , you are right I misunderstood one comment. Indeed there is nothing suspicius in the code.
Just a question.
You plotted
auto dy = clTOF.getY() - trkWork.getY();

Do you have the same also for
auto dx = clTOF.getX() - trkWork.getX();
To see if it zero after the propagation (just to exclude that the step size in propagation doesn't affect final residual extraction. In TOF matching I do the last steps with 1 mm step).

@miranov25 : for time resolution I have to check how I implemented it in the timeseries (I don't remember if I did it in the matching part and then attached the info to the cluster or if I did it directly in the timeseries workflow). A question: what do you mean with tagging? Do you need a rough selection on pions (subtracting the closest BC could be enough) or you really need to subtract FT0-AC (< 100 ps resolution + collision association)?
Francesco

@miranov25
Copy link
Contributor

Hello @noferini

We would like to reject the fake association. For that we do not need a perfectly calibrated T0, but something O(100 ps) will be sufficient.

Regards
Marian

@shahor02
Copy link
Collaborator Author

Hi @noferini ,

Yes, the track is at the cluster X, with the patch

diff --git a/Detectors/TPC/calibration/SpacePoints/src/TrackInterpolation.cxx b/Detectors/TPC/calibration/SpacePoints/src/TrackInterpolation.cxx
index 3b4bd3cf02..8493d45ca6 100644
--- a/Detectors/TPC/calibration/SpacePoints/src/TrackInterpolation.cxx
+++ b/Detectors/TPC/calibration/SpacePoints/src/TrackInterpolation.cxx
@@ -942,6 +942,7 @@ void TrackInterpolation::extrapolateTrack(int iSeed)
         float tgPhi = trkWork.getSnp() / std::sqrt((1.f - trkWork.getSnp()) * (1.f + trkWork.getSnp()));
         auto dy = clTOF.getY() - trkWork.getY();
         auto dz = clTOF.getZ() - trkWork.getZ();
+       LOGP(info, "TOF PadInSector:{:4d} Sec:{:2d}, ClX,Y,Z:{:.2f},{:.2f},{:.2f} D[cl-track]: {:.2f},{:.2f},{:.2f}", clTOF.getPadInSector(), clTOF.getCount(), clTOF.getX(), clTOF.getY(), clTOF.getZ(), clTOF.getX()-trkWork.getX(), dy,dz);
         if ((std::abs(dy) < param::MaxResid) && (std::abs(dz) < param::MaxResid) && (std::abs(trkWork.getY()) < param::MaxY) && (std::abs(trkWork.getZ()) < param::MaxZ) && (std::abs(tgPhi) < param::MaxTgSlp)) {
           mClRes.emplace_back(dy, dz, tgPhi, trkWork.getY(), trkWork.getZ(), 170, clTOF.getCount(), clTOF.getPadInSector());
           trackData.clAvailTOF = 1;

I get:

...
[3450473:tpc-track-interpolation]: [23:59:33][INFO] TOF PadInSector:1580 Sec:16, ClX,Y,Z:376.60,51.63,221.59 D[cl-track]: 0.00,-0.75,3.10
[3450473:tpc-track-interpolation]: [23:59:33][INFO] TOF PadInSector: 302 Sec: 8, ClX,Y,Z:376.82,-17.43,338.73 D[cl-track]: 0.00,-10.54,-6.36
[3450473:tpc-track-interpolation]: [23:59:33][INFO] TOF PadInSector:  31 Sec:11, ClX,Y,Z:375.87,21.05,368.46 D[cl-track]: 0.00,6.52,1.19
[3450473:tpc-track-interpolation]: [23:59:33][INFO] TOF PadInSector:3681 Sec: 2, ClX,Y,Z:381.47,21.74,52.61 D[cl-track]: 0.00,4.27,0.47
[3450473:tpc-track-interpolation]: [23:59:33][INFO] TOF PadInSector:4239 Sec: 1, ClX,Y,Z:380.03,-20.62,10.58 D[cl-track]: 0.00,11.76,1.34
[3450473:tpc-track-interpolation]: [23:59:33][INFO] TOF PadInSector:3261 Sec:11, ClX,Y,Z:378.18,56.00,88.71 D[cl-track]: 0.00,11.48,2.61
[3450473:tpc-track-interpolation]: [23:59:33][INFO] TOF PadInSector:5750 Sec:12, ClX,Y,Z:373.52,39.17,-100.67 D[cl-track]: 0.00,-16.20,-1.90
[3450473:tpc-track-interpolation]: [23:59:33][INFO] TOF PadInSector:  95 Sec:17, ClX,Y,Z:379.36,55.15,363.94 D[cl-track]: 0.00,-2.43,-5.13
[3450473:tpc-track-interpolation]: [23:59:33][INFO] TOF PadInSector: 501 Sec: 7, ClX,Y,Z:375.07,-4.25,320.21 D[cl-track]: 0.00,20.67,-2.43
[3450473:tpc-track-interpolation]: [23:59:33][INFO] TOF PadInSector:2882 Sec: 3, ClX,Y,Z:375.54,-56.16,112.70 D[cl-track]: 0.00,-46.29,8.48
[3450473:tpc-track-interpolation]: [23:59:33][INFO] TOF PadInSector:3426 Sec:13, ClX,Y,Z:380.44,-13.99,72.94 D[cl-track]: 0.00,-7.33,6.80
[3450473:tpc-track-interpolation]: [23:59:33][INFO] TOF PadInSector:6556 Sec: 2, ClX,Y,Z:375.88,9.50,-166.94 D[cl-track]: 0.00,-0.37,0.43
[3450473:tpc-track-interpolation]: [23:59:33][INFO] TOF PadInSector:1946 Sec: 2, ClX,Y,Z:375.11,4.22,189.53 D[cl-track]: 0.00,2.69,5.38
[3450473:tpc-track-interpolation]: [23:59:33][INFO] TOF PadInSector: 538 Sec: 6, ClX,Y,Z:377.39,-33.46,315.87 D[cl-track]: 0.00,2.96,-4.00
[3450473:tpc-track-interpolation]: [23:59:33][INFO] TOF PadInSector:6319 Sec: 5, ClX,Y,Z:376.88,21.06,-147.90 D[cl-track]: 0.00,5.14,3.07
[3450473:tpc-track-interpolation]: [23:59:33][INFO] TOF PadInSector: 509 Sec: 5, ClX,Y,Z:374.69,16.10,319.67 D[cl-track]: 0.00,8.98,0.91
[3450473:tpc-track-interpolation]: [23:59:33][INFO] TOF PadInSector:2242 Sec: 2, ClX,Y,Z:373.30,24.20,164.97 D[cl-track]: 0.00,7.38,1.28
[3450473:tpc-track-interpolation]: [23:59:33][INFO] TOF PadInSector:2082 Sec: 0, ClX,Y,Z:378.77,-17.63,179.15 D[cl-track]: 0.00,-18.95,5.80
[3450473:tpc-track-interpolation]: [23:59:33][INFO] TOF PadInSector:2799 Sec:17, ClX,Y,Z:379.56,-24.76,120.33 D[cl-track]: 0.00,-6.10,-0.52
...

@noferini
Copy link
Collaborator

Hi @shahor02 ,
ok. Then the only thing I can suggest at the moment is to try to see what happens if you use only single-hit cluster
cl->getNumOfContributingChannels() == 1
This should reject ~15-20% of multiple-hit cluster (however I would not expect a big difference since they should have a symmetric effect in y).

To run a check on my side can you provide me the file with the cluster and the geometry file you are using so that I can inspect what is wrong in the cluster position?

Cheers,
Francesco

@noferini
Copy link
Collaborator

Hi @miranov25 ,,
for subtraction of ft0 you can refer to

ULong64_t bclongtof = (tpctofmatch.getSignal() - 10000) * BC_TIME_INPS_INV;

Note that in tpc timeries I didn't subtract bclong since I want to keep the full time information inside the tf.
For tagging you should subtract also it.

Cheers,
Francesco

@shahor02
Copy link
Collaborator Author

Hi @noferini , indeed, selecting 1-pad clusters does not change anything. For the data file, I've replied to the private email.

@miranov25
Copy link
Contributor

Hello Ruben and Francesco,

For the TPC unbinned residuals, we stored them with respect to the ideal position (simple rotation by the rotation angle).
Now I have two comments regarding the TOF and ITS+TRD+TOF residuals — something we did not explicitly specify before:

  • ITS, TRD, TOF

    • We could store the delta with respect to the aligned position, but in that case we must also record which alignment was used when creating a given unbinned residual tree.
    • The simpler solution would be to store this in the UserInfo of the tree, e.g. the CCDB entry key used.
  • TOF clusters (1 vs. 2) — as mentioned in the previous email/GitHub exchange:

    • Francesco, are these clusters always on the same reference plane (up/down), or can they be at different positions?
    • If there are only 2 planes, we could simply assign 2 TOF layers. (I don’t recall exactly how I handled this in my Run 1 TOF tracking.)
    • If there are multiple possible radii, then the natural solution is to store the actual hit position in the track table.

This clarification is important for track refits in the iterative TPC calibration, as well as for ITS/TRD/TOF alignment monitoring.

Regards
Marian

@shahor02
Copy link
Collaborator Author

@noferini following your comment I've added to tof::Geo a method to translate "aligned sector" cluster coordinates to the nominal sector frame. Also, I've added to tof::Cluster a flag (uses base cluster bit field) telling in which frame it is.
The residual extraction uses tof::Geo::alignedToNominalSector method only if the cluster is not in the nominal frame (current default). I would consider writing the TOF clusters directly in the nominal frame so that they can be used for the global tracking as they are, but this is up to you and can be done in the different PR.
With this fix I get reasonable residuals.
image

I've updated the /alice/cern.ch/user/s/shahoian/toMI/o2tpc_residuals_1731271904120_1731272504119_0_843410.root

@miranov25 , we store TPC residuals in the ideal frame simply because the TPC has no alignment.
For other detectors: the alignment does not change often and the geometry version used for the processing can be found in the logs.
Concerning the time-of-flight info: currently, we are not reading FT0 info, adding it will require modifying log production scripts. Also, the way it is implemented in the TPC time-series will make it polluted by the FT0 trigger on QED, which dominates in PbPb. Therefore, cuts should be applied to FT0 beforehand.
If you want, you can implement this later, I want to get rid of this PR asap.

@miranov25
Copy link
Contributor

@shahor02 and @noferini

I agree, let's proceed with merging this PR. We'll address the timing implementation in a follow-up PR.
As a reminder, the timing information is a critical feature for two reasons:

  • It will enable us to filter out fake matches effectively.
  • It will allow us to use the TOF β information as an additional constraint on momentum, which will help us better constrain the radial scaling.

These were the key motivations for ensuring a decent time resolution with the TOF.

…is passed

The unbinned residuals got channel data member which holds ITS chipID, TRD chamber ID
or TOF pad within the sector resp. The convention for non-TPC rows:
160-165: TRD layers
170:     TOF
180-186: ITS layers
The getters isTPC(), isTRD(), isTOF() and isITS() can be used to query the residual type
and getDetID() will return 0,1,2 and 3 for ITS, TPC, TRD and TOF points resp.
Also, getX() and getAlpha() will provide the tracking frame X and alpha of the residual.
These getters, when acting on the non-TPC residuals require initialized geometry helpers.
The initialization can be done manually via static method
o2::tpc::UnbinnedResid::init(long timeStamp = -1)
which will load from the CCDB the geometry corresponding to the requested timestamp (-1 : now).
If the initialization was not done in advance then it will be done internally at the 1st
query of getX() or getAlpha(), with the timestamp = -1.
@shahor02
Copy link
Collaborator Author

Merging after squashing some commits, the tests were passed.

@shahor02 shahor02 merged commit 38a4549 into AliceO2Group:dev Aug 24, 2025
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

3 participants