Skip to content

Commit 078a388

Browse files
victor-gonzalezVictor
andauthored
[PWGCF] DptDpt - Generator level not reconstructed processing (#9668)
Co-authored-by: Victor <victor@cern.ch>
1 parent ca1bc38 commit 078a388

File tree

3 files changed

+127
-6
lines changed

3 files changed

+127
-6
lines changed

PWGCF/TableProducer/dptdptfilter.cxx

Lines changed: 88 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -672,8 +672,9 @@ void DptDptFilter::processGeneratorLevel(aod::McCollision const& mccollision,
672672
if (tmpcollision.mcCollisionId() == mccollision.globalIndex()) {
673673
typename AllCollisions::iterator const& collision = allcollisions.iteratorAt(tmpcollision.globalIndex());
674674
if (isEventSelected(collision, defaultcent)) {
675-
fhTrueVertexZAA->Fill((mccollision.posZ()));
676-
processGenerated(mccollision, mcparticles, defaultcent);
675+
if (processGenerated(mccollision, mcparticles, defaultcent)) {
676+
fhTrueVertexZAA->Fill((mccollision.posZ()));
677+
}
677678
processed = true;
678679
break; /* TODO: only processing the first reconstructed accepted collision */
679680
}
@@ -801,6 +802,8 @@ struct DptDptFilterTracks {
801802
PIDSpeciesSelection pidselector;
802803
bool checkAmbiguousTracks = false;
803804

805+
std::vector<bool> particleReconstructed;
806+
804807
void init(InitContext& initContext)
805808
{
806809
LOGF(info, "DptDptFilterTracks::init()");
@@ -1201,6 +1204,26 @@ struct DptDptFilterTracks {
12011204
tracks.size());
12021205
}
12031206

1207+
/* filter the tracks but not creating the filtered tracks table */
1208+
/* the aim is to fill the structure of the generated particles */
1209+
/* that were reconstructed */
1210+
template <typename passedtracks>
1211+
void filterTracksSpecial(soa::Join<aod::Collisions, aod::DptDptCFCollisionsInfo> const&, passedtracks const& tracks)
1212+
{
1213+
/* do check for special adjustments */
1214+
getCCDBInformation();
1215+
1216+
for (auto const& track : tracks) {
1217+
int8_t pid = -1;
1218+
if (track.has_collision() && (track.template collision_as<soa::Join<aod::Collisions, aod::DptDptCFCollisionsInfo>>()).collisionaccepted()) {
1219+
pid = selectTrack<kNODEBUG, soa::Join<aod::Collisions, aod::DptDptCFCollisionsInfo>>(track);
1220+
if (!(pid < 0)) {
1221+
particleReconstructed[track.mcParticleId()] = true;
1222+
}
1223+
}
1224+
}
1225+
}
1226+
12041227
/* TODO: for the time being the full derived data is still not supported */
12051228
/* for doing that we need to get the index of the associated mc collision */
12061229
void filterParticles(soa::Join<aod::McCollisions, aod::DptDptCFGenCollisionsInfo> const& gencollisions, aod::McParticles const& particles)
@@ -1250,6 +1273,59 @@ struct DptDptFilterTracks {
12501273
particles.size());
12511274
}
12521275

1276+
/* we produce the derived particle table incoporating only the particles that were accepted but not were reconstructed */
1277+
void filterParticlesSpecial(soa::Join<aod::McCollisions, aod::DptDptCFGenCollisionsInfo> const& gencollisions, aod::McParticles const& particles)
1278+
{
1279+
using namespace dptdptfilter;
1280+
1281+
int acceptedparticles = 0;
1282+
int acceptedcollisions = 0;
1283+
if (!fullDerivedData) {
1284+
gentracksinfo.reserve(particles.size());
1285+
}
1286+
1287+
for (auto const& gencoll : gencollisions) {
1288+
if (gencoll.collisionaccepted()) {
1289+
acceptedcollisions++;
1290+
}
1291+
}
1292+
1293+
for (auto const& particle : particles) {
1294+
int8_t pid = -1;
1295+
auto pdgpart = fPDG->GetParticle(particle.pdgCode());
1296+
float charge = pdgpart != nullptr ? getCharge(pdgpart->Charge()) : 0;
1297+
1298+
if (charge != 0) {
1299+
if (particle.has_mcCollision() && (particle.template mcCollision_as<soa::Join<aod::McCollisions, aod::DptDptCFGenCollisionsInfo>>()).collisionaccepted()) {
1300+
auto mccollision = particle.template mcCollision_as<soa::Join<aod::McCollisions, aod::DptDptCFGenCollisionsInfo>>();
1301+
pid = selectParticle(particle, mccollision);
1302+
if (!(pid < 0)) {
1303+
if (particleReconstructed[particle.globalIndex()]) {
1304+
/* the particle was reconstructed and accepted, reject it */
1305+
pid = -1;
1306+
} else {
1307+
acceptedparticles++;
1308+
}
1309+
}
1310+
}
1311+
} else {
1312+
if ((particle.mcCollisionId() == 0) && traceCollId0) {
1313+
LOGF(DPTDPTFILTERLOGTRACKS, "Particle %d with fractional charge or equal to zero", particle.globalIndex());
1314+
}
1315+
}
1316+
if (!fullDerivedData) {
1317+
gentracksinfo(pid);
1318+
}
1319+
}
1320+
LOGF(DPTDPTFILTERLOGCOLLISIONS,
1321+
"Processed %d accepted generated collisions out of a total of %d with %d accepted particles out of a "
1322+
"total of %d",
1323+
acceptedcollisions,
1324+
gencollisions.size(),
1325+
acceptedparticles,
1326+
particles.size());
1327+
}
1328+
12531329
template <typename passedtracks>
12541330
void doFilterTracks(soa::Join<aod::Collisions, aod::DptDptCFCollisionsInfo> const& collisions, passedtracks const& tracks)
12551331
{
@@ -1339,6 +1415,16 @@ struct DptDptFilterTracks {
13391415
filterParticles(gencollisions, particles);
13401416
}
13411417
PROCESS_SWITCH(DptDptFilterTracks, filterGenerated, "Generated particles filtering", true)
1418+
1419+
void filterGeneratedNotReconstructedWithPID(soa::Join<aod::McCollisions, aod::DptDptCFGenCollisionsInfo> const& gencollisions, aod::McParticles const& particles,
1420+
soa::Join<aod::Collisions, aod::DptDptCFCollisionsInfo>& collisions, DptDptFullTracksPIDDetLevel const& tracks)
1421+
{
1422+
particleReconstructed.resize(particles.size());
1423+
filterTracksSpecial(collisions, tracks);
1424+
filterParticlesSpecial(gencollisions, particles);
1425+
particleReconstructed.clear();
1426+
}
1427+
PROCESS_SWITCH(DptDptFilterTracks, filterGeneratedNotReconstructedWithPID, "Generated particles filtering", false)
13421428
};
13431429

13441430
template <StrongDebugging outdebug, typename TrackObject>

PWGCF/Tasks/dptdptcorrelations.cxx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ struct DptDptCorrelationsTask {
9898
/* histograms */
9999
TH1F* fhVertexZA; //!<! the z vertex distribution for the current multiplicity/centrality class
100100
std::vector<TH1F*> fhN1VsPt{nch, nullptr}; //!<! weighted single particle distribution vs \f$p_T\f$, for the different species
101+
std::vector<TH2F*> fhN1VsPtEta{nch, nullptr}; //!<! weighted single particle distribution vs \f$p_T,\;\eta\f$, for the different species
101102
std::vector<TH2F*> fhN1VsEtaPhi{nch, nullptr}; //!<! weighted single particle distribution vs \f$\eta,\;\phi\f$, for the different species
102103
std::vector<TH2F*> fhSum1PtVsEtaPhi{nch, nullptr}; //!<! accumulated sum of weighted \f$p_T\f$ vs \f$\eta,\;\phi\f$, for the different species
103104
std::vector<TH3F*> fhN1VsZEtaPhiPt{nch, nullptr}; //!<! single particle distribution vs \f$\mbox{vtx}_z,\; \eta,\;\phi,\;p_T\f$, for the different species
@@ -407,6 +408,7 @@ struct DptDptCorrelationsTask {
407408
float corr = (*corrs)[index];
408409
fhN1VsPt[track.trackacceptedid()]->Fill(track.pt(), corr);
409410
if constexpr (smallsingles) {
411+
fhN1VsPtEta[track.trackacceptedid()]->Fill(track.eta(), track.pt(), corr);
410412
fhN1VsEtaPhi[track.trackacceptedid()]->Fill(track.eta(), getShiftedPhi(track.phi()), corr);
411413
fhSum1PtVsEtaPhi[track.trackacceptedid()]->Fill(track.eta(), getShiftedPhi(track.phi()), track.pt() * corr);
412414
} else {
@@ -439,6 +441,7 @@ struct DptDptCorrelationsTask {
439441
n1nw[track.trackacceptedid()] += 1;
440442
sum1Ptnw[track.trackacceptedid()] += track.pt();
441443

444+
fhN1VsPtEta[track.trackacceptedid()]->Fill(track.eta(), track.pt(), corr);
442445
fhN1VsEtaPhi[track.trackacceptedid()]->Fill(track.eta(), getShiftedPhi(track.phi()), corr);
443446
fhSum1PtVsEtaPhi[track.trackacceptedid()]->Fill(track.eta(), getShiftedPhi(track.phi()), track.pt() * corr);
444447
index++;
@@ -672,6 +675,9 @@ struct DptDptCorrelationsTask {
672675
/* we don't want the Sumw2 structure being created here */
673676
bool defSumw2 = TH1::GetDefaultSumw2();
674677
if constexpr (smallsingles) {
678+
fhN1VsPtEta[i] = new TH2F(TString::Format("n1_%s_vsPtEta", tnames[i].c_str()).Data(),
679+
TString::Format("#LT n_{1_{%s}} #GT;#eta;#it{p}_{T}", tnames[i].c_str()).Data(),
680+
etabins, etalow, etaup, ptbins, ptlow, ptup);
675681
fhN1VsEtaPhi[i] = new TH2F(TString::Format("n1_%s_vsEtaPhi", tnames[i].c_str()).Data(),
676682
TString::Format("#LT n_{1} #GT;#eta_{%s};#varphi_{%s} (radian);#LT n_{1} #GT", tnames[i].c_str(), tnames[i].c_str()).Data(),
677683
etabins, etalow, etaup, phibins, philow, phiup);
@@ -722,6 +728,8 @@ struct DptDptCorrelationsTask {
722728

723729
/* the statistical uncertainties will be estimated by the subsamples method so let's get rid of the error tracking */
724730
if constexpr (smallsingles) {
731+
fhN1VsPtEta[i]->SetBit(TH1::kIsNotW);
732+
fhN1VsPtEta[i]->Sumw2(false);
725733
fhN1VsEtaPhi[i]->SetBit(TH1::kIsNotW);
726734
fhN1VsEtaPhi[i]->Sumw2(false);
727735
fhSum1PtVsEtaPhi[i]->SetBit(TH1::kIsNotW);
@@ -737,6 +745,7 @@ struct DptDptCorrelationsTask {
737745

738746
fOutputList->Add(fhN1VsPt[i]);
739747
if constexpr (smallsingles) {
748+
fOutputList->Add(fhN1VsPtEta[i]);
740749
fOutputList->Add(fhN1VsEtaPhi[i]);
741750
fOutputList->Add(fhSum1PtVsEtaPhi[i]);
742751
} else {
@@ -747,6 +756,9 @@ struct DptDptCorrelationsTask {
747756
} else {
748757
for (uint i = 0; i < nch; ++i) {
749758
/* histograms for each track species */
759+
fhN1VsPtEta[i] = new TH2F(TString::Format("n1_%s_vsPtEta", tnames[i].c_str()).Data(),
760+
TString::Format("#LT n_{1_{%s}} #GT;#eta;#it{p}_{T}", tnames[i].c_str()).Data(),
761+
etabins, etalow, etaup, ptbins, ptlow, ptup);
750762
fhN1VsEtaPhi[i] = new TH2F(TString::Format("n1_%s_vsEtaPhi", tnames[i].c_str()).Data(),
751763
TString::Format("#LT n_{1} #GT;#eta_{%s};#varphi_{%s} (radian);#LT n_{1} #GT", tnames[i].c_str(), tnames[i].c_str()).Data(),
752764
etabins, etalow, etaup, phibins, philow, phiup);
@@ -768,6 +780,7 @@ struct DptDptCorrelationsTask {
768780
TString::Format("#LT #Sigma p_{t,%s} #GT;Centrality/Multiplicity (%%);#LT #Sigma p_{t,%s} #GT (GeV/c)", tnames[i].c_str(), tnames[i].c_str()).Data(), 100, 0.0, 100.0);
769781
fhNuaNue[i] = nullptr;
770782
fhPtAvgVsEtaPhi[i] = nullptr;
783+
fOutputList->Add(fhN1VsPtEta[i]);
771784
fOutputList->Add(fhN1VsEtaPhi[i]);
772785
fOutputList->Add(fhSum1PtVsEtaPhi[i]);
773786
fOutputList->Add(fhN1VsC[i]);

PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -807,7 +807,9 @@ struct DptDptEfficiencyAndQc {
807807
/* do nothing if not active */
808808
if (!doprocessDetectorLevelNotStored &&
809809
!doprocessDetectorLevelNotStoredPID &&
810+
!doprocessDetectorLevelNotStoredTunedOnDataPID &&
810811
!doprocessDetectorLevelNotStoredPIDExtra &&
812+
!doprocessDetectorLevelNotStoredTunedOnDataPIDExtra &&
811813
!doprocessGeneratorLevelNotStored &&
812814
!doprocessReconstructedNotStored &&
813815
!doprocessReconstructedNotStoredPID &&
@@ -895,8 +897,8 @@ struct DptDptEfficiencyAndQc {
895897
noOfNSigmaBins = static_cast<int>((maxNSigma - minNSigma) / widthNSigmaBin);
896898

897899
bool doBasicAnalysis = doprocessDetectorLevelNotStored || doprocessReconstructedNotStored;
898-
bool doPidAnalysis = doprocessDetectorLevelNotStoredPID || doprocessReconstructedNotStoredPID;
899-
bool doPidExtraAnalysis = doprocessDetectorLevelNotStoredPIDExtra || doprocessReconstructedNotStoredPIDExtra;
900+
bool doPidAnalysis = doprocessDetectorLevelNotStoredPID || doprocessDetectorLevelNotStoredTunedOnDataPID || doprocessReconstructedNotStoredPID;
901+
bool doPidExtraAnalysis = doprocessDetectorLevelNotStoredPIDExtra || doprocessDetectorLevelNotStoredTunedOnDataPIDExtra || doprocessReconstructedNotStoredPIDExtra;
900902

901903
if (doBasicAnalysis) {
902904
qaDataCE = new QADataCollectingEngine*[ncmranges];
@@ -1070,7 +1072,17 @@ struct DptDptEfficiencyAndQc {
10701072

10711073
processTracks<soa::Filtered<soa::Join<aod::Collisions, aod::DptDptCFCollisionsInfo>>, kPID, kReco>(collision, tracks);
10721074
}
1073-
PROCESS_SWITCH(DptDptEfficiencyAndQc, processDetectorLevelNotStoredPID, "Process MC detector level PID QA for not stored derived data", true);
1075+
PROCESS_SWITCH(DptDptEfficiencyAndQc, processDetectorLevelNotStoredPID, "Process MC detector level PID QA for not stored derived data", false);
1076+
1077+
void processDetectorLevelNotStoredTunedOnDataPID(soa::Filtered<soa::Join<aod::Collisions, aod::DptDptCFCollisionsInfo>>::iterator const& collision,
1078+
soa::Join<aod::FullTracks, aod::DptDptCFTracksInfo, aod::TrackSelection, aod::McTrackLabels, TpcPID, TofPID, aod::mcTPCTuneOnData> const& tracks,
1079+
soa::Join<aod::McParticles, aod::DptDptCFGenTracksInfo> const&)
1080+
{
1081+
using namespace efficiencyandqatask;
1082+
1083+
processTracks<soa::Filtered<soa::Join<aod::Collisions, aod::DptDptCFCollisionsInfo>>, kPID, kReco>(collision, tracks);
1084+
}
1085+
PROCESS_SWITCH(DptDptEfficiencyAndQc, processDetectorLevelNotStoredTunedOnDataPID, "Process MC detector level tuned on data PID QA for not stored derived data", true);
10741086

10751087
void processDetectorLevelNotStoredPIDExtra(soa::Filtered<soa::Join<aod::Collisions, aod::DptDptCFCollisionsInfo>>::iterator const& collision,
10761088
soa::Join<aod::FullTracks, aod::DptDptCFTracksInfo, aod::TrackSelection, aod::McTrackLabels, TpcPID, TofPID> const& tracks,
@@ -1080,7 +1092,17 @@ struct DptDptEfficiencyAndQc {
10801092

10811093
processTracks<soa::Filtered<soa::Join<aod::Collisions, aod::DptDptCFCollisionsInfo>>, kPIDEXTRA, kReco>(collision, tracks);
10821094
}
1083-
PROCESS_SWITCH(DptDptEfficiencyAndQc, processDetectorLevelNotStoredPIDExtra, "Process MC detector level PID extra QA for not stored derived data", true);
1095+
PROCESS_SWITCH(DptDptEfficiencyAndQc, processDetectorLevelNotStoredPIDExtra, "Process MC detector level PID extra QA for not stored derived data", false);
1096+
1097+
void processDetectorLevelNotStoredTunedOnDataPIDExtra(soa::Filtered<soa::Join<aod::Collisions, aod::DptDptCFCollisionsInfo>>::iterator const& collision,
1098+
soa::Join<aod::FullTracks, aod::DptDptCFTracksInfo, aod::TrackSelection, aod::McTrackLabels, TpcPID, TofPID, aod::mcTPCTuneOnData> const& tracks,
1099+
soa::Join<aod::McParticles, aod::DptDptCFGenTracksInfo> const&)
1100+
{
1101+
using namespace efficiencyandqatask;
1102+
1103+
processTracks<soa::Filtered<soa::Join<aod::Collisions, aod::DptDptCFCollisionsInfo>>, kPIDEXTRA, kReco>(collision, tracks);
1104+
}
1105+
PROCESS_SWITCH(DptDptEfficiencyAndQc, processDetectorLevelNotStoredTunedOnDataPIDExtra, "Process MC detector level tuned on data PID extra QA for not stored derived data", true);
10841106
};
10851107

10861108
using BCsWithTimestamps = soa::Join<aod::BCs, aod::Timestamps>;

0 commit comments

Comments
 (0)