Skip to content

Commit 035cce5

Browse files
authored
[PWGDQ] Adding flow variables to dilepton flat tables and propagation of MCH-MID tracks in table-maker (#4091)
* Add function to propagate muon tracks through absorber to PV * Format * Fix * Fix * Fix typo * Fixing libraries * Clang format * Missing array definition * Retrieving geometry from ccdb * Clang format * Fixing retrieving of ccdb object * Calng format * Fixing covariance name * PWGDQ: Adding propagation for MCH-MID tracks and filling flow variables in dilepton flat table * Clang format * Bug fixes * Clang format
1 parent 109d661 commit 035cce5

File tree

4 files changed

+51
-16
lines changed

4 files changed

+51
-16
lines changed

PWGDQ/Core/VarManager.h

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838

3939
#include "Framework/DataTypes.h"
4040
// #include "MCHTracking/TrackExtrap.h"
41+
#include "TGeoGlobalMagField.h"
42+
#include "Field/MagneticField.h"
4143
#include "ReconstructionDataFormats/Track.h"
4244
#include "ReconstructionDataFormats/Vertex.h"
4345
#include "DCAFitter/DCAFitterN.h"
@@ -802,19 +804,38 @@ void VarManager::FillPropagateMuon(const T& muon, const C& collision, float* val
802804
values = fgValues;
803805
}
804806
if constexpr ((fillMap & MuonCov) > 0) {
805-
o2::mch::TrackExtrap::setField();
806807
double chi2 = muon.chi2();
807808
SMatrix5 tpars(muon.x(), muon.y(), muon.phi(), muon.tgl(), muon.signed1Pt());
808809
std::vector<double> v1{muon.cXX(), muon.cXY(), muon.cYY(), muon.cPhiX(), muon.cPhiY(),
809810
muon.cPhiPhi(), muon.cTglX(), muon.cTglY(), muon.cTglPhi(), muon.cTglTgl(),
810811
muon.c1PtX(), muon.c1PtY(), muon.c1PtPhi(), muon.c1PtTgl(), muon.c1Pt21Pt2()};
811812
SMatrix55 tcovs(v1.begin(), v1.end());
812813
o2::track::TrackParCovFwd fwdtrack{muon.z(), tpars, tcovs, chi2};
813-
o2::dataformats::GlobalFwdTrack track(fwdtrack);
814-
auto mchTrack = mMatching.FwdtoMCH(track);
815-
o2::mch::TrackExtrap::extrapToVertex(mchTrack, collision.posX(), collision.posY(), collision.posZ(), collision.covXX(), collision.covYY());
816-
auto propmuon = mMatching.MCHtoFwd(mchTrack);
817-
814+
o2::dataformats::GlobalFwdTrack propmuon;
815+
if (static_cast<int>(muon.trackType()) > 2) {
816+
o2::mch::TrackExtrap::setField();
817+
o2::dataformats::GlobalFwdTrack track;
818+
track.setParameters(tpars);
819+
track.setZ(fwdtrack.getZ());
820+
track.setCovariances(tcovs);
821+
auto mchTrack = mMatching.FwdtoMCH(track);
822+
o2::mch::TrackExtrap::extrapToVertex(mchTrack, collision.posX(), collision.posY(), collision.posZ(), collision.covXX(), collision.covYY());
823+
auto proptrack = mMatching.MCHtoFwd(mchTrack);
824+
propmuon.setParameters(proptrack.getParameters());
825+
propmuon.setZ(proptrack.getZ());
826+
propmuon.setCovariances(proptrack.getCovariances());
827+
828+
} else if (static_cast<int>(muon.trackType()) < 2) {
829+
double centerMFT[3] = {0, 0, -61.4};
830+
o2::field::MagneticField* field = static_cast<o2::field::MagneticField*>(TGeoGlobalMagField::Instance()->GetField());
831+
auto Bz = field->getBz(centerMFT); // Get field at centre of MFT
832+
auto geoMan = o2::base::GeometryManager::meanMaterialBudget(muon.x(), muon.y(), muon.z(), collision.posX(), collision.posY(), collision.posZ());
833+
auto x2x0 = static_cast<float>(geoMan.meanX2X0);
834+
fwdtrack.propagateToVtxhelixWithMCS(collision.posZ(), {collision.posX(), collision.posY()}, {collision.covXX(), collision.covYY()}, Bz, x2x0);
835+
propmuon.setParameters(fwdtrack.getParameters());
836+
propmuon.setZ(fwdtrack.getZ());
837+
propmuon.setCovariances(fwdtrack.getCovariances());
838+
}
818839
values[kPt] = propmuon.getPt();
819840
values[kX] = propmuon.getX();
820841
values[kY] = propmuon.getY();
@@ -2022,6 +2043,15 @@ void VarManager::FillPairVertexing(C const& collision, T const& t1, T const& t2,
20222043
v1 = {pars1.getPt(), pars1.getEta(), pars1.getPhi(), m1};
20232044
v2 = {pars2.getPt(), pars2.getEta(), pars2.getPhi(), m2};
20242045
v12 = v1 + v2;
2046+
values[kMass] = v12.M();
2047+
values[kPt] = v12.Pt();
2048+
values[kEta] = v12.Eta();
2049+
values[kPhi] = v12.Phi();
2050+
values[kRap] = -v12.Rapidity();
2051+
values[kVertexingTauxy] = KFGeoTwoProng.GetPseudoProperDecayTime(KFPV, v12.M()) / (o2::constants::physics::LightSpeedCm2NS);
2052+
values[kVertexingTauz] = dzPair2PV * v12.M() / (TMath::Abs(v12.Pz()) * o2::constants::physics::LightSpeedCm2NS);
2053+
values[kVertexingTauxyErr] = values[kVertexingLxyErr] * v12.M() / (v12.Pt() * o2::constants::physics::LightSpeedCm2NS);
2054+
values[kVertexingTauzErr] = values[kVertexingLzErr] * v12.M() / (TMath::Abs(v12.Pz()) * o2::constants::physics::LightSpeedCm2NS);
20252055

20262056
values[kPt1] = pars1.getPt();
20272057
values[kEta1] = pars1.getEta();

PWGDQ/DataModel/ReducedInfoTables.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,11 @@ DECLARE_SOA_TABLE(DimuonsAll, "AOD", "RTDIMUONALL", //!
514514
dilepton_track_index::PtMC2, dilepton_track_index::EtaMC2, dilepton_track_index::PhiMC2, dilepton_track_index::EMC2,
515515
dilepton_track_index::Vx1, dilepton_track_index::Vy1, dilepton_track_index::Vz1, dilepton_track_index::Vt1,
516516
dilepton_track_index::Vx2, dilepton_track_index::Vy2, dilepton_track_index::Vz2, dilepton_track_index::Vt2,
517-
dilepton_track_index::IsAmbig1, dilepton_track_index::IsAmbig2);
517+
dilepton_track_index::IsAmbig1, dilepton_track_index::IsAmbig2,
518+
reducedpair::U2Q2,
519+
reducedpair::U3Q3,
520+
reducedpair::Cos2DeltaPhi,
521+
reducedpair::Cos3DeltaPhi);
518522

519523
using Dilepton = Dileptons::iterator;
520524
using DileptonExtra = DileptonsExtra::iterator;

PWGDQ/Tasks/dqEfficiency.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -797,7 +797,7 @@ struct AnalysisSameEventPairing {
797797
t2.reducedMCTrack().pt(), t2.reducedMCTrack().eta(), t2.reducedMCTrack().phi(), t2.reducedMCTrack().e(),
798798
t1.reducedMCTrack().vx(), t1.reducedMCTrack().vy(), t1.reducedMCTrack().vz(), t1.reducedMCTrack().vt(),
799799
t2.reducedMCTrack().vx(), t2.reducedMCTrack().vy(), t2.reducedMCTrack().vz(), t2.reducedMCTrack().vt(),
800-
t1.isAmbiguous(), t2.isAmbiguous());
800+
t1.isAmbiguous(), t2.isAmbiguous(), -999., -999., -999., -999.);
801801
}
802802
}
803803

