Project
Loading...
Searching...
No Matches
SVStudy.cxx
Go to the documentation of this file.
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#include <vector>
13#include <TStopwatch.h>
45#include "MathUtils/fit.h"
48// #include "GPUSettingsO2.h"
49#include "GPUParam.h"
50#include "GPUParam.inc"
51#include "GPUO2InterfaceRefit.h"
52#include "GPUO2InterfaceUtils.h"
53
54namespace o2::svstudy
55{
56
57using namespace o2::framework;
60
67
69
70class SVStudySpec : public Task
71{
72 public:
73 SVStudySpec(std::shared_ptr<DataRequest> dr, std::shared_ptr<o2::base::GRPGeomRequest> gr, GTrackID::mask_t src, bool useTPCCl, bool useMC)
74 : mDataRequest(dr), mGGCCDBRequest(gr), mTracksSrc(src), mUseTPCCl(useTPCCl), mUseMC(useMC) {}
75 ~SVStudySpec() final = default;
76 void init(InitContext& ic) final;
77 void run(ProcessingContext& pc) final;
78 void endOfStream(EndOfStreamContext& ec) final;
79 void finaliseCCDB(ConcreteDataMatcher& matcher, void* obj) final;
80 void process(o2::globaltracking::RecoContainer& recoData);
81 o2::dataformats::V0Ext processV0(int iv, o2::globaltracking::RecoContainer& recoData);
82
83 private:
84 void updateTimeDependentParams(ProcessingContext& pc);
85 bool refitV0(const V0ID& id, o2::dataformats::V0& v0, o2::globaltracking::RecoContainer& recoData);
86 std::shared_ptr<DataRequest> mDataRequest;
87 std::shared_ptr<o2::base::GRPGeomRequest> mGGCCDBRequest;
88 bool mUseMC{false};
89 std::unique_ptr<o2::utils::TreeStreamRedirector> mDBGOut;
90 float mSelK0 = -1;
91 bool mRefit = false;
92 bool mUseTPCCl = false;
93 float mMaxEta = 0.8;
94 float mBz = 0;
95 int mNHBPerTF = 0;
96 int mNTPCOccBinLength = 0;
97 float mNTPCOccBinLengthInv;
98 float mTPCTBinMUSInv = 0.f;
99 GTrackID::mask_t mTracksSrc{};
101 std::vector<float> mTBinClOccAft, mTBinClOccBef;
102 std::unique_ptr<o2::steer::MCKinematicsReader> mcReader; // reader of MC information
103 std::shared_ptr<o2::gpu::GPUParam> mParam = nullptr;
104};
105
107{
109 mDBGOut = std::make_unique<o2::utils::TreeStreamRedirector>("svStudy.root", "recreate");
110 mRefit = ic.options().get<bool>("refit");
111 mSelK0 = ic.options().get<float>("sel-k0");
112 mMaxEta = ic.options().get<float>("max-eta");
113 if (mUseMC) {
114 mcReader = std::make_unique<o2::steer::MCKinematicsReader>("collisioncontext.root");
115 }
116}
117
119{
121 recoData.collectData(pc, *mDataRequest.get()); // select tracks of needed type, with minimal cuts, the real selected will be done in the vertexer
122 updateTimeDependentParams(pc); // Make sure this is called after recoData.collectData, which may load some conditions
123
124 size_t occupancyMapSizeBytes = o2::gpu::GPUO2InterfaceRefit::fillOccupancyMapGetSize(mNHBPerTF, mParam.get());
125 gsl::span<const unsigned int> TPCRefitterOccMap = recoData.occupancyMapTPC;
126 o2::gpu::GPUO2InterfaceUtils::paramUseExternalOccupancyMap(mParam.get(), mNHBPerTF, TPCRefitterOccMap.data(), occupancyMapSizeBytes);
127
128 mTBinClOccBef.resize(1);
129 mTBinClOccAft.resize(1);
130 if (recoData.inputsTPCclusters && mUseTPCCl) {
131 mNTPCOccBinLength = mParam->rec.tpc.occupancyMapTimeBins;
132 mTBinClOccBef.clear();
133 mTBinClOccAft.clear();
134 // prepare TPC occupancy data
135 if (mNTPCOccBinLength > 1 && recoData.occupancyMapTPC.size()) {
136 mNTPCOccBinLengthInv = 1. / mNTPCOccBinLength;
137 int nTPCBins = mNHBPerTF * o2::constants::lhc::LHCMaxBunches / 8, ninteg = 0;
138 int nTPCOccBins = nTPCBins * mNTPCOccBinLengthInv, sumBins = std::max(1, int(o2::constants::lhc::LHCMaxBunches / 8 * mNTPCOccBinLengthInv));
139 mTBinClOccAft.resize(nTPCOccBins);
140 mTBinClOccBef.resize(nTPCOccBins);
141 float sm = 0., tb = 0.5 * mNTPCOccBinLength;
142 std::vector<float> mltHistTB(nTPCOccBins);
143 for (int i = 0; i < nTPCOccBins; i++) {
144 mltHistTB[i] = mParam->GetUnscaledMult(tb);
145 tb += mNTPCOccBinLength;
146 }
147 for (int i = nTPCOccBins; i--;) {
148 sm += mltHistTB[i];
149 if (i + sumBins < nTPCOccBins) {
150 sm -= mltHistTB[i + sumBins];
151 }
152 mTBinClOccAft[i] = sm;
153 }
154 sm = 0;
155 for (int i = 0; i < nTPCOccBins; i++) {
156 sm += mltHistTB[i];
157 if (i - sumBins > 0) {
158 sm -= mltHistTB[i - sumBins];
159 }
160 mTBinClOccBef[i] = sm;
161 }
162 }
163 }
164
165 process(recoData);
166}
167
168void SVStudySpec::updateTimeDependentParams(ProcessingContext& pc)
169{
171 static bool initOnceDone = false;
172 if (!initOnceDone) { // this params need to be queried only once
173 initOnceDone = true;
174 const auto& svparam = o2::vertexing::SVertexerParams::Instance();
175 // Note: reading of the ITS AlpideParam needed for ITS timing is done by the RecoContainer
176 mFitterV0.setBz(mBz);
177 mFitterV0.setUseAbsDCA(svparam.useAbsDCA);
178 mFitterV0.setPropagateToPCA(false);
179 mFitterV0.setMaxR(svparam.maxRIni);
180 mFitterV0.setMinParamChange(svparam.minParamChange);
181 mFitterV0.setMinRelChi2Change(svparam.minRelChi2Change);
182 mFitterV0.setMaxDZIni(svparam.maxDZIni);
183 mFitterV0.setMaxDXYIni(svparam.maxDXYIni);
184 mFitterV0.setMaxChi2(svparam.maxChi2);
185 mFitterV0.setMatCorrType(o2::base::Propagator::MatCorrType(svparam.matCorr));
186 mFitterV0.setUsePropagator(svparam.usePropagator);
187 mFitterV0.setRefitWithMatCorr(svparam.refitWithMatCorr);
188 mFitterV0.setMaxStep(svparam.maxStep);
189 mFitterV0.setMaxSnp(svparam.maxSnp);
190 mFitterV0.setMinXSeed(svparam.minXSeed);
191
192 mNHBPerTF = o2::base::GRPGeomHelper::instance().getGRPECS()->getNHBFPerTF();
193 if (!mParam) {
194 // for occupancy estimator
196 }
198 mTPCTBinMUSInv = 1. / elParam.ZbinWidth; // 1./TPC bin in microseconds
199 }
200 mBz = o2::base::Propagator::Instance()->getNominalBz();
201 mFitterV0.setBz(mBz);
202}
203
205{
207 auto invalidate = [&v0ext]() { v0ext.v0ID.setVertexID(-1); };
208
209 auto v0s = recoData.getV0s();
210 auto v0IDs = recoData.getV0sIdx();
211 static int tfID = 0;
212
213 const auto& v0id = v0IDs[iv];
214 if (mRefit && !refitV0(v0id, v0ext.v0, recoData)) {
215 invalidate();
216 return v0ext;
217 }
218 const auto& v0sel = mRefit ? v0ext.v0 : v0s[iv];
219 if (mMaxEta < std::abs(v0sel.getEta())) {
220 invalidate();
221 return v0ext;
222 }
223 if (mSelK0 > 0 && std::abs(std::sqrt(v0sel.calcMass2AsK0()) - 0.497) > mSelK0) {
224 invalidate();
225 return v0ext;
226 }
227 if (!mRefit) {
228 v0ext.v0 = v0sel;
229 }
230 v0ext.v0ID = v0id;
231 const auto clRefs = recoData.getTPCTracksClusterRefs();
232 o2::MCCompLabel lb[2];
233 const o2::MCTrack* mcTrks[2];
234 for (int ip = 0; ip < 2; ip++) {
235 auto& prInfo = v0ext.prInfo[ip];
236 auto gid = v0ext.v0ID.getProngID(ip);
237 auto gidset = recoData.getSingleDetectorRefs(gid);
238 lb[ip] = recoData.getTrackMCLabel(gid);
239 if (lb[ip].isValid()) {
240 prInfo.corrGlo = !lb[ip].isFake();
241 }
242 // get TPC tracks, if any
243 if (gidset[GTrackID::TPC].isSourceSet()) {
244 const auto& tpcTr = recoData.getTPCTrack(gidset[GTrackID::TPC]);
245 prInfo.trackTPC = tpcTr;
246 prInfo.nClTPC = tpcTr.getNClusters();
247 lb[ip] = recoData.getTrackMCLabel(gidset[GTrackID::TPC]);
248 if (lb[ip].isValid()) {
249 prInfo.corrTPC = !lb[ip].isFake();
250 }
251 if (mParam && mUseTPCCl) {
252 uint8_t clSect = 0, clRow = 0;
253 uint32_t clIdx = 0;
254 tpcTr.getClusterReference(clRefs, tpcTr.getNClusterReferences() - 1, clSect, clRow, clIdx);
255 const auto& clus = recoData.getTPCClusters().clusters[clSect][clRow][clIdx];
256 prInfo.lowestRow = clRow;
257 int npads = mParam->tpcGeometry.NPads(clRow);
258 prInfo.padFromEdge = uint8_t(clus.getPad());
259 if (prInfo.padFromEdge > npads / 2) {
260 prInfo.padFromEdge = npads - 1 - prInfo.padFromEdge;
261 }
262 }
263 }
264 // get ITS tracks, if any
265 if (gid.includesDet(DetID::ITS)) {
266 auto gidITS = recoData.getITSContributorGID(gid);
267 if (gidset[GTrackID::ITS].isSourceSet()) {
268 const auto& itsTr = recoData.getITSTrack(gidset[GTrackID::ITS]);
269 prInfo.nClITS = itsTr.getNClusters();
270 lb[ip] = recoData.getTrackMCLabel(gidset[GTrackID::ITS]);
271 if (lb[ip].isValid()) {
272 prInfo.corrITS = !lb[ip].isFake();
273 }
274 for (int il = 0; il < 7; il++) {
275 if (itsTr.hasHitOnLayer(il)) {
276 prInfo.pattITS |= 0x1 << il;
277 }
278 }
279 } else {
280 const auto& itsTrf = recoData.getITSABRefs()[gidset[GTrackID::ITSAB]];
281 prInfo.nClITS = itsTrf.getNClusters();
282 lb[ip] = recoData.getTrackMCLabel(gidset[GTrackID::ITSAB]);
283 if (lb[ip].isValid()) {
284 prInfo.corrITS = !lb[ip].isFake();
285 }
286 for (int il = 0; il < 7; il++) {
287 if (itsTrf.hasHitOnLayer(il)) {
288 prInfo.pattITS |= 0x1 << il;
289 }
290 }
291 prInfo.pattITS |= 0x1 << 31; // flag AB
292 }
293 if (gidset[GTrackID::ITSTPC].isSourceSet()) {
294 auto mtc = recoData.getTPCITSTrack(gidset[GTrackID::ITSTPC]);
295 lb[ip] = recoData.getTrackMCLabel(gidset[GTrackID::ITSTPC]);
296 prInfo.chi2ITSTPC = mtc.getChi2Match();
297 if (lb[ip].isValid()) {
298 prInfo.corrITSTPC = !lb[ip].isFake();
299 }
300 }
301 }
302 if (mUseMC && lb[ip].isValid()) { // temp store of mctrks
303 mcTrks[ip] = mcReader->getTrack(lb[ip]);
304 }
305 }
306 if (mUseMC && (mcTrks[0] != nullptr) && (mcTrks[1] != nullptr)) {
307 // check majority vote on mother particle otherwise leave pdg -1
308 if (lb[0].getSourceID() == lb[1].getSourceID() && lb[0].getEventID() == lb[1].getEventID() &&
309 mcTrks[0]->getMotherTrackId() == mcTrks[1]->getMotherTrackId() && mcTrks[0]->getMotherTrackId() >= 0) {
310 const auto mother = mcReader->getTrack(lb[0].getSourceID(), lb[0].getEventID(), mcTrks[0]->getMotherTrackId());
311 v0ext.mcPID = mother->GetPdgCode();
312 }
313 }
314 return v0ext;
315}
316
318{
319 auto v0IDs = recoData.getV0sIdx();
320 auto nv0 = v0IDs.size();
321 if (nv0 > recoData.getV0s().size()) {
322 mRefit = true;
323 }
324 std::map<int, std::vector<int>> pv2sv;
325 static int tfID = 0;
326 for (int iv = 0; iv < nv0; iv++) {
327 const auto v0id = v0IDs[iv];
328 pv2sv[v0id.getVertexID()].push_back(iv);
329 }
330 std::vector<o2::dataformats::V0Ext> v0extVec;
331 for (auto it : pv2sv) {
332 int pvID = it.first;
333 auto& vv = it.second;
334 if (pvID < 0 || vv.size() == 0) {
335 continue;
336 }
337 v0extVec.clear();
338 for (int iv0 : vv) {
339 auto v0ext = processV0(iv0, recoData);
340 if (v0ext.v0ID.getVertexID() < 0) {
341 continue;
342 }
343 v0extVec.push_back(v0ext);
344 }
345 if (v0extVec.size()) {
346 const auto& pv = recoData.getPrimaryVertex(pvID);
347 float tpcOccBef = 0., tpcOccAft = 0.;
348 int tb = pv.getTimeStamp().getTimeStamp() * mTPCTBinMUSInv * mNTPCOccBinLengthInv;
349 tpcOccBef = tb < 0 ? mTBinClOccBef[0] : (tb >= mTBinClOccBef.size() ? mTBinClOccBef.back() : mTBinClOccBef[tb]);
350 tpcOccAft = tb < 0 ? mTBinClOccAft[0] : (tb >= mTBinClOccAft.size() ? mTBinClOccAft.back() : mTBinClOccAft[tb]);
351
352 (*mDBGOut) << "v0"
353 << "orbit=" << recoData.startIR.orbit << "tfID=" << tfID << "tpcOccBef=" << tpcOccBef << "tpcOccAft=" << tpcOccAft
354 << "v0Ext=" << v0extVec
355 << "pv=" << pv
356 << "\n";
357 }
358 }
359 tfID++;
360}
361
362bool SVStudySpec::refitV0(const V0ID& id, o2::dataformats::V0& v0, o2::globaltracking::RecoContainer& recoData)
363{
364 auto seedP = recoData.getTrackParam(id.getProngID(0));
365 auto seedN = recoData.getTrackParam(id.getProngID(1));
366 bool isTPConly = (id.getProngID(0).getSource() == GTrackID::TPC) || (id.getProngID(1).getSource() == GTrackID::TPC);
367 const auto& svparam = o2::vertexing::SVertexerParams::Instance();
368 if (svparam.mTPCTrackPhotonTune && isTPConly) {
369 mFitterV0.setMaxDZIni(svparam.mTPCTrackMaxDZIni);
370 mFitterV0.setMaxDXYIni(svparam.mTPCTrackMaxDXYIni);
371 mFitterV0.setMaxChi2(svparam.mTPCTrackMaxChi2);
372 mFitterV0.setCollinear(true);
373 }
374 int nCand = mFitterV0.process(seedP, seedN);
375 if (svparam.mTPCTrackPhotonTune && isTPConly) { // restore
376 // Reset immediately to the defaults
377 mFitterV0.setMaxDZIni(svparam.maxDZIni);
378 mFitterV0.setMaxDXYIni(svparam.maxDXYIni);
379 mFitterV0.setMaxChi2(svparam.maxChi2);
380 mFitterV0.setCollinear(false);
381 }
382 if (nCand == 0) { // discard this pair
383 return false;
384 }
385 const int cand = 0;
386 if (!mFitterV0.isPropagateTracksToVertexDone(cand) && !mFitterV0.propagateTracksToVertex(cand)) {
387 return false;
388 }
389 const auto& trPProp = mFitterV0.getTrack(0, cand);
390 const auto& trNProp = mFitterV0.getTrack(1, cand);
391 std::array<float, 3> pP{}, pN{};
392 trPProp.getPxPyPzGlo(pP);
393 trNProp.getPxPyPzGlo(pN);
394 std::array<float, 3> pV0 = {pP[0] + pN[0], pP[1] + pN[1], pP[2] + pN[2]};
395 auto p2V0 = pV0[0] * pV0[0] + pV0[1] * pV0[1] + pV0[2] * pV0[2];
396 const auto& pv = recoData.getPrimaryVertex(id.getVertexID());
397 const auto v0XYZ = mFitterV0.getPCACandidatePos(cand);
398 float dx = v0XYZ[0] - pv.getX(), dy = v0XYZ[1] - pv.getY(), dz = v0XYZ[2] - pv.getZ(), prodXYZv0 = dx * pV0[0] + dy * pV0[1] + dz * pV0[2];
399 float cosPA = prodXYZv0 / std::sqrt((dx * dx + dy * dy + dz * dz) * p2V0);
400 new (&v0) o2::dataformats::V0(v0XYZ, pV0, mFitterV0.calcPCACovMatrixFlat(cand), trPProp, trNProp);
401 v0.setDCA(mFitterV0.getChi2AtPCACandidate(cand));
402 v0.setCosPA(cosPA);
403 return true;
404}
405
407{
408 mDBGOut.reset();
409}
410
412{
414 return;
415 }
416}
417
419{
420 std::vector<OutputSpec> outputs;
421 auto dataRequest = std::make_shared<DataRequest>();
422
423 dataRequest->requestTracks(srcTracks, useMC);
424 dataRequest->requestClusters(srcCls, false);
425 dataRequest->requestPrimaryVertices(useMC);
426 dataRequest->requestSecondaryVertices(useMC);
427 dataRequest->inputs.emplace_back("meanvtx", "GLO", "MEANVERTEX", 0, Lifetime::Condition, ccdbParamSpec("GLO/Calib/MeanVertex", {}, 1));
428 auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(true, // orbitResetTime
429 true, // GRPECS=true
430 false, // GRPLHCIF
431 true, // GRPMagField
432 true, // askMatLUT
434 dataRequest->inputs,
435 true);
436 bool useTPCcl = srcCls[GTrackID::TPC];
437 return DataProcessorSpec{
438 "sv-study",
439 dataRequest->inputs,
440 outputs,
441 AlgorithmSpec{adaptFromTask<SVStudySpec>(dataRequest, ggRequest, srcTracks, useTPCcl, useMC)},
442 Options{
443 {"refit", VariantType::Bool, false, {"refit SVertices"}},
444 {"sel-k0", VariantType::Float, -1.f, {"If positive, select K0s with this mass margin"}},
445 {"max-eta", VariantType::Float, 1.2f, {"Cut on track eta"}},
446 }};
447}
448
449} // namespace o2::svstudy
Defintions for N-prongs secondary vertex fit.
Wrapper container for different reconstructed object types.
Definition of the GeometryManager class.
Definition of the FIT RecPoints class.
int32_t i
Helper for geometry and GRP related CCDB requests.
Global index for barrel track: provides provenance (detectors combination), index in respective array...
Definition of the MCTrack class.
Utility functions for MC particles.
Definition of the Names Generator class.
Definition of the parameter class for the detector electronics.
Wrapper container for different reconstructed object types.
Configurable params for secondary vertexer.
Result of refitting TPC-ITS matched track.
Reference on ITS/MFT clusters set.
Referenc on track indices contributing to the vertex, with possibility chose tracks from specific sou...
bool isFake() const
Definition MCCompLabel.h:78
void checkUpdates(o2::framework::ProcessingContext &pc)
static GRPGeomHelper & instance()
void setRequest(std::shared_ptr< GRPGeomRequest > req)
GPUd() value_type estimateLTFast(o2 static GPUd() float estimateLTIncrement(const o2 PropagatorImpl * Instance(bool uninitialized=false)
Definition Propagator.h:143
void setDCA(float d)
Definition V0.h:47
Static class with identifiers, bitmasks and names for ALICE detectors.
Definition DetID.h:58
static constexpr ID ITS
Definition DetID.h:63
ConfigParamRegistry const & options()
Definition InitContext.h:33
static size_t fillOccupancyMapGetSize(uint32_t nHbfPerTf, const GPUParam *param=nullptr)
static void paramUseExternalOccupancyMap(GPUParam *param, uint32_t nHbfPerTf, const uint32_t *occupancymap, int32_t occupancyMapSize)
static std::shared_ptr< GPUParam > getFullParamShared(float solenoidBz, uint32_t nHbfPerTf=0, std::unique_ptr< GPUO2InterfaceConfiguration > *pConfiguration=nullptr, std::unique_ptr< GPUSettingsO2 > *pO2Settings=nullptr, bool *autoMaxTimeBin=nullptr)
void finaliseCCDB(ConcreteDataMatcher &matcher, void *obj) final
Definition SVStudy.cxx:411
SVStudySpec(std::shared_ptr< DataRequest > dr, std::shared_ptr< o2::base::GRPGeomRequest > gr, GTrackID::mask_t src, bool useTPCCl, bool useMC)
Definition SVStudy.cxx:73
o2::dataformats::V0Ext processV0(int iv, o2::globaltracking::RecoContainer &recoData)
Definition SVStudy.cxx:204
void init(InitContext &ic) final
Definition SVStudy.cxx:106
~SVStudySpec() final=default
void process(o2::globaltracking::RecoContainer &recoData)
Definition SVStudy.cxx:317
void endOfStream(EndOfStreamContext &ec) final
This is invoked whenever we have an EndOfStream event.
Definition SVStudy.cxx:406
void run(ProcessingContext &pc) final
Definition SVStudy.cxx:118
o2::gpu::gpustd::array< float, 6 > calcPCACovMatrixFlat(int cand=0) const
Definition DCAFitterN.h:196
Track & getTrack(int i, int cand=0)
Definition DCAFitterN.h:162
float getChi2AtPCACandidate(int cand=0) const
Definition DCAFitterN.h:148
GLenum src
Definition glcorearb.h:1767
GLfloat v0
Definition glcorearb.h:811
constexpr int LHCMaxBunches
Defining PrimaryVertex explicitly as messageable.
Definition TFIDInfo.h:20
std::vector< ConfigParamSpec > ccdbParamSpec(std::string const &path, int runDependent, std::vector< CCDBMetadata > metadata={}, int qrate=0)
std::vector< ConfigParamSpec > Options
detail::Bracket< float > Bracketf_t
Definition Primitive2D.h:40
o2::framework::DataProcessorSpec getSVStudySpec(o2::dataformats::GlobalTrackID::mask_t srcTracks, o2::dataformats::GlobalTrackID::mask_t srcCls, bool useMC)
create a processor spec
Definition SVStudy.cxx:418
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
Defining DataPointCompositeObject explicitly as copiable.
uint32_t orbit
LHC orbit.
std::array< ProngInfoExt, 2 > prInfo
Definition V0Ext.h:41
GTrackID getITSContributorGID(GTrackID source) const
GlobalIDSet getSingleDetectorRefs(GTrackID gidx) const
const o2::tpc::TrackTPC & getTPCTrack(GTrackID id) const
const o2::tpc::ClusterNativeAccess & getTPCClusters() const
o2::MCCompLabel getTrackMCLabel(GTrackID id) const
const o2::track::TrackParCov & getTrackParam(GTrackID gidx) const
const o2::dataformats::TrackTPCITS & getTPCITSTrack(GTrackID gid) const
void collectData(o2::framework::ProcessingContext &pc, const DataRequest &request)
const o2::dataformats::PrimaryVertex & getPrimaryVertex(int i) const
const o2::its::TrackITS & getITSTrack(GTrackID gid) const
std::unique_ptr< o2::tpc::internal::getWorkflowTPCInput_ret > inputsTPCclusters
gsl::span< const unsigned int > occupancyMapTPC
externally set TPC clusters occupancy map
const ClusterNative * clusters[constants::MAXSECTOR][constants::MAXGLOBALPADROW]