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