1212#include < vector>
1313#include < TStopwatch.h>
1414#include " DataFormatsGlobalTracking/RecoContainer.h"
15+ #include " DataFormatsITSMFT/TrkClusRef.h"
1516#include " DataFormatsGlobalTracking/RecoContainerCreateTracksVariadic.h"
1617#include " ReconstructionDataFormats/TrackTPCITS.h"
1718#include " ReconstructionDataFormats/GlobalTrackID.h"
3031#include " DetectorsCommonDataFormats/DetID.h"
3132#include " DetectorsBase/GRPGeomHelper.h"
3233#include " GlobalTrackingStudy/TrackingStudy.h"
34+ #include " GlobalTrackingStudy/TrackInfoExt.h"
3335#include " TPCBase/ParameterElectronics.h"
3436#include " ReconstructionDataFormats/PrimaryVertex.h"
3537#include " ReconstructionDataFormats/PrimaryVertexExt.h"
@@ -80,7 +82,7 @@ class TrackingStudySpec : public Task
8082 float mMaxVTTimeDiff = 80 .; // \mus
8183 float mTPCDCAYCut = 2 .;
8284 float mTPCDCAZCut = 2 .;
83- float mMinX = 6 .;
85+ float mMinX = 46 .;
8486 float mMaxEta = 0.8 ;
8587 float mMinPt = 0.1 ;
8688 int mMinTPCClusters = 60 ;
@@ -144,23 +146,19 @@ void TrackingStudySpec::process(o2::globaltracking::RecoContainer& recoData)
144146 static int TFCount = 0 ;
145147 int nv = vtxRefs.size ();
146148 o2::dataformats::PrimaryVertexExt pveDummy;
147- o2::dataformats::PrimaryVertex vtxDummy (mMeanVtx .getPos (), {}, {}, 0 );
148- std::vector<o2::dataformats::PrimaryVertexExt> pveVec (nv - 1 );
149+ o2::dataformats::PrimaryVertexExt vtxDummy (mMeanVtx .getPos (), {}, {}, 0 );
150+ std::vector<o2::dataformats::PrimaryVertexExt> pveVec (nv);
151+ pveVec.back () = vtxDummy;
149152 const auto & alpParams = o2::itsmft::DPLAlpideParam<o2::detectors::DetID::ITS>::Instance ();
150153 float tBiasITS = alpParams.roFrameBiasInBC * o2::constants::lhc::LHCBunchSpacingMUS;
151- std::vector<float > dtvec, dzvec;
152154 const o2::ft0::InteractionTag& ft0Params = o2::ft0::InteractionTag::Instance ();
153-
155+ std::vector<o2::dataformats::TrackInfoExt> trcExtVec;
154156 for (int iv = 0 ; iv < nv; iv++) {
155157 LOGP (debug, " processing PV {} of {}" , iv, nv);
156158 const auto & vtref = vtxRefs[iv];
157159 if (iv != nv - 1 ) {
158160 auto & pve = pveVec[iv];
159161 static_cast <o2::dataformats::PrimaryVertex&>(pve) = pvvec[iv];
160- dtvec.clear ();
161- dzvec.clear ();
162- dtvec.reserve (pve.getNContributors ());
163- dzvec.reserve (pve.getNContributors ());
164162 float bestTimeDiff = 1000 , bestTime = -999 ;
165163 int bestFTID = -1 ;
166164 if (mTracksSrc [GTrackID::FT0]) {
@@ -180,16 +178,11 @@ void TrackingStudySpec::process(o2::globaltracking::RecoContainer& recoData)
180178 if (bestFTID >= 0 ) {
181179 pve.FT0A = FITInfo[bestFTID].getTrigger ().getAmplA ();
182180 pve.FT0C = FITInfo[bestFTID].getTrigger ().getAmplC ();
183- pve.FT0Time = FITInfo[bestFTID].getInteractionRecord ().differenceInBCMUS (recoData.startIR );
181+ pve.FT0Time = double ( FITInfo[bestFTID].getInteractionRecord ().differenceInBCMUS (recoData.startIR )) + FITInfo[bestFTID]. getCollisionTimeMean () * 1e-6 ; // time in \mus
184182 }
185183 pve.VtxID = iv;
186184 }
187- float meanT = 0 , meanZ = 0 , rmsT = 0 , rmsZ = 0 ;
188- float meanTW = 0 , meanZW = 0 , rmsTW = 0 , rmsZW = 0 , WT = 0 , WZ = 0 ;
189- float meanT0 = 0 , rmsT0 = 0 ;
190- float meanTW0 = 0 , rmsTW0 = 0 , WT0 = 0 ;
191- int nContAdd = 0 , nContAdd0 = 0 , ntITS = 0 ;
192- int nAdjusted = 0 ;
185+ trcExtVec.clear ();
193186 float q2ptITS, q2ptTPC, q2ptITSTPC, q2ptITSTPCTRD;
194187 for (int is = 0 ; is < GTrackID::NSources; is++) {
195188 DetID::mask_t dm = GTrackID::getSourceDetectorsMask (is);
@@ -213,6 +206,7 @@ void TrackingStudySpec::process(o2::globaltracking::RecoContainer& recoData)
213206 }
214207 bool hasITS = GTrackID::getSourceDetectorsMask (is)[GTrackID::ITS];
215208 bool acceptGlo = true ;
209+ int nclTPC = 0 , nclITS = 0 , pattITS = 0 ;
216210 while (1 ) {
217211 // do we cound this track for global multiplicity?
218212 if (!(acceptGlo = abs (trc.getEta ()) < mMaxEta && trc.getPt () > mMinPt )) {
@@ -224,7 +218,7 @@ void TrackingStudySpec::process(o2::globaltracking::RecoContainer& recoData)
224218 GTrackID tpcTrID;
225219 if (GTrackID::getSourceDetectorsMask (is)[GTrackID::TPC] && recoData.isTrackSourceLoaded (GTrackID::TPC) && (tpcTrID = recoData.getTPCContributorGID (vid))) {
226220 auto & tpcTr = recoData.getTPCTrack (tpcTrID);
227- if (!(acceptGlo = tpcTr.getNClusters () >= mMinTPCClusters )) {
221+ if (!(acceptGlo = (nclTPC = tpcTr.getNClusters () ) >= mMinTPCClusters )) {
228222 break ;
229223 }
230224 }
@@ -236,124 +230,58 @@ void TrackingStudySpec::process(o2::globaltracking::RecoContainer& recoData)
236230 }
237231 break ;
238232 }
239-
240233 if (!hasITS) {
241234 continue ;
242235 }
243- float ttime = 0 , ttimeE = 0 ;
244- recoData.getTrackTime (vid, ttime, ttimeE);
245- bool acceptForPV0 = pvCont;
246- if (vid.getSource () == GTrackID::ITS) {
247- ttimeE *= mITSROFrameLengthMUS ;
248- ttime += ttimeE + tBiasITS;
249- ttimeE *= 1 . / sqrt (3 );
250- if (++ntITS > 0 ) { // do not allow ITS in the MAD
251- acceptForPV0 = false ;
252- }
253- } else if (vid.getSource () == GTrackID::ITSTPC) {
254- float bcf = ttime / o2::constants::lhc::LHCBunchSpacingMUS + o2::constants::lhc::LHCMaxBunches;
255- int bcWrtROF = int (bcf - alpParams.roFrameBiasInBC ) % alpParams.roFrameLengthInBC ;
256- if (bcWrtROF == 0 ) {
257- float dbc = bcf - (int (bcf / alpParams.roFrameBiasInBC )) * alpParams.roFrameBiasInBC ;
258- if (std::abs (dbc) < 1e-6 && (++nAdjusted) > 1 ) {
259- acceptForPV0 = false ; // do not allow more than 1 adjusted track MAD
260- }
261- }
262- } else if (vid.getSource () == GTrackID::TPC) {
263- ttimeE *= o2::constants::lhc::LHCBunchSpacingMUS * 8 ;
264- }
265- if (pvCont) {
266- float dt = ttime - pveVec[iv].getTimeStamp ().getTimeStamp ();
267- float tW = 1 . / (ttimeE * ttimeE), zW = 1 . / trc.getSigmaZ2 ();
268- dzvec.push_back (dca.getZ ());
269- WT += tW;
270- WZ += zW;
271- meanT += dt;
272- meanTW += dt * tW;
273- meanZ += dca.getZ ();
274- meanZW += dca.getZ () * zW;
275-
276- rmsT += dt * dt;
277- rmsTW += dt * dt * tW;
278- rmsZ += dca.getZ () * dca.getZ ();
279- rmsZW += dca.getZ () * dca.getZ () * zW;
280- nContAdd++;
281- if (acceptForPV0) {
282- dtvec.push_back (dt);
283- WT0 += tW;
284- meanT0 += dt;
285- meanTW0 += dt * tW;
286- rmsT0 += dt * dt;
287- rmsTW0 += dt * dt * tW;
288- nContAdd0++;
289- }
290- LOGP (debug, " dt={} dz={}, tW={}, zW={} t={} tE={} {}" , dt, dca.getZ (), tW, zW, ttime, ttimeE, vid.asString ());
291- }
292236 if (acceptGlo) {
293- q2ptITS = q2ptTPC = q2ptITSTPC = q2ptITSTPCTRD = 0 .;
237+ auto & trcExt = trcExtVec.emplace_back ();
238+ recoData.getTrackTime (vid, trcExt.ttime , trcExt.ttimeE );
239+ trcExt.track = trc;
240+ trcExt.dca = dca;
241+ trcExt.gid = vid;
242+ trcExt.xmin = xmin;
294243 auto gidRefs = recoData.getSingleDetectorRefs (vid);
295244 if (gidRefs[GTrackID::ITS].isIndexSet ()) {
296- q2ptITS = recoData.getTrackParam (gidRefs[GTrackID::ITS]).getQ2Pt ();
245+ const auto & itsTr = recoData.getITSTrack (gidRefs[GTrackID::ITS]);
246+ trcExt.q2ptITS = itsTr.getQ2Pt ();
247+ trcExt.nClITS = itsTr.getNClusters ();
248+ for (int il = 0 ; il < 7 ; il++) {
249+ if (itsTr.hasHitOnLayer (il)) {
250+ trcExt.pattITS |= 0x1 << il;
251+ }
252+ }
253+ } else if (gidRefs[GTrackID::ITSAB].isIndexSet ()) {
254+ const auto & itsTrf = recoData.getITSABRefs ()[gidRefs[GTrackID::ITSAB]];
255+ trcExt.nClITS = itsTrf.getNClusters ();
256+ for (int il = 0 ; il < 7 ; il++) {
257+ if (itsTrf.hasHitOnLayer (il)) {
258+ trcExt.pattITS |= 0x1 << il;
259+ }
260+ }
297261 }
298262 if (gidRefs[GTrackID::TPC].isIndexSet ()) {
299- q2ptTPC = recoData.getTrackParam (gidRefs[GTrackID::TPC]).getQ2Pt ();
263+ trcExt.q2ptTPC = recoData.getTrackParam (gidRefs[GTrackID::TPC]).getQ2Pt ();
264+ trcExt.nClTPC = nclTPC;
300265 }
301266 if (gidRefs[GTrackID::ITSTPC].isIndexSet ()) {
302- q2ptITSTPC = recoData.getTrackParam (gidRefs[GTrackID::ITSTPC]).getQ2Pt ();
267+ const auto & trTPCITS = recoData.getTPCITSTrack (gidRefs[GTrackID::ITSTPC]);
268+ trcExt.q2ptITSTPC = trTPCITS.getQ2Pt ();
269+ trcExt.chi2ITSTPC = trTPCITS.getChi2Match ();
303270 }
304271 if (gidRefs[GTrackID::TRD].isIndexSet ()) {
305- q2ptITSTPCTRD = recoData.getTrackParam (gidRefs[GTrackID::TRD]).getQ2Pt ();
272+ trcExt.q2ptITSTPCTRD = recoData.getTrackParam (gidRefs[GTrackID::TRD]).getQ2Pt ();
273+ }
274+ if (gidRefs[GTrackID::TOF].isIndexSet ()) {
275+ trcExt.infoTOF = recoData.getTOFMatch (vid);
306276 }
307-
308- (*mDBGOut ) << " dca"
309- << " tfID=" << TFCount << " ttime=" << ttime << " ttimeE=" << ttimeE
310- << " gid=" << vid << " pvid=" << (iv == nv - 1 ? -1 : iv) << " pv=" << (iv == nv - 1 ? vtxDummy : pvvec[iv])
311- << " trc=" << trc << " pvCont=" << pvCont << " ambig=" << ambig << " dca=" << dca << " xmin=" << xmin
312- << " q2ptITS=" << q2ptITS << " q2ptTPC=" << q2ptTPC << " q2ptITSTPC=" << q2ptITSTPC << " q2ptITSTPCTRD=" << q2ptITSTPCTRD
313- << " \n " ;
314277 }
315278 }
316279 }
317-
318- if (iv != nv - 1 ) {
319- auto & pve = pveVec[iv];
320- if (nContAdd) {
321- rmsT /= nContAdd;
322- rmsZ /= nContAdd;
323- meanT /= nContAdd;
324- meanZ /= nContAdd;
325- pve.rmsT = (rmsT - meanT * meanT);
326- pve.rmsT = pve.rmsT > 0 ? std::sqrt (pve.rmsT ) : 0 ;
327- pve.rmsZ = rmsZ - meanZ * meanZ;
328- pve.rmsZ = pve.rmsZ > 0 ? std::sqrt (pve.rmsZ ) : 0 ;
329- }
330- if (nContAdd0) {
331- rmsT0 /= nContAdd0;
332- meanT0 /= nContAdd0;
333- pve.rmsT0 = (rmsT0 - meanT0 * meanT0);
334- pve.rmsT0 = pve.rmsT0 > 0 ? std::sqrt (pve.rmsT0 ) : 0 ;
335- }
336- if (WT0 > 0 ) {
337- rmsTW0 /= WT0;
338- meanTW0 /= WT0;
339- pve.rmsTW0 = (rmsTW0 - meanTW0 * meanTW0);
340- pve.rmsTW0 = pve.rmsTW0 > 0 ? std::sqrt (pve.rmsTW0 ) : 0 ;
341- }
342- //
343- if (WT > 0 && WZ > 0 ) {
344- rmsTW /= WT;
345- meanTW /= WT;
346- pve.rmsTW = (rmsTW - meanTW * meanTW);
347- pve.rmsTW = pve.rmsTW > 0 ? std::sqrt (pve.rmsTW ) : 0 ;
348- rmsZW /= WZ;
349- meanZW /= WZ;
350- pve.rmsZW = rmsZW - meanZW * meanZW;
351- pve.rmsZW = pve.rmsZ > 0 ? std::sqrt (pve.rmsZ ) : 0 ;
352- }
353- pve.tMAD = o2::math_utils::MAD2Sigma (dtvec.size (), dtvec.data ());
354- pve.zMAD = o2::math_utils::MAD2Sigma (dzvec.size (), dzvec.data ());
355- }
280+ (*mDBGOut ) << " trpv"
281+ << " orbit=" << recoData.startIR .orbit << " tfID=" << TFCount
282+ << " pve=" << pveVec[iv] << " trc=" << trcExtVec << " \n " ;
356283 }
284+
357285 int nvtot = mMaxNeighbours < 0 ? -1 : (int )pveVec.size ();
358286
359287 auto insSlot = [maxSlots = mMaxNeighbours ](std::vector<float >& vc, float v, int slot, std::vector<int >& vid, int id) {
@@ -499,7 +427,7 @@ DataProcessorSpec getTrackingStudySpec(GTrackID::mask_t srcTracks, GTrackID::mas
499427 {" max-tpc-dcaz" , VariantType::Float, 2 .f , {" Cut on TPC dcaZ" }},
500428 {" max-eta" , VariantType::Float, 0 .8f , {" Cut on track eta" }},
501429 {" min-pt" , VariantType::Float, 0 .1f , {" Cut on track pT" }},
502- {" min-x-prop" , VariantType::Float, 6 .f , {" track should be propagated to this X at least" }},
430+ {" min-x-prop" , VariantType::Float, 46 .f , {" track should be propagated to this X at least" }},
503431 }};
504432}
505433
0 commit comments