Skip to content

Commit 60c9177

Browse files
committed
implemented mass reco by KFParticle and changed name of parameters
1 parent 08aeb42 commit 60c9177

File tree

2 files changed

+115
-25
lines changed

2 files changed

+115
-25
lines changed

PWGHF/HFL/Tasks/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
o2physics_add_dpl_workflow(task-electron-weak-boson
1313
SOURCES taskElectronWeakBoson.cxx
14-
PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::EventFilteringUtils
14+
PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::EventFilteringUtils KFParticle::KFParticle
1515
COMPONENT_NAME Analysis)
1616

1717
o2physics_add_dpl_workflow(task-muon-charm-beauty-separation

PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx

Lines changed: 114 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,31 +12,46 @@
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

4156
using namespace o2;
4257
using 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

Comments
 (0)