4848#include < algorithm>
4949#include < cfloat>
5050#include < cmath>
51+ #include < cstdint>
5152#include < map>
5253#include < memory>
5354#include < string>
5657#include < utility>
5758#include < vector>
5859
59- #include < stdint.h>
60-
61- // #include <math.h>
62-
6360struct globalDimuonFilter {
6461 o2::framework::Produces<o2::aod::GlobalDimuonFilters> tags;
6562
@@ -147,18 +144,24 @@ struct globalDimuonFilter {
147144 // for z shift for propagation
148145 o2::framework::Configurable<bool > cfgApplyZShiftFromCCDB{" cfgApplyZShiftFromCCDB" , false , " flag to apply z shift" };
149146 o2::framework::Configurable<std::string> cfgZShiftPath{" cfgZShiftPath" , " Users/m/mcoquet/ZShift" , " CCDB path for z shift to apply to forward tracks" };
150- o2::framework::Configurable<float > cfgManualXShift{" cfgManualXShift" , 0 , " manual x shift for propagation of global muon to PV" };
151- o2::framework::Configurable<float > cfgManualYShift{" cfgManualYShift" , 0 , " manual y shift for propagation of global muon to PV" };
152- o2::framework::Configurable<float > cfgManualZShift{" cfgManualZShift" , 0 , " manual z shift for propagation of global muon to PV" };
147+ o2::framework::Configurable<float > cfgManualXShiftMFTtop{" cfgManualXShiftMFTtop" , 0 , " manual x shift for propagation of global muon to PV" };
148+ o2::framework::Configurable<float > cfgManualYShiftMFTtop{" cfgManualYShiftMFTtop" , 0 , " manual y shift for propagation of global muon to PV" };
149+ o2::framework::Configurable<float > cfgManualZShiftMFTtop{" cfgManualZShiftMFTtop" , 0 , " manual z shift for propagation of global muon to PV" };
150+ o2::framework::Configurable<float > cfgManualXShiftMFTbottom{" cfgManualXShiftMFTbottom" , 0 , " manual x shift for propagation of global muon to PV" };
151+ o2::framework::Configurable<float > cfgManualYShiftMFTbottom{" cfgManualYShiftMFTbottom" , 0 , " manual y shift for propagation of global muon to PV" };
152+ o2::framework::Configurable<float > cfgManualZShiftMFTbottom{" cfgManualZShiftMFTbottom" , 0 , " manual z shift for propagation of global muon to PV" };
153153
154154 o2::framework::HistogramRegistry fRegistry {" output" , {}, o2::framework::OutputObjHandlingPolicy::AnalysisObject, false , false };
155155 o2::ccdb::CcdbApi ccdbApi;
156156 o2::framework::Service<o2::ccdb::BasicCCDBManager> ccdb;
157157 int mRunNumber = 0 ;
158158 float mBz = 0 ;
159- float mXShift = 0 ;
160- float mYShift = 0 ;
161- float mZShift = 0 ;
159+ float mXShiftMFTtop = 0 ;
160+ float mYShiftMFTtop = 0 ;
161+ float mZShiftMFTtop = 0 ;
162+ float mXShiftMFTbottom = 0 ;
163+ float mYShiftMFTbottom = 0 ;
164+ float mZShiftMFTbottom = 0 ;
162165
163166 void init (o2::framework::InitContext&)
164167 {
@@ -169,9 +172,12 @@ struct globalDimuonFilter {
169172 ccdbApi.init (ccdburl);
170173 mRunNumber = 0 ;
171174 mBz = 0 ;
172- mXShift = 0 ;
173- mYShift = 0 ;
174- mZShift = 0 ;
175+ mXShiftMFTtop = 0 ;
176+ mYShiftMFTtop = 0 ;
177+ mZShiftMFTtop = 0 ;
178+ mXShiftMFTbottom = 0 ;
179+ mYShiftMFTbottom = 0 ;
180+ mZShiftMFTbottom = 0 ;
175181
176182 addHistograms ();
177183 }
@@ -202,16 +208,26 @@ struct globalDimuonFilter {
202208 auto * zShift = ccdb->getForTimeStamp <std::vector<float >>(cfgZShiftPath, bc.timestamp ());
203209 if (zShift != nullptr && !zShift->empty ()) {
204210 LOGF (info, " reading z shift %f from %s" , (*zShift)[0 ], cfgZShiftPath.value );
205- mZShift = (*zShift)[0 ];
211+ mZShiftMFTtop = (*zShift)[0 ];
212+ mZShiftMFTbottom = (*zShift)[0 ];
206213 } else {
207214 LOGF (info, " z shift is not found in ccdb path %s. set to 0 cm" , cfgZShiftPath.value );
208- mZShift = 0 ;
215+ mZShiftMFTtop = 0 ;
216+ mZShiftMFTbottom = 0 ;
209217 }
210218 } else {
211- LOGF (info, " z shift is manually set to %f cm" , cfgManualZShift.value );
212- mXShift = cfgManualXShift;
213- mYShift = cfgManualYShift;
214- mZShift = cfgManualZShift;
219+ LOGF (info, " X shift for MFT top is manually set to %f cm" , cfgManualXShiftMFTtop.value );
220+ LOGF (info, " X shift for MFT bottom is manually set to %f cm" , cfgManualXShiftMFTbottom.value );
221+ LOGF (info, " Y shift for MFT top is manually set to %f cm" , cfgManualYShiftMFTtop.value );
222+ LOGF (info, " Y shift for MFT bottom is manually set to %f cm" , cfgManualYShiftMFTbottom.value );
223+ LOGF (info, " Z shift for MFT top is manually set to %f cm" , cfgManualZShiftMFTtop.value );
224+ LOGF (info, " Z shift for MFT bottom is manually set to %f cm" , cfgManualZShiftMFTbottom.value );
225+ mXShiftMFTtop = cfgManualXShiftMFTtop;
226+ mYShiftMFTtop = cfgManualYShiftMFTtop;
227+ mZShiftMFTtop = cfgManualZShiftMFTtop;
228+ mXShiftMFTbottom = cfgManualXShiftMFTbottom;
229+ mYShiftMFTbottom = cfgManualYShiftMFTbottom;
230+ mZShiftMFTbottom = cfgManualZShiftMFTbottom;
215231 }
216232 }
217233
@@ -232,9 +248,9 @@ struct globalDimuonFilter {
232248
233249 fRegistry .add (" Vertex/MB/hZvtx" , " vertex z; Z_{vtx} (cm)" , o2::framework::HistType::kTH1D , {{40 , -20 , +20 }}, false );
234250 fRegistry .add (" Vertex/MB/hChi2vsNContrib" , " vertex #chi^{2}/N_{contrib} vs. N_{contrib};N_{contrib};#chi^{2}/N_{contrib}" , o2::framework::HistType::kTH2D , {{200 , 0.5 , 200.5 }, {100 , 0 , 10 }}, false );
235- fRegistry .add (" Vertex/MB/hSigmaX" , " vertex #sigma_{X} vs. N_{contrib};N_{contrib};#sigma_{X} (#mum)" , o2::framework::HistType::kTH2D , {{200 , 0.5 , 200.5 }, {2000 , 0 , 200 }}, false );
236- fRegistry .add (" Vertex/MB/hSigmaY" , " vertex #sigma_{Y} vs. N_{contrib};N_{contrib};#sigma_{Y} (#mum)" , o2::framework::HistType::kTH2D , {{200 , 0.5 , 200.5 }, {2000 , 0 , 200 }}, false );
237- fRegistry .add (" Vertex/MB/hSigmaZ" , " vertex #sigma_{Z} vs. N_{contrib};N_{contrib};#sigma_{Z} (#mum)" , o2::framework::HistType::kTH2D , {{200 , 0.5 , 200.5 }, {2000 , 0 , 200 }}, false );
251+ fRegistry .add (" Vertex/MB/hSigmaX" , " vertex #sigma_{X} vs. N_{contrib};N_{contrib};#sigma_{X} (#mum)" , o2::framework::HistType::kTH2D , {{200 , 0.5 , 200.5 }, {1000 , 0 , 100 }}, false );
252+ fRegistry .add (" Vertex/MB/hSigmaY" , " vertex #sigma_{Y} vs. N_{contrib};N_{contrib};#sigma_{Y} (#mum)" , o2::framework::HistType::kTH2D , {{200 , 0.5 , 200.5 }, {1000 , 0 , 100 }}, false );
253+ fRegistry .add (" Vertex/MB/hSigmaZ" , " vertex #sigma_{Z} vs. N_{contrib};N_{contrib};#sigma_{Z} (#mum)" , o2::framework::HistType::kTH2D , {{200 , 0.5 , 200.5 }, {1000 , 0 , 100 }}, false );
238254 fRegistry .addClone (" Vertex/MB/" , " Vertex/Triggered/" );
239255
240256 fRegistry .add (" MFTMCHMID/positive/hPt" , " pT;p_{T} (GeV/c)" , o2::framework::HistType::kTH1D , {{200 , 0 .0f , 10 }}, false );
@@ -253,7 +269,7 @@ struct globalDimuonFilter {
253269 fRegistry .add (" MFTMCHMID/positive/hChi2MatchMCHMFT_Pt" , " chi2 match MCH-MFT;p_{T,#mu} (GeV/c);matching #chi^{2}/ndf between MFT-MCH" , o2::framework::HistType::kTH2D , {{200 , 0 , 10 }, {100 , 0 .0f , 100 }}, false );
254270 fRegistry .add (" MFTMCHMID/positive/hDCAxy2D" , " DCA x vs. y;DCA_{x} (cm);DCA_{y} (cm)" , o2::framework::HistType::kTH2D , {{400 , -1 , 1 }, {400 , -1 , +1 }}, false );
255271 fRegistry .add (" MFTMCHMID/positive/hDCAxy2DinSigma" , " DCA x vs. y in sigma;DCA_{x} (#sigma);DCA_{y} (#sigma)" , o2::framework::HistType::kTH2D , {{200 , -10 , 10 }, {200 , -10 , +10 }}, false );
256- fRegistry .add (" MFTMCHMID/positive/hDCAxy" , " DCAxy;DCA_{xy} (cm);" , o2::framework::HistType::kTH1D , {{100 , 0 , 1 }}, false );
272+ fRegistry .add (" MFTMCHMID/positive/hDCAxy" , " DCAxy;DCA_{xy} (cm);" , o2::framework::HistType::kTH1D , {{1000 , 0 , 1 }}, false );
257273 fRegistry .add (" MFTMCHMID/positive/hDCAxyinSigma" , " DCAxy in sigma;DCA_{xy} (#sigma);" , o2::framework::HistType::kTH1D , {{100 , 0 , 10 }}, false );
258274 fRegistry .add (" MFTMCHMID/positive/hLog10Chi2IP" , " chi2IP;log_{10}(#chi^{2}_{IP})" , o2::framework::HistType::kTH1D , {{1000 , -5 , 5 }}, false );
259275 fRegistry .add (" MFTMCHMID/positive/hDCAxResolutionvsPt" , " DCA_{x} resolution vs. p_{T};p_{T} (GeV/c);DCA_{x} resolution (#mum);" , o2::framework::HistType::kTH2D , {{100 , 0 , 10 .f }, {500 , 0 , 500 }}, false );
@@ -426,12 +442,12 @@ struct globalDimuonFilter {
426442 return false ;
427443 }
428444
429- o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = o2::aod::fwdtrackutils::propagateMuon (mchtrack, mchtrack, collision, o2::aod::fwdtrackutils::propagationPoint::kToVertex , glMuonCutGroup.matchingZ , mBz , mXShift , mYShift , mZShift );
445+ o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = o2::aod::fwdtrackutils::propagateMuon (mchtrack, mchtrack, collision, o2::aod::fwdtrackutils::propagationPoint::kToVertex , glMuonCutGroup.matchingZ , mBz , 0 . f , 0 . f , 0 . f );
430446 float etaMatchedMCHMID = propmuonAtPV_Matched.getEta ();
431447 float phiMatchedMCHMID = propmuonAtPV_Matched.getPhi ();
432448 phiMatchedMCHMID = RecoDecay::constrainAngle (phiMatchedMCHMID, 0 , 1U );
433449
434- o2::dataformats::GlobalFwdTrack propmuonAtPV = o2::aod::fwdtrackutils::propagateMuon (fwdtrack, fwdtrack, collision, o2::aod::fwdtrackutils::propagationPoint::kToVertex , glMuonCutGroup.matchingZ , mBz , mXShift , mYShift , mZShift );
450+ o2::dataformats::GlobalFwdTrack propmuonAtPV = mfttrack. y () > 0 . f ? o2::aod::fwdtrackutils::propagateMuon (fwdtrack, fwdtrack, collision, o2::aod::fwdtrackutils::propagationPoint::kToVertex , glMuonCutGroup.matchingZ , mBz , mXShiftMFTtop , mYShiftMFTtop , mZShiftMFTtop ) : o2::aod::fwdtrackutils::propagateMuon (fwdtrack, fwdtrack, collision, o2::aod::fwdtrackutils::propagationPoint:: kToVertex , glMuonCutGroup. matchingZ , mBz , mXShiftMFTbottom , mYShiftMFTbottom , mZShiftMFTbottom );
435451 pt = propmuonAtPV.getPt ();
436452 eta = propmuonAtPV.getEta ();
437453 phi = propmuonAtPV.getPhi ();
@@ -448,7 +464,7 @@ struct globalDimuonFilter {
448464 return false ;
449465 }
450466
451- o2::dataformats::GlobalFwdTrack propmuonAtDCA = o2::aod::fwdtrackutils::propagateMuon (fwdtrack, fwdtrack, collision, o2::aod::fwdtrackutils::propagationPoint::kToDCA , glMuonCutGroup.matchingZ , mBz , mXShift , mYShift , mZShift );
467+ o2::dataformats::GlobalFwdTrack propmuonAtDCA = mfttrack. y () > 0 . f ? o2::aod::fwdtrackutils::propagateMuon (fwdtrack, fwdtrack, collision, o2::aod::fwdtrackutils::propagationPoint::kToDCA , glMuonCutGroup.matchingZ , mBz , mXShiftMFTtop , mYShiftMFTtop , mZShiftMFTtop ) : o2::aod::fwdtrackutils::propagateMuon (fwdtrack, fwdtrack, collision, o2::aod::fwdtrackutils::propagationPoint:: kToDCA , glMuonCutGroup. matchingZ , mBz , mXShiftMFTbottom , mYShiftMFTbottom , mZShiftMFTbottom );
452468 float dcaX = propmuonAtDCA.getX () - collision.posX ();
453469 float dcaY = propmuonAtDCA.getY () - collision.posY ();
454470 float dcaXY = std::sqrt (dcaX * dcaX + dcaY * dcaY);
@@ -482,7 +498,7 @@ struct globalDimuonFilter {
482498 }
483499 float sigma_dcaXY = dcaXY / dcaXYinSigma / std::sqrt (2 .f );
484500
485- o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = o2::aod::fwdtrackutils::propagateMuon (mchtrack, mchtrack, collision, o2::aod::fwdtrackutils::propagationPoint::kToDCA , glMuonCutGroup.matchingZ , mBz , mXShift , mYShift , mZShift );
501+ o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = o2::aod::fwdtrackutils::propagateMuon (mchtrack, mchtrack, collision, o2::aod::fwdtrackutils::propagationPoint::kToDCA , glMuonCutGroup.matchingZ , mBz , 0 . f , 0 . f , 0 . f );
486502 float dcaX_Matched = propmuonAtDCA_Matched.getX () - collision.posX ();
487503 float dcaY_Matched = propmuonAtDCA_Matched.getY () - collision.posY ();
488504 float dcaXY_Matched = std::sqrt (dcaX_Matched * dcaX_Matched + dcaY_Matched * dcaY_Matched);
@@ -496,7 +512,7 @@ struct globalDimuonFilter {
496512 return false ;
497513 }
498514
499- float chi2IP = o2::aod::fwdtrackutils::getFwdChi2IP (fwdtrack, collision, mBz , mXShift , mYShift , mZShift );
515+ float chi2IP = mfttrack. y () > 0 . f ? o2::aod::fwdtrackutils::getFwdChi2IP (fwdtrack, collision, mBz , mXShiftMFTtop , mYShiftMFTtop , mZShiftMFTtop ) : o2::aod::fwdtrackutils::getFwdChi2IP (fwdtrack, collision, mBz , mXShiftMFTbottom , mYShiftMFTbottom , mZShiftMFTbottom );
500516
501517 if constexpr (fillHistograms) {
502518 if (fwdtrack.sign () > 0 ) {
@@ -613,12 +629,12 @@ struct globalDimuonFilter {
613629 return false ;
614630 }
615631
616- o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = o2::aod::fwdtrackutils::propagateMuon (mchtrack, mchtrack, collision, o2::aod::fwdtrackutils::propagationPoint::kToVertex , tagMuonCutGroup.matchingZ , mBz , mXShift , mYShift , mZShift );
632+ o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = o2::aod::fwdtrackutils::propagateMuon (mchtrack, mchtrack, collision, o2::aod::fwdtrackutils::propagationPoint::kToVertex , tagMuonCutGroup.matchingZ , mBz , 0 . f , 0 . f , 0 . f );
617633 float etaMatchedMCHMID = propmuonAtPV_Matched.getEta ();
618634 float phiMatchedMCHMID = propmuonAtPV_Matched.getPhi ();
619635 phiMatchedMCHMID = RecoDecay::constrainAngle (phiMatchedMCHMID, 0 , 1U );
620636
621- o2::dataformats::GlobalFwdTrack propmuonAtPV = o2::aod::fwdtrackutils::propagateMuon (fwdtrack, fwdtrack, collision, o2::aod::fwdtrackutils::propagationPoint::kToVertex , tagMuonCutGroup.matchingZ , mBz , mXShift , mYShift , mZShift );
637+ o2::dataformats::GlobalFwdTrack propmuonAtPV = mfttrack. y () > 0 . f ? o2::aod::fwdtrackutils::propagateMuon (fwdtrack, fwdtrack, collision, o2::aod::fwdtrackutils::propagationPoint::kToVertex , tagMuonCutGroup.matchingZ , mBz , mXShiftMFTtop , mYShiftMFTtop , mZShiftMFTtop ) : o2::aod::fwdtrackutils::propagateMuon (fwdtrack, fwdtrack, collision, o2::aod::fwdtrackutils::propagationPoint:: kToVertex , tagMuonCutGroup. matchingZ , mBz , mXShiftMFTbottom , mYShiftMFTbottom , mZShiftMFTbottom );
622638 pt = propmuonAtPV.getPt ();
623639 eta = propmuonAtPV.getEta ();
624640 phi = propmuonAtPV.getPhi ();
@@ -701,12 +717,12 @@ struct globalDimuonFilter {
701717 return false ;
702718 }
703719
704- o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = o2::aod::fwdtrackutils::propagateMuon (mchtrack, mchtrack, collision, o2::aod::fwdtrackutils::propagationPoint::kToVertex , probeMuonCutGroup.matchingZ , mBz , mXShift , mYShift , mZShift );
720+ o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = o2::aod::fwdtrackutils::propagateMuon (mchtrack, mchtrack, collision, o2::aod::fwdtrackutils::propagationPoint::kToVertex , probeMuonCutGroup.matchingZ , mBz , 0 . f , 0 . f , 0 . f );
705721 float etaMatchedMCHMID = propmuonAtPV_Matched.getEta ();
706722 float phiMatchedMCHMID = propmuonAtPV_Matched.getPhi ();
707723 phiMatchedMCHMID = RecoDecay::constrainAngle (phiMatchedMCHMID, 0 , 1U );
708724
709- o2::dataformats::GlobalFwdTrack propmuonAtPV = o2::aod::fwdtrackutils::propagateMuon (fwdtrack, fwdtrack, collision, o2::aod::fwdtrackutils::propagationPoint::kToVertex , probeMuonCutGroup.matchingZ , mBz , mXShift , mYShift , mZShift );
725+ o2::dataformats::GlobalFwdTrack propmuonAtPV = mfttrack. y () > 0 . f ? o2::aod::fwdtrackutils::propagateMuon (fwdtrack, fwdtrack, collision, o2::aod::fwdtrackutils::propagationPoint::kToVertex , probeMuonCutGroup.matchingZ , mBz , mXShiftMFTtop , mYShiftMFTtop , mZShiftMFTtop ) : o2::aod::fwdtrackutils::propagateMuon (fwdtrack, fwdtrack, collision, o2::aod::fwdtrackutils::propagationPoint:: kToVertex , probeMuonCutGroup. matchingZ , mBz , mXShiftMFTbottom , mYShiftMFTbottom , mZShiftMFTbottom );
710726 pt = propmuonAtPV.getPt ();
711727 eta = propmuonAtPV.getEta ();
712728 phi = propmuonAtPV.getPhi ();
@@ -730,7 +746,7 @@ struct globalDimuonFilter {
730746 return false ;
731747 }
732748
733- o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = o2::aod::fwdtrackutils::propagateMuon (mchtrack, mchtrack, collision, o2::aod::fwdtrackutils::propagationPoint::kToDCA , probeMuonCutGroup.matchingZ , mBz , mXShift , mYShift , mZShift );
749+ o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = o2::aod::fwdtrackutils::propagateMuon (mchtrack, mchtrack, collision, o2::aod::fwdtrackutils::propagationPoint::kToDCA , probeMuonCutGroup.matchingZ , mBz , 0 . f , 0 . f , 0 . f );
734750 float dcaX_Matched = propmuonAtDCA_Matched.getX () - collision.posX ();
735751 float dcaY_Matched = propmuonAtDCA_Matched.getY () - collision.posY ();
736752 float dcaXY_Matched = std::sqrt (dcaX_Matched * dcaX_Matched + dcaY_Matched * dcaY_Matched);
@@ -888,7 +904,7 @@ struct globalDimuonFilter {
888904 } // end end of negative muon loop
889905 } // end end of positive muon loop
890906
891- for (const auto pos1 : posMuons) {
907+ for (const auto & pos1 : posMuons) {
892908 auto fwdtrack1 = fwdtracks.rawIteratorAt (pos1);
893909 if (!isBestMatch (collision, fwdtrack1, fwdtracks, mfttracks)) {
894910 continue ;
@@ -899,7 +915,7 @@ struct globalDimuonFilter {
899915 }
900916 ROOT ::Math::PtEtaPhiMVector v1 (pt1, eta1, phi1, o2::constants::physics::MassMuon);
901917
902- for (const auto pos2 : posMuons) {
918+ for (const auto & pos2 : posMuons) {
903919 auto fwdtrack2 = fwdtracks.rawIteratorAt (pos2);
904920 if (pos1 == pos2) {
905921 continue ;
@@ -921,7 +937,7 @@ struct globalDimuonFilter {
921937 } // end end of positive muon loop
922938 } // end end of positive muon loop
923939
924- for (const auto neg1 : negMuons) {
940+ for (const auto & neg1 : negMuons) {
925941 auto fwdtrack1 = fwdtracks.rawIteratorAt (neg1);
926942 if (!isBestMatch (collision, fwdtrack1, fwdtracks, mfttracks)) {
927943 continue ;
@@ -932,7 +948,7 @@ struct globalDimuonFilter {
932948 }
933949 ROOT ::Math::PtEtaPhiMVector v1 (pt1, eta1, phi1, o2::constants::physics::MassMuon);
934950
935- for (const auto neg2 : negMuons) {
951+ for (const auto & neg2 : negMuons) {
936952 auto fwdtrack2 = fwdtracks.rawIteratorAt (neg2);
937953 if (neg1 == neg2) {
938954 continue ;
0 commit comments