Skip to content

Commit 4e47704

Browse files
authored
[PWGHF] implemented mass reco by KFParticle and changed name of parameters (#11760)
1 parent ee36e4d commit 4e47704

File tree

2 files changed

+118
-26
lines changed

2 files changed

+118
-26
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: 117 additions & 25 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>
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

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"};
@@ -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

Comments
 (0)