Skip to content

Commit 87352ef

Browse files
authored
Update in PID tasks and handlers of PID param (#4181)
Update TPC qa plots - Using log binning for momentum - Using TPC momentum instead of momentum at vertex Extend QA plots for TOF PID - add event wide info - using different tasks for different observables Add TPC with TOF plots - Add log axes Add param setter from the index Add possibility to read param from file in TPC param handler
1 parent 80e0423 commit 87352ef

8 files changed

Lines changed: 376 additions & 123 deletions

File tree

Analysis/DataModel/include/PID/BetheBloch.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ namespace o2::pid::tpc
2727
class BetheBloch : public Parametrization
2828
{
2929
public:
30-
BetheBloch() : Parametrization("BetheBloch", 7) { Printf("%s", fName.Data()); };
30+
BetheBloch() : Parametrization("BetheBloch", 7){};
3131
~BetheBloch() override = default;
3232
float operator()(const float* x) const override
3333
{

Analysis/DataModel/include/PID/TOFReso.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ namespace o2::pid::tof
2929
class TOFReso : public Parametrization
3030
{
3131
public:
32-
TOFReso() : Parametrization("TOFReso", 5) { Printf("%s", fName.Data()); };
32+
TOFReso() : Parametrization("TOFReso", 5){};
3333
~TOFReso() override = default;
3434
float operator()(const float* x) const override
3535
{

Analysis/DataModel/include/PID/TPCReso.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ namespace o2::pid::tpc
2626
class TPCReso : public Parametrization
2727
{
2828
public:
29-
TPCReso() : Parametrization("TPCReso", 2) { Printf("%s", fName.Data()); };
29+
TPCReso() : Parametrization("TPCReso", 2){};
3030
~TPCReso() override = default;
3131
float operator()(const float* x) const override
3232
{

Analysis/DataModel/include/PIDBase/ParamBase.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,11 @@ class Parametrization : public TNamed
108108
/// Printer for parameters
109109
void PrintParametrization() const;
110110

111+
/// Setter for the parameter at position iparam
112+
/// \param iparam index in the array of the parameters
113+
/// \param value value of the parameter at position iparam
114+
void SetParameter(const unsigned int iparam, const pidvar_t value) { mParameters.SetParameter(iparam, value); }
115+
111116
/// Setter for the parameter, using an array
112117
/// \param params array with parameters
113118
void SetParameters(const std::vector<pidvar_t> params) { mParameters.SetParameters(params); }

Analysis/DataModel/src/handleParamTPCBetheBloch.cxx

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,9 @@ bool initOptionsAndParse(bpo::options_description& options, int argc, char* argv
3131
"url,u", bpo::value<std::string>()->default_value("http://ccdb-test.cern.ch:8080"), "URL of the CCDB database")(
3232
"start,s", bpo::value<long>()->default_value(0), "Start timestamp of object validity")(
3333
"stop,S", bpo::value<long>()->default_value(4108971600000), "Stop timestamp of object validity")(
34-
"delete_previous,d", bpo::value<int>()->default_value(0), "Flag to delete previous versions of converter objects in the CCDB before uploading the new one so as to avoid proliferation on CCDB")(
35-
"file,f", bpo::value<std::string>()->default_value(""), "Option to save parametrization to file instead of uploading to ccdb")(
34+
"delete-previous,d", bpo::value<int>()->default_value(0), "Flag to delete previous versions of converter objects in the CCDB before uploading the new one so as to avoid proliferation on CCDB")(
35+
"save-to-file,f", bpo::value<std::string>()->default_value(""), "Option to save parametrization to file instead of uploading to ccdb")(
36+
"read-from-file", bpo::value<std::string>()->default_value(""), "Option to get parametrization from a file")(
3637
"mode,m", bpo::value<unsigned int>()->default_value(0), "Working mode: 0 push 1 pull and test")(
3738
"verbose,v", bpo::value<int>()->default_value(0), "Verbose level 0, 1")(
3839
"help,h", "Produce help message.");
@@ -75,35 +76,52 @@ int main(int argc, char* argv[])
7576
return 1;
7677
}
7778
if (mode == 0) { // Push mode
78-
const std::vector<float> bbparams = {0.0320981, 19.9768, 2.52666e-16, 2.72123, 6.08092, 50.f, 2.3};
79-
const std::vector<float> resoparams = {0.07, 0.0};
80-
BetheBloch tpc;
81-
tpc.SetParameters(bbparams);
82-
TPCReso reso;
83-
reso.SetParameters(resoparams);
84-
const std::string fname = vm["file"].as<std::string>();
79+
BetheBloch* bb = nullptr;
80+
TPCReso* reso = nullptr;
81+
const std::string input_file_name = vm["read-from-file"].as<std::string>();
82+
83+
if (!input_file_name.empty()) {
84+
TFile f(input_file_name.data(), "READ");
85+
if (!f.IsOpen()) {
86+
LOG(WARNING) << "Input file " << input_file_name << " is not reacheable, cannot get param from file";
87+
}
88+
f.GetObject("BetheBloch", bb);
89+
f.GetObject("TPCReso", reso);
90+
f.Close();
91+
}
92+
if (!bb) {
93+
bb = new BetheBloch();
94+
const std::vector<float> bbparams = {0.0320981, 19.9768, 2.52666e-16, 2.72123, 6.08092, 50.f, 2.3};
95+
bb->SetParameters(bbparams);
96+
}
97+
if (!reso) {
98+
reso = new TPCReso();
99+
const std::vector<float> resoparams = {0.07, 0.0};
100+
reso->SetParameters(resoparams);
101+
}
102+
const std::string fname = vm["save-to-file"].as<std::string>();
85103
if (!fname.empty()) { // Saving it to file
86104
TFile f(fname.data(), "RECREATE");
87-
tpc.Write();
88-
reso.Write();
105+
bb->Write();
106+
reso->Write();
89107
f.ls();
90108
f.Close();
91109
} else { // Saving it to CCDB
92110

93111
long start = vm["start"].as<long>();
94112
long stop = vm["stop"].as<long>();
95113

96-
if (vm["delete_previous"].as<int>()) {
114+
if (vm["delete-previous"].as<int>()) {
97115
api.truncate(path);
98116
}
99-
api.storeAsTFileAny(&tpc, path + "/BetheBloch", metadata, start, stop);
100-
api.storeAsTFileAny(&reso, path + "/TPCReso", metadata, start, stop);
117+
api.storeAsTFileAny(bb, path + "/BetheBloch", metadata, start, stop);
118+
api.storeAsTFileAny(reso, path + "/TPCReso", metadata, start, stop);
101119
}
102120
} else { // Pull and test mode
103121
const float x[2] = {1, 1};
104-
BetheBloch* tpc = api.retrieveFromTFileAny<BetheBloch>(path + "/BetheBloch", metadata, -1, headers);
105-
tpc->PrintParametrization();
106-
LOG(INFO) << "BetheBloch " << tpc->operator()(x);
122+
BetheBloch* bb = api.retrieveFromTFileAny<BetheBloch>(path + "/BetheBloch", metadata, -1, headers);
123+
bb->PrintParametrization();
124+
LOG(INFO) << "BetheBloch " << bb->operator()(x);
107125
TPCReso* reso = api.retrieveFromTFileAny<TPCReso>(path + "/TPCReso", metadata, -1, headers);
108126
reso->PrintParametrization();
109127
LOG(INFO) << "TPCReso " << reso->operator()(x);

Analysis/Tasks/pidTOF.cxx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ struct pidTOFTask {
5555

5656
void process(aod::Collision const& collision, soa::Join<aod::Tracks, aod::TracksExtra> const& tracks)
5757
{
58-
LOGF(info, "Tracks for collision: %d", tracks.size());
5958
tof::EventTime evt = tof::EventTime();
6059
evt.SetEvTime(0, collision.collisionTime());
6160
evt.SetEvTimeReso(0, collision.collisionTimeRes());

Analysis/Tasks/spectraTOF.cxx

Lines changed: 120 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -28,80 +28,133 @@ using namespace o2;
2828
using namespace o2::framework;
2929
using namespace o2::framework::expressions;
3030

31-
struct TOFPIDQATask {
31+
#define TRACKSELECTION \
32+
UChar_t clustermap = i.itsClusterMap(); \
33+
bool issel = (i.tpcNClsFindable() > 70) && (i.flags() & 0x4) && (TESTBIT(clustermap, 0) || TESTBIT(clustermap, 1)); \
34+
issel = issel && (i.flags() & 0x2000); \
35+
issel = issel && (i.flags() & 0x80000000); \
36+
if (!issel) \
37+
continue;
38+
39+
// #define TRACKSELECTION 1;
40+
41+
struct TOFQATask {
42+
// Event quantities
43+
DOTH1F(hvtxz, ";Vertex Z position;Events", 300, -15, 15);
44+
DOTH1F(hevtime, ";Event time (ns);Tracks", 100, -2, 2);
3245
// Track quantities
33-
DOTH1F(hp_NoCut, ";#it{p} (GeV/#it{c});Tracks", 100, 0, 20);
34-
DOTH1F(hp_TrkCut, ";#it{p} (GeV/#it{c});Tracks", 100, 0, 20);
35-
DOTH1F(hp_TOFCut, ";#it{p} (GeV/#it{c});Tracks", 100, 0, 20);
36-
// TOF Quantities
37-
DOTH1F(hlength_NoCut, ";Track Length (cm);Tracks", 100, 0, 1000);
38-
DOTH1F(htime_NoCut, ";TOF Time (ns);Tracks", 1000, 0, 600);
39-
DOTH1F(hevtime_NoCut, ";Event time (ns);Tracks", 100, -2, 2);
40-
DOTH2F(hp_pTOFexp_NoCut, ";#it{p} (GeV/#it{c});#it{p}_{Exp TOF} (GeV/#it{c});Tracks", 100, 0, 20, 100, 0, 20);
41-
// T-Texp
42-
DOTH2F(htimediffEl_NoCut, ";#it{p} (GeV/#it{c});(t-t_{evt}-t_{exp e});Tracks", 100, 0, 5, 100, -1000, 1000);
43-
DOTH2F(htimediffMu_NoCut, ";#it{p} (GeV/#it{c});(t-t_{evt}-t_{exp #mu});Tracks", 100, 0, 5, 100, -1000, 1000);
44-
DOTH2F(htimediffPi_NoCut, ";#it{p} (GeV/#it{c});(t-t_{evt}-t_{exp #pi});Tracks", 100, 0, 5, 100, -1000, 1000);
45-
DOTH2F(htimediffKa_NoCut, ";#it{p} (GeV/#it{c});(t-t_{evt}-t_{exp K});Tracks", 100, 0, 5, 100, -1000, 1000);
46-
DOTH2F(htimediffPr_NoCut, ";#it{p} (GeV/#it{c});(t-t_{evt}-t_{exp p});Tracks", 100, 0, 5, 100, -1000, 1000);
47-
// NSigma
48-
DOTH2F(hnsigmaEl_NoCut, ";#it{p} (GeV/#it{c});(t-t_{evt}-t_{exp e})/N_{sigma e};Tracks", 100, 0, 5, 100, -10, 10);
49-
DOTH2F(hnsigmaMu_NoCut, ";#it{p} (GeV/#it{c});(t-t_{evt}-t_{exp #mu})/N_{sigma #mu};Tracks", 100, 0, 5, 100, -10, 10);
50-
DOTH2F(hnsigmaPi_NoCut, ";#it{p} (GeV/#it{c});(t-t_{evt}-t_{exp #pi})/N_{sigma #pi};Tracks", 100, 0, 5, 100, -10, 10);
51-
DOTH2F(hnsigmaKa_NoCut, ";#it{p} (GeV/#it{c});(t-t_{evt}-t_{exp K})/N_{sigma K};Tracks", 100, 0, 5, 100, -10, 10);
52-
DOTH2F(hnsigmaPr_NoCut, ";#it{p} (GeV/#it{c});(t-t_{evt}-t_{exp p})/N_{sigma p};Tracks", 100, 0, 5, 100, -10, 10);
46+
DOTH1F(heta, ";#eta;Tracks", 100, -1, 1);
47+
DOTH1F(hp, ";#it{p} (GeV/#it{c});Tracks", 100, 0, 20);
48+
DOTH1F(hpt, ";#it{p}_{T} (GeV/#it{c});Tracks", 100, 0, 20);
49+
DOTH1F(hlength, ";Track Length (cm);Tracks", 100, 0, 1000);
50+
DOTH1F(htime, ";TOF Time (ns);Tracks", 1000, 0, 600);
5351
// Beta
5452
DOTH2F(hp_beta, ";#it{p} (GeV/#it{c});TOF #beta;Tracks", 100, 0, 20, 100, 0, 2);
5553

5654
void process(aod::Collision const& collision, soa::Join<aod::Tracks, aod::TracksExtra, aod::pidRespTOF, aod::pidRespTOFbeta> const& tracks)
5755
{
56+
hvtxz->Fill(collision.posZ());
5857
for (auto i : tracks) {
59-
hp_NoCut->Fill(i.p());
6058
// Track selection
61-
UChar_t clustermap = i.itsClusterMap();
62-
bool issel = (i.tpcNClsFindable() > 70) && (i.flags() & 0x4) && (TESTBIT(clustermap, 0) || TESTBIT(clustermap, 1));
63-
if (issel)
64-
hp_TrkCut->Fill(i.p());
65-
issel = issel && (i.flags() & 0x2000); //kTOFout
66-
issel = issel && (i.flags() & 0x80000000); //kTIME
67-
if (issel)
68-
hp_TOFCut->Fill(i.p());
69-
hp_pTOFexp_NoCut->Fill(i.p(), i.tofExpMom() / (TMath::C() * 1.0e2f * 1.0e-12f));
70-
//
71-
hlength_NoCut->Fill(i.length());
72-
htime_NoCut->Fill(i.tofSignal() / 1000);
59+
TRACKSELECTION;
7360
//
74-
hevtime_NoCut->Fill(collision.collisionTime() / 1000);
75-
// hevtime_NoCut->Fill(collision.collisionTime0() / 1000);
61+
hevtime->Fill(collision.collisionTime() / 1000);
62+
// hevtime->Fill(collision.collisionTime0() / 1000);
63+
const float psq = sqrt(i.px() * i.px() + i.py() * i.py() + i.pz() * i.pz());
64+
heta->Fill(i.eta());
65+
hp->Fill(i.p());
66+
hpt->Fill(i.pt());
7667
//
77-
htimediffEl_NoCut->Fill(i.p(), i.tofSignal() - collision.collisionTime() - i.tofExpSignalEl());
78-
htimediffMu_NoCut->Fill(i.p(), i.tofSignal() - collision.collisionTime() - i.tofExpSignalMu());
79-
htimediffPi_NoCut->Fill(i.p(), i.tofSignal() - collision.collisionTime() - i.tofExpSignalPi());
80-
htimediffKa_NoCut->Fill(i.p(), i.tofSignal() - collision.collisionTime() - i.tofExpSignalKa());
81-
htimediffPr_NoCut->Fill(i.p(), i.tofSignal() - collision.collisionTime() - i.tofExpSignalPr());
82-
//
83-
hnsigmaEl_NoCut->Fill(i.p(), i.tofNSigmaEl());
84-
hnsigmaMu_NoCut->Fill(i.p(), i.tofNSigmaMu());
85-
hnsigmaPi_NoCut->Fill(i.p(), i.tofNSigmaPi());
86-
hnsigmaKa_NoCut->Fill(i.p(), i.tofNSigmaKa());
87-
hnsigmaPr_NoCut->Fill(i.p(), i.tofNSigmaPr());
68+
hlength->Fill(i.length());
69+
htime->Fill(i.tofSignal() / 1000);
8870
// Beta
8971
hp_beta->Fill(i.p(), i.beta());
9072
}
9173
}
9274
};
9375

94-
struct SpectraTask {
76+
struct TOFExpTimeQATask {
77+
// T-Texp
78+
#define TIT(part) Form(";#it{p} (GeV/#it{c});(t-t_{evt}-t_{exp %s});Tracks", part)
79+
DOTH2F(htimediffEl, TIT("e"), 100, 0, 5, 100, -1000, 1000);
80+
DOTH2F(htimediffMu, TIT("#mu"), 100, 0, 5, 100, -1000, 1000);
81+
DOTH2F(htimediffPi, TIT("#pi"), 100, 0, 5, 100, -1000, 1000);
82+
DOTH2F(htimediffKa, TIT("K"), 100, 0, 5, 100, -1000, 1000);
83+
DOTH2F(htimediffPr, TIT("p"), 100, 0, 5, 100, -1000, 1000);
84+
DOTH2F(htimediffDe, TIT("d"), 100, 0, 5, 100, -1000, 1000);
85+
DOTH2F(htimediffTr, TIT("t"), 100, 0, 5, 100, -1000, 1000);
86+
DOTH2F(htimediffHe, TIT("^{3}He"), 100, 0, 5, 100, -1000, 1000);
87+
DOTH2F(htimediffAl, TIT("#alpha"), 100, 0, 5, 100, -1000, 1000);
88+
#undef TIT
89+
90+
void process(aod::Collision const& collision, soa::Join<aod::Tracks, aod::TracksExtra, aod::pidRespTOF, aod::pidRespTOFbeta> const& tracks)
91+
{
92+
for (auto i : tracks) {
93+
// Track selection
94+
TRACKSELECTION;
95+
//
96+
const float tof = i.tofSignal() - collision.collisionTime();
97+
htimediffEl->Fill(i.p(), tof - i.tofExpSignalEl());
98+
htimediffMu->Fill(i.p(), tof - i.tofExpSignalMu());
99+
htimediffPi->Fill(i.p(), tof - i.tofExpSignalPi());
100+
htimediffKa->Fill(i.p(), tof - i.tofExpSignalKa());
101+
htimediffPr->Fill(i.p(), tof - i.tofExpSignalPr());
102+
htimediffDe->Fill(i.p(), tof - i.tofExpSignalDe());
103+
htimediffTr->Fill(i.p(), tof - i.tofExpSignalTr());
104+
htimediffHe->Fill(i.p(), tof - i.tofExpSignalHe());
105+
htimediffAl->Fill(i.p(), tof - i.tofExpSignalAl());
106+
}
107+
}
108+
};
109+
110+
struct TOFNSigmaQATask {
111+
// NSigma
112+
#define TIT(part) Form(";#it{p} (GeV/#it{c});(t-t_{evt}-t_{exp %s})/N_{sigma %s};Tracks", part, part)
113+
DOTH2F(hnsigmaEl, TIT("e"), 100, 0, 5, 100, -10, 10);
114+
DOTH2F(hnsigmaMu, TIT("#mu"), 100, 0, 5, 100, -10, 10);
115+
DOTH2F(hnsigmaPi, TIT("#pi"), 100, 0, 5, 100, -10, 10);
116+
DOTH2F(hnsigmaKa, TIT("K"), 100, 0, 5, 100, -10, 10);
117+
DOTH2F(hnsigmaPr, TIT("p"), 100, 0, 5, 100, -10, 10);
118+
DOTH2F(hnsigmaDe, TIT("d"), 100, 0, 5, 100, -10, 10);
119+
DOTH2F(hnsigmaTr, TIT("t"), 100, 0, 5, 100, -10, 10);
120+
DOTH2F(hnsigmaHe, TIT("^{3}He"), 100, 0, 5, 100, -10, 10);
121+
DOTH2F(hnsigmaAl, TIT("#alpha"), 100, 0, 5, 100, -10, 10);
122+
#undef TIT
123+
124+
void process(aod::Collision const& collision, soa::Join<aod::Tracks, aod::TracksExtra, aod::pidRespTOF, aod::pidRespTOFbeta> const& tracks)
125+
{
126+
for (auto i : tracks) {
127+
// Track selection
128+
TRACKSELECTION;
129+
//
130+
hnsigmaEl->Fill(i.p(), i.tofNSigmaEl());
131+
hnsigmaMu->Fill(i.p(), i.tofNSigmaMu());
132+
hnsigmaPi->Fill(i.p(), i.tofNSigmaPi());
133+
hnsigmaKa->Fill(i.p(), i.tofNSigmaKa());
134+
hnsigmaPr->Fill(i.p(), i.tofNSigmaPr());
135+
hnsigmaDe->Fill(i.p(), i.tofNSigmaDe());
136+
hnsigmaTr->Fill(i.p(), i.tofNSigmaTr());
137+
hnsigmaHe->Fill(i.p(), i.tofNSigmaHe());
138+
hnsigmaAl->Fill(i.p(), i.tofNSigmaAl());
139+
}
140+
}
141+
};
142+
143+
struct TOFSpectraTask {
95144
// Pt
96-
DOTH1F(hpt_El, ";#it{p}_{T} (GeV/#it{c});Tracks", 100, 0, 20);
97-
DOTH1F(hpt_Pi, ";#it{p}_{T} (GeV/#it{c});Tracks", 100, 0, 20);
98-
DOTH1F(hpt_Ka, ";#it{p}_{T} (GeV/#it{c});Tracks", 100, 0, 20);
99-
DOTH1F(hpt_Pr, ";#it{p}_{T} (GeV/#it{c});Tracks", 100, 0, 20);
145+
#define TIT ";#it{p}_{T} (GeV/#it{c});Tracks"
146+
DOTH1F(hpt_El, TIT, 100, 0, 20);
147+
DOTH1F(hpt_Pi, TIT, 100, 0, 20);
148+
DOTH1F(hpt_Ka, TIT, 100, 0, 20);
149+
DOTH1F(hpt_Pr, TIT, 100, 0, 20);
150+
#undef TIT
100151
// P
101-
DOTH1F(hp_El, ";#it{p} (GeV/#it{c});Tracks", 100, 0, 20);
102-
DOTH1F(hp_Pi, ";#it{p} (GeV/#it{c});Tracks", 100, 0, 20);
103-
DOTH1F(hp_Ka, ";#it{p} (GeV/#it{c});Tracks", 100, 0, 20);
104-
DOTH1F(hp_Pr, ";#it{p} (GeV/#it{c});Tracks", 100, 0, 20);
152+
#define TIT ";#it{p} (GeV/#it{c});Tracks"
153+
DOTH1F(hp_El, TIT, 100, 0, 20);
154+
DOTH1F(hp_Pi, TIT, 100, 0, 20);
155+
DOTH1F(hp_Ka, TIT, 100, 0, 20);
156+
DOTH1F(hp_Pr, TIT, 100, 0, 20);
157+
#undef TIT
105158
//
106159
DOTH1F(hlength_El, ";Track Length (cm);Tracks", 100, 0, 1000);
107160
DOTH1F(htime_El, ";TOF Time (ns);Tracks", 1000, 0, 600);
@@ -115,15 +168,12 @@ struct SpectraTask {
115168
void process(soa::Join<aod::Tracks, aod::TracksExtra, aod::pidRespTOF, aod::pidRespTOFbeta> const& tracks)
116169
{
117170
for (auto i : tracks) {
118-
UChar_t clustermap = i.itsClusterMap();
119-
bool issel = (i.tpcNClsFindable() > 70) && (i.flags() & 0x4) && (TESTBIT(clustermap, 0) || TESTBIT(clustermap, 1));
120-
issel = issel && (i.flags() & 0x2000); //kTOFout
121-
issel = issel && (i.flags() & 0x80000000); //kTIME
122-
if (!issel)
123-
continue;
171+
// Track selection
172+
TRACKSELECTION;
173+
//
124174
if (TMath::Abs(i.tofNSigmaPi()) < 3) {
125-
hp_El->Fill(i.p());
126-
hpt_El->Fill(i.pt());
175+
hp_Pi->Fill(i.p());
176+
hpt_Pi->Fill(i.pt());
127177
} else if (TMath::Abs(i.tofNSigmaKa()) < 3) {
128178
hp_Ka->Fill(i.p());
129179
hpt_Ka->Fill(i.pt());
@@ -148,6 +198,10 @@ struct SpectraTask {
148198
WorkflowSpec defineDataProcessing(ConfigContext const&)
149199
{
150200
return WorkflowSpec{
151-
adaptAnalysisTask<TOFPIDQATask>("tofpidqa-task"),
152-
adaptAnalysisTask<SpectraTask>("filterEl-task")};
201+
adaptAnalysisTask<TOFQATask>("tofqa-task"),
202+
adaptAnalysisTask<TOFExpTimeQATask>("tofexptime-task"),
203+
adaptAnalysisTask<TOFNSigmaQATask>("tofnsigma-task"),
204+
adaptAnalysisTask<TOFSpectraTask>("tofspectra-task")};
153205
}
206+
207+
#undef TRACKSELECTION

0 commit comments

Comments
 (0)