1212// / \file taskElectronWeakBoson.cxx
1313// / \brief task for WeakBoson (W/Z) based on electron in mid-rapidity
1414// / \author S. Sakai & S. Ito (Univ. of Tsukuba)
15- #include < vector>
16- #include < string>
17-
18- #include " CCDB/BasicCCDBManager.h"
15+ #ifndef HomogeneousField
16+ #define HomogeneousField // o2-linter: disable=name/macro (required by KFParticle)
17+ #endif
1918
20- #include " Framework/runDataProcessing.h"
21- #include " Framework/AnalysisTask.h"
22- #include " Framework/ASoAHelpers.h"
19+ #include " PWGHF/Core/HfHelper.h"
20+ #include " PWGJE/DataModel/EMCALClusters.h"
2321
24- #include " EMCALBase/Geometry.h"
25- #include " EMCALCalib/BadChannelMap.h"
22+ #include " Common/Core/RecoDecay.h"
23+ #include " Common/Core/TrackSelection.h"
24+ #include " Common/Core/trackUtilities.h"
25+ #include " Common/DataModel/EventSelection.h"
26+ #include " Common/DataModel/PIDResponse.h"
27+ #include " Common/DataModel/TrackSelectionTables.h"
28+ #include " EventFiltering/Zorro.h"
29+ #include " Tools/KFparticle/KFUtilities.h"
2630
31+ #include " CCDB/BasicCCDBManager.h"
32+ #include " DataFormatsEMCAL/AnalysisCluster.h"
2733#include " DataFormatsEMCAL/Cell.h"
2834#include " DataFormatsEMCAL/Constants.h"
29- #include " DataFormatsEMCAL/AnalysisCluster.h"
35+ #include " DataFormatsParameters/GRPMagField.h"
36+ #include " DataFormatsParameters/GRPObject.h"
37+ #include " DetectorsBase/GeometryManager.h"
38+ #include " DetectorsBase/Propagator.h"
39+ #include " EMCALBase/Geometry.h"
40+ #include " EMCALCalib/BadChannelMap.h"
41+ #include " Framework/ASoAHelpers.h"
42+ #include " Framework/AnalysisTask.h"
43+ #include " Framework/runDataProcessing.h"
3044
31- #include " Common/Core/RecoDecay.h"
32- #include " Common/DataModel/EventSelection.h"
33- #include " Common/DataModel/TrackSelectionTables.h"
34- #include " Common/DataModel/PIDResponse.h"
45+ #include " TPDGCode.h"
3546
36- #include " EventFiltering/Zorro.h"
47+ #include " KFPTrack.h"
48+ #include " KFPVertex.h"
49+ #include " KFParticle.h"
50+ #include " KFParticleBase.h"
51+ #include " KFVertex.h"
3752
38- #include " PWGJE/DataModel/EMCALClusters.h "
39- #include " PWGHF/Core/HfHelper.h "
53+ #include < string >
54+ #include < vector >
4055
4156using namespace o2 ;
4257using namespace o2 ::framework;
@@ -52,9 +67,9 @@ struct HfTaskElectronWeakBoson {
5267
5368 Configurable<float > vtxZ{" vtxZ" , 10 .f , " " };
5469
55- Configurable<float > etaTrLow{ " etaTrLow " , -1 .0f , " minimun track eta" };
56- Configurable<float > etaTrUp{ " etaTrUp " , 1 .0f , " maximum track eta" };
57- Configurable<float > etaEmcAcc{ " etaEmcAcc " , 0 .6f , " maximum track eta" };
70+ Configurable<float > etaTrMim{ " etaTrMim " , -1 .0f , " minimun track eta" };
71+ Configurable<float > etaTrMax{ " etaTrMax " , 1 .0f , " maximum track eta" };
72+ Configurable<float > etaEmcMax{ " etaEmcMax " , 0 .6f , " maximum track eta" };
5873 Configurable<float > dcaxyMax{" dcaxyMax" , 2 .0f , " mximum DCA xy" };
5974 Configurable<float > chi2ItsMax{" chi2ItsMax" , 15 .0f , " its chi2 cut" };
6075 Configurable<float > ptMin{" ptMin" , 3 .0f , " minimum pT cut" };
@@ -90,8 +105,15 @@ struct HfTaskElectronWeakBoson {
90105 Configurable<bool > cfgSkimmedProcessing{" cfgSkimmedProcessing" , true , " Enables processing of skimmed datasets" };
91106 Configurable<std::string> cfgTriggerName{" cfgTriggerName" , " fGammaHighPtEMCAL" , " Trigger of interest (comma separated for multiple)" };
92107
93- // CCDB service object
108+ // CCDB service configurations
94109 Configurable<std::string> cfgCCDBPath{" cfgCCDBPath" , " Users/m/mpuccio/EventFiltering/OTS/" , " Path to CCDB for trigger data" };
110+ Configurable<std::string> ccdbPathGrpMag{" ccdbPathGrpMag" , " GLO/Config/GRPMagField" , " CCDB path of the GRPMagField object (Run 3)" };
111+
112+ // KFParticle
113+ Configurable<int > kfConstructMethod{" kfConstructMethod" , 2 , " KF Construct Method" };
114+ Configurable<int > kfChisqMassMax{" kfChisqMassMax" , 10 , " Chi2 Max for mass reco by KF particle" };
115+
116+ // CCDB service object
95117 Service<o2::ccdb::BasicCCDBManager> ccdb;
96118
97119 struct HfElectronCandidate {
@@ -104,10 +126,12 @@ struct HfTaskElectronWeakBoson {
104126 };
105127 std::vector<HfElectronCandidate> selectedElectronsIso;
106128 std::vector<HfElectronCandidate> selectedElectronsAss;
129+ std::vector<HfElectronCandidate> reconstructedZ;
107130
108131 using SelectedClusters = o2::aod::EMCALClusters;
109132 // PbPb
110- using TrackEle = o2::soa::Join<o2::aod::Tracks, o2::aod::FullTracks, o2::aod::TracksExtra, o2::aod::TracksDCA, o2::aod::TrackSelection, o2::aod::pidTPCFullEl>;
133+ // using TrackEle = o2::soa::Join<o2::aod::Tracks, o2::aod::FullTracks, o2::aod::TracksExtra, o2::aod::TracksDCA, o2::aod::TrackSelection, o2::aod::pidTPCFullEl>;
134+ using TrackEle = o2::soa::Join<o2::aod::Tracks, o2::aod::TracksCov, o2::aod::FullTracks, o2::aod::TracksExtra, o2::aod::TracksDCA, o2::aod::TrackSelection, o2::aod::pidTPCFullEl>;
111135
112136 // pp
113137 // using TrackEle = o2::soa::Filtered<o2::soa::Join<o2::aod::Tracks, o2::aod::FullTracks, o2::aod::TracksDCA, o2::aod::TrackSelection, o2::aod::pidTPCEl, o2::aod::pidTOFEl>>;
@@ -116,7 +140,7 @@ struct HfTaskElectronWeakBoson {
116140 Filter eventFilter = (o2::aod::evsel::sel8 == true );
117141 Filter posZFilter = (nabs(o2::aod::collision::posZ) < vtxZ);
118142
119- Filter etafilter = (aod::track::eta < etaTrUp ) && (aod::track::eta > etaTrLow );
143+ Filter etafilter = (aod::track::eta < etaTrMax ) && (aod::track::eta > etaTrMim );
120144 Filter dcaxyfilter = (nabs(aod::track::dcaXY) < dcaxyMax);
121145 Filter filterGlobalTr = requireGlobalTrackInFilter();
122146
@@ -201,6 +225,8 @@ struct HfTaskElectronWeakBoson {
201225 registry.add (" hIsolationTrack" , " Isolation Track" , kTH2F , {{axisE}, {axisIsoTrack}});
202226 registry.add (" hInvMassZeeLs" , " invariant mass for Z LS pair" , kTH2F , {{axisPt}, {axisInvMassZ}});
203227 registry.add (" hInvMassZeeUls" , " invariant mass for Z ULS pair" , kTH2F , {{axisPt}, {axisInvMassZ}});
228+ registry.add (" hKfInvMassZeeLs" , " invariant mass for Z LS pair KFp" , kTH2F , {{axisPt}, {axisInvMassZ}});
229+ registry.add (" hKfInvMassZeeUls" , " invariant mass for Z ULS pair KFp" , kTH2F , {{axisPt}, {axisInvMassZ}});
204230 registry.add (" hTHnElectrons" , " electron info" , HistType::kTHnSparseF , {axisPt, axisNsigma, axisM02, axisEop, axisIsoEnergy, axisIsoTrack});
205231 registry.add (" hTHnTrMatch" , " Track EMC Match" , HistType::kTHnSparseF , {axisPt, axisdPhi, axisdEta});
206232
@@ -266,6 +292,56 @@ struct HfTaskElectronWeakBoson {
266292 return (trackCount);
267293 }
268294
295+ void recoMassZee (KFParticle kfpIsoEle,
296+ int charge,
297+ TrackEle const & tracks)
298+ {
299+ // LOG(info) << "Invarimass cal by KF particle ";
300+ for (const auto & track : tracks) {
301+
302+ if (track.pt () < ptZeeMin)
303+ continue ;
304+ if (std::abs (track.tpcNSigmaEl ()) > nsigTpcMax)
305+ continue ;
306+ if (std::abs (track.eta ()) > etaTrMax)
307+ continue ;
308+
309+ int pdgAss = kElectron ;
310+ if (track.sign () > 0 ) {
311+ pdgAss = kPositron ;
312+ }
313+
314+ KFPTrack kfpTrackAssEle = createKFPTrackFromTrack (track);
315+ KFParticle kfpAssEle (kfpTrackAssEle, pdgAss);
316+ const KFParticle* electronPairs[2 ] = {&kfpIsoEle, &kfpAssEle};
317+ KFParticle zeeKF;
318+ zeeKF.SetConstructMethod (kfConstructMethod);
319+ zeeKF.Construct (electronPairs, 2 );
320+ // LOG(info) << "Invarimass cal by KF particle Chi2/NDF = " << zeeKF.GetChi2()/zeeKF.GetNDF();
321+ float massZeeChi2 = zeeKF.GetChi2 () / zeeKF.GetNDF ();
322+ if (zeeKF.GetNDF () < 1 )
323+ continue ;
324+ if (std::abs (massZeeChi2) > kfChisqMassMax)
325+ continue ;
326+ float massZee, massZeeErr;
327+ zeeKF.GetMass (massZee, massZeeErr);
328+ // LOG(info) << "Invarimass cal by KF particle mass = " << massZee;
329+
330+ if (track.sign () * charge > 0 ) {
331+ registry.fill (HIST (" hKfInvMassZeeLs" ), kfpIsoEle.GetPt (), massZee);
332+ } else {
333+ registry.fill (HIST (" hKfInvMassZeeUls" ), kfpIsoEle.GetPt (), massZee);
334+ }
335+
336+ reconstructedZ.emplace_back (
337+ zeeKF.GetPt (),
338+ zeeKF.GetEta (),
339+ zeeKF.GetPhi (),
340+ massZee,
341+ track.sign () * charge);
342+ }
343+ }
344+
269345 void process (soa::Filtered<aod::Collisions>::iterator const & collision,
270346 aod::BCsWithTimestamps const &,
271347 SelectedClusters const & emcClusters,
@@ -294,6 +370,14 @@ struct HfTaskElectronWeakBoson {
294370 zorro.initCCDB (ccdb.service , runNumber, currentTimestamp, cfgTriggerName);
295371 isFirstEvent = false ;
296372 lastRunNumber = runNumber;
373+
374+ // initialize magnetic field
375+ o2::parameters::GRPMagField* grpo = ccdb->getForTimeStamp <o2::parameters::GRPMagField>(ccdbPathGrpMag, currentTimestamp);
376+ o2::base::Propagator::initFieldFromGRP (grpo);
377+ double magneticField = o2::base::Propagator::Instance ()->getNominalBz ();
378+ LOG (info) << " magneticField = " << magneticField;
379+ if (magneticField)
380+ KFParticle::SetField (magneticField);
297381 }
298382
299383 // Check if this is a triggered event using Zorro
@@ -310,6 +394,7 @@ struct HfTaskElectronWeakBoson {
310394 // initialze for inclusive-electron
311395 selectedElectronsIso.clear ();
312396 selectedElectronsAss.clear ();
397+ reconstructedZ.clear ();
313398
314399 registry.fill (HIST (" hEventCounter" ), 0.5 );
315400
@@ -321,7 +406,7 @@ struct HfTaskElectronWeakBoson {
321406
322407 for (const auto & track : tracks) {
323408
324- if (std::abs (track.eta ()) > etaTrUp )
409+ if (std::abs (track.eta ()) > etaTrMax )
325410 continue ;
326411 if (track.tpcNClsCrossedRows () < nclcrossTpcMin)
327412 continue ;
@@ -363,7 +448,7 @@ struct HfTaskElectronWeakBoson {
363448 // continue;
364449 if (track.phi () < phiEmcMin || track.phi () > phiEmcMax)
365450 continue ;
366- if (std::abs (track.eta ()) > etaEmcAcc )
451+ if (std::abs (track.eta ()) > etaEmcMax )
367452 continue ;
368453 auto tracksofcluster = matchedtracks.sliceBy (perClusterMatchedTracks, track.globalIndex ());
369454
@@ -441,6 +526,13 @@ struct HfTaskElectronWeakBoson {
441526 registry.fill (HIST (" hEopIsolation" ), match.track_as <TrackEle>().pt (), eop);
442527
443528 if (match.track_as <TrackEle>().pt () > ptZeeMin) {
529+ int pdgIso = kElectron ;
530+ if (match.track_as <TrackEle>().sign () > 0 ) {
531+ pdgIso = kPositron ;
532+ }
533+ KFPTrack kfpTrackIsoEle = createKFPTrackFromTrack (match.track_as <TrackEle>());
534+ KFParticle kfpIsoEle (kfpTrackIsoEle, pdgIso);
535+ recoMassZee (kfpIsoEle, match.track_as <TrackEle>().sign (), tracks);
444536
445537 selectedElectronsIso.emplace_back (
446538 match.track_as <TrackEle>().pt (),
0 commit comments