Skip to content

Commit 8829dc0

Browse files
abylinkinalibuild
andauthored
[PWGUD] Update on personal PID Spectra analyzer (#8317)
Co-authored-by: ALICE Action Bot <alibuild@cern.ch>
1 parent 414e441 commit 8829dc0

File tree

4 files changed

+351
-0
lines changed

4 files changed

+351
-0
lines changed

PWGUD/DataModel/SGTables.h

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2+
// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3+
// All rights not expressly granted are reserved.
4+
//
5+
// This software is distributed under the terms of the GNU General Public
6+
// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7+
//
8+
// In applying this license CERN does not waive the privileges and immunities
9+
// granted to it by virtue of its status as an Intergovernmental Organization
10+
// or submit itself to any jurisdiction.
11+
12+
#ifndef PWGUD_DATAMODEL_SGTABLES_H_
13+
#define PWGUD_DATAMODEL_SGTABLES_H_
14+
15+
#include <vector>
16+
#include <cmath>
17+
#include "Framework/ASoA.h"
18+
#include "Framework/AnalysisDataModel.h"
19+
#include "Framework/DataTypes.h"
20+
#include "MathUtils/Utils.h"
21+
#include "Common/DataModel/PIDResponse.h"
22+
#include "Common/DataModel/TrackSelectionTables.h"
23+
24+
namespace o2::aod
25+
{
26+
namespace sgevent
27+
{
28+
DECLARE_SOA_COLUMN(Run, run, int32_t);
29+
DECLARE_SOA_COLUMN(Flag, flag, int);
30+
DECLARE_SOA_COLUMN(GS, gs, int);
31+
DECLARE_SOA_COLUMN(ZNA, zna, float);
32+
DECLARE_SOA_COLUMN(ZNC, znc, float);
33+
DECLARE_SOA_COLUMN(Ntr, ntr, int);
34+
} // namespace sgevent
35+
DECLARE_SOA_TABLE(SGEvents, "AOD", "SGEVENT", // o2::soa::Index<>,
36+
sgevent::Run, sgevent::Flag, sgevent::GS, sgevent::ZNA, sgevent::ZNC, sgevent::Ntr);
37+
// sgevent::Run, sgevent::Flag);
38+
using SGEvent = SGEvents::iterator;
39+
namespace sgtrack
40+
{
41+
DECLARE_SOA_INDEX_COLUMN(SGEvent, sgEvent);
42+
DECLARE_SOA_COLUMN(Pt, pt, float);
43+
DECLARE_SOA_COLUMN(Eta, eta, float);
44+
DECLARE_SOA_COLUMN(Phi, phi, float);
45+
DECLARE_SOA_COLUMN(Sign, sign, float);
46+
DECLARE_SOA_COLUMN(TPCpi, tpcpi, float);
47+
DECLARE_SOA_COLUMN(TPCka, tpcka, float);
48+
DECLARE_SOA_COLUMN(TPCpr, tpcpr, float);
49+
DECLARE_SOA_COLUMN(TPCel, tpcel, float);
50+
DECLARE_SOA_COLUMN(TOFpi, tofpi, float);
51+
DECLARE_SOA_COLUMN(TOFka, tofka, float);
52+
DECLARE_SOA_COLUMN(TOFpr, tofpr, float);
53+
DECLARE_SOA_COLUMN(TOFel, tofel, float);
54+
} // namespace sgtrack
55+
DECLARE_SOA_TABLE(SGTracks, "AOD", "SGTRACK",
56+
o2::soa::Index<>, sgtrack::SGEventId,
57+
sgtrack::Pt, sgtrack::Eta, sgtrack::Phi, sgtrack::Sign, sgtrack::TPCpi, sgtrack::TPCka, sgtrack::TPCpr, sgtrack::TPCel, sgtrack::TOFpi, sgtrack::TOFka, sgtrack::TOFpr, sgtrack::TOFel);
58+
using SGTrack = SGTracks::iterator;
59+
} // namespace o2::aod
60+
61+
#endif // PWGUD_DATAMODEL_SGTABLES_H_

PWGUD/Tasks/CMakeLists.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,16 @@ o2physics_add_dpl_workflow(sg-spectra
1919
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase
2020
COMPONENT_NAME Analysis)
2121

22+
o2physics_add_dpl_workflow(sg-pid-spectra-table
23+
SOURCES sgPIDSpectraTable.cxx
24+
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase
25+
COMPONENT_NAME Analysis)
26+
27+
o2physics_add_dpl_workflow(sg-pid-analyzer
28+
SOURCES sgPIDAnalyzer.cxx
29+
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase
30+
COMPONENT_NAME Analysis)
31+
2232
o2physics_add_dpl_workflow(sg-pid-spectra
2333
SOURCES sgPIDSpectra.cxx
2434
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase

PWGUD/Tasks/sgPIDAnalyzer.cxx

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2+
// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3+
// All rights not expressly granted are reserved.
4+
//
5+
// This software is distributed under the terms of the GNU General Public
6+
// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7+
//
8+
// In applying this license CERN does not waive the privileges and immunities
9+
// granted to it by virtue of its status as an Intergovernmental Organization
10+
// or submit itself to any jurisdiction.
11+
//
12+
// \Single Gap Event Analyzer
13+
// \author Sasha Bylinkin, alexander.bylinkin@gmail.com
14+
// \since April 2023
15+
16+
#include "Framework/runDataProcessing.h"
17+
#include "Framework/AnalysisTask.h"
18+
19+
#include "TVector3.h"
20+
#include "TTree.h"
21+
#include "TFile.h"
22+
#include <TH1F.h>
23+
#include <TH2F.h>
24+
#include "Common/DataModel/PIDResponse.h"
25+
#include "PWGUD/DataModel/SGTables.h"
26+
#include "PWGUD/Core/UDHelpers.h"
27+
#include "PWGUD/Core/SGSelector.h"
28+
#include "PWGUD/Core/SGTrackSelector.h"
29+
30+
using namespace o2;
31+
using namespace o2::framework;
32+
using namespace o2::framework::expressions;
33+
34+
struct sgPIDAnalyzer {
35+
HistogramRegistry histos{"Histos", {}};
36+
37+
ConfigurableAxis ptAxis{
38+
"ptAxis",
39+
{198, 0.1, 10.0},
40+
"Pt binning"};
41+
42+
ConfigurableAxis sigmaAxis{"sigmaAxis", {100, -50, 50}, "nSigma TPC binning"};
43+
44+
void init(InitContext&)
45+
{
46+
47+
const AxisSpec ptBins{ptAxis, "p_{T} axis"};
48+
const AxisSpec nSigmaBins{sigmaAxis, "pseudo rapidity axis"};
49+
histos.add("TPC/pTPC_Pi", "Positive TPC Pi Tracks", {HistType::kTH2F, {ptBins, nSigmaBins}});
50+
histos.add("TPC/nTPC_Pi", "Negative TPC Pi Tracks", {HistType::kTH2F, {ptBins, nSigmaBins}});
51+
histos.add("TPC/pTPC_Ka", "Positive TPC Ka Tracks", {HistType::kTH2F, {ptBins, nSigmaBins}});
52+
histos.add("TPC/nTPC_Ka", "Negative TPC Ka Tracks", {HistType::kTH2F, {ptBins, nSigmaBins}});
53+
histos.add("TPC/pTPC_Pr", "Positive TPC Pr Tracks", {HistType::kTH2F, {ptBins, nSigmaBins}});
54+
histos.add("TPC/nTPC_Pr", "Negative TPC Pr Tracks", {HistType::kTH2F, {ptBins, nSigmaBins}});
55+
histos.add("TPC/pTPC_El", "Positive TPC El Tracks", {HistType::kTH2F, {ptBins, nSigmaBins}});
56+
histos.add("TPC/nTPC_El", "Negative TPC El Tracks", {HistType::kTH2F, {ptBins, nSigmaBins}});
57+
58+
histos.add("TPC/pTPC_Pi_Ka", "Positive TPC Pi vs Ka", {HistType::kTH2F, {ptBins, nSigmaBins}});
59+
histos.add("TPC/pTPC_Pi_Pr", "Positive TPC Pi vs Pr", {HistType::kTH2F, {ptBins, nSigmaBins}});
60+
histos.add("TPC/pTPC_Pi_El", "Positive TPC Pi vs El", {HistType::kTH2F, {ptBins, nSigmaBins}});
61+
histos.add("TPC/pTPC_Ka_Pi", "Positive TPC Ka vs Pi", {HistType::kTH2F, {ptBins, nSigmaBins}});
62+
histos.add("TPC/pTPC_Ka_Pr", "Positive TPC Ka vs Pr", {HistType::kTH2F, {ptBins, nSigmaBins}});
63+
histos.add("TPC/pTPC_Ka_El", "Positive TPC Ka vs El", {HistType::kTH2F, {ptBins, nSigmaBins}});
64+
histos.add("TPC/pTPC_Pr_Pi", "Positive TPC Pr vs Pi", {HistType::kTH2F, {ptBins, nSigmaBins}});
65+
histos.add("TPC/pTPC_Pr_Ka", "Positive TPC Pr vs Ka", {HistType::kTH2F, {ptBins, nSigmaBins}});
66+
histos.add("TPC/pTPC_Pr_El", "Positive TPC Pr vs El", {HistType::kTH2F, {ptBins, nSigmaBins}});
67+
68+
histos.add("TPC/nTPC_Pi_Ka", "Positive TPC Pi vs Ka", {HistType::kTH2F, {ptBins, nSigmaBins}});
69+
histos.add("TPC/nTPC_Pi_Pr", "Positive TPC Pi vs Pr", {HistType::kTH2F, {ptBins, nSigmaBins}});
70+
histos.add("TPC/nTPC_Pi_El", "Positive TPC Pi vs El", {HistType::kTH2F, {ptBins, nSigmaBins}});
71+
histos.add("TPC/nTPC_Ka_Pi", "Positive TPC Ka vs Pi", {HistType::kTH2F, {ptBins, nSigmaBins}});
72+
histos.add("TPC/nTPC_Ka_Pr", "Positive TPC Ka vs Pr", {HistType::kTH2F, {ptBins, nSigmaBins}});
73+
histos.add("TPC/nTPC_Ka_El", "Positive TPC Ka vs El", {HistType::kTH2F, {ptBins, nSigmaBins}});
74+
histos.add("TPC/nTPC_Pr_Pi", "Positive TPC Pr vs Pi", {HistType::kTH2F, {ptBins, nSigmaBins}});
75+
histos.add("TPC/nTPC_Pr_Ka", "Positive TPC Pr vs Ka", {HistType::kTH2F, {ptBins, nSigmaBins}});
76+
histos.add("TPC/nTPC_Pr_El", "Positive TPC Pr vs El", {HistType::kTH2F, {ptBins, nSigmaBins}});
77+
78+
histos.add("TOF/pPi", "Positive TPC Pi vs TOF Pi vs pt", {HistType::kTH3F, {ptBins, nSigmaBins, nSigmaBins}});
79+
histos.add("TOF/nPi", "Negative TPC Pi vs TOF Pi vs pt", {HistType::kTH3F, {ptBins, nSigmaBins, nSigmaBins}});
80+
histos.add("TOF/pKa", "Positive TPC Ka vs TOF Ka vs pt", {HistType::kTH3F, {ptBins, nSigmaBins, nSigmaBins}});
81+
histos.add("TOF/nKa", "Negative TPC Ka vs TOF Ka vs pt", {HistType::kTH3F, {ptBins, nSigmaBins, nSigmaBins}});
82+
histos.add("TOF/pPr", "Positive TPC Pr vs TOF Pr vs pt", {HistType::kTH3F, {ptBins, nSigmaBins, nSigmaBins}});
83+
histos.add("TOF/nPr", "Negative TPC Pr vs TOF Pr vs pt", {HistType::kTH3F, {ptBins, nSigmaBins, nSigmaBins}});
84+
histos.add("TOF/pEl", "Positive TPC El vs TOF El vs pt", {HistType::kTH3F, {ptBins, nSigmaBins, nSigmaBins}});
85+
histos.add("TOF/nEl", "Negative TPC El vs TOF El vs pt", {HistType::kTH3F, {ptBins, nSigmaBins, nSigmaBins}});
86+
}
87+
88+
void process(aod::SGEvents const& events, aod::SGTracks const& tracks)
89+
{
90+
int eventIndex = 0; // Sequential index for SGEvents
91+
for (auto event : events) {
92+
for (auto track : tracks) {
93+
if (track.sgEventId() != eventIndex)
94+
continue; // Match track to the current event index
95+
bool isPositive = (track.sign() > 0);
96+
if (track.tofpi() == -999) {
97+
// Directly fill histograms without a local variable for histName
98+
if (isPositive) {
99+
histos.fill(HIST("TPC/pTPC_Pi"), track.pt(), track.tpcpi());
100+
histos.fill(HIST("TPC/pTPC_Ka"), track.pt(), track.tpcka());
101+
histos.fill(HIST("TPC/pTPC_Pr"), track.pt(), track.tpcpr());
102+
histos.fill(HIST("TPC/pTPC_El"), track.pt(), track.tpcel());
103+
if (abs(track.tpcpi()) < 1) {
104+
histos.fill(HIST("TPC/pTPC_Pi_Ka"), track.pt(), track.tpcka());
105+
histos.fill(HIST("TPC/pTPC_Pi_Pr"), track.pt(), track.tpcpr());
106+
histos.fill(HIST("TPC/pTPC_Pi_El"), track.pt(), track.tpcel());
107+
}
108+
if (abs(track.tpcka()) < 1) {
109+
histos.fill(HIST("TPC/pTPC_Ka_Pi"), track.pt(), track.tpcpi());
110+
histos.fill(HIST("TPC/pTPC_Ka_Pr"), track.pt(), track.tpcpr());
111+
histos.fill(HIST("TPC/pTPC_Ka_El"), track.pt(), track.tpcel());
112+
}
113+
if (abs(track.tpcpr()) < 1) {
114+
histos.fill(HIST("TPC/pTPC_Pr_Pi"), track.pt(), track.tpcpi());
115+
histos.fill(HIST("TPC/pTPC_Pr_Ka"), track.pt(), track.tpcka());
116+
histos.fill(HIST("TPC/pTPC_Pr_El"), track.pt(), track.tpcel());
117+
}
118+
} else {
119+
histos.fill(HIST("TPC/nTPC_Pi"), track.pt(), track.tpcpi());
120+
histos.fill(HIST("TPC/nTPC_Ka"), track.pt(), track.tpcka());
121+
histos.fill(HIST("TPC/nTPC_Pr"), track.pt(), track.tpcpr());
122+
histos.fill(HIST("TPC/nTPC_El"), track.pt(), track.tpcel());
123+
if (abs(track.tpcpi()) < 1) {
124+
histos.fill(HIST("TPC/nTPC_Pi_Ka"), track.pt(), track.tpcka());
125+
histos.fill(HIST("TPC/nTPC_Pi_Pr"), track.pt(), track.tpcpr());
126+
histos.fill(HIST("TPC/nTPC_Pi_El"), track.pt(), track.tpcel());
127+
}
128+
if (abs(track.tpcka()) < 1) {
129+
histos.fill(HIST("TPC/nTPC_Ka_Pi"), track.pt(), track.tpcpi());
130+
histos.fill(HIST("TPC/nTPC_Ka_Pr"), track.pt(), track.tpcpr());
131+
histos.fill(HIST("TPC/nTPC_Ka_El"), track.pt(), track.tpcel());
132+
}
133+
if (abs(track.tpcpr()) < 1) {
134+
histos.fill(HIST("TPC/nTPC_Pr_Pi"), track.pt(), track.tpcpi());
135+
histos.fill(HIST("TPC/nTPC_Pr_Ka"), track.pt(), track.tpcka());
136+
histos.fill(HIST("TPC/nTPC_Pr_El"), track.pt(), track.tpcel());
137+
}
138+
}
139+
} else {
140+
if (isPositive) {
141+
histos.fill(HIST("TOF/pPi"), track.pt(), track.tpcpi(), track.tofpi());
142+
histos.fill(HIST("TOF/pKa"), track.pt(), track.tpcka(), track.tofka());
143+
histos.fill(HIST("TOF/pPr"), track.pt(), track.tpcpr(), track.tofpr());
144+
histos.fill(HIST("TOF/pEl"), track.pt(), track.tpcel(), track.tofel());
145+
} else {
146+
histos.fill(HIST("TOF/nPi"), track.pt(), track.tpcpi(), track.tofpi());
147+
histos.fill(HIST("TOF/nKa"), track.pt(), track.tpcka(), track.tofka());
148+
histos.fill(HIST("TOF/nPr"), track.pt(), track.tpcpr(), track.tofpr());
149+
histos.fill(HIST("TOF/nEl"), track.pt(), track.tpcel(), track.tofel());
150+
}
151+
}
152+
}
153+
eventIndex++;
154+
}
155+
}
156+
};
157+
158+
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
159+
{
160+
return WorkflowSpec{
161+
adaptAnalysisTask<sgPIDAnalyzer>(cfgc, TaskName{"sgpidanalyzer"})};
162+
}

PWGUD/Tasks/sgPIDSpectraTable.cxx

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2+
// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3+
// All rights not expressly granted are reserved.
4+
//
5+
// This software is distributed under the terms of the GNU General Public
6+
// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7+
//
8+
// In applying this license CERN does not waive the privileges and immunities
9+
// granted to it by virtue of its status as an Intergovernmental Organization
10+
// or submit itself to any jurisdiction.
11+
//
12+
// \Single Gap Event Analyzer
13+
// \author Sasha Bylinkin, alexander.bylinkin@gmail.com
14+
// \since April 2023
15+
#include <vector>
16+
17+
#include "Framework/runDataProcessing.h"
18+
#include "Framework/AnalysisTask.h"
19+
20+
#include "TVector3.h"
21+
#include "TTree.h"
22+
#include "TFile.h"
23+
#include "Common/DataModel/PIDResponse.h"
24+
#include "PWGUD/DataModel/UDTables.h"
25+
#include "PWGUD/DataModel/SGTables.h"
26+
#include "PWGUD/Core/UDHelpers.h"
27+
#include "PWGUD/Core/SGSelector.h"
28+
#include "PWGUD/Core/SGTrackSelector.h"
29+
30+
using namespace o2;
31+
using namespace o2::framework;
32+
using namespace o2::framework::expressions;
33+
34+
struct SGPIDSpectraTable {
35+
Produces<aod::SGEvents> SGevents;
36+
Produces<aod::SGTracks> SGtracks;
37+
SGSelector sgSelector;
38+
39+
// configurables
40+
Configurable<float> FV0_cut{"FV0", 50., "FV0A threshold"};
41+
Configurable<float> ZDC_cut{"ZDC", .1, "ZDC threshold"};
42+
Configurable<float> FT0A_cut{"FT0A", 100., "FT0A threshold"};
43+
Configurable<float> FT0C_cut{"FT0C", 50., "FT0C threshold"};
44+
Configurable<float> FDDA_cut{"FDDA", 10000., "FDDA threshold"};
45+
Configurable<float> FDDC_cut{"FDDC", 10000., "FDDC threshold"};
46+
Configurable<float> GS_cut{"GS", 0., "Gap-side A=0, C=1, AC = 2, No Gap = -1, All events = 3"};
47+
// Track Selections
48+
Configurable<float> PV_cut{"PV_cut", 1.0, "Use Only PV tracks"};
49+
Configurable<float> dcaZ_cut{"dcaZ_cut", 2.0, "dcaZ cut"};
50+
Configurable<float> dcaXY_cut{"dcaXY_cut", 0.0, "dcaXY cut (0 for Pt-function)"};
51+
Configurable<float> tpcChi2_cut{"tpcChi2_cut", 4, "Max tpcChi2NCl"};
52+
Configurable<float> tpcNClsFindable_cut{"tpcNClsFindable_cut", 70, "Min tpcNClsFindable"};
53+
Configurable<float> itsChi2_cut{"itsChi2_cut", 36, "Max itsChi2NCl"};
54+
Configurable<float> eta_cut{"eta_cut", 0.9, "Track Pseudorapidity"};
55+
Configurable<float> pt_cut{"pt_cut", 0.1, "Track Pt"};
56+
// initialize histogram registry
57+
HistogramRegistry registry{
58+
"registry",
59+
{}};
60+
61+
void init(InitContext&)
62+
{
63+
// Collision histograms
64+
}
65+
66+
// define data types
67+
using UDCollisionsFull = soa::Join<aod::UDCollisions, aod::SGCollisions, aod::UDCollisionsSels, aod::UDZdcsReduced>; // UDCollisions
68+
using UDCollisionFull = UDCollisionsFull::iterator;
69+
using UDTracksFull = soa::Join<aod::UDTracks, aod::UDTracksPID, aod::UDTracksExtra, aod::UDTracksFlags, aod::UDTracksDCA>;
70+
71+
void process(UDCollisionFull const& coll, UDTracksFull const& tracks)
72+
{
73+
float FIT_cut[5] = {FV0_cut, FT0A_cut, FT0C_cut, FDDA_cut, FDDC_cut};
74+
int truegapSide = sgSelector.trueGap(coll, FIT_cut[0], FIT_cut[1], FIT_cut[2], ZDC_cut);
75+
if (GS_cut != 3) {
76+
if (truegapSide != GS_cut)
77+
return;
78+
}
79+
// fill collision histograms
80+
// int truegapSide = sgSelector.trueGap(dgcand, FV0_cut, ZDC_cut);
81+
// select PV contributors
82+
std::vector<float> parameters = {PV_cut, dcaZ_cut, dcaXY_cut, tpcChi2_cut, tpcNClsFindable_cut, itsChi2_cut, eta_cut, pt_cut};
83+
// check rho0 signals
84+
float tpcpi, tpcka, tpcel, tpcpr, tofpi, tofka, tofpr, tofel;
85+
TVector3 a;
86+
int goodtracks = 0;
87+
for (auto t : tracks) {
88+
if (trackselector(t, parameters)) {
89+
goodtracks++;
90+
}
91+
}
92+
if (!goodtracks)
93+
return;
94+
SGevents(coll.runNumber(), coll.flags(), truegapSide, coll.energyCommonZNA(), coll.energyCommonZNC(), goodtracks);
95+
// SGevents(coll.runNumber(), coll.flags());
96+
for (auto t : tracks) {
97+
if (trackselector(t, parameters)) {
98+
a.SetXYZ(t.px(), t.py(), t.pz());
99+
tpcpi = t.hasTPC() ? t.tpcNSigmaPi() : -999;
100+
tpcka = t.hasTPC() ? t.tpcNSigmaKa() : -999;
101+
tpcpr = t.hasTPC() ? t.tpcNSigmaPr() : -999;
102+
tpcel = t.hasTPC() ? t.tpcNSigmaEl() : -999;
103+
tofpi = t.hasTOF() ? t.tofNSigmaPi() : -999;
104+
tofka = t.hasTOF() ? t.tofNSigmaKa() : -999;
105+
tofpr = t.hasTOF() ? t.tofNSigmaPr() : -999;
106+
tofel = t.hasTOF() ? t.tofNSigmaEl() : -999;
107+
SGtracks(SGevents.lastIndex(), a.Pt(), a.Eta(), a.Phi(), t.sign(), tpcpi, tpcka, tpcpr, tpcel, tofpi, tofka, tofpr, tofel);
108+
}
109+
}
110+
}
111+
};
112+
113+
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
114+
{
115+
return WorkflowSpec{
116+
adaptAnalysisTask<SGPIDSpectraTable>(cfgc, TaskName{"sgpidspectratable"}),
117+
};
118+
}

0 commit comments

Comments
 (0)