Skip to content

Commit b62fd8d

Browse files
authored
[PWGUD] TauTau 1+3 topo skimmer (#10623)
1 parent c9d7f57 commit b62fd8d

File tree

1 file changed

+240
-4
lines changed

1 file changed

+240
-4
lines changed

PWGUD/Tasks/upcTauTau13topo.cxx

Lines changed: 240 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,88 @@ using namespace o2::framework;
4343
using namespace o2::framework::expressions;
4444
using namespace o2::constants::physics;
4545

46+
// derived tables for tautau->4 (=1+3) tracks
47+
namespace o2::aod
48+
{
49+
namespace tau_tree
50+
{
51+
// event info
52+
DECLARE_SOA_COLUMN(RunNumber, runNumber, int32_t);
53+
DECLARE_SOA_COLUMN(Bc, bc, int);
54+
DECLARE_SOA_COLUMN(TotalTracks, totalTracks, int);
55+
DECLARE_SOA_COLUMN(NumContrib, numContrib, int);
56+
// DECLARE_SOA_COLUMN(GlobalNonPVtracks, globalNonPVtracks, int);
57+
// DECLARE_SOA_COLUMN(PosX, posX, float);
58+
// DECLARE_SOA_COLUMN(PosY, posY, float);
59+
DECLARE_SOA_COLUMN(PosZ, posZ, float);
60+
DECLARE_SOA_COLUMN(FlagUPC, flagUPC, bool);
61+
DECLARE_SOA_COLUMN(OccupancyInTime, occupancyInTime, int);
62+
DECLARE_SOA_COLUMN(HadronicRate, hadronicRate, double);
63+
DECLARE_SOA_COLUMN(Trs, trs, bool);
64+
DECLARE_SOA_COLUMN(Trofs, trofs, bool);
65+
DECLARE_SOA_COLUMN(Hmpr, hmpr, bool);
66+
// DECLARE_SOA_COLUMN(Tfb, tfb, int);
67+
// DECLARE_SOA_COLUMN(ItsRofb, itsRofb, int);
68+
// DECLARE_SOA_COLUMN(Sbp, sbp, int);
69+
// DECLARE_SOA_COLUMN(ZvtxFT0vsPv, zvtxFT0vsPv, int);
70+
// DECLARE_SOA_COLUMN(VtxITSTPC, vtxITSTPC, int);
71+
DECLARE_SOA_COLUMN(ZdcAenergy, zdcAenergy, float);
72+
DECLARE_SOA_COLUMN(ZdcCenergy, zdcCenergy, float);
73+
DECLARE_SOA_COLUMN(Qtot, qtot, short);
74+
// FIT info
75+
DECLARE_SOA_COLUMN(TotalFT0AmplitudeA, totalFT0AmplitudeA, float);
76+
DECLARE_SOA_COLUMN(TotalFT0AmplitudeC, totalFT0AmplitudeC, float);
77+
DECLARE_SOA_COLUMN(TotalFV0AmplitudeA, totalFV0AmplitudeA, float);
78+
// DECLARE_SOA_COLUMN(TimeFT0A, timeFT0A, float);
79+
// DECLARE_SOA_COLUMN(TimeFT0C, timeFT0C, float);
80+
// DECLARE_SOA_COLUMN(TimeFV0A, timeFV0A, float);
81+
// tracks
82+
DECLARE_SOA_COLUMN(TrkPx, trkPx, float[4]);
83+
DECLARE_SOA_COLUMN(TrkPy, trkPy, float[4]);
84+
DECLARE_SOA_COLUMN(TrkPz, trkPz, float[4]);
85+
// DECLARE_SOA_COLUMN(TrkSign, trkSign, int[4]);
86+
// DECLARE_SOA_COLUMN(TrkDCAxy, trkDCAxy, float[4]);
87+
// DECLARE_SOA_COLUMN(TrkDCAz, trkDCAz, float[4]);
88+
DECLARE_SOA_COLUMN(TrkTPCcr, trkTPCcr, int[4]);
89+
DECLARE_SOA_COLUMN(TrkTPCsignal, trkTPCsignal, float[4]);
90+
DECLARE_SOA_COLUMN(TrkTPCnSigmaEl, trkTPCnSigmaEl, float[4]);
91+
// DECLARE_SOA_COLUMN(TrkTPCnSigmaMu, trkTPCnSigmaMu, float[4]);
92+
DECLARE_SOA_COLUMN(TrkTPCnSigmaPi, trkTPCnSigmaPi, float[4]);
93+
DECLARE_SOA_COLUMN(TrkTPCnSigmaKa, trkTPCnSigmaKa, float[4]);
94+
DECLARE_SOA_COLUMN(TrkTPCnSigmaPr, trkTPCnSigmaPr, float[4]);
95+
DECLARE_SOA_COLUMN(TrkTOFbeta, trkTOFbeta, float[4]);
96+
DECLARE_SOA_COLUMN(TrkTOFnSigmaEl, trkTOFnSigmaEl, float[4]);
97+
// DECLARE_SOA_COLUMN(TrkTOFnSigmaMu, trkTOFnSigmaMu, float[4]);
98+
DECLARE_SOA_COLUMN(TrkTOFnSigmaPi, trkTOFnSigmaPi, float[4]);
99+
DECLARE_SOA_COLUMN(TrkTOFnSigmaKa, trkTOFnSigmaKa, float[4]);
100+
DECLARE_SOA_COLUMN(TrkTOFnSigmaPr, trkTOFnSigmaPr, float[4]);
101+
DECLARE_SOA_COLUMN(TrkTOFchi2, trkTOFchi2, float[4]);
102+
103+
} // end of namespace tau_tree
104+
DECLARE_SOA_TABLE(TauFourTracks, "AOD", "TAUFOURTRACK",
105+
tau_tree::RunNumber, tau_tree::Bc, tau_tree::TotalTracks, tau_tree::NumContrib,
106+
// tau_tree::GlobalNonPVtracks,
107+
// tau_tree::PosX, tau_tree::PosY,
108+
tau_tree::PosZ,
109+
tau_tree::FlagUPC, tau_tree::OccupancyInTime, tau_tree::HadronicRate, tau_tree::ZdcAenergy, tau_tree::ZdcCenergy,
110+
tau_tree::Qtot,
111+
tau_tree::Trs, tau_tree::Trofs, tau_tree::Hmpr,
112+
// tau_tree::Tfb, tau_tree::ItsRofb, tau_tree::Sbp, tau_tree::ZvtxFT0vsPv, tau_tree::VtxITSTPC,
113+
tau_tree::TotalFT0AmplitudeA, tau_tree::TotalFT0AmplitudeC, tau_tree::TotalFV0AmplitudeA,
114+
// tau_tree::TimeFT0A, tau_tree::TimeFT0C, tau_tree::TimeFV0A,
115+
tau_tree::TrkPx, tau_tree::TrkPy, tau_tree::TrkPz,
116+
// tau_tree::TrkSign,
117+
// tau_tree::TrkDCAxy, tau_tree::TrkDCAz,
118+
tau_tree::TrkTPCcr,
119+
tau_tree::TrkTPCsignal, tau_tree::TrkTPCnSigmaEl, tau_tree::TrkTPCnSigmaPi, tau_tree::TrkTPCnSigmaKa, tau_tree::TrkTPCnSigmaPr,
120+
tau_tree::TrkTOFbeta, tau_tree::TrkTOFnSigmaEl, tau_tree::TrkTOFnSigmaPi, tau_tree::TrkTOFnSigmaKa, tau_tree::TrkTOFnSigmaPr,
121+
tau_tree::TrkTOFchi2);
122+
123+
} // end of namespace o2::aod
124+
46125
struct TauTau13topo {
126+
Produces<o2::aod::TauFourTracks> tauFourTracks;
127+
47128
SGSelector sgSelector;
48129
// configurables
49130
Configurable<float> cutFV0{"cutFV0", 10000., "FV0A threshold"};
@@ -652,7 +733,7 @@ struct TauTau13topo {
652733
registry.add("pidTPC/hpvsdedxElHipCut33", "eTOF+1 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}});
653734
registry.add("pidTPC/hpvsdedxElHipCut34", "piTOF+33 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}});
654735
registry.add("pidTPC/hpvsdedxElHipCut35", "ZDC+27 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}});
655-
registry.add("pidTPC/hpvsdedxElHipCut36", "Good+35 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}});
736+
// registry.add("pidTPC/hpvsdedxElHipCut36", "Good+35 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}});
656737
// registry.add("pidTPC/hpvsdedxElHipCut37", "TOFgood+36 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}});
657738

658739
registry.add("pidTPC/hpvsdedxElHipCut40", "All from gamma hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}});
@@ -706,7 +787,7 @@ struct TauTau13topo {
706787
registry.add("pidTOF/hpvsNsigmaElHipCut27", "DP+30 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}});
707788
registry.add("pidTOF/hpvsNsigmaElHipCut35", "ZDC+27 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}});
708789
registry.add("pidTOF/hpvsNsigmaElHipCut23", "Occ+35 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}});
709-
registry.add("pidTOF/hpvsNsigmaElHipCut36", "Good+23 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}});
790+
// registry.add("pidTOF/hpvsNsigmaElHipCut36", "Good+23 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}});
710791
// registry.add("pidTOF/hpvsNsigmaElHipCut37", "GoodTof+36 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}});
711792

712793
registry.add("pidTOF/h3piTOFchi2", "tof chi2;chi2 TOF;events", {HistType::kTH1F, {{100, 0., 10.}}});
@@ -715,7 +796,7 @@ struct TauTau13topo {
715796
registry.add("pidTOF/h3piTOFchi2Cut27", "tof chi2;chi2 TOF;events", {HistType::kTH1F, {{100, 0., 10.}}});
716797
registry.add("pidTOF/h3piTOFchi2Cut35", "tof chi2;chi2 TOF;events", {HistType::kTH1F, {{100, 0., 10.}}});
717798
registry.add("pidTOF/h3piTOFchi2Cut23", "tof chi2;chi2 TOF;events", {HistType::kTH1F, {{100, 0., 10.}}});
718-
registry.add("pidTOF/h3piTOFchi2Cut36", "tof chi2;chi2 TOF;events", {HistType::kTH1F, {{100, 0., 10.}}});
799+
// registry.add("pidTOF/h3piTOFchi2Cut36", "tof chi2;chi2 TOF;events", {HistType::kTH1F, {{100, 0., 10.}}});
719800
// registry.add("pidTOF/h3piTOFchi2Cut37", "tof chi2;chi2 TOF;events", {HistType::kTH1F, {{100, 0., 10.}}});
720801

721802
// MC part
@@ -2889,6 +2970,7 @@ struct TauTau13topo {
28892970
registry.get<TH2>(HIST("control/cut30/h4trkMassVsPt"))->Fill(mass4pi, pttot);
28902971
registry.get<TH1>(HIST("control/cut30/hNtofTrk"))->Fill(nTofTrk);
28912972
registry.get<TH2>(HIST("control/cut30/hZNACenergy"))->Fill(energyZNA, energyZNC);
2973+
registry.get<TH1>(HIST("global/hRecFlag"))->Fill(5 + 2 + dgcand.flags()); // reconstruction with upc settings flag
28922974
for (int i = 0; i < 4; i++) {
28932975
if (flagEl[i] && trkHasTof[i] && flagPi[i] && flagPr[i] && flagKa[i] && flagCR[i] && !flagVcalPV[i] && flagS3pi[i] && flagIM[i] && (otherTOFtracks[i] >= 1)) {
28942976
registry.get<TH2>(HIST("pidTPC/hpvsdedxElHipCut30"))->Fill(tmpMomentum[i], tmpDedx[i]);
@@ -2917,6 +2999,7 @@ struct TauTau13topo {
29172999
registry.get<TH2>(HIST("control/cut27/h4trkMassVsPt"))->Fill(mass4pi, pttot);
29183000
registry.get<TH1>(HIST("control/cut27/hNtofTrk"))->Fill(nTofTrk);
29193001
registry.get<TH2>(HIST("control/cut27/hZNACenergy"))->Fill(energyZNA, energyZNC);
3002+
registry.get<TH1>(HIST("global/hRecFlag"))->Fill(5 + 2 + 2 + dgcand.flags()); // reconstruction with upc settings flag
29203003
for (int i = 0; i < 4; i++) {
29213004
if (flagEl[i] && trkHasTof[i] && flagPi[i] && flagPr[i] && flagKa[i] && flagCR[i] && !flagVcalPV[i] && flagS3pi[i] && flagIM[i] && (otherTOFtracks[i] >= 1) && flagDP[i]) {
29223005
registry.get<TH2>(HIST("pidTPC/hpvsdedxElHipCut27"))->Fill(tmpMomentum[i], tmpDedx[i]);
@@ -2944,7 +3027,7 @@ struct TauTau13topo {
29443027
//
29453028
// skip events with znac energy cut 35
29463029
//
2947-
if (energyZNA >= 1. && energyZNC >= 1.) {
3030+
if (energyZNA >= 1. || energyZNC >= 1.) {
29483031
if (verbose) {
29493032
LOGF(info, "<tautau13topo> Candidate rejected: ZNA, ZNC are %f, %f", energyZNA, energyZNC);
29503033
}
@@ -4719,9 +4802,162 @@ struct TauTau13topo {
47194802

47204803
} // end of processEfficiencyMCSG
47214804

4805+
// skimming: only 4 tracks selection
4806+
void processDoSkim(UDCollisionFull2 const& dgcand, UDTracksFull const& dgtracks, PVTracks const& PVContributors)
4807+
{
4808+
int gapSide = dgcand.gapSide();
4809+
int truegapSide = sgSelector.trueGap(dgcand, cutFV0, cutFT0A, cutFT0C, cutZDC);
4810+
if (gapSide < 0 || gapSide > 2)
4811+
return;
4812+
gapSide = truegapSide;
4813+
if (gapSide != mGapSide)
4814+
return;
4815+
4816+
// zdc information
4817+
float energyZNA = dgcand.energyCommonZNA();
4818+
float energyZNC = dgcand.energyCommonZNC();
4819+
if (energyZNA < 0)
4820+
energyZNA = -1.;
4821+
if (energyZNC < 0)
4822+
energyZNC = -1.;
4823+
4824+
int nTofTrk = 0;
4825+
int nEtaIn15 = 0;
4826+
int npT100 = 0;
4827+
// int qtot = 0;
4828+
short qtot = 0;
4829+
TLorentzVector p;
4830+
for (const auto& trk : PVContributors) {
4831+
qtot += trk.sign();
4832+
p.SetXYZM(trk.px(), trk.py(), trk.pz(), MassPiPlus);
4833+
if (std::abs(p.Eta()) < trkEtacut)
4834+
nEtaIn15++; // 0.9 is a default
4835+
if (trk.pt() > 0.1)
4836+
npT100++;
4837+
if (trk.hasTOF())
4838+
nTofTrk++;
4839+
} // end of loop over PV tracks
4840+
4841+
if (PVContributors.size() != 4)
4842+
return;
4843+
if (nEtaIn15 != 4)
4844+
return;
4845+
if (npT100 != 4)
4846+
return;
4847+
if (nTofTrk < nTofTrkMinCut)
4848+
return;
4849+
4850+
//
4851+
// FIT informaton
4852+
//
4853+
auto bitMin = 16 - mFITvetoWindow; // default is +- 1 bc (1 bit)
4854+
auto bitMax = 16 + mFITvetoWindow;
4855+
bool flagFITveto = false;
4856+
// check FIT information
4857+
for (auto bit = bitMin; bit <= bitMax; bit++) {
4858+
if (TESTBIT(dgcand.bbFT0Apf(), bit))
4859+
flagFITveto = true;
4860+
if (TESTBIT(dgcand.bbFT0Cpf(), bit))
4861+
flagFITveto = true;
4862+
if (useFV0ForVeto && TESTBIT(dgcand.bbFV0Apf(), bit))
4863+
flagFITveto = true;
4864+
if (useFDDAForVeto && TESTBIT(dgcand.bbFDDApf(), bit))
4865+
flagFITveto = true;
4866+
if (useFDDCForVeto && TESTBIT(dgcand.bbFDDCpf(), bit))
4867+
flagFITveto = true;
4868+
} // end of loop over FIT bits
4869+
4870+
if (mFITvetoFlag && flagFITveto)
4871+
return;
4872+
4873+
//
4874+
// variables per track
4875+
//
4876+
int counterTmp = 0;
4877+
float px[4], py[4], pz[4];
4878+
// int sign[4];
4879+
// float dcaZ[4];
4880+
// float dcaXY[4];
4881+
4882+
float tmpDedx[4];
4883+
float tmpTofNsigmaEl[4];
4884+
float tmpTofNsigmaPi[4];
4885+
float tmpTofNsigmaKa[4];
4886+
float tmpTofNsigmaPr[4];
4887+
4888+
float nSigmaEl[4];
4889+
float nSigmaPi[4];
4890+
float nSigmaPr[4];
4891+
float nSigmaKa[4];
4892+
// float chi2TPC[4];
4893+
// float chi2ITS[4];
4894+
float chi2TOF[4] = {-1., -1., -1., -1.};
4895+
// float nclTPCfind[4];
4896+
int nclTPCcrossedRows[4];
4897+
// double trkTime[4];
4898+
// float trkTimeRes[4];
4899+
float trkTofSignal[4];
4900+
4901+
for (const auto& trk : PVContributors) {
4902+
4903+
px[counterTmp] = trk.px();
4904+
py[counterTmp] = trk.py();
4905+
pz[counterTmp] = trk.pz();
4906+
// sign[counterTmp] = trk.sign();
4907+
// dcaZ[counterTmp] = trk.dcaZ();
4908+
// dcaXY[counterTmp] = trk.dcaXY();
4909+
4910+
tmpDedx[counterTmp] = trk.tpcSignal();
4911+
nSigmaEl[counterTmp] = trk.tpcNSigmaEl();
4912+
nSigmaPi[counterTmp] = trk.tpcNSigmaPi();
4913+
nSigmaPr[counterTmp] = trk.tpcNSigmaPr();
4914+
nSigmaKa[counterTmp] = trk.tpcNSigmaKa();
4915+
4916+
trkTofSignal[counterTmp] = trk.beta();
4917+
tmpTofNsigmaEl[counterTmp] = trk.tofNSigmaEl();
4918+
tmpTofNsigmaPi[counterTmp] = trk.tofNSigmaPi();
4919+
tmpTofNsigmaKa[counterTmp] = trk.tofNSigmaKa();
4920+
tmpTofNsigmaPr[counterTmp] = trk.tofNSigmaPr();
4921+
4922+
// chi2TPC[counterTmp] = trk.tpcChi2NCl();
4923+
// chi2ITS[counterTmp] = trk.itsChi2NCl();
4924+
if (trk.hasTOF())
4925+
chi2TOF[counterTmp] = trk.tofChi2();
4926+
// nclTPCfind[counterTmp] = trk.tpcNClsFindable();
4927+
nclTPCcrossedRows[counterTmp] = trk.tpcNClsCrossedRows();
4928+
4929+
// trkTime[counterTmp] = trk.trackTime();
4930+
// trkTimeRes[counterTmp] = trk.trackTimeRes();
4931+
counterTmp++;
4932+
}
4933+
4934+
tauFourTracks(dgcand.runNumber(),
4935+
dgcand.globalBC(), // is it necessary
4936+
dgtracks.size(),
4937+
dgcand.numContrib(),
4938+
// dgcand.posX(), dgcand.posY(),
4939+
dgcand.posZ(),
4940+
dgcand.flags(),
4941+
dgcand.occupancyInTime(),
4942+
dgcand.hadronicRate(), // is it necessary
4943+
energyZNA, energyZNC,
4944+
qtot,
4945+
dgcand.trs(), dgcand.trofs(), dgcand.hmpr(), // to test it
4946+
// dgcand.tfb(), dgcand.itsROFb(), dgcand.sbp(), dgcand.zVtxFT0vPV(), dgcand.vtxITSTPC(),
4947+
dgcand.totalFT0AmplitudeA(), dgcand.totalFT0AmplitudeC(), dgcand.totalFV0AmplitudeA(),
4948+
// dgcand.timeFT0A(), dgcand.timeFT0C(), dgcand.timeFV0A(),
4949+
px, py, pz, // sign,
4950+
// dcaXY, dcaZ,
4951+
nclTPCcrossedRows,
4952+
tmpDedx, nSigmaEl, nSigmaPi, nSigmaKa, nSigmaPr,
4953+
trkTofSignal, tmpTofNsigmaEl, tmpTofNsigmaPi, tmpTofNsigmaKa, tmpTofNsigmaPr,
4954+
chi2TOF);
4955+
} // end of skim process
4956+
47224957
PROCESS_SWITCH(TauTau13topo, processDataSG, "Run over SG Producer tables in reco level (reconstructed data or MC)", true);
47234958
PROCESS_SWITCH(TauTau13topo, processSimpleMCSG, "Run over SG Producer tables in true level (MC true only)", false);
47244959
PROCESS_SWITCH(TauTau13topo, processEfficiencyMCSG, "Run over SG Producer tables in true and reco level (MC true and reconstructed)", false);
4960+
PROCESS_SWITCH(TauTau13topo, processDoSkim, "Run over SG Producer tables to produce skimmed data", false);
47254961
};
47264962

47274963
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)

0 commit comments

Comments
 (0)