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;
5556using MyCollisions = soa::Join<aod::EMEvents, aod::EMEventsMult, aod::EMEventsCent>;
5657using 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>;
5960using MyCollisionWithSWT = MyCollisionsWithSWT::iterator;
6061
6162using 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