Skip to content

Commit 9fdee58

Browse files
authored
PWGEM/Dilepton: fix dimuonQCMC (#6983)
1 parent 229e9ab commit 9fdee58

11 files changed

Lines changed: 198 additions & 70 deletions

File tree

PWGEM/Dilepton/Core/DielectronCut.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class DielectronCut : public TNamed
4040
public:
4141
DielectronCut() = default;
4242
DielectronCut(const char* name, const char* title) : TNamed(name, title) {}
43+
~DielectronCut() {}
4344

4445
enum class DielectronCuts : int {
4546
// pair cut

PWGEM/Dilepton/Core/DimuonCut.h

Lines changed: 8 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,18 @@
2727
#include "Framework/Logger.h"
2828
#include "Framework/DataTypes.h"
2929
#include "CommonConstants/PhysicsConstants.h"
30+
#include "PWGEM/Dilepton/Utils/EMTrackUtilities.h"
31+
32+
using namespace o2::aod::pwgem::dilepton::utils::emtrackutil;
3033

3134
class DimuonCut : public TNamed
3235
{
3336
public:
3437
DimuonCut() = default;
3538
DimuonCut(const char* name, const char* title) : TNamed(name, title) {}
3639

40+
~DimuonCut() {}
41+
3742
enum class DimuonCuts : int {
3843
// pair cut
3944
kMass = 0,
@@ -79,36 +84,9 @@ class DimuonCut : public TNamed
7984
ROOT::Math::PtEtaPhiMVector v2(t2.pt(), t2.eta(), t2.phi(), o2::constants::physics::MassMuon);
8085
ROOT::Math::PtEtaPhiMVector v12 = v1 + v2;
8186

82-
float dcaX1 = t1.fwdDcaX();
83-
float dcaY1 = t1.fwdDcaY();
84-
float cXX1 = t1.cXX();
85-
float cYY1 = t1.cYY();
86-
float cXY1 = t1.cXY();
87-
float dcaX2 = t2.fwdDcaX();
88-
float dcaY2 = t2.fwdDcaY();
89-
float cXX2 = t2.cXX();
90-
float cYY2 = t2.cYY();
91-
float cXY2 = t2.cXY();
92-
93-
float dca_xy1 = 999.f;
94-
float det1 = cXX1 * cYY1 - cXY1 * cXY1;
95-
if (det1 < 0) {
96-
dca_xy1 = 999.f;
97-
} else {
98-
float chi2 = (dcaX1 * dcaX1 * cYY1 + dcaY1 * dcaY1 * cXX1 - 2. * dcaX1 * dcaY1 * cXY1) / det1;
99-
dca_xy1 = std::sqrt(std::abs(chi2) / 2.); // in sigma
100-
}
101-
102-
float dca_xy2 = 999.f;
103-
float det2 = cXX2 * cYY2 - cXY2 * cXY2;
104-
if (det2 < 0) {
105-
dca_xy2 = 999.f;
106-
} else {
107-
float chi2 = (dcaX2 * dcaX2 * cYY2 + dcaY2 * dcaY2 * cXX2 - 2. * dcaX2 * dcaY2 * cXY2) / det2;
108-
dca_xy2 = std::sqrt(std::abs(chi2) / 2.); // in sigma
109-
}
110-
111-
float pair_dca_xy = std::sqrt((std::pow(dca_xy1, 2) + std::pow(dca_xy2, 2)) / 2.);
87+
float dca_xy_t1 = fwdDcaXYinSigma(t1);
88+
float dca_xy_t2 = fwdDcaXYinSigma(t2);
89+
float pair_dca_xy = std::sqrt((dca_xy_t1 * dca_xy_t1 + dca_xy_t2 * dca_xy_t2) / 2.);
11290

11391
if (v12.M() < mMinMass || mMaxMass < v12.M()) {
11492
return false;

PWGEM/Dilepton/Core/EMEventCut.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class EMEventCut : public TNamed
2727
public:
2828
EMEventCut() = default;
2929
EMEventCut(const char* name, const char* title) : TNamed(name, title) {}
30+
~EMEventCut() {}
3031

3132
enum class EMEventCuts : int {
3233
kSel8 = 0,

PWGEM/Dilepton/Core/PhotonHBT.h

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,10 @@ struct PhotonHBT {
207207
used_photonIds.shrink_to_fit();
208208
used_dileptonIds.clear();
209209
used_dileptonIds.shrink_to_fit();
210+
211+
if (eid_bdt) {
212+
delete eid_bdt;
213+
}
210214
}
211215

212216
HistogramRegistry fRegistry{"output", {}, OutputObjHandlingPolicy::AnalysisObject, false, false};
@@ -298,12 +302,13 @@ struct PhotonHBT {
298302
const AxisSpec axis_kt{ConfKtBins, "k_{T} (GeV/c)"};
299303

300304
const AxisSpec axis_qinv{30, 0.0, +0.3, "q_{inv} (GeV/c)"};
301-
const AxisSpec axis_qout_cms{60, -0.3, +0.3, "q_{out}^{CMS} (GeV/c)"};
302-
const AxisSpec axis_qside_cms{60, -0.3, +0.3, "q_{side}^{CMS} (GeV/c)"};
303-
const AxisSpec axis_qlong_cms{60, -0.3, +0.3, "q_{long}^{CMS} (GeV/c)"};
304-
const AxisSpec axis_qlong_lcms{60, -0.3, +0.3, "q_{long}^{LCMS} (GeV/c)"};
305+
const AxisSpec axis_qabs_lcms{30, 0.0, +0.3, "|q|^{LCMS} (GeV/c)"};
306+
const AxisSpec axis_qout{60, -0.3, +0.3, "q_{out} (GeV/c)"}; // qout does not change between LAB and LCMS frame
307+
const AxisSpec axis_qside{60, -0.3, +0.3, "q_{side} (GeV/c)"}; // qside does not change between LAB and LCMS frame
308+
const AxisSpec axis_qlong{60, -0.3, +0.3, "q_{long} (GeV/c)"};
305309

306-
fRegistry.add("Pair/same/hs", "diphoton correlation", kTHnSparseD, {axis_kt, axis_qinv, axis_qout_cms, axis_qside_cms, axis_qlong_cms, axis_qlong_lcms}, true);
310+
fRegistry.add("Pair/same/hs_1d", "diphoton correlation 1D", kTHnSparseD, {axis_kt, axis_qinv, axis_qabs_lcms}, true);
311+
fRegistry.add("Pair/same/hs_3d", "diphoton correlation 3D LCMS", kTHnSparseD, {axis_kt, axis_qout, axis_qside, axis_qlong}, true);
307312
fRegistry.addClone("Pair/same/", "Pair/mix/");
308313
}
309314

@@ -376,6 +381,7 @@ struct PhotonHBT {
376381
}
377382
}
378383

384+
o2::ml::OnnxModel* eid_bdt = nullptr;
379385
void DefineDileptonCut()
380386
{
381387
fDielectronCut = DielectronCut("fDielectronCut", "fDielectronCut");
@@ -414,7 +420,7 @@ struct PhotonHBT {
414420
fDielectronCut.SetTOFNsigmaElRange(dielectroncuts.cfg_min_TOFNsigmaEl, dielectroncuts.cfg_max_TOFNsigmaEl);
415421

416422
if (dielectroncuts.cfg_pid_scheme == static_cast<int>(DielectronCut::PIDSchemes::kPIDML)) { // please call this at the end of DefineDileptonCut
417-
o2::ml::OnnxModel* eid_bdt = new o2::ml::OnnxModel();
423+
eid_bdt = new o2::ml::OnnxModel();
418424
if (dielectroncuts.loadModelsFromCCDB) {
419425
ccdbApi.init(ccdburl);
420426
std::map<std::string, std::string> metadata;
@@ -453,14 +459,12 @@ struct PhotonHBT {
453459
ROOT::Math::PtEtaPhiMVector k12 = 0.5 * (v1 + v2);
454460
float qinv = -q12.M();
455461
float kt = k12.Pt();
456-
float qlong_cms = q12.Pz();
457462

458-
ROOT::Math::XYZVector q_3d = q12.Vect(); // 3D q vector
463+
// ROOT::Math::XYZVector q_3d = q12.Vect(); // 3D q vector
459464
ROOT::Math::XYZVector uv_out(k12.Px() / k12.Pt(), k12.Py() / k12.Pt(), 0); // unit vector for out. i.e. parallel to kt
460465
ROOT::Math::XYZVector uv_long(0, 0, 1); // unit vector for long, beam axis
461466
ROOT::Math::XYZVector uv_side = uv_out.Cross(uv_long); // unit vector for side
462-
float qout_cms = q_3d.Dot(uv_out);
463-
float qside_cms = q_3d.Dot(uv_side);
467+
// float qlong_lab = q_3d.Dot(uv_long);
464468

465469
// longitudinally co-moving system (LCMS)
466470
ROOT::Math::PxPyPzEVector v1_cartesian(v1.Px(), v1.Py(), v1.Pz(), v1.E());
@@ -469,17 +473,28 @@ struct PhotonHBT {
469473
float beta_z = (v1 + v2).Pz() / (v1 + v2).E();
470474
ROOT::Math::Boost bst_z(0, 0, -beta_z); // Boost supports only PxPyPzEVector
471475
ROOT::Math::PxPyPzEVector q12_lcms = bst_z(q12_cartesian);
472-
float qlong_lcms = q12_lcms.Pz();
476+
ROOT::Math::XYZVector q_3d_lcms = q12_lcms.Vect(); // 3D q vector in LCMS
477+
float qout_lcms = q_3d_lcms.Dot(uv_out);
478+
float qside_lcms = q_3d_lcms.Dot(uv_side);
479+
float qlong_lcms = q_3d_lcms.Dot(uv_long);
480+
float qabs_lcms = q_3d_lcms.R();
473481

474482
// ROOT::Math::PxPyPzEVector v1_lcms_cartesian = bst_z(v1_cartesian);
475483
// ROOT::Math::PxPyPzEVector v2_lcms_cartesian = bst_z(v2_cartesian);
476484
// ROOT::Math::PxPyPzEVector q12_lcms_cartesian = bst_z(q12_cartesian);
477-
// LOGF(info, "q12.Pz() = %f, q12_cartesian.Pz() = %f",q12.Pz(), q12_cartesian.Pz());
478-
// LOGF(info, "v1.Pz() = %f, v2.Pz() = %f",v1.Pz(), v2.Pz());
479-
// LOGF(info, "v1_lcms_cartesian.Pz() = %f, v2_lcms_cartesian.Pz() = %f",v1_lcms_cartesian.Pz(), v2_lcms_cartesian.Pz());
485+
// LOGF(info, "q12.Pz() = %f, q12_cartesian.Pz() = %f", q12.Pz(), q12_cartesian.Pz());
486+
// LOGF(info, "v1.Pz() = %f, v2.Pz() = %f", v1.Pz(), v2.Pz());
487+
// LOGF(info, "v1_lcms_cartesian.Pz() = %f, v2_lcms_cartesian.Pz() = %f", v1_lcms_cartesian.Pz(), v2_lcms_cartesian.Pz());
480488
// LOGF(info, "q12_lcms_cartesian.Pz() = %f", q12_lcms_cartesian.Pz());
481-
482-
fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("hs"), kt, qinv, qout_cms, qside_cms, qlong_cms, qlong_lcms);
489+
// LOGF(info, "q_3d_lcms.Dot(uv_out) = %f, q_3d_lcms.Dot(uv_side) = %f, q_3d.Dot(uv_out) = %f, q_3d.Dot(uv_side) = %f", q_3d_lcms.Dot(uv_out), q_3d_lcms.Dot(uv_side), q_3d.Dot(uv_out), q_3d.Dot(uv_side));
490+
// LOGF(info, "q12_lcms.Pz() = %f, q_3d_lcms.Dot(uv_long) = %f", q12_lcms.Pz(), q_3d_lcms.Dot(uv_long));
491+
// ROOT::Math::PxPyPzEVector q12_lcms_tmp = bst_z(v1_cartesian) - bst_z(v2_cartesian);
492+
// LOGF(info, "q12_lcms.Px() = %f, q12_lcms.Py() = %f, q12_lcms.Pz() = %f, q12_lcms_tmp.Px() = %f, q12_lcms_tmp.Py() = %f, q12_lcms_tmp.Pz() = %f", q12_lcms.Px(), q12_lcms.Py(), q12_lcms.Pz(), q12_lcms_tmp.Px(), q12_lcms_tmp.Py(), q12_lcms_tmp.Pz());
493+
// float qabs_lcms_tmp = q12_lcms.P();
494+
// LOGF(info, "qabs_lcms = %f, qabs_lcms_tmp = %f", qabs_lcms, qabs_lcms_tmp);
495+
496+
fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("hs_1d"), kt, qinv, qabs_lcms);
497+
fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("hs_3d"), kt, qout_lcms, qside_lcms, qlong_lcms);
483498
}
484499

485500
template <typename TCollisions, typename TPhotons1, typename TPhotons2, typename TSubInfos1, typename TSubInfos2, typename TPreslice1, typename TPreslice2, typename TCut1, typename TCut2>

PWGEM/Dilepton/DataModel/dileptonTables.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
// granted to it by virtue of its status as an Intergovernmental Organization
1010
// or submit itself to any jurisdiction.
1111

12+
#include <string>
13+
#include <unordered_map>
1214
#include "Common/Core/RecoDecay.h"
1315
#include "Framework/AnalysisDataModel.h"
1416
#include "Common/DataModel/PIDResponse.h"
@@ -25,9 +27,39 @@
2527
namespace o2::aod
2628
{
2729

30+
namespace pwgem::dilepton::swt
31+
{
32+
enum class swtAliases : int { // software trigger aliases for EM
33+
kUnDef = 0,
34+
kHighTrackMult = 1,
35+
kHighFt0Mult,
36+
kSingleE,
37+
kLMeeIMR,
38+
kLMeeHMR,
39+
kDiElectron,
40+
kSingleMuLow,
41+
kSingleMuHigh,
42+
kDiMuon,
43+
kNaliases
44+
};
45+
46+
const std::unordered_map<std::string, int> aliasLabels = {
47+
{"fHighTrackMult", static_cast<int>(o2::aod::pwgem::dilepton::swt::swtAliases::kHighTrackMult)},
48+
{"fHighFt0Mult", static_cast<int>(o2::aod::pwgem::dilepton::swt::swtAliases::kHighFt0Mult)},
49+
{"fSingleE", static_cast<int>(o2::aod::pwgem::dilepton::swt::swtAliases::kSingleE)},
50+
{"fLMeeIMR", static_cast<int>(o2::aod::pwgem::dilepton::swt::swtAliases::kLMeeIMR)},
51+
{"fLMeeHMR", static_cast<int>(o2::aod::pwgem::dilepton::swt::swtAliases::kLMeeHMR)},
52+
{"fDiElectron", static_cast<int>(o2::aod::pwgem::dilepton::swt::swtAliases::kDiElectron)},
53+
{"fSingleMuLow", static_cast<int>(o2::aod::pwgem::dilepton::swt::swtAliases::kSingleMuLow)},
54+
{"fSingleMuHigh", static_cast<int>(o2::aod::pwgem::dilepton::swt::swtAliases::kSingleMuHigh)},
55+
{"fDiMuon", static_cast<int>(o2::aod::pwgem::dilepton::swt::swtAliases::kDiMuon)},
56+
};
57+
} // namespace pwgem::dilepton::swt
58+
2859
namespace emevent
2960
{
3061
DECLARE_SOA_COLUMN(CollisionId, collisionId, int);
62+
DECLARE_SOA_BITMAP_COLUMN(SWTAlias, swtalias, 16); //! Bitmask of fired trigger aliases (see above for definitions)
3163
DECLARE_SOA_COLUMN(NeeULS, neeuls, int);
3264
DECLARE_SOA_COLUMN(NeeLSpp, neelspp, int);
3365
DECLARE_SOA_COLUMN(NeeLSmm, neelsmm, int);
@@ -134,6 +166,10 @@ DECLARE_SOA_TABLE(EMEventsQvec, "AOD", "EMEVENTQVEC", //! event q vector table
134166
emevent::EP3BTot<emevent::Q3xBTot, emevent::Q3yBTot>);
135167
using EMEventQvec = EMEventsQvec::iterator;
136168

169+
DECLARE_SOA_TABLE(EMSWTriggerBits, "AOD", "EMSWTRIGGERBIT", //!
170+
emevent::SWTAlias);
171+
using EMSWTriggerBit = EMSWTriggerBits::iterator;
172+
137173
DECLARE_SOA_TABLE(EMEventsNee, "AOD", "EMEVENTNEE", emevent::NeeULS, emevent::NeeLSpp, emevent::NeeLSmm); // joinable to EMEvents
138174
using EMEventNee = EMEventsNee::iterator;
139175

PWGEM/Dilepton/TableProducer/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ o2physics_add_dpl_workflow(skimmer-secondary-electron
4747

4848
o2physics_add_dpl_workflow(create-emevent-dilepton
4949
SOURCES createEMEventDilepton.cxx
50-
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore
50+
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::EventFilteringUtils
5151
COMPONENT_NAME Analysis)
5252

5353
o2physics_add_dpl_workflow(associate-mc-info-dilepton

PWGEM/Dilepton/TableProducer/createEMEventDilepton.cxx

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "DataFormatsParameters/GRPObject.h"
2525
#include "DataFormatsParameters/GRPMagField.h"
2626
#include "CCDB/BasicCCDBManager.h"
27+
#include "EventFiltering/Zorro.h"
2728

2829
#include "PWGEM/Dilepton/DataModel/dileptonTables.h"
2930
#include "PWGEM/PhotonMeson/DataModel/gammaTables.h"
@@ -50,6 +51,7 @@ struct CreateEMEventDilepton {
5051
Produces<o2::aod::EMEventsMult> event_mult;
5152
Produces<o2::aod::EMEventsCent> event_cent;
5253
Produces<o2::aod::EMEventsQvec> event_qvec;
54+
Produces<o2::aod::EMSWTriggerBits> emswtbit;
5355

5456
enum class EMEventType : int {
5557
kEvent = 0,
@@ -64,6 +66,8 @@ struct CreateEMEventDilepton {
6466
Configurable<bool> skipGRPOquery{"skipGRPOquery", true, "skip grpo query"};
6567
Configurable<double> d_bz_input{"d_bz", -999, "bz field, -999 is automatic"};
6668
Configurable<bool> applyEveSel_at_skimming{"applyEveSel_at_skimming", false, "flag to apply minimal event selection at the skimming level"};
69+
Configurable<bool> enable_swt{"enable_swt", false, "flag to process skimmed data (swt triggered)"};
70+
Configurable<std::string> cfg_swt_names{"cfg_swt_names", "fHighTrackMult,fHighFt0Mult", "comma-separated software trigger names"}; // !trigger names have to be pre-registered in dileptonTable.h for bit operation!
6771

6872
HistogramRegistry registry{"registry"};
6973
void init(o2::framework::InitContext&)
@@ -73,6 +77,14 @@ struct CreateEMEventDilepton {
7377
hEventCounter->GetXaxis()->SetBinLabel(2, "sel8");
7478
}
7579

80+
~CreateEMEventDilepton()
81+
{
82+
swt_names.clear();
83+
swt_names.shrink_to_fit();
84+
}
85+
86+
Zorro zorro;
87+
std::vector<std::string> swt_names;
7688
int mRunNumber;
7789
float d_bz;
7890
Service<o2::ccdb::BasicCCDBManager> ccdb;
@@ -84,6 +96,16 @@ struct CreateEMEventDilepton {
8496
return;
8597
}
8698

99+
if (enable_swt) {
100+
LOGF(info, "enable software triggers : %s", cfg_swt_names.value.data());
101+
zorro.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), cfg_swt_names.value);
102+
std::stringstream tokenizer(cfg_swt_names.value);
103+
std::string token;
104+
while (std::getline(tokenizer, token, ',')) {
105+
swt_names.emplace_back(token);
106+
}
107+
}
108+
87109
// In case override, don't proceed, please - no CCDB access required
88110
if (d_bz_input > -990) {
89111
d_bz = d_bz_input;
@@ -137,13 +159,27 @@ struct CreateEMEventDilepton {
137159
continue;
138160
}
139161

162+
if (enable_swt) {
163+
if (zorro.isSelected(bc.globalBC())) { // triggered event
164+
uint16_t trigger_bitmap = 0;
165+
for (auto& swtname : swt_names) {
166+
LOGF(info, "swtname = %s , swt index = %d", swtname.data(), o2::aod::pwgem::dilepton::swt::aliasLabels.at(swtname));
167+
trigger_bitmap |= BIT(o2::aod::pwgem::dilepton::swt::aliasLabels.at(swtname));
168+
} // end of desired trigger names loop
169+
LOGF(info, "trigger_bitmap = %d", trigger_bitmap);
170+
emswtbit(trigger_bitmap);
171+
} else { // rejected
172+
continue;
173+
}
174+
}
175+
// LOGF(info, "collision.multNTracksPV() = %d, collision.multFT0A() = %f, collision.multFT0C() = %f", collision.multNTracksPV(), collision.multFT0A(), collision.multFT0C());
176+
140177
registry.fill(HIST("hEventCounter"), 1);
141178

142179
if (collision.sel8()) {
143180
registry.fill(HIST("hEventCounter"), 2);
144181
}
145182

146-
// uint64_t tag = collision.selection_raw();
147183
event(collision.globalIndex(), bc.runNumber(), bc.globalBC(), collision.alias_raw(), collision.selection_raw(), bc.timestamp(),
148184
collision.posX(), collision.posY(), collision.posZ(),
149185
collision.numContrib(), collision.trackOccupancyInTimeRange());

PWGEM/Dilepton/Tasks/dielectronQC.cxx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,10 @@ struct dielectronQC {
277277

278278
used_trackIds.clear();
279279
used_trackIds.shrink_to_fit();
280+
281+
if (eid_bdt) {
282+
delete eid_bdt;
283+
}
280284
}
281285

282286
void addhistograms()
@@ -412,6 +416,7 @@ struct dielectronQC {
412416
fEMEventCut.SetOccupancyRange(eventcuts.cfgOccupancyMin, eventcuts.cfgOccupancyMax);
413417
}
414418

419+
o2::ml::OnnxModel* eid_bdt = nullptr;
415420
void DefineDileptonCut()
416421
{
417422
fDielectonCut = DielectronCut("fDielectonCut", "fDielectonCut");
@@ -448,7 +453,7 @@ struct dielectronQC {
448453
fDielectonCut.SetTOFNsigmaElRange(dielectroncuts.cfg_min_TOFNsigmaEl, dielectroncuts.cfg_max_TOFNsigmaEl);
449454

450455
if (dielectroncuts.cfg_pid_scheme == static_cast<int>(DielectronCut::PIDSchemes::kPIDML)) { // please call this at the end of DefineDileptonCut
451-
o2::ml::OnnxModel* eid_bdt = new o2::ml::OnnxModel();
456+
eid_bdt = new o2::ml::OnnxModel();
452457
if (dielectroncuts.loadModelsFromCCDB) {
453458
ccdbApi.init(ccdburl);
454459
std::map<std::string, std::string> metadata;

0 commit comments

Comments
 (0)