@@ -104,6 +104,8 @@ struct AnalysisEnergyCorrelator {
104104 Configurable<std::string> fConfigTrackCuts {" cfgTrackCuts" , " electronSelection1_ionut" , " Comma separated list of barrel track cuts for electrons" };
105105 Configurable<std::string> fConfigTrackCutsJSON {" cfgTrackCutsJSON" , " " , " Additional track cuts in JSON" };
106106 Configurable<std::string> fConfigAddTrackHistogram {" cfgAddTrackHistogram" , " " , " Track histograms" };
107+ Configurable<std::string> fConfigMCRecTrackSignals {" cfgMCRecTrackSignals" , " " , " Comma separated list of MC signals (reconstructed)" };
108+ Configurable<std::string> fConfigMCRecTrackSignalsJSON {" cfgMCRecTrackSignalsJSON" , " " , " Additional list of MC signals (reconstructed) via JSON" };
107109 Configurable<bool > fConfigTrackQA {" cfgTrackQA" , false , " If true, fill Track QA histograms" };
108110 } fConfigTrackOptions ;
109111
@@ -155,12 +157,14 @@ struct AnalysisEnergyCorrelator {
155157 std::vector<TString> fTrackCutNames ;
156158 std::vector<TString> fHadronCutNames ;
157159 std::vector<TString> fHistNamesReco ;
160+ std::vector<TString> fHistNamesMCMatched ;
158161
159162 std::map<int , std::vector<TString>> fTrackHistNames ;
160163 std::map<int , std::vector<TString>> fBarrelHistNamesMCmatched ;
161164 std::map<int64_t , bool > fSelMap ;
162165
163- std::vector<MCSignal*> fRecMCSignals ; // MC signals for reconstructed pairs
166+ std::vector<MCSignal*> fRecMCTrackSignals ; // MC signals for reconstructed tracks
167+ std::vector<MCSignal*> fRecMCSignals ; // MC signals for reconstructed pairs
164168 std::vector<MCSignal*> fGenMCSignals ;
165169 std::vector<MCSignal*> fRecMCTripleSignals ; // MC signals for reconstructed triples
166170
@@ -175,8 +179,8 @@ struct AnalysisEnergyCorrelator {
175179
176180 TH2F* hAcceptance_rec;
177181 TH2F* hAcceptance_gen;
178- TH1F * hEfficiency_dilepton;
179- TH1F * hEfficiency_hadron;
182+ TH2F * hEfficiency_dilepton;
183+ TH2F * hEfficiency_hadron;
180184 TH1F* hMasswindow;
181185
182186 void init (o2::framework::InitContext& context)
@@ -332,6 +336,28 @@ struct AnalysisEnergyCorrelator {
332336 }
333337 }
334338
339+ // TODO: create a std::vector of hist classes to be used at Fill time, to avoid using Form in the process function
340+ TString sigRecTrackNamesStr = fConfigTrackOptions .fConfigMCRecTrackSignals .value ;
341+ std::unique_ptr<TObjArray> objRecTrackSigArray (sigRecTrackNamesStr.Tokenize (" ," ));
342+ for (int isig = 0 ; isig < objRecTrackSigArray->GetEntries (); isig++) {
343+ MCSignal* sig_RecTrack = o2::aod::dqmcsignals::GetMCSignal (objRecTrackSigArray->At (isig)->GetName ());
344+ if (sig_RecTrack) {
345+ fRecMCTrackSignals .push_back (sig_RecTrack);
346+ }
347+ }
348+
349+ // Add the MCSignals from the JSON config
350+ TString addRecTrackSignalsGenStr = fConfigTrackOptions .fConfigMCRecTrackSignalsJSON .value ;
351+ if (addRecTrackSignalsGenStr != " " ) {
352+ std::vector<MCSignal*> addMCRecTrackSignals = dqmcsignals::GetMCSignalsFromJSON (addRecTrackSignalsGenStr.Data ());
353+ for (auto & mcIt : addMCRecTrackSignals) {
354+ if (mcIt->GetNProngs () > 2 ) { // NOTE: only 2 prong signals
355+ continue ;
356+ }
357+ fRecMCTrackSignals .push_back (mcIt);
358+ }
359+ }
360+
335361 VarManager::SetUseVars (AnalysisCut::fgUsedVars);
336362
337363 fHistMan = new HistogramManager (" analysisHistos" , " " , VarManager::kNVars );
@@ -352,6 +378,11 @@ struct AnalysisEnergyCorrelator {
352378 TString nameStr = Form (" AssocsBarrel_%s" , cut->GetName ());
353379 fHistNamesReco .push_back (nameStr);
354380 histClasses += Form (" %s;" , nameStr.Data ());
381+ for (auto & sig : fRecMCTrackSignals ) {
382+ TString nameStr2 = Form (" AssocsBarrelMatched_%s_%s" , cut->GetName (), sig->GetName ());
383+ fHistNamesMCMatched .push_back (nameStr2);
384+ histClasses += Form (" %s;" , nameStr2.Data ());
385+ }
355386 }
356387 DefineHistograms (fHistMan , histClasses.Data (), fConfigTrackOptions .fConfigAddTrackHistogram .value .data ());
357388 }
@@ -435,8 +466,8 @@ struct AnalysisEnergyCorrelator {
435466 if (!listAccs) {
436467 LOG (fatal) << " Problem getting TList object with efficiencies!" ;
437468 }
438- hEfficiency_dilepton = static_cast <TH1F *>(listAccs->FindObject (" hEfficiency_dilepton" ));
439- hEfficiency_hadron = static_cast <TH1F *>(listAccs->FindObject (" hEfficiency_hadron" ));
469+ hEfficiency_dilepton = static_cast <TH2F *>(listAccs->FindObject (" hEfficiency_dilepton" ));
470+ hEfficiency_hadron = static_cast <TH2F *>(listAccs->FindObject (" hEfficiency_hadron" ));
440471 hAcceptance_rec = static_cast <TH2F*>(listAccs->FindObject (" hAcceptance_rec" ));
441472 hAcceptance_gen = static_cast <TH2F*>(listAccs->FindObject (" hAcceptance_gen" ));
442473 hMasswindow = static_cast <TH1F*>(listAccs->FindObject (" hMasswindow" ));
@@ -479,9 +510,9 @@ struct AnalysisEnergyCorrelator {
479510 float deltaphi = RecoDecay::constrainAngle (dilepton_phi - hadron_phi, -0.5 * o2::constants::math::PI);
480511 Effweight_rec = hAcceptance_rec->Interpolate (dilepton_eta - hadron_eta, deltaphi);
481512 Accweight_gen = hAcceptance_gen->Interpolate (dilepton_eta - hadron_eta, deltaphi);
482- float Effdilepton = hEfficiency_dilepton->Interpolate (VarManager::fgValues[VarManager::kPt ]);
513+ float Effdilepton = hEfficiency_dilepton->Interpolate (VarManager::fgValues[VarManager::kPt ], dilepton_eta );
483514 float Masswindow = hMasswindow->Interpolate (VarManager::fgValues[VarManager::kPt ]);
484- float Effhadron = hEfficiency_hadron->Interpolate (hadron.pt ());
515+ float Effhadron = hEfficiency_hadron->Interpolate (hadron.pt (), hadron. eta () );
485516 Accweight_gen = Accweight_gen * Effdilepton * Effhadron;
486517 if (fConfigDileptonHadronOptions .fConfigApplyEfficiencyME ) {
487518 Effweight_rec = Effdilepton * Effhadron * Masswindow; // for the moment, apply the efficiency correction also for the mixed event pairs, but this can be changed in case we want to apply it only for the same event pairs
@@ -647,17 +678,32 @@ struct AnalysisEnergyCorrelator {
647678 fHistMan ->FillHistClass (" AssocsBarrel_BeforeCuts" , VarManager::fgValues);
648679 }
649680
681+ uint32_t mcDecision = static_cast <uint32_t >(0 );
682+ // run MC matching for this pair
683+ int isig = 0 ;
684+ mcDecision = 0 ;
685+ for (auto sig = fRecMCTrackSignals .begin (); sig != fRecMCTrackSignals .end (); sig++, isig++) {
686+ if (t1.has_mcParticle ()) {
687+ if ((*sig)->CheckSignal (true , t1.mcParticle ())) {
688+ mcDecision |= (static_cast <uint32_t >(1 ) << isig);
689+ }
690+ }
691+ }
650692 // Apply electron cuts and fill histograms
651693 int iCut1 = 0 ;
652694 for (auto cut1 = fTrackCuts .begin (); cut1 != fTrackCuts .end (); cut1++, iCut1++) {
653695 if ((*cut1)->IsSelected (VarManager::fgValues)) {
654696 filter1 |= (static_cast <uint32_t >(1 ) << iCut1);
655697 if (fConfigTrackOptions .fConfigTrackQA ) {
656698 fHistMan ->FillHistClass (fHistNamesReco [iCut1], VarManager::fgValues);
699+ for (size_t isig = 0 ; isig < fRecMCTrackSignals .size (); isig++) { // loop over MC signals
700+ if (mcDecision & (static_cast <uint32_t >(1 ) << isig)) {
701+ fHistMan ->FillHistClass (fHistNamesMCMatched [iCut1 * fRecMCTrackSignals .size () + isig], VarManager::fgValues); // matched signal
702+ }
703+ }
657704 }
658705 }
659706 }
660-
661707 // Check opposite charge with t2
662708 for (auto & a2 : groupedAssocs) {
663709 auto t2 = a2.template track_as <MyBarrelTracksWithCov>();
0 commit comments