PWGDQ/Tasks/tableReader.cxx

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -796,7 +796,7 @@ struct AnalysisSameEventPairing {
796796

797797
if (fNoCorr) {
798798
VarManager::SetupFwdDCAFitterNoCorr();
799-
} else if (fCorrFullGeo) {
799+
} else if (fCorrFullGeo || (fConfigUseKFVertexing && fPropToPCA)) {
800800
if (!o2::base::GeometryManager::isGeometryLoaded()) {
801801
ccdb->get<TGeoManager>(geoPath);
802802
}
@@ -944,15 +944,15 @@ struct AnalysisSameEventPairing {
944944
if (fConfigUseKFVertexing.value) {
945945
VarManager::SetupTwoProngKFParticle(mMagField);
946946
} else {
947-
VarManager::SetupTwoProngDCAFitter(mMagField, fPropToPCA.value, 200.0f, 4.0f, 1.0e-3f, 0.9f, fUseAbsDCA.value); // TODO: get these parameters from Configurables
948-
VarManager::SetupTwoProngFwdDCAFitter(mMagField, fPropToPCA.value, 200.0f, 1.0e-3f, 0.9f, fUseAbsDCA.value);
947+
VarManager::SetupTwoProngDCAFitter(mMagField, true, 200.0f, 4.0f, 1.0e-3f, 0.9f, fUseAbsDCA.value); // TODO: get these parameters from Configurables
948+
VarManager::SetupTwoProngFwdDCAFitter(mMagField, true, 200.0f, 1.0e-3f, 0.9f, fUseAbsDCA.value);
949949
}
950950
} else {
951951
if (fConfigUseKFVertexing.value) {
952952
VarManager::SetupTwoProngKFParticle(fConfigMagField.value);
953953
} else {
954-
VarManager::SetupTwoProngDCAFitter(fConfigMagField.value, fPropToPCA.value, 200.0f, 4.0f, 1.0e-3f, 0.9f, fUseAbsDCA.value); // TODO: get these parameters from Configurables
955-
VarManager::SetupTwoProngFwdDCAFitter(fConfigMagField.value, fPropToPCA.value, 200.0f, 1.0e-3f, 0.9f, fUseAbsDCA.value);
954+
VarManager::SetupTwoProngDCAFitter(fConfigMagField.value, true, 200.0f, 4.0f, 1.0e-3f, 0.9f, fUseAbsDCA.value); // TODO: get these parameters from Configurables
955+
VarManager::SetupTwoProngFwdDCAFitter(fConfigMagField.value, true, 200.0f, 1.0e-3f, 0.9f, fUseAbsDCA.value);
956956
}
957957
}
958958
fCurrentRun = event.runNumber();
@@ -1016,8 +1016,7 @@ struct AnalysisSameEventPairing {
10161016
if constexpr ((TPairType == pairTypeEE) && trackHasCov) {
10171017
dileptonExtraList(t1.globalIndex(), t2.globalIndex(), VarManager::fgValues[VarManager::kVertexingTauz], VarManager::fgValues[VarManager::kVertexingLz], VarManager::fgValues[VarManager::kVertexingLxy]);
10181018
}
1019-
constexpr bool muonHasCov = ((TTrackFillMap & VarManager::ObjTypes::MuonCov) > 0 || (TTrackFillMap & VarManager::ObjTypes::ReducedMuonCov) > 0);
1020-
if constexpr ((TPairType == pairTypeMuMu) && muonHasCov) {
1019+
if constexpr (TPairType == pairTypeMuMu) {
10211020
// LOGP(info, "mu1 collId = {}, mu2 collId = {}", t1.collisionId(), t2.collisionId());
10221021
dileptonExtraList(t1.globalIndex(), t2.globalIndex(), VarManager::fgValues[VarManager::kVertexingTauz], VarManager::fgValues[VarManager::kVertexingLz], VarManager::fgValues[VarManager::kVertexingLxy]);
10231022
if (fConfigFlatTables.value) {
@@ -1040,7 +1039,9 @@ struct AnalysisSameEventPairing {
10401039
-999., -999., -999., -999.,
10411040
-999., -999., -999., -999.,
10421041
-999., -999., -999., -999.,
1043-
t1.isAmbiguous(), t2.isAmbiguous());
1042+
t1.isAmbiguous(), t2.isAmbiguous(),
1043+
VarManager::fgValues[VarManager::kU2Q2], VarManager::fgValues[VarManager::kU3Q3],
1044+
VarManager::fgValues[VarManager::kCos2DeltaPhi], VarManager::fgValues[VarManager::kCos3DeltaPhi]);
10441045
}
10451046
}
10461047

0 commit comments

Comments
 (0)