1010
1111// O2 includes
1212#include " ReconstructionDataFormats/Track.h"
13+ #include " Framework/runDataProcessing.h"
1314#include " Framework/AnalysisTask.h"
1415#include " Framework/AnalysisDataModel.h"
1516#include " Framework/ASoAHelpers.h"
@@ -20,43 +21,8 @@ using namespace o2;
2021using namespace o2 ::framework;
2122using namespace o2 ::framework::expressions;
2223
23- void customize (std::vector<o2::framework::ConfigParamSpec>& workflowOptions)
24- {
25- std::vector<ConfigParamSpec> options{
26- {" add-tof-histos" , VariantType::Int, 0 , {" Generate TPC with TOF histograms" }}};
27- std::swap (workflowOptions, options);
28- }
29-
30- #include " Framework/runDataProcessing.h"
31-
32- #define CANDIDATE_SELECTION \
33- Configurable<float > cfgCutVertex{" cfgCutVertex" , 10 .0f , " Accepted z-vertex range" }; \
34- Configurable<float > cfgCutEta{" cfgCutEta" , 0 .8f , " Eta range for tracks" }; \
35- Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; \
36- Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::isGlobalTrack == (uint8_t ) true );
37-
38- // FIXME: we should put this function in some common header so it has to be defined only once
39- template <typename T>
40- void makelogaxis (T h)
41- {
42- const int nbins = h->GetNbinsX ();
43- double binp[nbins + 1 ];
44- double max = h->GetXaxis ()->GetBinUpEdge (nbins);
45- double min = h->GetXaxis ()->GetBinLowEdge (1 );
46- if (min <= 0 ) {
47- min = 0.00001 ;
48- }
49- double lmin = TMath::Log10 (min);
50- double ldelta = (TMath::Log10 (max) - lmin) / ((double )nbins);
51- for (int i = 0 ; i < nbins; i++) {
52- binp[i] = TMath::Exp (TMath::Log (10 ) * (lmin + i * ldelta));
53- }
54- binp[nbins] = max + 1 ;
55- h->GetXaxis ()->Set (nbins, binp);
56- }
57-
58- constexpr int Np = 9 ;
5924struct TPCSpectraTaskSplit {
25+ static constexpr int Np = 9 ;
6026 static constexpr const char * pT[Np] = {" e" , " #mu" , " #pi" , " K" , " p" , " d" , " t" , " ^{3}He" , " #alpha" };
6127 static constexpr std::string_view hp[Np] = {" p/El" , " p/Mu" , " p/Pi" , " p/Ka" , " p/Pr" , " p/De" , " p/Tr" , " p/He" , " p/Al" };
6228 static constexpr std::string_view hpt[Np] = {" pt/El" , " pt/Mu" , " pt/Pi" , " pt/Ka" , " pt/Pr" , " pt/De" , " pt/Tr" , " pt/He" , " pt/Al" };
@@ -72,11 +38,6 @@ struct TPCSpectraTaskSplit {
7238 }
7339 }
7440
75- // Defining filters and input
76- CANDIDATE_SELECTION
77-
78- Configurable<float > nsigmacut{" nsigmacut" , 3 , " Value of the Nsigma cut" };
79-
8041 template <std::size_t i, typename T>
8142 void fillParticleHistos (const T& track, const float & nsigma)
8243 {
@@ -87,6 +48,12 @@ struct TPCSpectraTaskSplit {
8748 histos.fill (HIST (hpt[i]), track.pt ());
8849 }
8950
51+ Configurable<float > cfgCutVertex{" cfgCutVertex" , 10 .0f , " Accepted z-vertex range" };
52+ Configurable<float > cfgCutEta{" cfgCutEta" , 0 .8f , " Eta range for tracks" };
53+ Configurable<float > nsigmacut{" nsigmacut" , 3 , " Value of the Nsigma cut" };
54+
55+ Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex;
56+ Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::isGlobalTrack == (uint8_t ) true );
9057 using TrackCandidates = soa::Filtered<soa::Join<aod::Tracks, aod::TracksExtra,
9158 aod::pidRespTPCEl, aod::pidRespTPCMu, aod::pidRespTPCPi,
9259 aod::pidRespTPCKa, aod::pidRespTPCPr, aod::pidRespTPCDe,
@@ -110,68 +77,8 @@ struct TPCSpectraTaskSplit {
11077 }
11178};
11279
113- struct TPCPIDQASignalwTOFTaskSplit {
114- static constexpr const char * pT[Np] = {" e" , " #mu" , " #pi" , " K" , " p" , " d" , " t" , " ^{3}He" , " #alpha" };
115- static constexpr std::string_view htpcsignal[Np] = {" tpcsignal/El" , " tpcsignal/Mu" , " tpcsignal/Pi" ,
116- " tpcsignal/Ka" , " tpcsignal/Pr" , " tpcsignal/De" ,
117- " tpcsignal/Tr" , " tpcsignal/He" , " tpcsignal/Al" };
118- HistogramRegistry histos{" Histos" , {}, OutputObjHandlingPolicy::AnalysisObject};
119-
120- template <uint8_t i>
121- void addParticleHistos ()
122- {
123- histos.add (htpcsignal[i].data (), Form (" ;#it{p} (GeV/#it{c});TPC Signal;N_{#sigma}^{TPC}(%s)" , pT[i]), kTH3D , {{1000 , 0.001 , 20 }, {1000 , 0 , 1000 }, {20 , -10 , 10 }});
124- makelogaxis (histos.get <TH3>(HIST (htpcsignal[i])));
125- }
126-
127- void init (o2::framework::InitContext&)
128- {
129- addParticleHistos<0 >();
130- addParticleHistos<1 >();
131- addParticleHistos<2 >();
132- addParticleHistos<3 >();
133- addParticleHistos<4 >();
134- addParticleHistos<5 >();
135- addParticleHistos<6 >();
136- addParticleHistos<7 >();
137- addParticleHistos<8 >();
138- }
139-
140- // Filters
141- CANDIDATE_SELECTION
142-
143- Filter trackFilterTOF = (aod::track::tofSignal > 0 .f); // Skip tracks without TOF
144- using TrackCandidates = soa::Filtered<soa::Join<aod::Tracks, aod::TracksExtra,
145- aod::pidRespTPCEl, aod::pidRespTPCMu, aod::pidRespTPCPi,
146- aod::pidRespTPCKa, aod::pidRespTPCPr, aod::pidRespTPCDe,
147- aod::pidRespTPCTr, aod::pidRespTPCHe, aod::pidRespTPCAl,
148- aod::pidRespTOFEl, aod::pidRespTOFMu, aod::pidRespTOFPi,
149- aod::pidRespTOFKa, aod::pidRespTOFPr, aod::pidRespTOFDe,
150- aod::pidRespTOFTr, aod::pidRespTOFHe, aod::pidRespTOFAl,
151- aod::TrackSelection>>;
152-
153- void process (TrackCandidates::iterator const & track)
154- {
155- // const float mom = track.p();
156- const float mom = track.tpcInnerParam ();
157- histos.fill (HIST (htpcsignal[0 ]), mom, track.tpcSignal (), track.tofNSigmaEl ());
158- histos.fill (HIST (htpcsignal[1 ]), mom, track.tpcSignal (), track.tofNSigmaMu ());
159- histos.fill (HIST (htpcsignal[2 ]), mom, track.tpcSignal (), track.tofNSigmaPi ());
160- histos.fill (HIST (htpcsignal[3 ]), mom, track.tpcSignal (), track.tofNSigmaKa ());
161- histos.fill (HIST (htpcsignal[4 ]), mom, track.tpcSignal (), track.tofNSigmaPr ());
162- histos.fill (HIST (htpcsignal[5 ]), mom, track.tpcSignal (), track.tofNSigmaDe ());
163- histos.fill (HIST (htpcsignal[6 ]), mom, track.tpcSignal (), track.tofNSigmaTr ());
164- histos.fill (HIST (htpcsignal[7 ]), mom, track.tpcSignal (), track.tofNSigmaHe ());
165- histos.fill (HIST (htpcsignal[8 ]), mom, track.tpcSignal (), track.tofNSigmaAl ());
166- }
167- };
168-
16980WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
17081{
171- int TPCwTOF = cfgc.options ().get <int >(" add-tof-histos" );
17282 WorkflowSpec workflow{adaptAnalysisTask<TPCSpectraTaskSplit>(" tpcspectra-split-task" )};
173- if (TPCwTOF) {
174- workflow.push_back (adaptAnalysisTask<TPCPIDQASignalwTOFTaskSplit>(" TPCpidqa-signalwTOF-split-task" ));
175- }
17683 return workflow;
17784}
0 commit comments