Skip to content

Commit 85d2fe5

Browse files
authored
[PWGEM/Dilepton] add possibility to select phiPosition (#13166)
1 parent 2982a0d commit 85d2fe5

File tree

7 files changed

+168
-7
lines changed

7 files changed

+168
-7
lines changed

PWGEM/Dilepton/Core/DielectronCut.cxx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,16 @@ void DielectronCut::SetTrackPhiRange(float minPhi, float maxPhi, bool mirror, bo
100100
mRejectTrackPhi = reject;
101101
LOG(info) << "Dielectron Cut, set track phi range (rad.): " << mMinTrackPhi << " - " << mMaxTrackPhi << " with mirror: " << mMirrorTrackPhi << " and rejection: " << mRejectTrackPhi;
102102
}
103+
void DielectronCut::SetTrackPhiPositionRange(float minPhi, float maxPhi, float refR, float bz, bool mirror)
104+
{
105+
mMinTrackPhiPosition = minPhi;
106+
mMaxTrackPhiPosition = maxPhi;
107+
mRefR = refR;
108+
mBz = bz;
109+
mMirrorTrackPhi = mirror;
110+
LOG(info) << "Dielectron Cut, set track phi position range (rad.): " << mMinTrackPhiPosition << " - " << mMaxTrackPhiPosition << " at Rxy = " << mRefR << " with mirror: " << mMirrorTrackPhi;
111+
LOG(info) << "Dielectron Cut, set Bz in kG: " << mBz;
112+
}
103113
void DielectronCut::SetMinNClustersTPC(int minNClustersTPC)
104114
{
105115
mMinNClustersTPC = minNClustersTPC;

PWGEM/Dilepton/Core/DielectronCut.h

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ class DielectronCut : public TNamed
5454
kTrackPtRange,
5555
kTrackEtaRange,
5656
kTrackPhiRange,
57+
kTrackPhiPositionRange,
5758
kTPCNCls,
5859
kTPCCrossedRows,
5960
kTPCCrossedRowsOverNCls,
@@ -181,6 +182,9 @@ class DielectronCut : public TNamed
181182
if (!IsSelectedTrack(track, DielectronCuts::kTrackPhiRange)) {
182183
return false;
183184
}
185+
if (!IsSelectedTrack(track, DielectronCuts::kTrackPhiPositionRange)) {
186+
return false;
187+
}
184188
if (!IsSelectedTrack(track, DielectronCuts::kDCA3Dsigma)) {
185189
return false;
186190
}
@@ -404,6 +408,29 @@ class DielectronCut : public TNamed
404408
return mRejectTrackPhi ? !is_in_phi_range : is_in_phi_range;
405409
}
406410

411+
case DielectronCuts::kTrackPhiPositionRange: {
412+
float phiPosition = track.phi() + std::asin(-0.30282 * track.sign() * (mBz * 0.1) * mRefR / (2.f * track.pt()));
413+
414+
if (mMinTrackPhiPosition < 0.f && mMaxTrackPhiPosition < M_PI) { // threshold across 0 rad.
415+
o2::math_utils::bringToPMPi(phiPosition);
416+
bool isInAcc = mMinTrackPhiPosition < phiPosition && phiPosition < mMaxTrackPhiPosition;
417+
bool isInAccMirrored = false;
418+
if (mMirrorTrackPhi) {
419+
o2::math_utils::bringTo02Pi(phiPosition);
420+
isInAccMirrored = mMinTrackPhiPosition + M_PI < phiPosition && phiPosition < mMaxTrackPhiPosition + M_PI;
421+
}
422+
return isInAcc || isInAccMirrored;
423+
} else {
424+
o2::math_utils::bringTo02Pi(phiPosition);
425+
bool isInAcc = mMinTrackPhiPosition < phiPosition && phiPosition < mMaxTrackPhiPosition;
426+
bool isInAccMirrored = false;
427+
if (mMirrorTrackPhi) {
428+
isInAccMirrored = mMinTrackPhiPosition + M_PI < phiPosition && phiPosition < mMaxTrackPhiPosition + M_PI;
429+
}
430+
return isInAcc || isInAccMirrored;
431+
}
432+
}
433+
407434
case DielectronCuts::kTPCNCls:
408435
return track.tpcNClsFound() >= mMinNClustersTPC;
409436

@@ -462,6 +489,7 @@ class DielectronCut : public TNamed
462489
void SetTrackPtRange(float minPt = 0.f, float maxPt = 1e10f);
463490
void SetTrackEtaRange(float minEta = -1e10f, float maxEta = 1e10f);
464491
void SetTrackPhiRange(float minPhi = 0.f, float maxPhi = 2.f * M_PI, bool mirror = false, bool reject = false);
492+
void SetTrackPhiPositionRange(float minPhi, float maxPhi, float refR, float bz, bool mirror);
465493
void SetMinNClustersTPC(int minNClustersTPC);
466494
void SetMinNCrossedRowsTPC(int minNCrossedRowsTPC);
467495
void SetMinNCrossedRowsOverFindableClustersTPC(float minNCrossedRowsOverFindableClustersTPC);
@@ -547,10 +575,13 @@ class DielectronCut : public TNamed
547575
bool mRequireDiffSides{false}; // flag to require 2 tracks to be from different sides. (A-C combination). If one wants 2 tracks to be in the same side (A-A or C-C), one can simply use track eta cut.
548576

549577
// kinematic cuts
550-
float mMinTrackPt{0.f}, mMaxTrackPt{1e10f}; // range in pT
551-
float mMinTrackEta{-1e10f}, mMaxTrackEta{1e10f}; // range in eta
552-
float mMinTrackPhi{0.f}, mMaxTrackPhi{2.f * M_PI}; // range in phi
553-
bool mMirrorTrackPhi{false}, mRejectTrackPhi{false}; // phi cut mirror by Pi, rejected/accepted
578+
float mMinTrackPt{0.f}, mMaxTrackPt{1e10f}; // range in pT
579+
float mMinTrackEta{-1e10f}, mMaxTrackEta{1e10f}; // range in eta
580+
float mMinTrackPhi{0.f}, mMaxTrackPhi{2.f * M_PI}; // range in phi
581+
float mMinTrackPhiPosition{0.f}, mMaxTrackPhiPosition{2.f * M_PI}; // range in phi
582+
bool mMirrorTrackPhi{false}, mRejectTrackPhi{false}; // phi cut mirror by Pi, rejected/accepted
583+
float mRefR{0.5}; // reference radius in m
584+
float mBz{0.0}; // solenoid magnetic field along Z in kG
554585

555586
// track quality cuts
556587
int mMinNClustersTPC{0}; // min number of TPC clusters

PWGEM/Dilepton/Core/Dilepton.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,9 @@ struct Dilepton {
219219
Configurable<float> cfg_max_its_cluster_size{"cfg_max_its_cluster_size", 16.f, "max ITS cluster size"};
220220
Configurable<float> cfg_min_rel_diff_pin{"cfg_min_rel_diff_pin", -1e+10, "min rel. diff. between pin and ppv"};
221221
Configurable<float> cfg_max_rel_diff_pin{"cfg_max_rel_diff_pin", +1e+10, "max rel. diff. between pin and ppv"};
222+
Configurable<float> cfgRefR{"cfgRefR", 0.50, "ref. radius (m) for calculating phi position"}; // 0.50 +/- 0.06 can be syst. unc.
223+
Configurable<float> cfg_min_phiposition_track{"cfg_min_phiposition_track", 0.f, "min phi position for single track at certain radius"};
224+
Configurable<float> cfg_max_phiposition_track{"cfg_max_phiposition_track", 6.3, "max phi position for single track at certain radius"};
222225

223226
Configurable<int> cfg_pid_scheme{"cfg_pid_scheme", static_cast<int>(DielectronCut::PIDSchemes::kTPChadrejORTOFreq), "pid scheme [kTOFreq : 0, kTPChadrej : 1, kTPChadrejORTOFreq : 2, kTPConly : 3, kTOFif : 4, kPIDML : 5, kTPChadrejORTOFreq_woTOFif : 6]"};
224227
Configurable<float> cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -2.0, "min. TPC n sigma for electron inclusion"};
@@ -302,7 +305,7 @@ struct Dilepton {
302305
Service<o2::ccdb::BasicCCDBManager> ccdb;
303306
int mRunNumber;
304307
float d_bz;
305-
o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE;
308+
// o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE;
306309

307310
HistogramRegistry fRegistry{"output", {}, OutputObjHandlingPolicy::AnalysisObject, false, false};
308311
static constexpr std::string_view event_cut_types[2] = {"before/", "after/"};
@@ -486,6 +489,7 @@ struct Dilepton {
486489
LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kG";
487490
}
488491
mRunNumber = collision.runNumber();
492+
fDielectronCut.SetTrackPhiPositionRange(dielectroncuts.cfg_min_phiposition_track, dielectroncuts.cfg_max_phiposition_track, dielectroncuts.cfgRefR, d_bz, dielectroncuts.cfg_mirror_phi_track);
489493

490494
auto grplhcif = ccdb->getForTimeStamp<o2::parameters::GRPLHCIFData>("GLO/Config/GRPLHCIF", collision.timestamp());
491495
int beamZ1 = grplhcif->getBeamZ(o2::constants::lhc::BeamC);

PWGEM/Dilepton/Core/DileptonMC.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,9 @@ struct DileptonMC {
214214
Configurable<float> cfg_max_its_cluster_size{"cfg_max_its_cluster_size", 16.f, "max ITS cluster size"};
215215
Configurable<float> cfg_min_rel_diff_pin{"cfg_min_rel_diff_pin", -1e+10, "min rel. diff. between pin and ppv"};
216216
Configurable<float> cfg_max_rel_diff_pin{"cfg_max_rel_diff_pin", +1e+10, "max rel. diff. between pin and ppv"};
217+
Configurable<float> cfgRefR{"cfgRefR", 0.50, "ref. radius (m) for calculating phi position"}; // 0.50 +/- 0.06 can be syst. unc.
218+
Configurable<float> cfg_min_phiposition_track{"cfg_min_phiposition_track", 0.f, "min phi position for single track at certain radius"};
219+
Configurable<float> cfg_max_phiposition_track{"cfg_max_phiposition_track", 6.3, "max phi position for single track at certain radius"};
217220

218221
Configurable<int> cfg_pid_scheme{"cfg_pid_scheme", static_cast<int>(DielectronCut::PIDSchemes::kTPChadrejORTOFreq), "pid scheme [kTOFreq : 0, kTPChadrej : 1, kTPChadrejORTOFreq : 2, kTPConly : 3, kTOFif = 4, kPIDML = 5]"};
219222
Configurable<float> cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -2.0, "min. TPC n sigma for electron inclusion"};
@@ -609,6 +612,7 @@ struct DileptonMC {
609612
LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kG";
610613
}
611614
mRunNumber = collision.runNumber();
615+
fDielectronCut.SetTrackPhiPositionRange(dielectroncuts.cfg_min_phiposition_track, dielectroncuts.cfg_max_phiposition_track, dielectroncuts.cfgRefR, d_bz, dielectroncuts.cfg_mirror_phi_track);
612616

613617
//// for muon
614618
// o2::base::Propagator::initFieldFromGRP(grpmag);

PWGEM/Dilepton/Core/SingleTrackQC.h

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "DataFormatsParameters/GRPMagField.h"
3434
#include "DataFormatsParameters/GRPObject.h"
3535
#include "DetectorsBase/GeometryManager.h"
36+
#include "DetectorsBase/Propagator.h"
3637
#include "Framework/ASoAHelpers.h"
3738
#include "Framework/AnalysisTask.h"
3839
#include "Framework/runDataProcessing.h"
@@ -55,7 +56,7 @@ using namespace o2::aod::pwgem::dilepton::utils::emtrackutil;
5556
using MyCollisions = soa::Join<aod::EMEvents, aod::EMEventsMult, aod::EMEventsCent>;
5657
using MyCollision = MyCollisions::iterator;
5758

58-
using MyCollisionsWithSWT = soa::Join<aod::EMEvents, aod::EMEventsMult, aod::EMEventsCent, aod::EMEventsQvec, aod::EMSWTriggerBits>;
59+
using MyCollisionsWithSWT = soa::Join<MyCollisions, aod::EMSWTriggerBits>;
5960
using MyCollisionWithSWT = MyCollisionsWithSWT::iterator;
6061

6162
using MyElectrons = soa::Join<aod::EMPrimaryElectrons, aod::EMPrimaryElectronEMEventIds, aod::EMAmbiguousElectronSelfIds, aod::EMPrimaryElectronsPrefilterBit>;
@@ -73,6 +74,10 @@ struct SingleTrackQC {
7374

7475
// Configurables
7576
Configurable<std::string> ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"};
77+
Configurable<std::string> grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"};
78+
Configurable<std::string> grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"};
79+
Configurable<bool> skipGRPOquery{"skipGRPOquery", true, "skip grpo query"};
80+
Configurable<float> d_bz_input{"d_bz_input", -999, "bz field in kG, -999 is automatic"};
7681

7782
Configurable<int> cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"};
7883
Configurable<float> cfgCentMin{"cfgCentMin", -1, "min. centrality"};
@@ -146,6 +151,9 @@ struct SingleTrackQC {
146151
Configurable<float> cfg_max_its_cluster_size{"cfg_max_its_cluster_size", 16.f, "max ITS cluster size"};
147152
Configurable<float> cfg_min_rel_diff_pin{"cfg_min_rel_diff_pin", -1e+10, "min rel. diff. between pin and ppv"};
148153
Configurable<float> cfg_max_rel_diff_pin{"cfg_max_rel_diff_pin", +1e+10, "max rel. diff. between pin and ppv"};
154+
Configurable<float> cfgRefR{"cfgRefR", 0.50, "ref. radius (m) for calculating phi position"}; // 0.50 +/- 0.06 can be syst. unc.
155+
Configurable<float> cfg_min_phiposition_track{"cfg_min_phiposition_track", 0.f, "min phi position for single track at certain radius"};
156+
Configurable<float> cfg_max_phiposition_track{"cfg_max_phiposition_track", 6.3, "max phi position for single track at certain radius"};
149157

150158
Configurable<int> cfg_pid_scheme{"cfg_pid_scheme", static_cast<int>(DielectronCut::PIDSchemes::kTPChadrejORTOFreq), "pid scheme [kTOFreq : 0, kTPChadrej : 1, kTPChadrejORTOFreq : 2, kTPConly : 3, kTOFif = 4, kPIDML = 5]"};
151159
Configurable<float> cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -2.0, "min. TPC n sigma for electron inclusion"};
@@ -231,12 +239,14 @@ struct SingleTrackQC {
231239
const AxisSpec axis_pt{ConfPtlBins, "p_{T,e} (GeV/c)"};
232240
const AxisSpec axis_eta{20, -1.0, +1.0, "#eta_{e}"};
233241
const AxisSpec axis_phi{36, 0.0, 2 * M_PI, "#varphi_{e} (rad.)"};
242+
const AxisSpec axis_phiposition{36, 0.0, 2 * M_PI, "#varphi_{e}^{*} (rad.)"};
234243
const AxisSpec axis_dca3D{ConfDCA3DBins, "DCA_{e}^{3D} (#sigma)"};
235244
const AxisSpec axis_dcaXY{ConfDCAXYBins, "DCA_{e}^{XY} (#sigma)"};
236245
const AxisSpec axis_dcaZ{ConfDCAZBins, "DCA_{e}^{Z} (#sigma)"};
237246

238247
// track info
239248
fRegistry.add("Track/positive/hs", "rec. single electron", kTHnSparseD, {axis_pt, axis_eta, axis_phi, axis_dca3D, axis_dcaXY, axis_dcaZ}, true);
249+
fRegistry.add("Track/positive/hPhiPosition", Form("phi position at r_{xy} = %3.2f m", dielectroncuts.cfgRefR.value), kTH1F, {axis_phiposition}, false);
240250
fRegistry.add("Track/positive/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{4000, -20, 20}}, false);
241251
fRegistry.add("Track/positive/hDCAxyz", "DCA xy vs. z;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -1.0f, 1.0f}, {200, -1.f, 1.f}}, false);
242252
fRegistry.add("Track/positive/hDCAxyzSigma", "DCA xy vs. z;DCA_{xy} (#sigma);DCA_{z} (#sigma)", kTH2F, {{400, -20.0f, 20.0f}, {400, -20.0f, 20.0f}}, false);
@@ -309,6 +319,7 @@ struct SingleTrackQC {
309319
}
310320

311321
int mRunNumber;
322+
float d_bz;
312323
void init(InitContext&)
313324
{
314325
ccdb->setURL(ccdburl);
@@ -322,6 +333,7 @@ struct SingleTrackQC {
322333
DefineDimuonCut();
323334
addhistograms();
324335
mRunNumber = 0;
336+
d_bz = 0;
325337

326338
if (doprocessNorm) {
327339
fRegistry.addClone("Event/before/hCollisionCounter", "Event/norm/hCollisionCounter");
@@ -352,8 +364,40 @@ struct SingleTrackQC {
352364
if (mRunNumber == collision.runNumber()) {
353365
return;
354366
}
367+
if (d_bz_input > -990) {
368+
d_bz = d_bz_input;
369+
o2::parameters::GRPMagField grpmag;
370+
if (std::fabs(d_bz) > 1e-5) {
371+
grpmag.setL3Current(30000.f / (d_bz / 5.0f));
372+
}
373+
o2::base::Propagator::initFieldFromGRP(&grpmag);
374+
mRunNumber = collision.runNumber();
375+
return;
376+
}
377+
378+
auto run3grp_timestamp = collision.timestamp();
379+
o2::parameters::GRPObject* grpo = 0x0;
380+
o2::parameters::GRPMagField* grpmag = 0x0;
381+
if (!skipGRPOquery)
382+
grpo = ccdb->getForTimeStamp<o2::parameters::GRPObject>(grpPath, run3grp_timestamp);
383+
if (grpo) {
384+
o2::base::Propagator::initFieldFromGRP(grpo);
385+
// Fetch magnetic field from ccdb for current collision
386+
d_bz = grpo->getNominalL3Field();
387+
LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kG";
388+
} else {
389+
grpmag = ccdb->getForTimeStamp<o2::parameters::GRPMagField>(grpmagPath, run3grp_timestamp);
390+
if (!grpmag) {
391+
LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for timestamp " << run3grp_timestamp;
392+
}
393+
o2::base::Propagator::initFieldFromGRP(grpmag);
394+
// Fetch magnetic field from ccdb for current collision
395+
d_bz = std::lround(5.f * grpmag->getL3Current() / 30000.f);
396+
LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kG";
397+
}
355398

356399
mRunNumber = collision.runNumber();
400+
fDielectronCut.SetTrackPhiPositionRange(dielectroncuts.cfg_min_phiposition_track, dielectroncuts.cfg_max_phiposition_track, dielectroncuts.cfgRefR, d_bz, dielectroncuts.cfg_mirror_phi_track);
357401
}
358402

359403
void DefineEMEventCut()
@@ -489,9 +533,12 @@ struct SingleTrackQC {
489533
float dca3D = dca3DinSigma(track);
490534
float dcaXY = dcaXYinSigma(track);
491535
float dcaZ = dcaZinSigma(track);
536+
float phiPosition = track.phi() + std::asin(-0.30282 * track.sign() * (d_bz * 0.1) * dielectroncuts.cfgRefR / (2.f * track.pt()));
537+
o2::math_utils::bringTo02Pi(phiPosition);
492538

493539
if (track.sign() > 0) {
494540
fRegistry.fill(HIST("Track/positive/hs"), track.pt(), track.eta(), track.phi(), dca3D, dcaXY, dcaZ, weight);
541+
fRegistry.fill(HIST("Track/positive/hPhiPosition"), phiPosition);
495542
fRegistry.fill(HIST("Track/positive/hQoverPt"), track.sign() / track.pt());
496543
fRegistry.fill(HIST("Track/positive/hDCAxyz"), track.dcaXY(), track.dcaZ());
497544
fRegistry.fill(HIST("Track/positive/hDCAxyzSigma"), dcaXY, dcaZ);
@@ -535,6 +582,7 @@ struct SingleTrackQC {
535582
// fRegistry.fill(HIST("Track/positive/hITSNsigmaPr"), track.p(), track.itsNSigmaPr());
536583
} else {
537584
fRegistry.fill(HIST("Track/negative/hs"), track.pt(), track.eta(), track.phi(), dca3D, dcaXY, dcaZ, weight);
585+
fRegistry.fill(HIST("Track/negative/hPhiPosition"), phiPosition);
538586
fRegistry.fill(HIST("Track/negative/hQoverPt"), track.sign() / track.pt());
539587
fRegistry.fill(HIST("Track/negative/hDCAxyz"), track.dcaXY(), track.dcaZ());
540588
fRegistry.fill(HIST("Track/negative/hDCAxyzSigma"), dcaXY, dcaZ);

0 commit comments

Comments
 (0)