Skip to content

Commit 674113f

Browse files
committed
[DPG][Common] Test of dE/dx correction for occupancy
1 parent e501845 commit 674113f

File tree

5 files changed

+796
-45
lines changed

5 files changed

+796
-45
lines changed

Common/TableProducer/PID/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ o2physics_add_dpl_workflow(pid-tof-full
4545

4646
o2physics_add_dpl_workflow(pid-tpc-base
4747
SOURCES pidTPCBase.cxx
48-
PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore
48+
PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::AnalysisCCDB
4949
COMPONENT_NAME Analysis)
5050

5151
o2physics_add_dpl_workflow(pid-tpc

Common/TableProducer/PID/pidTPC.cxx

Lines changed: 110 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,32 +18,34 @@
1818
/// \brief Task to produce PID tables for TPC split for each particle.
1919
/// Only the tables for the mass hypotheses requested are filled, and only for the requested table size ("Full" or "Tiny"). The others are sent empty.
2020
///
21-
#include <utility>
2221
#include <map>
2322
#include <memory>
2423
#include <string>
24+
#include <utility>
2525
#include <vector>
2626
// ROOT includes
2727
#include "TFile.h"
2828
#include "TRandom.h"
2929
#include "TSystem.h"
3030

3131
// O2 includes
32+
#include "MetadataHelper.h"
33+
#include "TableHelper.h"
34+
#include "pidTPCBase.h"
35+
36+
#include "Common/Core/PID/TPCPIDResponse.h"
37+
#include "Common/DataModel/EventSelection.h"
38+
#include "Common/DataModel/Multiplicity.h"
39+
#include "Common/DataModel/PIDResponseTPC.h"
40+
#include "Tools/ML/model.h"
41+
3242
#include "CCDB/BasicCCDBManager.h"
43+
#include "CCDB/CcdbApi.h"
44+
#include "Framework/ASoAHelpers.h"
45+
#include "Framework/AnalysisDataModel.h"
3346
#include "Framework/AnalysisTask.h"
3447
#include "Framework/runDataProcessing.h"
35-
#include "Framework/ASoAHelpers.h"
3648
#include "ReconstructionDataFormats/Track.h"
37-
#include "CCDB/CcdbApi.h"
38-
#include "Common/DataModel/PIDResponseTPC.h"
39-
#include "Common/Core/PID/TPCPIDResponse.h"
40-
#include "Framework/AnalysisDataModel.h"
41-
#include "Common/DataModel/Multiplicity.h"
42-
#include "Common/DataModel/EventSelection.h"
43-
#include "TableHelper.h"
44-
#include "Tools/ML/model.h"
45-
#include "pidTPCBase.h"
46-
#include "MetadataHelper.h"
4749

4850
using namespace o2;
4951
using namespace o2::framework;
@@ -155,8 +157,10 @@ struct tpcPid {
155157
void init(o2::framework::InitContext& initContext)
156158
{
157159
// Protection for process flags
158-
if ((doprocessStandard && doprocessMcTuneOnData) || (!doprocessStandard && !doprocessMcTuneOnData)) {
159-
LOG(fatal) << "pid-tpc must have only one of the options 'processStandard' OR 'processMcTuneOnData' enabled. Please check your configuration.";
160+
if (!((doprocessStandard && !doprocessStandard2 && !doprocessMcTuneOnData) ||
161+
(!doprocessStandard && doprocessStandard2 && !doprocessMcTuneOnData) ||
162+
(!doprocessStandard && !doprocessStandard2 && doprocessMcTuneOnData))) {
163+
LOG(fatal) << "pid-tpc must have only one of the options 'processStandard', 'processStandard2', 'processMcTuneOnData' enabled. Please check your configuration.";
160164
}
161165
response = new o2::pid::tpc::Response();
162166
// Checking the tables are requested in the workflow and enabling them
@@ -552,6 +556,98 @@ struct tpcPid {
552556
Partition<TrksMC> mcnotTPCStandaloneTracks = (aod::track::tpcNClsFindable > static_cast<uint8_t>(0)) && ((aod::track::itsClusterSizes > static_cast<uint32_t>(0)) || (aod::track::trdPattern > static_cast<uint8_t>(0)) || (aod::track::tofExpMom > 0.f && aod::track::tofChi2 > 0.f)); // To count number of tracks for use in NN array
553557
Partition<TrksMC> mctracksWithTPC = (aod::track::tpcNClsFindable > (uint8_t)0);
554558

559+
void processStandard2(Coll const& collisions, Trks const& tracks, aod::DEdxsCorrected const& dedxscorrected, aod::BCsWithTimestamps const& bcs)
560+
{
561+
const uint64_t outTable_size = tracks.size();
562+
const uint64_t dedxscorrected_size = dedxscorrected.size();
563+
564+
if (dedxscorrected_size != outTable_size) {
565+
LOG(fatal) << "Size of dEdx corrected table does not match size of tracks! dEdx size: " << dedxscorrected_size << ", tracks size: " << outTable_size;
566+
}
567+
568+
auto reserveTable = [&outTable_size](const Configurable<int>& flag, auto& table) {
569+
if (flag.value != 1) {
570+
return;
571+
}
572+
table.reserve(outTable_size);
573+
};
574+
575+
// Prepare memory for enabled tables
576+
reserveTable(pidFullEl, tablePIDFullEl);
577+
reserveTable(pidFullMu, tablePIDFullMu);
578+
reserveTable(pidFullPi, tablePIDFullPi);
579+
reserveTable(pidFullKa, tablePIDFullKa);
580+
reserveTable(pidFullPr, tablePIDFullPr);
581+
reserveTable(pidFullDe, tablePIDFullDe);
582+
reserveTable(pidFullTr, tablePIDFullTr);
583+
reserveTable(pidFullHe, tablePIDFullHe);
584+
reserveTable(pidFullAl, tablePIDFullAl);
585+
586+
reserveTable(pidTinyEl, tablePIDTinyEl);
587+
reserveTable(pidTinyMu, tablePIDTinyMu);
588+
reserveTable(pidTinyPi, tablePIDTinyPi);
589+
reserveTable(pidTinyKa, tablePIDTinyKa);
590+
reserveTable(pidTinyPr, tablePIDTinyPr);
591+
reserveTable(pidTinyDe, tablePIDTinyDe);
592+
reserveTable(pidTinyTr, tablePIDTinyTr);
593+
reserveTable(pidTinyHe, tablePIDTinyHe);
594+
reserveTable(pidTinyAl, tablePIDTinyAl);
595+
596+
const uint64_t tracksForNet_size = (skipTPCOnly) ? notTPCStandaloneTracks.size() : tracksWithTPC.size();
597+
std::vector<float> network_prediction;
598+
599+
if (useNetworkCorrection) {
600+
network_prediction = createNetworkPrediction(collisions, tracks, bcs, tracksForNet_size);
601+
}
602+
603+
uint64_t count_tracks = 0;
604+
uint64_t count_tracks2 = 0;
605+
606+
for (auto const& trk : tracks) {
607+
// Loop on Tracks
608+
609+
const auto& bc = trk.has_collision() ? collisions.iteratorAt(trk.collisionId()).bc_as<aod::BCsWithTimestamps>() : bcs.begin();
610+
auto dedx_corr = dedxscorrected.iteratorAt(count_tracks2);
611+
count_tracks2++;
612+
if (useCCDBParam && ccdbTimestamp.value == 0 && !ccdb->isCachedObjectValid(ccdbPath.value, bc.timestamp())) { // Updating parametrisation only if the initial timestamp is 0
613+
if (recoPass.value == "") {
614+
LOGP(info, "Retrieving latest TPC response object for timestamp {}:", bc.timestamp());
615+
} else {
616+
LOGP(info, "Retrieving TPC Response for timestamp {} and recoPass {}:", bc.timestamp(), recoPass.value);
617+
}
618+
response = ccdb->getSpecific<o2::pid::tpc::Response>(ccdbPath.value, bc.timestamp(), metadata);
619+
headers = ccdbApi.retrieveHeaders(ccdbPath.value, metadata, bc.timestamp());
620+
if (!response) {
621+
LOGP(warning, "!! Could not find a valid TPC response object for specific pass name {}! Falling back to latest uploaded object.", metadata["RecoPassName"]);
622+
response = ccdb->getForTimeStamp<o2::pid::tpc::Response>(ccdbPath.value, bc.timestamp());
623+
headers = ccdbApi.retrieveHeaders(ccdbPath.value, nullmetadata, bc.timestamp());
624+
if (!response) {
625+
LOGP(fatal, "Could not find ANY TPC response object for the timestamp {}!", bc.timestamp());
626+
}
627+
}
628+
LOG(info) << "Successfully retrieved TPC PID object from CCDB for timestamp " << bc.timestamp() << ", period " << headers["LPMProductionTag"] << ", recoPass " << headers["RecoPassName"];
629+
response->PrintAll();
630+
}
631+
auto makePidTablesDefault = [&trk, &dedx_corr, &collisions, &network_prediction, &count_tracks, &tracksForNet_size, this](const int flagFull, auto& tableFull, const int flagTiny, auto& tableTiny, const o2::track::PID::ID pid) {
632+
makePidTables(flagFull, tableFull, flagTiny, tableTiny, pid, dedx_corr.tpcSignalCorrected(), trk, collisions, network_prediction, count_tracks, tracksForNet_size);
633+
};
634+
635+
makePidTablesDefault(pidFullEl, tablePIDFullEl, pidTinyEl, tablePIDTinyEl, o2::track::PID::Electron);
636+
makePidTablesDefault(pidFullMu, tablePIDFullMu, pidTinyMu, tablePIDTinyMu, o2::track::PID::Muon);
637+
makePidTablesDefault(pidFullPi, tablePIDFullPi, pidTinyPi, tablePIDTinyPi, o2::track::PID::Pion);
638+
makePidTablesDefault(pidFullKa, tablePIDFullKa, pidTinyKa, tablePIDTinyKa, o2::track::PID::Kaon);
639+
makePidTablesDefault(pidFullPr, tablePIDFullPr, pidTinyPr, tablePIDTinyPr, o2::track::PID::Proton);
640+
makePidTablesDefault(pidFullDe, tablePIDFullDe, pidTinyDe, tablePIDTinyDe, o2::track::PID::Deuteron);
641+
makePidTablesDefault(pidFullTr, tablePIDFullTr, pidTinyTr, tablePIDTinyTr, o2::track::PID::Triton);
642+
makePidTablesDefault(pidFullHe, tablePIDFullHe, pidTinyHe, tablePIDTinyHe, o2::track::PID::Helium3);
643+
makePidTablesDefault(pidFullAl, tablePIDFullAl, pidTinyAl, tablePIDTinyAl, o2::track::PID::Alpha);
644+
645+
if (trk.hasTPC() && (!skipTPCOnly || trk.hasITS() || trk.hasTRD() || trk.hasTOF())) {
646+
count_tracks++; // Increment network track counter only if track has TPC, and (not skipping TPConly) or (is not TPConly)
647+
}
648+
}
649+
}
650+
PROCESS_SWITCH(tpcPid, processStandard2, "Creating PID tables with Corrected dEdx", false);
555651
void processMcTuneOnData(CollMC const& collisionsMc, TrksMC const& tracksMc, aod::BCsWithTimestamps const& bcs, aod::McParticles const&)
556652
{
557653
gRandom->SetSeed(0); // Ensure unique seed from UUID for each process call

Common/TableProducer/PID/pidTPCBase.cxx

Lines changed: 108 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,21 @@
1515
/// \brief Base to build tasks for TPC PID tasks.
1616
///
1717

18+
#include <string>
1819
#include <utility>
1920
#include <vector>
20-
#include <string>
2121

2222
// O2 includes
23-
#include "CCDB/BasicCCDBManager.h"
24-
#include "Framework/AnalysisTask.h"
25-
#include "ReconstructionDataFormats/Track.h"
26-
#include "Common/DataModel/FT0Corrected.h"
2723
#include "TableHelper.h"
2824
#include "pidTPCBase.h"
25+
26+
#include "Common/DataModel/FT0Corrected.h"
27+
#include "Common/CCDB/ctpRateFetcher.h"
28+
29+
#include "CCDB/BasicCCDBManager.h"
30+
#include "Framework/AnalysisTask.h"
2931
#include "Framework/runDataProcessing.h"
32+
#include "ReconstructionDataFormats/Track.h"
3033

3134
using namespace o2;
3235
using namespace o2::framework;
@@ -76,7 +79,106 @@ struct PidMultiplicity {
7679
PROCESS_SWITCH(PidMultiplicity, processStandard, "Process with tracks, needs propagated tracks", true);
7780
};
7881

82+
struct DeDxCorrection {
83+
Produces<aod::DEdxsCorrected> dEdxCorrected;
84+
using BCsRun3 = soa::Join<aod::BCs, aod::Timestamps, aod::BcSels, aod::Run3MatchedToBCSparse>;
85+
using ColEvSels = soa::Join<aod::Collisions, aod::EvSels, aod::Mults>;
86+
using FullTracksIU = soa::Join<aod::TracksIU, aod::TracksExtra>;
87+
88+
uint64_t minGlobalBC = 0;
89+
Service<o2::ccdb::BasicCCDBManager> ccdb;
90+
ctpRateFetcher mRateFetcher;
91+
92+
Str_dEdx_correction str_dedx_correction;
93+
94+
// void init(InitContext& initContext)
95+
void init(o2::framework::InitContext&)
96+
{
97+
ccdb->setURL("http://alice-ccdb.cern.ch");
98+
ccdb->setCaching(true);
99+
ccdb->setLocalObjectValidityChecking();
100+
str_dedx_correction.init();
101+
}
102+
103+
void processRun3(
104+
ColEvSels const& cols,
105+
FullTracksIU const& tracks,
106+
aod::BCsWithTimestamps const& bcs)
107+
{
108+
const uint64_t outTable_size = tracks.size();
109+
dEdxCorrected.reserve(outTable_size);
110+
111+
for (auto const& trk : tracks) {
112+
double hadronicRate;
113+
int multTPC;
114+
int occupancy;
115+
if (trk.has_collision()) {
116+
auto collision = cols.iteratorAt(trk.collisionId());
117+
auto bc = collision.bc_as<aod::BCsWithTimestamps>();
118+
const int runnumber = bc.runNumber();
119+
hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), runnumber, "ZNC hadronic") * 1.e-3; // kHz
120+
multTPC = collision.multTPC();
121+
occupancy = collision.trackOccupancyInTimeRange();
122+
} else {
123+
auto bc = bcs.begin();
124+
const int runnumber = bc.runNumber();
125+
hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), runnumber, "ZNC hadronic") * 1.e-3; // kHz
126+
multTPC = 0;
127+
occupancy = 0;
128+
}
129+
130+
float signedP = trk.sign() * trk.tpcInnerParam();
131+
float fTPCSignal = trk.tpcSignal();
132+
float fNormMultTPC = multTPC / 11000.;
133+
134+
float fTrackOccN = occupancy / 1000.;
135+
float fOccTPCN = fNormMultTPC * 10; //(fNormMultTPC*10).clip(0,12)
136+
if (fOccTPCN > 12)
137+
fOccTPCN = 12;
138+
else if (fOccTPCN < 0)
139+
fOccTPCN = 0;
140+
141+
float fTrackOccMeanN = hadronicRate / 5;
142+
float side = trk.tgl() > 0 ? 1 : 0;
143+
float a1pt = std::abs(trk.signed1Pt());
144+
float a1pt2 = a1pt * a1pt;
145+
float atgl = std::abs(trk.tgl());
146+
float mbb0R = 50 / fTPCSignal;
147+
if (mbb0R > 1.05)
148+
mbb0R = 1.05;
149+
else if (mbb0R < 0.05)
150+
mbb0R = 0.05;
151+
// float mbb0R = max(0.05, min(50 / fTPCSignal, 1.05));
152+
float a1ptmbb0R = a1pt * mbb0R;
153+
float atglmbb0R = atgl * mbb0R;
154+
155+
std::vector<float> vec_occu = {fTrackOccN, fOccTPCN, fTrackOccMeanN};
156+
std::vector<float> vec_track = {mbb0R, a1pt, atgl, atglmbb0R, a1ptmbb0R, side, a1pt2};
157+
158+
float fTPCSignalN_CR0 = str_dedx_correction.fReal_fTPCSignalN(vec_occu, vec_track);
159+
160+
float mbb0R1 = 50 / (fTPCSignal / fTPCSignalN_CR0);
161+
if (mbb0R1 > 1.05)
162+
mbb0R1 = 1.05;
163+
else if (mbb0R1 < 0.05)
164+
mbb0R1 = 0.05;
165+
166+
std::vector<float> vec_track1 = {mbb0R1, a1pt, atgl, atgl * mbb0R1, a1pt * mbb0R1, side, a1pt2};
167+
float fTPCSignalN_CR1 = str_dedx_correction.fReal_fTPCSignalN(vec_occu, vec_track1);
168+
169+
float corrected_dEdx = fTPCSignal / fTPCSignalN_CR1;
170+
dEdxCorrected(corrected_dEdx);
171+
}
172+
}
173+
PROCESS_SWITCH(DeDxCorrection, processRun3, "dEdx correction process", false);
174+
175+
void processDummy(ColEvSels const&) {}
176+
177+
PROCESS_SWITCH(DeDxCorrection, processDummy, "Do nothing", true);
178+
};
179+
79180
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
80181
{
81-
return WorkflowSpec{adaptAnalysisTask<PidMultiplicity>(cfgc)};
182+
return WorkflowSpec{adaptAnalysisTask<PidMultiplicity>(cfgc),
183+
adaptAnalysisTask<DeDxCorrection>(cfgc)};
82184
}

Common/TableProducer/PID/pidTPCBase.h

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,22 @@
2121
#include "Common/DataModel/Multiplicity.h"
2222
#include "Common/DataModel/PIDResponseTPC.h"
2323

24+
#include "TMatrixD.h"
25+
2426
namespace o2::aod
2527
{
2628

29+
namespace pid
30+
{
31+
DECLARE_SOA_COLUMN(TpcSignalCorrected, tpcSignalCorrected, float); //!
32+
}; // namespace pid
33+
2734
DECLARE_SOA_TABLE(PIDMults, "AOD", "PIDMults", //! TPC auxiliary table for the PID
2835
o2::soa::Marker<1>,
2936
mult::MultTPC);
37+
DECLARE_SOA_TABLE_FULL(DEdxsCorrected, "DEdxsCorrected", "AOD", "DEDXCORR", pid::TpcSignalCorrected); //!
3038
using PIDMult = PIDMults::iterator;
39+
using DEdxCorrected = DEdxsCorrected::iterator; //!
3140

3241
} // namespace o2::aod
3342

@@ -57,4 +66,41 @@ int getPIDIndex(const int pdgCode) // Get O2 PID index corresponding to MC PDG c
5766
}
5867
}
5968

69+
typedef struct Str_dEdx_correction {
70+
TMatrixD fMatrix;
71+
bool warning = true;
72+
73+
// void init(std::vector<double>& params)
74+
void init()
75+
{
76+
double elements[32] = {0.99091, -0.015053, 0.0018912, -0.012305,
77+
0.081387, 0.003205, -0.0087404, -0.0028608,
78+
0.013066, 0.017012, -0.0018469, -0.0052177,
79+
-0.0035655, 0.0017846, 0.0019127, -0.00012964,
80+
0.0049428, 0.0055592, -0.0010618, -0.0016134,
81+
-0.0059098, 0.0013335, 0.00052133, 3.1119e-05,
82+
-0.004882, 0.00077317, -0.0013827, 0.003249,
83+
-0.00063689, 0.0016218, -0.00045215, -1.5815e-05};
84+
fMatrix.ResizeTo(4, 8);
85+
fMatrix.SetMatrixArray(elements);
86+
}
87+
88+
float fReal_fTPCSignalN(std::vector<float>& vec1, std::vector<float>& vec2)
89+
{
90+
float result = 0.f;
91+
// push 1.
92+
vec1.insert(vec1.begin(), 1.0);
93+
vec2.insert(vec2.begin(), 1.0);
94+
for (int i = 0; i < fMatrix.GetNrows(); i++) {
95+
for (int j = 0; j < fMatrix.GetNcols(); j++) {
96+
double param = fMatrix(i, j);
97+
double value1 = i > vec1.size() ? 0 : vec1[i];
98+
double value2 = j > vec2.size() ? 0 : vec2[j];
99+
result += param * value1 * value2;
100+
}
101+
}
102+
return result;
103+
}
104+
} Str_dEdx_correction;
105+
60106
#endif // COMMON_TABLEPRODUCER_PID_PIDTPCBASE_H_

0 commit comments

Comments
 (0)