@@ -55,7 +55,7 @@ struct vertexingfwd {
5555 {" TracksDCAX" , " ; DCA_{x} (cm); counts" , {HistType::kTH1F , {{100 , -10 , 10 }}}},
5656 {" TracksDCAY" , " ; DCA_{y} (cm); counts" , {HistType::kTH1F , {{100 , -10 , 10 }}}},
5757 {" AmbiguousTracksStatus" , " ; Status; counts" , {HistType::kTH1F , {{6 , -0.5 , 5.5 }}}},
58- {" CollisionsSize " , " ; Collisions size " , {HistType::kTH1F , {{10 , -0.5 , 9.5 }}}},
58+ {" NbCollComp " , " ; NbCollComp " , {HistType::kTH1F , {{10 , -0.5 , 9.5 }}}},
5959 {" NumberOfContributors" , " ; N_{tr} for vertexing; counts" , {HistType::kTH1F , {{100 , 0 , 100 }}}},
6060 {" CollisionsMatchIndicesMC" , " ; Rec. minDCA ambitrack coll.ID; Gen. ambitrack coll.ID" , {HistType::kTH2F , {{401 , -0.5 , 1000.5 }, {401 , -0.5 , 1000.5 }}}},
6161 {" TracksDCAXYBest" , " ; DCA_{xy}^{best} (cm); counts" , {HistType::kTH1F , {{100 , -1 , 10 }}}},
@@ -89,14 +89,24 @@ struct vertexingfwd {
8989 int getIndexBestCollision (std::vector<double > vecOfDCA, int method = 0 )
9090 {
9191 int indice = 0 ;
92+ if (vecOfDCA.size () == 0 ) {
93+ return -1 ;
94+ }
9295 if (method == 0 ) {
9396 indice = std::distance (vecOfDCA.begin (), std::min_element (vecOfDCA.begin (), vecOfDCA.end ()));
9497 }
9598 return indice;
9699 }
97100
98- void processNew (aod::AmbiguousMFTTracks const & ambitracks, FullBCs const & bcs, soa::Join<o2::aod::MFTTracks, aod::McMFTTrackLabels> const & tracks, FullCollision const & collisions, aod::McParticles const & mcParticles, aod::McCollisions const & mcCollisions)
101+ void processNew (aod::AmbiguousMFTTracks const & ambitracks, aod::BCs const & bcs, soa::Join<o2::aod::MFTTracks, aod::McMFTTrackLabels> const & tracks, FullCollision const & collisions, aod::McParticles const & mcParticles, aod::McCollisions const & mcCollisions)
99102 {
103+
104+ int ntracks = tracks.size ();
105+ int nambitracks = ambitracks.size ();
106+
107+ registry.fill (HIST (" AmbiguousTracksStatus" ), 0.0 , ntracks);
108+ registry.fill (HIST (" AmbiguousTracksStatus" ), 1.0 , nambitracks);
109+
100110 for (auto & ambitrack : ambitracks) {
101111 vecCollForAmb.clear ();
102112 vecDCACollForAmb.clear ();
@@ -109,8 +119,6 @@ struct vertexingfwd {
109119
110120 auto track = ambitrack.mfttrack_as <MFTTracksLabeled>(); // Obtain the MFT ambiguous track with the MC labels
111121 // auto extAmbiTrackid = ambitrack.mfttrackId(); // Global index of the MFT ambiguous track
112- int ntracks = tracks.size ();
113- int nambitracks = ambitracks.size ();
114122
115123 if (!track.has_mcParticle ()) {
116124 LOGF (warning, " No MC particle for ambiguous track, skip..." );
@@ -120,8 +128,6 @@ struct vertexingfwd {
120128 mcCollAmbiID = particle.mcCollisionId ();
121129 zVtxMCAmbi = particle.mcCollision ().posZ ();
122130
123- registry.fill (HIST (" AmbiguousTracksStatus" ), 0.0 , ntracks);
124- registry.fill (HIST (" AmbiguousTracksStatus" ), 1.0 , nambitracks);
125131 if (particle.isPhysicalPrimary ()) {
126132 registry.fill (HIST (" AmbiguousTracksStatus" ), 2.0 );
127133 } else {
@@ -137,51 +143,78 @@ struct vertexingfwd {
137143 vecAmbTrack.push_back (track.z ());
138144 vecAmbTrack.push_back (track.chi2 ());
139145
140- auto bcambis = ambitrack.bc_as <soa::Join<aod::BCs, aod::MatchedBCCollisionsSparse>> ();
146+ auto bcambis = ambitrack.bc ();
141147
142- for (auto & bcambi : bcambis) {
148+ int collCounter = 0 ;
149+ for (auto & collision : collisions) {
150+ uint64_t mostProbableBC = collision.bc ().globalBC ();
151+ // uint64_t meanBC = mostProbableBC - std::lround(collision.collisionTime() / (o2::constants::lhc::LHCBunchSpacingNS / 1000));
152+ // int deltaBC = std::ceil(collision.collisionTimeRes() / (o2::constants::lhc::LHCBunchSpacingNS / 1000) * 4);
143153
144- if (!bcambi.has_collision ()) {
145- continue ;
146- }
154+ for (auto & bcambi : bcambis) {
147155
148- auto collision = bcambi.collision_as <soa::Join<aod::Collisions, aod::McCollisionLabels>>();
156+ if (bcambi.globalBC () != mostProbableBC) {
157+ continue ;
158+ }
159+ collCounter++;
149160
150- SMatrix5 tpars (vecAmbTrack[0 ], vecAmbTrack[1 ], vecAmbTrack[2 ], vecAmbTrack[3 ], vecAmbTrack[4 ]);
151- // std::vector<double> v1{extAmbiTrack.cXX(), extAmbiTrack.cXY(), extAmbiTrack.cYY(), extAmbiTrack.cPhiX(), extAmbiTrack.cPhiY(),
152- // extAmbiTrack.cPhiPhi(), extAmbiTrack.cTglX(), extAmbiTrack.cTglY(), extAmbiTrack.cTglPhi(), extAmbiTrack.cTglTgl(),
153- // extAmbiTrack.c1PtX(), extAmbiTrack.c1PtY(), extAmbiTrack.c1PtPhi(), extAmbiTrack.c1PtTgl(), extAmbiTrack.c1Pt21Pt2()};
161+ SMatrix5 tpars (vecAmbTrack[0 ], vecAmbTrack[1 ], vecAmbTrack[2 ], vecAmbTrack[3 ], vecAmbTrack[4 ]);
162+ // std::vector<double> v1{extAmbiTrack.cXX(), extAmbiTrack.cXY(), extAmbiTrack.cYY(), extAmbiTrack.cPhiX(), extAmbiTrack.cPhiY(),
163+ // extAmbiTrack.cPhiPhi(), extAmbiTrack.cTglX(), extAmbiTrack.cTglY(), extAmbiTrack.cTglPhi(), extAmbiTrack.cTglTgl(),
164+ // extAmbiTrack.c1PtX(), extAmbiTrack.c1PtY(), extAmbiTrack.c1PtPhi(), extAmbiTrack.c1PtTgl(), extAmbiTrack.c1Pt21Pt2()};
154165
155- std::vector<double > v1; // Temporary null vector for the computation of the covariance matrix
156- SMatrix55 tcovs (v1.begin (), v1.end ());
157- o2::track::TrackParCovFwd pars1{vecAmbTrack[5 ], tpars, tcovs, vecAmbTrack[6 ]};
166+ std::vector<double > v1; // Temporary null vector for the computation of the covariance matrix
167+ SMatrix55 tcovs (v1.begin (), v1.end ());
168+ o2::track::TrackParCovFwd pars1{vecAmbTrack[5 ], tpars, tcovs, vecAmbTrack[6 ]};
158169
159- // o2::track::TrackParCovFwd pars1{extAmbiTrack.z(), tpars, tcovs, chi2};
160- pars1.propagateToZlinear (collision.posZ ()); // track parameters propagation to the position of the z vertex
170+ // o2::track::TrackParCovFwd pars1{extAmbiTrack.z(), tpars, tcovs, chi2};
171+ pars1.propagateToZlinear (collision.posZ ()); // track parameters propagation to the position of the z vertex
161172
162- const auto dcaX (pars1.getX () - collision.posX ());
163- const auto dcaY (pars1.getY () - collision.posY ());
164- auto dcaXY = std::sqrt (dcaX * dcaX + dcaY * dcaY);
173+ const auto dcaX (pars1.getX () - collision.posX ());
174+ const auto dcaY (pars1.getY () - collision.posY ());
175+ auto dcaXY = std::sqrt (dcaX * dcaX + dcaY * dcaY);
165176
166- registry.fill (HIST (" TracksDCAXY" ), dcaXY);
167- registry.fill (HIST (" TracksDCAX" ), dcaX);
168- registry.fill (HIST (" TracksDCAY" ), dcaY);
169- registry.fill (HIST (" NumberOfContributors" ), collision.numContrib ());
177+ registry.fill (HIST (" TracksDCAXY" ), dcaXY);
178+ registry.fill (HIST (" TracksDCAX" ), dcaX);
179+ registry.fill (HIST (" TracksDCAY" ), dcaY);
180+ registry.fill (HIST (" NumberOfContributors" ), collision.numContrib ());
170181
171- int mcCollindex = collision.mcCollision ().globalIndex ();
172- vecCollForAmb.push_back (mcCollindex);
173- vecDCACollForAmb.push_back (dcaXY);
174- vecZposCollForAmb.push_back (collision.mcCollision ().posZ ());
182+ vecDCACollForAmb.push_back (dcaXY);
175183
176- registry.fill (HIST (" DeltaZvtx" ), collision.mcCollision ().posZ () - zVtxMCAmbi);
177- } // BCs loop
184+ if (!collision.has_mcCollision ()) {
185+ continue ;
186+ }
187+
188+ int mcCollindex = collision.mcCollision ().globalIndex ();
189+ vecCollForAmb.push_back (mcCollindex);
190+
191+ vecZposCollForAmb.push_back (collision.mcCollision ().posZ ());
192+
193+ registry.fill (HIST (" DeltaZvtx" ), collision.mcCollision ().posZ () - zVtxMCAmbi);
194+ break ;
195+ }
196+ }
197+
198+ registry.fill (HIST (" NbCollComp" ), collCounter);
199+ registry.fill (HIST (" CorrectMatch" ), 3.0 ); // counting for ambiguous track with N collisions >=0
178200
179201 int indexMinDCA = getIndexBestCollision (vecDCACollForAmb, 0 ); // obtain min value in the stored vector of DCAs
180- int indexMCcoll = vecCollForAmb[indexMinDCA];
202+ int indexMCcoll = -1 ;
203+ if (indexMinDCA == -1 ) {
204+ continue ;
205+ }
206+ indexMCcoll = vecCollForAmb[indexMinDCA];
207+
181208 registry.fill (HIST (" CollisionsMatchIndicesMC" ), mcCollAmbiID, indexMCcoll);
182- registry.fill (HIST (" CollisionsSize" ), vecCollForAmb.size ());
183- registry.fill (HIST (" CorrectMatch" ), 3.0 ); // counting for amibuous track with N collisions >=0
184- if (vecCollForAmb.size () == 0 ) { // do not use the vector with no collisions
209+
210+ if (collCounter == 1 ) {
211+ printf (" strange ambiguous track of mfttrackId %d and trackGI %lld\n " , ambitrack.mfttrackId (), track.globalIndex ());
212+ if (mcCollAmbiID == indexMCcoll) {
213+ printf (" and this is a correct match for the ambiguous track of mfttrackid %d\n " , ambitrack.mfttrackId ());
214+ }
215+ }
216+
217+ if (vecDCACollForAmb.size () == 0 ) { // do not use the vector with no collisions
185218 if (!particle.isPhysicalPrimary ()) {
186219 registry.fill (HIST (" AmbiguousTracksStatus" ), 5.0 );
187220 }
@@ -205,6 +238,7 @@ struct vertexingfwd {
205238 registry.fill (HIST (" CorrectMatch" ), value);
206239 registry.fill (HIST (" EfficiencyZvtx" ), zVtxMCAmbi, value);
207240 registry.fill (HIST (" CorrectMatch" ), 2.0 ); // Counting for amibuous track with N collisions > 0
241+
208242 if (value == 0.0 ) {
209243 registry.fill (HIST (" TracksDCAXYBestFalse" ), vecDCACollForAmb[indexMinDCA]); // Incorrect association with min DCA
210244 }
@@ -214,8 +248,15 @@ struct vertexingfwd {
214248
215249 PROCESS_SWITCH (vertexingfwd, processNew, " Process ambiguous track DCA" , true );
216250
217- void processOld (aod::AmbiguousTracksMFT const & ambitracks, FullBCs const & bcs, soa::Join<o2::aod::MFTTracks, aod::McMFTTrackLabels> const & tracks, FullCollision const & collisions, aod::McParticles const & mcParticles, aod::McCollisions const & mcCollisions)
251+ void processOld (aod::AmbiguousTracksMFT const & ambitracks, aod::BCs const & bcs, soa::Join<o2::aod::MFTTracks, aod::McMFTTrackLabels> const & tracks, FullCollision const & collisions, aod::McParticles const & mcParticles, aod::McCollisions const & mcCollisions)
218252 {
253+
254+ int ntracks = tracks.size ();
255+ int nambitracks = ambitracks.size ();
256+
257+ registry.fill (HIST (" AmbiguousTracksStatus" ), 0.0 , ntracks);
258+ registry.fill (HIST (" AmbiguousTracksStatus" ), 1.0 , nambitracks);
259+
219260 for (auto & ambitrack : ambitracks) {
220261 vecCollForAmb.clear ();
221262 vecDCACollForAmb.clear ();
@@ -228,8 +269,6 @@ struct vertexingfwd {
228269
229270 auto track = ambitrack.mfttrack_as <MFTTracksLabeled>(); // Obtain the MFT ambiguous track with the MC labels
230271 // auto extAmbiTrackid = ambitrack.mfttrackId(); // Global index of the MFT ambiguous track
231- int ntracks = tracks.size ();
232- int nambitracks = ambitracks.size ();
233272
234273 if (!track.has_mcParticle ()) {
235274 LOGF (warning, " No MC particle for ambiguous track, skip..." );
@@ -239,8 +278,6 @@ struct vertexingfwd {
239278 mcCollAmbiID = particle.mcCollisionId ();
240279 zVtxMCAmbi = particle.mcCollision ().posZ ();
241280
242- registry.fill (HIST (" AmbiguousTracksStatus" ), 0.0 , ntracks);
243- registry.fill (HIST (" AmbiguousTracksStatus" ), 1.0 , nambitracks);
244281 if (particle.isPhysicalPrimary ()) {
245282 registry.fill (HIST (" AmbiguousTracksStatus" ), 2.0 );
246283 } else {
@@ -256,51 +293,70 @@ struct vertexingfwd {
256293 vecAmbTrack.push_back (track.z ());
257294 vecAmbTrack.push_back (track.chi2 ());
258295
259- auto bcambis = ambitrack.bc_as <soa::Join<aod::BCs, aod::MatchedBCCollisionsSparse>> ();
296+ auto bcambis = ambitrack.bc ();
260297
261- for (auto & bcambi : bcambis) {
298+ int collCounter = 0 ;
299+ for (auto & collision : collisions) {
300+ uint64_t mostProbableBC = collision.bc ().globalBC ();
301+ // uint64_t meanBC = mostProbableBC - std::lround(collision.collisionTime() / (o2::constants::lhc::LHCBunchSpacingNS / 1000));
302+ // int deltaBC = std::ceil(collision.collisionTimeRes() / (o2::constants::lhc::LHCBunchSpacingNS / 1000) * 4);
262303
263- if (!bcambi.has_collision ()) {
264- continue ;
265- }
304+ for (auto & bcambi : bcambis) {
305+ if (bcambi.globalBC () != mostProbableBC) {
306+ continue ;
307+ }
308+ collCounter++;
309+
310+ SMatrix5 tpars (vecAmbTrack[0 ], vecAmbTrack[1 ], vecAmbTrack[2 ], vecAmbTrack[3 ], vecAmbTrack[4 ]);
311+ // std::vector<double> v1{extAmbiTrack.cXX(), extAmbiTrack.cXY(), extAmbiTrack.cYY(), extAmbiTrack.cPhiX(), extAmbiTrack.cPhiY(),
312+ // extAmbiTrack.cPhiPhi(), extAmbiTrack.cTglX(), extAmbiTrack.cTglY(), extAmbiTrack.cTglPhi(), extAmbiTrack.cTglTgl(),
313+ // extAmbiTrack.c1PtX(), extAmbiTrack.c1PtY(), extAmbiTrack.c1PtPhi(), extAmbiTrack.c1PtTgl(), extAmbiTrack.c1Pt21Pt2()};
266314
267- auto collision = bcambi.collision_as <soa::Join<aod::Collisions, aod::McCollisionLabels>>();
315+ std::vector<double > v1; // Temporary null vector for the computation of the covariance matrix
316+ SMatrix55 tcovs (v1.begin (), v1.end ());
317+ o2::track::TrackParCovFwd pars1{vecAmbTrack[5 ], tpars, tcovs, vecAmbTrack[6 ]};
268318
269- SMatrix5 tpars (vecAmbTrack[0 ], vecAmbTrack[1 ], vecAmbTrack[2 ], vecAmbTrack[3 ], vecAmbTrack[4 ]);
270- // std::vector<double> v1{extAmbiTrack.cXX(), extAmbiTrack.cXY(), extAmbiTrack.cYY(), extAmbiTrack.cPhiX(), extAmbiTrack.cPhiY(),
271- // extAmbiTrack.cPhiPhi(), extAmbiTrack.cTglX(), extAmbiTrack.cTglY(), extAmbiTrack.cTglPhi(), extAmbiTrack.cTglTgl(),
272- // extAmbiTrack.c1PtX(), extAmbiTrack.c1PtY(), extAmbiTrack.c1PtPhi(), extAmbiTrack.c1PtTgl(), extAmbiTrack.c1Pt21Pt2()};
319+ // o2::track::TrackParCovFwd pars1{extAmbiTrack.z(), tpars, tcovs, chi2};
320+ pars1.propagateToZlinear (collision.posZ ()); // track parameters propagation to the position of the z vertex
273321
274- std::vector< double > v1; // Temporary null vector for the computation of the covariance matrix
275- SMatrix55 tcovs (v1. begin (), v1. end ());
276- o2::track::TrackParCovFwd pars1{vecAmbTrack[ 5 ], tpars, tcovs, vecAmbTrack[ 6 ]} ;
322+ const auto dcaX (pars1. getX () - collision. posX ());
323+ const auto dcaY (pars1. getY () - collision. posY ());
324+ auto dcaXY = std::sqrt (dcaX * dcaX + dcaY * dcaY) ;
277325
278- // o2::track::TrackParCovFwd pars1{extAmbiTrack.z(), tpars, tcovs, chi2};
279- pars1.propagateToZlinear (collision.posZ ()); // track parameters propagation to the position of the z vertex
326+ registry.fill (HIST (" TracksDCAXY" ), dcaXY);
327+ registry.fill (HIST (" TracksDCAX" ), dcaX);
328+ registry.fill (HIST (" TracksDCAY" ), dcaY);
329+ registry.fill (HIST (" NumberOfContributors" ), collision.numContrib ());
280330
281- const auto dcaX (pars1.getX () - collision.posX ());
282- const auto dcaY (pars1.getY () - collision.posY ());
283- auto dcaXY = std::sqrt (dcaX * dcaX + dcaY * dcaY);
331+ vecDCACollForAmb.push_back (dcaXY);
284332
285- registry.fill (HIST (" TracksDCAXY" ), dcaXY);
286- registry.fill (HIST (" TracksDCAX" ), dcaX);
287- registry.fill (HIST (" TracksDCAY" ), dcaY);
288- registry.fill (HIST (" NumberOfContributors" ), collision.numContrib ());
333+ if (!collision.has_mcCollision ()) {
334+ continue ;
335+ }
289336
290- int mcCollindex = collision.mcCollision ().globalIndex ();
291- vecCollForAmb.push_back (mcCollindex);
292- vecDCACollForAmb.push_back (dcaXY);
293- vecZposCollForAmb.push_back (collision.mcCollision ().posZ ());
337+ int mcCollindex = collision.mcCollision ().globalIndex ();
338+ vecCollForAmb.push_back (mcCollindex);
294339
295- registry.fill (HIST (" DeltaZvtx" ), collision.mcCollision ().posZ () - zVtxMCAmbi);
296- } // BCs loop
340+ vecZposCollForAmb.push_back (collision.mcCollision ().posZ ());
341+
342+ registry.fill (HIST (" DeltaZvtx" ), collision.mcCollision ().posZ () - zVtxMCAmbi);
343+ break ;
344+ }
345+ }
346+
347+ registry.fill (HIST (" NbCollComp" ), collCounter);
297348
298349 int indexMinDCA = getIndexBestCollision (vecDCACollForAmb, 0 ); // obtain min value in the stored vector of DCAs
299- int indexMCcoll = vecCollForAmb[indexMinDCA];
350+ int indexMCcoll = -1 ;
351+ if (indexMinDCA == -1 ) {
352+ continue ;
353+ }
354+ indexMCcoll = vecCollForAmb[indexMinDCA];
355+
300356 registry.fill (HIST (" CollisionsMatchIndicesMC" ), mcCollAmbiID, indexMCcoll);
301- registry. fill ( HIST ( " CollisionsSize " ), vecCollForAmb. size ());
357+
302358 registry.fill (HIST (" CorrectMatch" ), 3.0 ); // counting for amibuous track with N collisions >=0
303- if (vecCollForAmb .size () == 0 ) { // do not use the vector with no collisions
359+ if (vecDCACollForAmb .size () == 0 ) { // do not use the vector with no collisions
304360 if (!particle.isPhysicalPrimary ()) {
305361 registry.fill (HIST (" AmbiguousTracksStatus" ), 5.0 );
306362 }
0 commit comments