@@ -94,7 +94,6 @@ struct OnTheFlyTracker {
9494 Configurable<float> maxEta{"maxEta", 1.5, "maximum eta to consider viable"};
9595 Configurable<float> multEtaRange{"multEtaRange", 0.8, "eta range to compute the multiplicity"};
9696 Configurable<float> minPt{"minPt", 0.1, "minimum pt to consider viable"};
97- Configurable<bool> enableLUT{"enableLUT", false, "Enable track smearing"};
9897 Configurable<bool> enablePrimarySmearing{"enablePrimarySmearing", false, "Enable smearing of primary particles"};
9998 Configurable<bool> enableSecondarySmearing{"enableSecondarySmearing", false, "Enable smearing of weak decay daughters"};
10099 Configurable<bool> enableNucleiSmearing{"enableNucleiSmearing", false, "Enable smearing of nuclei"};
@@ -147,7 +146,7 @@ struct OnTheFlyTracker {
147146 Configurable<int> minSiliconHits{"minSiliconHits", 6, "minimum number of silicon hits to accept track"};
148147 Configurable<int> minSiliconHitsIfTPCUsed{"minSiliconHitsIfTPCUsed", 2, "minimum number of silicon hits to accept track in case TPC info is present"};
149148 Configurable<int> minTPCClusters{"minTPCClusters", 70, "minimum number of TPC hits necessary to consider minSiliconHitsIfTPCUsed"};
150- Configurable<std::string> alice3geo{"alice3geo", "2", "0: ALICE 3 v1, 1: ALICE 3 v4, 2: ALICE 3 Sep 2025, or path to ccdb with a3 geo"};
149+ Configurable<std::vector<std:: string>> alice3geo{"alice3geo", std::vector<std::string>{ "2"} , "0: ALICE 3 v1, 1: ALICE 3 v4, 2: ALICE 3 Sep 2025, or path to ccdb with a3 geo (ccdb:Users/u/user/) "};
151150 Configurable<bool> applyZacceptance{"applyZacceptance", false, "apply z limits to detector layers or not"};
152151 Configurable<bool> applyMSCorrection{"applyMSCorrection", true, "apply ms corrections for secondaries or not"};
153152 Configurable<bool> applyElossCorrection{"applyElossCorrection", true, "apply eloss corrections for secondaries or not"};
@@ -181,7 +180,8 @@ struct OnTheFlyTracker {
181180 o2::vertexing::DCAFitterN<2> fitter;
182181
183182 // FastTracker machinery
184- o2::fastsim::FastTracker fastTracker;
183+ // o2::fastsim::FastTracker fastTracker;
184+ std::vector<std::unique_ptr<o2::fastsim::FastTracker>> fastTracker;
185185 o2::fastsim::FastTracker fastPrimaryTracker;
186186
187187 // Class to hold the track information for the O2 vertexing
@@ -267,11 +267,10 @@ struct OnTheFlyTracker {
267267 static constexpr int kMaxLUTConfigs = 20;
268268 void init(o2::framework::InitContext&)
269269 {
270-
271270 ccdb->setURL("http://alice-ccdb.cern.ch");
272271 ccdb->setTimestamp(-1);
273272
274- if (enableLUT ) {
273+ if (enablePrimarySmearing ) {
275274 auto loadLUT = [&](int icfg, int pdg, const std::vector<std::string>& tables) {
276275 const bool foundNewCfg = static_cast<size_t>(icfg) < tables.size();
277276 const std::string& lutFile = foundNewCfg ? tables[icfg] : tables.front();
@@ -330,6 +329,31 @@ struct OnTheFlyTracker {
330329 histPointers.insert({histPath + "hSimMultiplicity", histos.add((histPath + "hSimMultiplicity").c_str(), "hSimMultiplicity", {kTH1D, {{axes.axisMultiplicity}}})});
331330 histPointers.insert({histPath + "hRecoMultiplicity", histos.add((histPath + "hRecoMultiplicity").c_str(), "hRecoMultiplicity", {kTH1D, {{axes.axisMultiplicity}}})});
332331
332+ if (enableSecondarySmearing) {
333+ fastTracker.emplace_back(std::make_unique<o2::fastsim::FastTracker>());
334+ fastTracker[icfg]->SetMagneticField(magneticField);
335+ fastTracker[icfg]->SetApplyZacceptance(fastTrackerSettings.applyZacceptance);
336+ fastTracker[icfg]->SetApplyMSCorrection(fastTrackerSettings.applyMSCorrection);
337+ fastTracker[icfg]->SetApplyElossCorrection(fastTrackerSettings.applyElossCorrection);
338+
339+ if (fastTrackerSettings.alice3geo.value[icfg] == "0") {
340+ fastTracker[icfg]->AddSiliconALICE3v2(fastTrackerSettings.pixelRes);
341+ } else if (fastTrackerSettings.alice3geo.value[icfg] == "1") {
342+ fastTracker[icfg]->AddSiliconALICE3v4(fastTrackerSettings.pixelRes);
343+ fastTracker[icfg]->AddTPC(0.1, 0.1);
344+ } else if (fastTrackerSettings.alice3geo.value[icfg] == "2") {
345+ fastTracker[icfg]->AddSiliconALICE3(fastTrackerSettings.scaleVD, fastTrackerSettings.pixelRes);
346+ } else {
347+ fastTracker[icfg]->AddGenericDetector(fastTrackerSettings.alice3geo.value[icfg], ccdb.operator->());
348+ }
349+
350+ // print fastTracker settings
351+ fastTracker[icfg]->Print();
352+ histPointers.insert({histPath + "hMassXi", histos.add((histPath + "hMassXi").c_str(), "hMassXi", {kTH1D, {{axes.axisXiMass}}})});
353+
354+ }
355+
356+
333357 } // end config loop
334358 }
335359
@@ -449,28 +473,7 @@ struct OnTheFlyTracker {
449473 // Set seed for TGenPhaseSpace
450474 rand.SetSeed(seed);
451475
452- // configure FastTracker
453- if (enableSecondarySmearing) {
454- fastTracker.SetMagneticField(magneticField);
455- fastTracker.SetApplyZacceptance(fastTrackerSettings.applyZacceptance);
456- fastTracker.SetApplyMSCorrection(fastTrackerSettings.applyMSCorrection);
457- fastTracker.SetApplyElossCorrection(fastTrackerSettings.applyElossCorrection);
458-
459- if (fastTrackerSettings.alice3geo.value == "0") {
460- fastTracker.AddSiliconALICE3v2(fastTrackerSettings.pixelRes);
461- } else if (fastTrackerSettings.alice3geo.value == "1") {
462- fastTracker.AddSiliconALICE3v4(fastTrackerSettings.pixelRes);
463- fastTracker.AddTPC(0.1, 0.1);
464- } else if (fastTrackerSettings.alice3geo.value == "2") {
465- fastTracker.AddSiliconALICE3(fastTrackerSettings.scaleVD, fastTrackerSettings.pixelRes);
466- } else {
467- fastTracker.AddGenericDetector(fastTrackerSettings.alice3geo, ccdb.operator->());
468- }
469-
470- // print fastTracker settings
471- fastTracker.Print();
472- }
473-
476+ // Configure FastTracker for primaries
474477 if (fastPrimaryTrackerSettings.fastTrackPrimaries) {
475478 fastPrimaryTracker.SetMagneticField(magneticField);
476479 fastPrimaryTracker.SetApplyZacceptance(fastPrimaryTrackerSettings.applyZacceptance);
@@ -548,10 +551,10 @@ struct OnTheFlyTracker {
548551 }
549552
550553 float dNdEta = 0.f; // Charged particle multiplicity to use in the efficiency evaluation
551- void processWithLUTs(aod::McCollision const& mcCollision, aod::McParticles const& mcParticles, int const& cfgId )
554+ void processWithLUTs(aod::McCollision const& mcCollision, aod::McParticles const& mcParticles, int const& icfg )
552555 {
553556 int lastTrackIndex = tableStoredTracksCov.lastIndex() + 1; // bookkeep the last added track
554- const std::string histPath = "Configuration_" + std::to_string(cfgId ) + "/";
557+ const std::string histPath = "Configuration_" + std::to_string(icfg ) + "/";
555558
556559 tracksAlice3.clear();
557560 ghostTracksAlice3.clear();
@@ -697,9 +700,9 @@ struct OnTheFlyTracker {
697700 nSiliconHits[i] = 0;
698701 nTPCHits[i] = 0;
699702 if (enableSecondarySmearing) {
700- nHits[i] = fastTracker. FastTrack(xiDaughterTrackParCovsPerfect[i], xiDaughterTrackParCovsTracked[i], dNdEta);
701- nSiliconHits[i] = fastTracker. GetNSiliconPoints();
702- nTPCHits[i] = fastTracker. GetNGasPoints();
703+ nHits[i] = fastTracker[icfg]-> FastTrack(xiDaughterTrackParCovsPerfect[i], xiDaughterTrackParCovsTracked[i], dNdEta);
704+ nSiliconHits[i] = fastTracker[icfg]-> GetNSiliconPoints();
705+ nTPCHits[i] = fastTracker[icfg]-> GetNGasPoints();
703706
704707 if (nHits[i] < 0) { // QA
705708 histos.fill(HIST("hFastTrackerQA"), o2::math_utils::abs(nHits[i]));
@@ -710,8 +713,8 @@ struct OnTheFlyTracker {
710713 } else {
711714 continue; // extra sure
712715 }
713- for (uint32_t ih = 0; ih < fastTracker. GetNHits(); ih++) {
714- histos.fill(HIST("hFastTrackerHits"), fastTracker. GetHitZ(ih), std::hypot(fastTracker. GetHitX(ih), fastTracker. GetHitY(ih)));
716+ for (uint32_t ih = 0; ih < fastTracker[icfg]-> GetNHits(); ih++) {
717+ histos.fill(HIST("hFastTrackerHits"), fastTracker[icfg]-> GetHitZ(ih), std::hypot(fastTracker[icfg]-> GetHitX(ih), fastTracker[icfg]-> GetHitY(ih)));
715718 }
716719 } else {
717720 isReco[i] = true;
@@ -860,8 +863,8 @@ struct OnTheFlyTracker {
860863 if (cascadeDecaySettings.trackXi) {
861864 // optionally, add the points in the layers before the decay of the Xi
862865 // will back-track the perfect MC cascade to relevant layers, find hit, smear and add to smeared cascade
863- for (int i = fastTracker. GetLayers().size() - 1; i >= 0; --i) {
864- o2::fastsim::DetLayer layer = fastTracker. GetLayer(i);
866+ for (int i = fastTracker[icfg]-> GetLayers().size() - 1; i >= 0; --i) {
867+ o2::fastsim::DetLayer layer = fastTracker[icfg]-> GetLayer(i);
865868 if (layer.isInert()) {
866869 continue; // Not an active tracking layer
867870 }
@@ -931,6 +934,7 @@ struct OnTheFlyTracker {
931934 histos.fill(HIST("hMassLambda"), thisCascade.mLambda);
932935 histos.fill(HIST("hMassXi"), thisCascade.mXi);
933936 histos.fill(HIST("hFoundVsFindable"), thisCascade.findableClusters, thisCascade.foundClusters);
937+ getHist(TH1, histPath + "hMassXi")->Fill(thisCascade.mXi);
934938 }
935939
936940 // add this cascade to vector (will fill cursor later with collision ID)
@@ -948,7 +952,7 @@ struct OnTheFlyTracker {
948952
949953 bool reconstructed = true;
950954 if (enablePrimarySmearing && !fastPrimaryTrackerSettings.fastTrackPrimaries) {
951- reconstructed = mSmearer[cfgId ]->smearTrack(trackParCov, mcParticle.pdgCode(), dNdEta);
955+ reconstructed = mSmearer[icfg ]->smearTrack(trackParCov, mcParticle.pdgCode(), dNdEta);
952956 } else if (fastPrimaryTrackerSettings.fastTrackPrimaries) {
953957 o2::track::TrackParCov o2Track;
954958 o2::upgrade::convertMCParticleToO2Track(mcParticle, o2Track, pdgDB);
@@ -1042,9 +1046,6 @@ struct OnTheFlyTracker {
10421046 // *+~+*+~+*+~+*+~+*+~+*+~+*+~+*+~+*+~+*+~+*+~+*+~+*+~+*+~+*
10431047
10441048 // debug / informational
1045- // histos.fill(HIST("hSimMultiplicity"), multiplicityCounter);
1046- // histos.fill(HIST("hRecoMultiplicity"), tracksAlice3.size());
1047- // histos.fill(HIST("hPVz"), primaryVertex.getZ());
10481049 getHist(TH1, histPath + "hSimMultiplicity")->Fill(multiplicityCounter);
10491050 getHist(TH1, histPath + "hRecoMultiplicity")->Fill(tracksAlice3.size());
10501051 getHist(TH1, histPath + "hPVz")->Fill(primaryVertex.getZ());
@@ -1107,7 +1108,7 @@ struct OnTheFlyTracker {
11071108 tableTracksDCACov(dcaInfo.getSigmaY2(), dcaInfo.getSigmaZ2());
11081109 }
11091110 }
1110- tableOTFLUTConfigId(cfgId );
1111+ tableOTFLUTConfigId(icfg );
11111112 tableStoredTracks(tableCollisions.lastIndex(), trackType, trackParCov.getX(), trackParCov.getAlpha(), trackParCov.getY(), trackParCov.getZ(), trackParCov.getSnp(), trackParCov.getTgl(), trackParCov.getQ2Pt());
11121113 tableTracksExtension(trackParCov.getPt(), trackParCov.getP(), trackParCov.getEta(), trackParCov.getPhi());
11131114
@@ -1202,18 +1203,15 @@ struct OnTheFlyTracker {
12021203 }
12031204
12041205 // do bookkeeping of fastTracker tracking
1205- histos.fill(HIST("hCovMatOK"), 0.0f, fastTracker. GetCovMatNotOK());
1206- histos.fill(HIST("hCovMatOK"), 1.0f, fastTracker. GetCovMatOK());
1206+ histos.fill(HIST("hCovMatOK"), 0.0f, fastTracker[icfg]-> GetCovMatNotOK());
1207+ histos.fill(HIST("hCovMatOK"), 1.0f, fastTracker[icfg]-> GetCovMatOK());
12071208 } // end process
12081209
12091210 void process(aod::McCollision const& mcCollision, aod::McParticles const& mcParticles)
12101211 {
1211- static int ievt = 0;
1212- std::cout << "Proccesing event " << ievt << std::endl;
12131212 for (size_t icfg = 0; icfg < mSmearer.size(); ++icfg) {
12141213 processWithLUTs(mcCollision, mcParticles, static_cast<int>(icfg));
12151214 }
1216- ievt++;
12171215 }
12181216};
12191217
0 commit comments