Skip to content

Commit 05c70b3

Browse files
authored
[PWGDQ] Add a new file dqEnergyCorrelator_direct.cxx for the energy correlator analysis (#15253)
1 parent 980a3ee commit 05c70b3

File tree

3 files changed

+1131
-0
lines changed

3 files changed

+1131
-0
lines changed

PWGDQ/Core/VarManager.h

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1363,6 +1363,10 @@ class VarManager : public TObject
13631363
static void FillDileptonTrackVertexing(C const& collision, T1 const& lepton1, T1 const& lepton2, T1 const& track, float* values);
13641364
template <typename T1, typename T2>
13651365
static void FillDileptonHadron(T1 const& dilepton, T2 const& hadron, float* values = nullptr, float hadronMass = 0.0f);
1366+
template <typename T1, typename T2, typename T3>
1367+
static void FillEnergyCorrelatorTriple(T1 const& lepton1, T2 const& lepton2, T3 const& hadron, float* values = nullptr, float Translow = 1. / 3, float Transhigh = 2. / 3, bool applyFitMass = false, float sidebandMass = 0.0f);
1368+
template <int pairType, typename T1, typename T2, typename T3, typename T4, typename T5>
1369+
static void FillEnergyCorrelatorsUnfoldingTriple(T1 const& lepton1, T2 const& lepton2, T3 const& hadron, T4 const& track, T5 const& t1, float* values = nullptr);
13661370
template <typename T1, typename T2>
13671371
static void FillEnergyCorrelator(T1 const& dilepton, T2 const& hadron, float* values = nullptr, float Translow = 1. / 3, float Transhigh = 2. / 3, bool applyFitMass = false, float sidebandMass = 0.0f);
13681372
template <typename T1, typename T2>
@@ -5873,6 +5877,114 @@ void VarManager::FillEnergyCorrelator(T1 const& dilepton, T2 const& hadron, floa
58735877
}
58745878
}
58755879
}
5880+
5881+
template <typename T1, typename T2, typename T3>
5882+
void VarManager::FillEnergyCorrelatorTriple(T1 const& lepton1, T2 const& lepton2, T3 const& hadron, float* values, float Translow, float Transhigh, bool applyFitMass, float sidebandMass)
5883+
{
5884+
float m1 = o2::constants::physics::MassElectron;
5885+
float m2 = o2::constants::physics::MassElectron;
5886+
5887+
ROOT::Math::PtEtaPhiMVector v_lepton1(lepton1.pt(), lepton1.eta(), lepton1.phi(), m1);
5888+
ROOT::Math::PtEtaPhiMVector v_lepton2(lepton2.pt(), lepton2.eta(), lepton2.phi(), m2);
5889+
ROOT::Math::PtEtaPhiMVector dilepton = v_lepton1 + v_lepton2;
5890+
5891+
float dileptonmass = o2::constants::physics::MassJPsi;
5892+
if (applyFitMass) {
5893+
dileptonmass = dilepton.mass();
5894+
}
5895+
if (applyFitMass && sidebandMass > 0) {
5896+
dileptonmass = sidebandMass;
5897+
}
5898+
5899+
if (fgUsedVars[kCosChi] || fgUsedVars[kECWeight] || fgUsedVars[kCosTheta] || fgUsedVars[kEWeight_before] || fgUsedVars[kPtDau] || fgUsedVars[kEtaDau] || fgUsedVars[kPhiDau] || fgUsedVars[kCosChi_randomPhi_trans] || fgUsedVars[kCosChi_randomPhi_toward] || fgUsedVars[kCosChi_randomPhi_away]) {
5900+
values[kdileptonmass] = dileptonmass;
5901+
ROOT::Math::PtEtaPhiMVector v1(dilepton.pt(), dilepton.eta(), dilepton.phi(), dileptonmass);
5902+
ROOT::Math::PtEtaPhiMVector v2(hadron.pt(), hadron.eta(), hadron.phi(), o2::constants::physics::MassPionCharged);
5903+
values[kCosChi] = LorentzTransformJpsihadroncosChi("coschi", v1, v2);
5904+
float E_boost = LorentzTransformJpsihadroncosChi("weight_boost", v1, v2);
5905+
values[kECWeight] = E_boost / v1.M();
5906+
values[kCosTheta] = LorentzTransformJpsihadroncosChi("costheta", v1, v2);
5907+
values[kEWeight_before] = v2.Pt() / v1.M();
5908+
values[kPtDau] = v2.pt();
5909+
values[kEtaDau] = v2.eta();
5910+
values[kPhiDau] = RecoDecay::constrainAngle(v2.phi(), -o2::constants::math::PIHalf);
5911+
5912+
float deltaphi = RecoDecay::constrainAngle(v1.phi() - v2.phi(), -o2::constants::math::PI);
5913+
values[kDeltaPhi] = RecoDecay::constrainAngle(v1.phi() - v2.phi(), -o2::constants::math::PIHalf);
5914+
values[kDeltaEta] = v1.eta() - v2.eta();
5915+
values[kCosChi_randomPhi_trans] = -999.9f;
5916+
values[kCosChi_randomPhi_toward] = -999.9f;
5917+
values[kCosChi_randomPhi_away] = -999.9f;
5918+
5919+
values[kdeltaphi_randomPhi_trans] = -999.9f;
5920+
values[kdeltaphi_randomPhi_toward] = -999.9f;
5921+
values[kdeltaphi_randomPhi_away] = -999.9f;
5922+
5923+
float randomPhi_trans = -o2::constants::math::PIHalf;
5924+
float randomPhi_toward = -o2::constants::math::PIHalf;
5925+
float randomPhi_away = -o2::constants::math::PIHalf;
5926+
5927+
if ((deltaphi > -Transhigh * TMath::Pi() && deltaphi < -Translow * TMath::Pi()) || (deltaphi > Translow * TMath::Pi() && deltaphi < Transhigh * TMath::Pi())) {
5928+
randomPhi_trans = gRandom->Uniform(-o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf);
5929+
randomPhi_toward = gRandom->Uniform(-o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf);
5930+
randomPhi_away = gRandom->Uniform(-o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf);
5931+
5932+
ROOT::Math::PtEtaPhiMVector v2_randomPhi_trans(v2.pt(), v2.eta(), randomPhi_trans, o2::constants::physics::MassPionCharged);
5933+
values[kCosChi_randomPhi_trans] = LorentzTransformJpsihadroncosChi("coschi", v1, v2_randomPhi_trans);
5934+
values[kWeight_randomPhi_trans] = LorentzTransformJpsihadroncosChi("weight_boost", v1, v2_randomPhi_trans) / v1.M();
5935+
5936+
ROOT::Math::PtEtaPhiMVector v2_randomPhi_toward(v2.pt(), v2.eta(), randomPhi_toward, o2::constants::physics::MassPionCharged);
5937+
values[kCosChi_randomPhi_toward] = LorentzTransformJpsihadroncosChi("coschi", v1, v2_randomPhi_toward);
5938+
values[kWeight_randomPhi_toward] = LorentzTransformJpsihadroncosChi("weight_boost", v1, v2_randomPhi_toward) / v1.M();
5939+
5940+
ROOT::Math::PtEtaPhiMVector v2_randomPhi_away(v2.pt(), v2.eta(), randomPhi_away, o2::constants::physics::MassPionCharged);
5941+
values[kCosChi_randomPhi_away] = LorentzTransformJpsihadroncosChi("coschi", v1, v2_randomPhi_away);
5942+
values[kWeight_randomPhi_away] = LorentzTransformJpsihadroncosChi("weight_boost", v1, v2_randomPhi_away) / v1.M();
5943+
5944+
values[kdeltaphi_randomPhi_trans] = RecoDecay::constrainAngle(v1.phi() - randomPhi_trans, -o2::constants::math::PIHalf);
5945+
values[kdeltaphi_randomPhi_toward] = RecoDecay::constrainAngle(v1.phi() - randomPhi_toward, -o2::constants::math::PIHalf);
5946+
values[kdeltaphi_randomPhi_away] = RecoDecay::constrainAngle(v1.phi() - randomPhi_away, -o2::constants::math::PIHalf);
5947+
}
5948+
}
5949+
}
5950+
5951+
template <int pairType, typename T1, typename T2, typename T3, typename T4, typename T5>
5952+
void VarManager::FillEnergyCorrelatorsUnfoldingTriple(T1 const& lepton1, T2 const& lepton2, T3 const& hadron, T4 const& track, T5 const& t1, float* values)
5953+
{
5954+
if (fgUsedVars[kMCCosChi_gen] || fgUsedVars[kMCWeight_gen] || fgUsedVars[kMCdeltaeta_gen] || fgUsedVars[kMCCosChi_rec] || fgUsedVars[kMCWeight_rec] || fgUsedVars[kMCdeltaeta_rec]) {
5955+
// energy correlators
5956+
5957+
float m1 = o2::constants::physics::MassElectron;
5958+
float m2 = o2::constants::physics::MassElectron;
5959+
5960+
ROOT::Math::PtEtaPhiMVector v_lepton1(lepton1.pt(), lepton1.eta(), lepton1.phi(), m1);
5961+
ROOT::Math::PtEtaPhiMVector v_lepton2(lepton2.pt(), lepton2.eta(), lepton2.phi(), m2);
5962+
ROOT::Math::PtEtaPhiMVector dilepton = v_lepton1 + v_lepton2;
5963+
5964+
float MassHadron;
5965+
if constexpr (pairType == kJpsiHadronMass) {
5966+
MassHadron = TMath::Sqrt(t1.e() * t1.e() - t1.p() * t1.p());
5967+
}
5968+
if constexpr (pairType == kJpsiPionMass) {
5969+
MassHadron = o2::constants::physics::MassPionCharged;
5970+
}
5971+
ROOT::Math::PtEtaPhiMVector v1_gen(track.pt(), track.eta(), track.phi(), o2::constants::physics::MassJPsi);
5972+
ROOT::Math::PtEtaPhiMVector v2_gen(t1.pt(), t1.eta(), t1.phi(), MassHadron);
5973+
float E_boost_gen = LorentzTransformJpsihadroncosChi("weight_boost", v1_gen, v2_gen);
5974+
float CosChi_gen = LorentzTransformJpsihadroncosChi("coschi", v1_gen, v2_gen);
5975+
values[kMCCosChi_gen] = CosChi_gen;
5976+
values[kMCWeight_gen] = E_boost_gen / o2::constants::physics::MassJPsi;
5977+
values[kMCdeltaeta_gen] = track.eta() - t1.eta();
5978+
5979+
ROOT::Math::PtEtaPhiMVector v1_rec(dilepton.pt(), dilepton.eta(), dilepton.phi(), dilepton.mass());
5980+
ROOT::Math::PtEtaPhiMVector v2_rec(hadron.pt(), hadron.eta(), hadron.phi(), o2::constants::physics::MassPionCharged);
5981+
values[kMCCosChi_rec] = LorentzTransformJpsihadroncosChi("coschi", v1_rec, v2_rec);
5982+
float E_boost_rec = LorentzTransformJpsihadroncosChi("weight_boost", v1_rec, v2_rec);
5983+
values[kMCWeight_rec] = E_boost_rec / v1_rec.M();
5984+
values[kMCdeltaeta_rec] = dilepton.eta() - hadron.eta();
5985+
}
5986+
}
5987+
58765988
template <typename T1, typename T2>
58775989
void VarManager::FillDileptonPhoton(T1 const& dilepton, T2 const& photon, float* values)
58785990
{

PWGDQ/Tasks/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ o2physics_add_dpl_workflow(efficiency-with-assoc-direct
3939
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGDQCore O2::ReconstructionDataFormats O2::DetectorsCommonDataFormats O2::DetectorsVertexing
4040
COMPONENT_NAME Analysis)
4141

42+
o2physics_add_dpl_workflow(energy-correlator-direct
43+
SOURCES dqEnergyCorrelator_direct.cxx
44+
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGDQCore
45+
COMPONENT_NAME Analysis)
46+
4247
o2physics_add_dpl_workflow(filter-pp
4348
SOURCES filterPP.cxx
4449
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGDQCore

0 commit comments

Comments
 (0)