@@ -70,6 +70,7 @@ enum KindOfData {
7070// / \brief The kind of processing for templating the procedures and produce histograms
7171enum KindOfProcess {
7272 kBASIC , // /< produce the basic histograms
73+ kEXTRA , // /< produce the extra pair based histograms
7374 kPID , // /< produce the basic PID histograms
7475 kPIDEXTRA // /< produce the extra PID histograms
7576};
@@ -569,6 +570,73 @@ struct QADataCollectingEngine {
569570 }
570571};
571572
573+ /* the QA extra data, pairs, collecting engine */
574+ struct QAExtraDataCollectingEngine {
575+ uint nsp = static_cast <uint>(efficiencyandqatask::tnames.size());
576+ uint nmainsp = static_cast <uint>(efficiencyandqatask::mainspnames.size());
577+ uint nallmainsp = static_cast <uint>(efficiencyandqatask::allmainspnames.size());
578+
579+ // ===================================================
580+ // The QA output objects
581+ // ===================================================
582+ /* pairs histograms */
583+ std::vector<std::vector<std::vector<std::shared_ptr<TH2>>>> fhPhiPhiA{2 , {nsp, {nsp, nullptr }}};
584+ std::vector<std::vector<std::vector<std::shared_ptr<TH3>>>> fhDeltaPhiVsPhiPhiA{2 , {nsp, {nsp, nullptr }}};
585+ std::vector<std::vector<std::vector<std::shared_ptr<TH2>>>> fhEtaEtaA{2 , {nsp, {nsp, nullptr }}};
586+ std::vector<std::vector<std::vector<std::shared_ptr<TH3>>>> fhDeltaEtaVsEtaEtaA{2 , {nsp, {nsp, nullptr }}};
587+
588+ template <efficiencyandqatask::KindOfData kindOfData>
589+ void init (HistogramRegistry& registry, const char * dirname)
590+ {
591+ using namespace efficiencyandqatask ;
592+ using namespace analysis ::dptdptfilter;
593+
594+ AxisSpec phiAxis = {72 , 0 .0f , constants::math::TwoPI, " #varphi" };
595+ AxisSpec deltaPhiAxis = {72 , 0 .0f , constants::math::TwoPI, " #Delta#varphi" };
596+ AxisSpec etaAxis = {etabins, etalow, etaup, " #eta" };
597+ AxisSpec deltaEta = {2 * etabins - 1 , etalow - etaup, etaup - etalow, " #DeltaEta" };
598+
599+ /* the reconstructed and generated levels histograms */
600+ std::string recogen = (kindOfData == kReco ) ? " Reco" : " Gen" ;
601+ for (uint isp = 0 ; isp < nsp; ++isp) {
602+ for (uint jsp = 0 ; jsp < nsp; ++jsp) {
603+ fhPhiPhiA[kindOfData][isp][jsp] = ADDHISTOGRAM (TH2, DIRECTORYSTRING (" %s/%s/%s" , dirname, recogen.c_str (), " After" ), HNAMESTRING (" PhiPhi_%s%s" , tnames[isp].c_str (), tnames[jsp].c_str ()),
604+ HTITLESTRING (" %s%s pairs" , tnames[isp].c_str (), tnames[jsp].c_str ()), kTH2F , {phiAxis, phiAxis});
605+ fhDeltaPhiVsPhiPhiA[kindOfData][isp][jsp] = ADDHISTOGRAM (TH3, DIRECTORYSTRING (" %s/%s/%s" , dirname, recogen.c_str (), " After" ), HNAMESTRING (" deltaPhiVsPhiPhi_%s%s" , tnames[isp].c_str (), tnames[jsp].c_str ()),
606+ HTITLESTRING (" %s%s pairs" , tnames[isp].c_str (), tnames[jsp].c_str ()), kTH3F , {phiAxis, phiAxis, deltaPhiAxis});
607+ fhEtaEtaA[kindOfData][isp][jsp] = ADDHISTOGRAM (TH2, DIRECTORYSTRING (" %s/%s/%s" , dirname, recogen.c_str (), " After" ), HNAMESTRING (" EtaEta_%s%s" , tnames[isp].c_str (), tnames[jsp].c_str ()),
608+ HTITLESTRING (" %s%s pairs" , tnames[isp].c_str (), tnames[jsp].c_str ()), kTH2F , {etaAxis, etaAxis});
609+ fhDeltaEtaVsEtaEtaA[kindOfData][isp][jsp] = ADDHISTOGRAM (TH3, DIRECTORYSTRING (" %s/%s/%s" , dirname, recogen.c_str (), " After" ), HNAMESTRING (" deltaPhiVsEtaEta_%s%s" , tnames[isp].c_str (), tnames[jsp].c_str ()),
610+ HTITLESTRING (" %s%s pairs" , tnames[isp].c_str (), tnames[jsp].c_str ()), kTH3F , {phiAxis, phiAxis, deltaPhiAxis});
611+ }
612+ }
613+ }
614+
615+ template <efficiencyandqatask::KindOfData kindOfData, typename CollisionsObject, typename TracksObject>
616+ void processTrackPairs (TracksObject const & tracks1, TracksObject const & tracks2)
617+ {
618+ using namespace efficiencyandqatask ;
619+ using namespace analysis ::dptdptfilter;
620+
621+ /* we should only receive accepted tracks */
622+ for (auto const & track1 : tracks1) {
623+ for (auto const & track2 : tracks2) {
624+ /* checking the same track id condition */
625+ if (track1 == track2) {
626+ /* exclude autocorrelations */
627+ continue ;
628+ }
629+ float deltaPhi = RecoDecay::constrainAngle (track1.phi () - track2.phi ());
630+ float deltaEta = track1.eta () - track2.eta ();
631+ fhPhiPhiA[kindOfData][track1.trackacceptedid ()][track2.trackacceptedid ()]->Fill (track1.phi (), track2.phi ());
632+ fhDeltaPhiVsPhiPhiA[kindOfData][track1.trackacceptedid ()][track2.trackacceptedid ()]->Fill (track1.phi (), track2.phi (), deltaPhi);
633+ fhEtaEtaA[kindOfData][track1.trackacceptedid ()][track2.trackacceptedid ()]->Fill (track1.eta (), track2.eta ());
634+ fhDeltaEtaVsEtaEtaA[kindOfData][track1.trackacceptedid ()][track2.trackacceptedid ()]->Fill (track1.eta (), track2.eta (), deltaEta);
635+ }
636+ }
637+ }
638+ };
639+
572640/* the PID data collecting engine */
573641struct PidDataCollectingEngine {
574642 uint nsp = static_cast <uint>(efficiencyandqatask::tnames.size());
@@ -850,6 +918,7 @@ struct DptDptEfficiencyAndQc {
850918
851919 /* the data collecting engine instances */
852920 QADataCollectingEngine** qaDataCE;
921+ QAExtraDataCollectingEngine** qaExtraDataCE;
853922 PidDataCollectingEngine** pidDataCE;
854923 PidExtraDataCollectingEngine** pidExtraDataCE;
855924
@@ -892,11 +961,13 @@ struct DptDptEfficiencyAndQc {
892961
893962 /* do nothing if not active */
894963 if (!doprocessDetectorLevelNotStored &&
964+ !doprocessExtraDetectorLevelNotStored &&
895965 !doprocessDetectorLevelNotStoredPID &&
896966 !doprocessDetectorLevelNotStoredTunedOnDataPID &&
897967 !doprocessDetectorLevelNotStoredPIDExtra &&
898968 !doprocessDetectorLevelNotStoredTunedOnDataPIDExtra &&
899969 !doprocessGeneratorLevelNotStored &&
970+ !doprocessExtraGeneratorLevelNotStored &&
900971 !doprocessReconstructedNotStored &&
901972 !doprocessReconstructedNotStoredPID &&
902973 !doprocessReconstructedNotStoredPIDExtra) {
@@ -982,13 +1053,17 @@ struct DptDptEfficiencyAndQc {
9821053 widthNSigmaBin = cfgWidthNSigmaBin.value ;
9831054 noOfNSigmaBins = static_cast <int >((maxNSigma - minNSigma) / widthNSigmaBin);
9841055
985- bool doBasicAnalysis = doprocessDetectorLevelNotStored || doprocessReconstructedNotStored;
1056+ bool doBasicAnalysis = doprocessDetectorLevelNotStored || doprocessReconstructedNotStored || doprocessGeneratorLevelNotStored;
1057+ bool doExtraAnalysis = doprocessExtraDetectorLevelNotStored || doprocessExtraReconstructedNotStored || doprocessExtraGeneratorLevelNotStored;
9861058 bool doPidAnalysis = doprocessDetectorLevelNotStoredPID || doprocessDetectorLevelNotStoredTunedOnDataPID || doprocessReconstructedNotStoredPID;
9871059 bool doPidExtraAnalysis = doprocessDetectorLevelNotStoredPIDExtra || doprocessDetectorLevelNotStoredTunedOnDataPIDExtra || doprocessReconstructedNotStoredPIDExtra;
9881060
9891061 if (doBasicAnalysis) {
9901062 qaDataCE = new QADataCollectingEngine*[ncmranges];
9911063 }
1064+ if (doExtraAnalysis) {
1065+ qaExtraDataCE = new QAExtraDataCollectingEngine*[ncmranges];
1066+ }
9921067 if (doPidAnalysis) {
9931068 pidDataCE = new PidDataCollectingEngine*[ncmranges];
9941069 }
@@ -1014,6 +1089,11 @@ struct DptDptEfficiencyAndQc {
10141089 initializeCEInstance (dce, TString::Format (" EfficiencyAndQaData-%d-%d" , static_cast <int >(min), static_cast <int >(max)), *registrybank[i]);
10151090 return dce;
10161091 };
1092+ auto buildQACEExtraInstance = [&](float min, float max) {
1093+ auto * dce = new QAExtraDataCollectingEngine ();
1094+ initializeCEInstance (dce, TString::Format (" EfficiencyAndQaExtraData-%d-%d" , static_cast <int >(min), static_cast <int >(max)), *registrybank[i]);
1095+ return dce;
1096+ };
10171097 auto buildPidCEInstance = [&](float min, float max) {
10181098 auto * dce = new PidDataCollectingEngine ();
10191099 initializeCEInstance (dce, TString::Format (" EfficiencyAndPidData-%d-%d" , static_cast <int >(min), static_cast <int >(max)), *pidregistrybank[i]);
@@ -1028,6 +1108,9 @@ struct DptDptEfficiencyAndQc {
10281108 if (doBasicAnalysis) {
10291109 qaDataCE[ncmranges - i - 1 ] = buildQACEInstance (fCentMultMin [ncmranges - i - 1 ], fCentMultMax [ncmranges - i - 1 ]);
10301110 }
1111+ if (doExtraAnalysis) {
1112+ qaExtraDataCE[ncmranges - i - 1 ] = buildQACEExtraInstance (fCentMultMin [ncmranges - i - 1 ], fCentMultMax [ncmranges - i - 1 ]);
1113+ }
10311114 if (doPidAnalysis) {
10321115 pidDataCE[ncmranges - i - 1 ] = buildPidCEInstance (fCentMultMin [ncmranges - i - 1 ], fCentMultMax [ncmranges - i - 1 ]);
10331116 }
@@ -1075,6 +1158,9 @@ struct DptDptEfficiencyAndQc {
10751158 if constexpr (kindOfProcess == kBASIC ) {
10761159 qaDataCE[ixDCE]->newCollision <kindOfData>();
10771160 }
1161+ if constexpr (kindOfProcess == kEXTRA ) {
1162+ qaExtraDataCE[ixDCE]->processTrackPairs <kindOfData, FilteredCollisions>(tracks, tracks);
1163+ }
10781164 for (auto const & track : tracks) {
10791165 float tpcmom = track.p ();
10801166 float tofmom = track.p ();
@@ -1109,6 +1195,7 @@ struct DptDptEfficiencyAndQc {
11091195 using TofPID = soa::Join<aod::pidTOFFullEl, aod::pidTOFFullMu, aod::pidTOFFullPi, aod::pidTOFFullKa, aod::pidTOFFullPr, aod::TOFSignal, aod::pidTOFbeta, aod::pidTOFmass>;
11101196
11111197 Filter onlyacceptedcollisions = (aod::dptdptfilter::collisionaccepted == uint8_t (true ));
1198+ Filter onlyacceptedtracks = (aod::dptdptfilter::trackacceptedid >= int8_t (0 ));
11121199
11131200 void processReconstructedNotStored (soa::Filtered<soa::Join<aod::Collisions, aod::DptDptCFCollisionsInfo>>::iterator const & collision,
11141201 soa::Join<aod::FullTracks, aod::DptDptCFTracksInfo, aod::TrackSelection> const & tracks)
@@ -1138,6 +1225,34 @@ struct DptDptEfficiencyAndQc {
11381225 }
11391226 PROCESS_SWITCH (DptDptEfficiencyAndQc, processGeneratorLevelNotStored, " Process MC generator level efficiency and QA for not stored derived data" , true );
11401227
1228+ void processExtraReconstructedNotStored (soa::Filtered<soa::Join<aod::Collisions, aod::DptDptCFCollisionsInfo>>::iterator const & collision,
1229+ soa::Filtered<soa::Join<aod::FullTracks, aod::DptDptCFTracksInfo, aod::TrackSelection>> const & tracks)
1230+ {
1231+ using namespace efficiencyandqatask ;
1232+
1233+ processTracks<soa::Filtered<soa::Join<aod::Collisions, aod::DptDptCFCollisionsInfo>>, kEXTRA , kReco >(collision, tracks);
1234+ }
1235+ PROCESS_SWITCH (DptDptEfficiencyAndQc, processExtraReconstructedNotStored, " Process reconstructed extra efficiency and QA for not stored derived data" , false );
1236+
1237+ void processExtraDetectorLevelNotStored (soa::Filtered<soa::Join<aod::Collisions, aod::DptDptCFCollisionsInfo>>::iterator const & collision,
1238+ soa::Filtered<soa::Join<aod::FullTracks, aod::DptDptCFTracksInfo, aod::TrackSelection, aod::McTrackLabels>> const & tracks,
1239+ soa::Join<aod::McParticles, aod::DptDptCFGenTracksInfo> const &)
1240+ {
1241+ using namespace efficiencyandqatask ;
1242+
1243+ processTracks<soa::Filtered<soa::Join<aod::Collisions, aod::DptDptCFCollisionsInfo>>, kEXTRA , kReco >(collision, tracks);
1244+ }
1245+ PROCESS_SWITCH (DptDptEfficiencyAndQc, processExtraDetectorLevelNotStored, " Process MC detector level extra efficiency and QA for not stored derived data" , false );
1246+
1247+ void processExtraGeneratorLevelNotStored (soa::Filtered<soa::Join<aod::McCollisions, aod::DptDptCFGenCollisionsInfo>>::iterator const & collision,
1248+ soa::Filtered<soa::Join<aod::McParticles, aod::DptDptCFGenTracksInfo>> const & particles)
1249+ {
1250+ using namespace efficiencyandqatask ;
1251+
1252+ processTracks<soa::Filtered<soa::Join<aod::McCollisions, aod::DptDptCFGenCollisionsInfo>>, kEXTRA , kGen >(collision, particles);
1253+ }
1254+ PROCESS_SWITCH (DptDptEfficiencyAndQc, processExtraGeneratorLevelNotStored, " Process MC generator level extra efficiency and QA for not stored derived data" , true );
1255+
11411256 void processReconstructedNotStoredPID (soa::Filtered<soa::Join<aod::Collisions, aod::DptDptCFCollisionsInfo>>::iterator const & collision,
11421257 soa::Join<aod::FullTracks, aod::DptDptCFTracksInfo, aod::TrackSelection, TpcPID, TofPID> const & tracks)
11431258 {
0 commit comments