@@ -43,7 +43,88 @@ using namespace o2::framework;
4343using namespace o2 ::framework::expressions;
4444using 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+
46125struct 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
47274963WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
0 commit comments