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>
15+ #ifndef HomogeneousField
16+ #define HomogeneousField // o2-linter: disable=name/macro (required by KFParticle)
17+ #endif
1718
18- #include " CCDB/BasicCCDBManager.h"
19+ #include " PWGHF/Core/HfHelper.h"
20+ #include " PWGJE/DataModel/EMCALClusters.h"
1921
20- #include " Framework/runDataProcessing.h"
21- #include " Framework/AnalysisTask.h"
22- #include " Framework/ASoAHelpers.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"
2330
31+ #include " CCDB/BasicCCDBManager.h"
32+ #include " DataFormatsEMCAL/AnalysisCluster.h"
33+ #include " DataFormatsEMCAL/Cell.h"
34+ #include " DataFormatsEMCAL/Constants.h"
35+ #include " DataFormatsParameters/GRPMagField.h"
36+ #include " DataFormatsParameters/GRPObject.h"
37+ #include " DetectorsBase/GeometryManager.h"
38+ #include " DetectorsBase/Propagator.h"
2439#include " EMCALBase/Geometry.h"
2540#include " EMCALCalib/BadChannelMap.h"
41+ #include " Framework/ASoAHelpers.h"
42+ #include " Framework/AnalysisTask.h"
43+ #include " Framework/runDataProcessing.h"
2644
27- #include " DataFormatsEMCAL/Cell.h"
28- #include " DataFormatsEMCAL/Constants.h"
29- #include " DataFormatsEMCAL/AnalysisCluster.h"
45+ #include " TPDGCode.h"
3046
31- #include " Common/Core/RecoDecay.h"
32- #include " Common/DataModel/EventSelection.h"
33- #include " Common/DataModel/TrackSelectionTables.h"
34- #include " Common/DataModel/PIDResponse.h"
35-
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" };
@@ -92,8 +107,13 @@ struct HfTaskElectronWeakBoson {
92107
93108 // CCDB service object
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)" };
95111 Service<o2::ccdb::BasicCCDBManager> ccdb;
96112
113+ // KFParticle
114+ Configurable<int > kfConstructMethod{" kfConstructMethod" , 2 , " KF Construct Method" };
115+ Configurable<int > kfChisqMassMax{" kfChisqMassMax" , 10 , " Chi2 Max for mass reco by KF particle" };
116+
97117 struct HfElectronCandidate {
98118 float pt, eta, phi, energy;
99119 int charge;
@@ -104,10 +124,12 @@ struct HfTaskElectronWeakBoson {
104124 };
105125 std::vector<HfElectronCandidate> selectedElectronsIso;
106126 std::vector<HfElectronCandidate> selectedElectronsAss;
127+ std::vector<HfElectronCandidate> reconstructedZ;
107128
108129 using SelectedClusters = o2::aod::EMCALClusters;
109130 // 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>;
131+ // using TrackEle = o2::soa::Join<o2::aod::Tracks, o2::aod::FullTracks, o2::aod::TracksExtra, o2::aod::TracksDCA, o2::aod::TrackSelection, o2::aod::pidTPCFullEl>;
132+ 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>;
111133
112134 // pp
113135 // 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 +138,7 @@ struct HfTaskElectronWeakBoson {
116138 Filter eventFilter = (o2::aod::evsel::sel8 == true );
117139 Filter posZFilter = (nabs(o2::aod::collision::posZ) < vtxZ);
118140
119- Filter etafilter = (aod::track::eta < etaTrUp ) && (aod::track::eta > etaTrLow );
141+ Filter etafilter = (aod::track::eta < etaTrMax ) && (aod::track::eta > etaTrMim );
120142 Filter dcaxyfilter = (nabs(aod::track::dcaXY) < dcaxyMax);
121143 Filter filterGlobalTr = requireGlobalTrackInFilter();
122144
@@ -201,6 +223,8 @@ struct HfTaskElectronWeakBoson {
201223 registry.add (" hIsolationTrack" , " Isolation Track" , kTH2F , {{axisE}, {axisIsoTrack}});
202224 registry.add (" hInvMassZeeLs" , " invariant mass for Z LS pair" , kTH2F , {{axisPt}, {axisInvMassZ}});
203225 registry.add (" hInvMassZeeUls" , " invariant mass for Z ULS pair" , kTH2F , {{axisPt}, {axisInvMassZ}});
226+ registry.add (" hKfInvMassZeeLs" , " invariant mass for Z LS pair KFp" , kTH2F , {{axisPt}, {axisInvMassZ}});
227+ registry.add (" hKfInvMassZeeUls" , " invariant mass for Z ULS pair KFp" , kTH2F , {{axisPt}, {axisInvMassZ}});
204228 registry.add (" hTHnElectrons" , " electron info" , HistType::kTHnSparseF , {axisPt, axisNsigma, axisM02, axisEop, axisIsoEnergy, axisIsoTrack});
205229 registry.add (" hTHnTrMatch" , " Track EMC Match" , HistType::kTHnSparseF , {axisPt, axisdPhi, axisdEta});
206230
@@ -266,6 +290,56 @@ struct HfTaskElectronWeakBoson {
266290 return (trackCount);
267291 }
268292
293+ void recoMassZee (KFParticle kfpIsoEle,
294+ int charge,
295+ TrackEle const & tracks)
296+ {
297+ // LOG(info) << "Invarimass cal by KF particle ";
298+ for (const auto & track : tracks) {
299+
300+ if (track.pt () < ptZeeMin)
301+ continue ;
302+ if (std::abs (track.tpcNSigmaEl ()) > nsigTpcMax)
303+ continue ;
304+ if (std::abs (track.eta ()) > etaTrMax)
305+ continue ;
306+
307+ int pdgAss = kElectron ;
308+ if (track.sign () > 0 ) {
309+ pdgAss = kPositron ;
310+ }
311+
312+ KFPTrack kfpTrackAssEle = createKFPTrackFromTrack (track);
313+ KFParticle kfpAssEle (kfpTrackAssEle, pdgAss);
314+ const KFParticle* electronPairs[2 ] = {&kfpIsoEle, &kfpAssEle};
315+ KFParticle zeeKF;
316+ zeeKF.SetConstructMethod (kfConstructMethod);
317+ zeeKF.Construct (electronPairs, 2 );
318+ // LOG(info) << "Invarimass cal by KF particle Chi2/NDF = " << zeeKF.GetChi2()/zeeKF.GetNDF();
319+ float massZeeChi2 = zeeKF.GetChi2 () / zeeKF.GetNDF ();
320+ if (zeeKF.GetNDF () < 1 )
321+ continue ;
322+ if (std::abs (massZeeChi2) > kfChisqMassMax)
323+ continue ;
324+ float massZee, massZeeErr;
325+ zeeKF.GetMass (massZee, massZeeErr);
326+ // LOG(info) << "Invarimass cal by KF particle mass = " << massZee;
327+
328+ if (track.sign () * charge > 0 ) {
329+ registry.fill (HIST (" hKfInvMassZeeLs" ), kfpIsoEle.GetPt (), massZee);
330+ } else {
331+ registry.fill (HIST (" hKfInvMassZeeUls" ), kfpIsoEle.GetPt (), massZee);
332+ }
333+
334+ reconstructedZ.emplace_back (
335+ zeeKF.GetPt (),
336+ zeeKF.GetEta (),
337+ zeeKF.GetPhi (),
338+ massZee,
339+ track.sign () * charge);
340+ }
341+ }
342+
269343 void process (soa::Filtered<aod::Collisions>::iterator const & collision,
270344 aod::BCsWithTimestamps const &,
271345 SelectedClusters const & emcClusters,
@@ -294,6 +368,14 @@ struct HfTaskElectronWeakBoson {
294368 zorro.initCCDB (ccdb.service , runNumber, currentTimestamp, cfgTriggerName);
295369 isFirstEvent = false ;
296370 lastRunNumber = runNumber;
371+
372+ // initialize magnetic field
373+ o2::parameters::GRPMagField* grpo = ccdb->getForTimeStamp <o2::parameters::GRPMagField>(ccdbPathGrpMag, currentTimestamp);
374+ o2::base::Propagator::initFieldFromGRP (grpo);
375+ double magneticField = o2::base::Propagator::Instance ()->getNominalBz ();
376+ LOG (info) << " magneticField = " << magneticField;
377+ if (magneticField)
378+ KFParticle::SetField (magneticField);
297379 }
298380
299381 // Check if this is a triggered event using Zorro
@@ -310,6 +392,7 @@ struct HfTaskElectronWeakBoson {
310392 // initialze for inclusive-electron
311393 selectedElectronsIso.clear ();
312394 selectedElectronsAss.clear ();
395+ reconstructedZ.clear ();
313396
314397 registry.fill (HIST (" hEventCounter" ), 0.5 );
315398
@@ -321,7 +404,7 @@ struct HfTaskElectronWeakBoson {
321404
322405 for (const auto & track : tracks) {
323406
324- if (std::abs (track.eta ()) > etaTrUp )
407+ if (std::abs (track.eta ()) > etaTrMax )
325408 continue ;
326409 if (track.tpcNClsCrossedRows () < nclcrossTpcMin)
327410 continue ;
@@ -363,7 +446,7 @@ struct HfTaskElectronWeakBoson {
363446 // continue;
364447 if (track.phi () < phiEmcMin || track.phi () > phiEmcMax)
365448 continue ;
366- if (std::abs (track.eta ()) > etaEmcAcc )
449+ if (std::abs (track.eta ()) > etaEmcMax )
367450 continue ;
368451 auto tracksofcluster = matchedtracks.sliceBy (perClusterMatchedTracks, track.globalIndex ());
369452
@@ -441,6 +524,13 @@ struct HfTaskElectronWeakBoson {
441524 registry.fill (HIST (" hEopIsolation" ), match.track_as <TrackEle>().pt (), eop);
442525
443526 if (match.track_as <TrackEle>().pt () > ptZeeMin) {
527+ int pdgIso = kElectron ;
528+ if (match.track_as <TrackEle>().sign () > 0 ) {
529+ pdgIso = kPositron ;
530+ }
531+ KFPTrack kfpTrackIsoEle = createKFPTrackFromTrack (match.track_as <TrackEle>());
532+ KFParticle kfpIsoEle (kfpTrackIsoEle, pdgIso);
533+ recoMassZee (kfpIsoEle, match.track_as <TrackEle>().sign (), tracks);
444534
445535 selectedElectronsIso.emplace_back (
446536 match.track_as <TrackEle>().pt (),
0 commit comments