14#include <TStopwatch.h>
68 : mDataRequest(dr), mGGCCDBRequest(gr), mTracksSrc(
src), mUseMC(useMC) {}
74 void process(
o2::globaltracking::RecoContainer& recoData);
75 bool getDCAs(const
o2::track::TrackPar& track,
float& dcar,
float& dcaz);
80 std::shared_ptr<
o2::base::GRPGeomRequest> mGGCCDBRequest;
81 o2::tpc::VDriftHelper mTPCVDriftHelper{};
84 bool mUseGPUModel{
false};
88 int mTFEnd = 999999999;
94 float mSamplingFactor{0.1};
96 bool mEnableDCA =
false;
97 int mWriteTrackClusters = 0;
98 bool mDoSampling{
false};
100 bool mIgnorLegsWOGoodTime{
false};
101 bool mUseCosmicLegTiming{
false};
102 std::vector<size_t> mClusterOccupancy;
103 std::vector<size_t> mITSTPCTrackOccupanyTPCTime;
104 std::vector<size_t> mITSTPCTrackOccupanyCombinedTime;
105 std::unique_ptr<o2::utils::TreeStreamRedirector> mDBGOutTPC;
106 std::unique_ptr<o2::utils::TreeStreamRedirector> mDBGOutITSTPC;
107 std::unique_ptr<o2::utils::TreeStreamRedirector> mDBGOutTPCTF;
108 std::unique_ptr<o2::utils::TreeStreamRedirector> mDBGOutITSTPCTF;
109 std::unique_ptr<o2::utils::TreeStreamRedirector> mDBGOutCosmics;
110 std::unique_ptr<o2::utils::TreeStreamRedirector> mDBGOutCl;
111 float mITSROFrameLengthMUS = 0.;
114 std::mt19937 mGenerator;
117 uint32_t mTimeBinsPerTF{};
118 uint32_t mOccupancyBinsPerTF{};
119 uint32_t mTimeBinsPerDrift{500};
123 gsl::span<const o2::tpc::TPCClRefElem> mTPCTrackClusIdx;
124 gsl::span<const o2::tpc::TrackTPC> mTPCTracksArray;
125 gsl::span<const o2::dataformats::TrackTPCITS> mITSTPCTracksArray;
126 gsl::span<const o2::its::TrackITS> mITSTracksArray;
127 gsl::span<const o2::dataformats::TrackCosmics> mCosmics;
128 gsl::span<const unsigned char> mTPCRefitterShMap;
129 gsl::span<const unsigned int> mTPCRefitterOccMap;
131 gsl::span<const o2::MCCompLabel> mTPCTrkLabels;
132 std::unique_ptr<o2::gpu::GPUO2InterfaceRefit> mTPCRefitter;
133 std::vector<o2::InteractionTimeRecord> mIntRecs;
145 mEnableDCA = ic.
options().
get<
bool>(
"enable-dcas");
146 mUseGPUModel = ic.
options().
get<
bool>(
"use-gpu-fitter");
149 mDCAMinPt = ic.
options().
get<
float>(
"dcaMinPt");
150 mDCAMinNCl = ic.
options().
get<
float>(
"dcaMinNCl");
152 mSamplingFactor = ic.
options().
get<
float>(
"sampling-factor");
153 mDoSampling = ic.
options().
get<
bool>(
"do-sampling");
154 mDoRefit = ic.
options().
get<
bool>(
"do-refit");
155 mStudyType = ic.
options().
get<
int>(
"study-type");
156 mWriterType = ic.
options().
get<
int>(
"writer-type");
157 mWriteTrackClusters = ic.
options().
get<
int>(
"write-track-clusters");
158 mIgnorLegsWOGoodTime = ic.
options().
get<
bool>(
"ignore-legs-wo-outer-det");
159 mUseCosmicLegTiming = ic.
options().
get<
bool>(
"use-cosmic-leg-timing");
161 const auto occBinsPerDrift = ic.
options().
get<uint32_t>(
"occupancy-bins-per-drift");
163 mOccupancyBinsPerTF =
static_cast<uint32_t
>(std::ceil(
float(mTimeBinsPerTF * occBinsPerDrift) / mTimeBinsPerDrift));
164 mClusterOccupancy.resize(mOccupancyBinsPerTF);
165 mITSTPCTrackOccupanyTPCTime.resize(mOccupancyBinsPerTF);
166 mITSTPCTrackOccupanyCombinedTime.resize(mOccupancyBinsPerTF);
167 LOGP(info,
"Using {} bins for the occupancy per TF", mOccupancyBinsPerTF);
171 auto composeName = [maxLanes, lane](
const std::string& seed) {
return maxLanes > 1 ? fmt::format(
"{}_{}.root", seed, lane) : fmt::format(
"{}.root", seed); };
175 mDBGOutTPC = std::make_unique<o2::utils::TreeStreamRedirector>(composeName(
"tpctracks-study-streamer").c_str(),
"recreate");
178 mDBGOutITSTPC = std::make_unique<o2::utils::TreeStreamRedirector>(composeName(
"itstpctracks-study-streamer").c_str(),
"recreate");
181 mDBGOutCosmics = std::make_unique<o2::utils::TreeStreamRedirector>(composeName(
"cosmics-study-streamer").c_str(),
"recreate");
184 if (ic.
options().
get<
bool>(
"dump-clusters")) {
185 mDBGOutCl = std::make_unique<o2::utils::TreeStreamRedirector>(composeName(
"tpc-trackStudy-cl").c_str(),
"recreate");
191 mGenerator = std::mt19937(std::random_device{}());
197 if (mTFCount < mTFStart || mTFCount > mTFEnd) {
198 LOGP(info,
"Skipping TF {}", mTFCount);
204 updateTimeDependentParams(pc);
205 fillOccupancyVectors(recoData);
208 if (mTFCount >= mTFEnd) {
209 LOGP(info,
"Stopping processing after TF {}", mTFCount);
219 auto const&
raw = pc.
inputs().
get<
const char*>(
"corrMap");
220 mTPCCorrMaps = &o2::gpu::TPCFastTransformPOD::get(raw);
226 std::fill(mClusterOccupancy.begin(), mClusterOccupancy.end(), 0u);
227 std::fill(mITSTPCTrackOccupanyTPCTime.begin(), mITSTPCTrackOccupanyTPCTime.end(), 0u);
228 std::fill(mITSTPCTrackOccupanyCombinedTime.begin(), mITSTPCTrackOccupanyCombinedTime.end(), 0u);
233 for (
int sector = 0; sector < MAXSECTOR; ++sector) {
235 for (
size_t icl = 0; icl < clusterIndex.nClusters[sector][
padrow]; ++icl) {
236 const auto& cl = clusterIndex.clusters[sector][
padrow][icl];
238 const auto tpcTime = cl.getTime() + mTimeBinsPerDrift;
239 const uint32_t clOccPos =
static_cast<uint32_t
>(tpcTime * mOccupancyBinsPerTF / mTimeBinsPerTF);
240 if (clOccPos >= mOccupancyBinsPerTF) {
241 LOGP(error,
"cluster with time {} outside TPC acceptanc", cl.getTime());
243 ++mClusterOccupancy[clOccPos];
254 for (
const auto& tpcitsTrack : itstpcTracks) {
255 const auto idxTPC = tpcitsTrack.getRefTPC().getIndex();
256 if (idxTPC >= tpcTracks.size()) {
257 LOGP(fatal,
"TPC index {} out of array size {}", idxTPC, tpcTracks.size());
259 const auto& tpcTrack = tpcTracks[idxTPC];
261 const auto tpcTime = tpcTrack.getTime0() + mTimeBinsPerDrift;
263 const uint32_t clOccPosTPC =
static_cast<uint32_t
>(tpcTime * mOccupancyBinsPerTF / mTimeBinsPerTF);
264 if (clOccPosTPC < mITSTPCTrackOccupanyTPCTime.size()) {
265 ++mITSTPCTrackOccupanyTPCTime[clOccPosTPC];
267 LOGP(warn,
"TF {}: TPC occupancy index {} out of range {}", mTFCount, clOccPosTPC, mITSTPCTrackOccupanyTPCTime.size());
272 const auto tpcitsTime = tpcitsTrack.getTimeMUS().getTimeStamp() / paramEle.ZbinWidth + mTimeBinsPerDrift;
273 if (tpcitsTime > 0) {
274 const uint32_t clOccPosITSTPC =
static_cast<uint32_t
>(tpcitsTime * mOccupancyBinsPerTF / mTimeBinsPerTF);
275 if (clOccPosITSTPC < mITSTPCTrackOccupanyCombinedTime.size()) {
276 ++mITSTPCTrackOccupanyCombinedTime[clOccPosITSTPC];
283 *streamer <<
"occupancy"
284 <<
"tfCounter=" << mTFCount
285 <<
"clusterOcc=" << mClusterOccupancy
286 <<
"tpcTrackTimeOcc=" << mITSTPCTrackOccupanyTPCTime
287 <<
"itstpcTrackTimeOcc=" << mITSTPCTrackOccupanyCombinedTime
292 fillDebug(mDBGOutTPC.get());
293 fillDebug(mDBGOutITSTPC.get());
310 LOGP(info,
"Processing TF {} with {} its, {} tpc, {} its-tpc tracks and {} comsmics", mTFCount, mITSTracksArray.size(), mTPCTracksArray.size(), mITSTPCTracksArray.size(), mCosmics.size());
314 throw std::invalid_argument(
"initialization of MCKinematicsReader failed");
321 mTPCRefitter = std::make_unique<o2::gpu::GPUO2InterfaceRefit>(mTPCClusterIdxStruct, mTPCCorrMaps, prop->getNominalBz(), mTPCTrackClusIdx.data(), 0, mTPCRefitterShMap.data(), mTPCRefitterOccMap.data(), mTPCRefitterOccMap.size(),
nullptr, prop);
326 auto dumpClusters = [
this] {
328 const auto* corrMap = this->mTPCCorrMaps;
329 for (
int sector = 0; sector < 36; sector++) {
330 float alp = ((sector % 18) * 20 + 10) * TMath::DegToRad();
331 float sn = TMath::Sin(alp), cs = TMath::Cos(alp);
333 for (
int ic = 0; ic < this->mTPCClusterIdxStruct->
nClusters[sector][
row]; ic++) {
334 const auto cl = this->mTPCClusterIdxStruct->
clusters[sector][
row][ic];
335 float x,
y,
z, xG, yG;
336 corrMap->TransformIdeal(sector,
row, cl.getPad(), cl.getTime(),
x,
y,
z, 0);
338 LOGP(
debug,
"tf:{} s:{} r:{} p:{} t:{} qm:{} qt:{} f:{} x:{} y:{} z:{}",
tf, sector,
row, cl.getPad(), cl.getTime(), cl.getQmax(), cl.getQtot(), cl.getFlags(),
x,
y,
z);
339 (*mDBGOutCl) <<
"tpccl"
340 <<
"tf=" <<
tf <<
"sect=" << sector <<
"row=" <<
row <<
"pad=" << cl.getPad() <<
"time=" << cl.getTime() <<
"qmax=" << cl.getQmax() <<
"qtot=" << cl.getQtot()
341 <<
"sigT=" << cl.getSigmaTime() <<
"sigP=" << cl.getSigmaPad()
342 <<
"flags=" << cl.getFlags()
343 <<
"x=" <<
x <<
"y=" <<
y <<
"z=" <<
z <<
"xg=" << xG <<
"yg=" << yG
356 for (
size_t itr = 0; itr < mTPCTracksArray.size(); itr++) {
357 processTPCTrack(mTPCTracksArray[itr], mUseMC ? mTPCTrkLabels[itr] :
o2::MCCompLabel{}, mDBGOutTPC.get());
362 for (
const auto& tpcitsTrack : mITSTPCTracksArray) {
363 const auto idxTPC = tpcitsTrack.getRefTPC().getIndex();
364 const auto idxITS = tpcitsTrack.getRefITS().getIndex();
365 if (idxITS >= mITSTracksArray.size()) {
366 LOGP(fatal,
"ITS index {} out of array size {}", idxITS, mITSTracksArray.size());
368 if (idxTPC >= mTPCTracksArray.size()) {
369 LOGP(fatal,
"TPC index {} out of array size {}", idxTPC, mTPCTracksArray.size());
371 processTPCTrack(mTPCTracksArray[idxTPC], mUseMC ? mTPCTrkLabels[idxTPC] :
o2::MCCompLabel{}, mDBGOutITSTPC.get(), &mITSTracksArray[idxITS], &tpcitsTrack);
375 if (mCosmics.size() > 0) {
376 LOGP(info,
"Procssing {} cosmics", mCosmics.size());
377 processCosmics(recoData);
384 mDBGOutITSTPC.reset();
385 mDBGOutTPCTF.reset();
386 mDBGOutITSTPCTF.reset();
387 mDBGOutCosmics.reset();
404 std::array<float, 2> dca;
407 const auto ok = propagator->propagateToDCABxByBz(refPoint, propTrack, 2., o2::base::Propagator::MatCorrType::USEMatCorrLUT, &dca);
423 std::vector<int> occCl;
424 std::vector<short> clSector, clRow;
425 std::vector<float> clX, clY, clZ, clXI, clYI, clZI;
426 std::vector<tpc::ClusterNative> clNative;
428 float dcar, dcaz, dcarRef, dcazRef;
431 if (tr.hasBothSidesClusters()) {
435 bool sampleTsallis =
false;
436 bool sampleMB =
false;
437 float tsallisWeight = 0;
439 std::uniform_real_distribution<>
distr(0., 1.);
441 sampleTsallis =
true;
443 if (
distr(mGenerator) < mSamplingFactor) {
447 if (!sampleMB && !sampleTsallis) {
453 auto trackRefit = [&tr,
this](
o2::track::TrackParCov& trc,
float t,
float chi2refit,
bool outward =
false) ->
bool {
454 int retVal = mUseGPUModel ? this->mTPCRefitter->RefitTrackAsGPU(trc, tr.getClusterRef(), t, &chi2refit, outward,
true)
455 :
this->mTPCRefitter->RefitTrackAsTrackParCov(trc, tr.getClusterRef(), t, &chi2refit, outward, true);
457 LOGP(warn,
"Refit failed ({}) with time={}: track#{}[{}]",
retVal, t,
counter, trc.asString());
464 if (!trc.rotate(tr.getAlpha())) {
465 LOGP(warn,
"Rotation to original track alpha {} failed, track#{}[{}]", tr.getAlpha(),
counter, trc.asString());
468 float xtgt = this->mXRef;
473 if (!prop->PropagateToXBxByBz(trc, xtgt)) {
474 LOGP(warn,
"Propagation to X={} failed, track#{}[{}]", xtgt,
counter, trc.asString());
481 auto prepClus = [
this, &tr, &clData](
float t) {
482 int count = tr.getNClusters();
483 const auto* corrMap = this->mTPCCorrMaps;
485 for (
int ic =
count; ic--;) {
487 uint32_t clusterIndex;
488 o2::tpc::TrackTPC::getClusterReference(mTPCTrackClusIdx, ic, sector,
row, clusterIndex, tr.getClusterRef());
489 unsigned int absoluteIndex = mTPCClusterIdxStruct->
clusterOffset[sector][
row] + clusterIndex;
490 cl = &mTPCClusterIdxStruct->
clusters[sector][
row][clusterIndex];
491 uint8_t clflags = cl->getFlags();
495 clData.clSector.emplace_back(sector);
496 clData.clRow.emplace_back(
row);
497 auto& clCopy = clData.clNative.emplace_back(*cl);
498 clCopy.setFlags(clflags);
502 corrMap->TransformIdeal(sector,
row, cl->getPad(), cl->getTime(),
x,
y,
z, t);
503 clData.clXI.emplace_back(
x);
504 clData.clYI.emplace_back(
y);
505 clData.clZI.emplace_back(
z);
508 mTPCCorrMaps->Transform(sector,
row, cl->getPad(), cl->getTime(),
x,
y,
z, t);
509 clData.clX.emplace_back(
x);
510 clData.clY.emplace_back(
y);
511 clData.clZ.emplace_back(
z);
514 const auto tpcTime = cl->getTime() + mTimeBinsPerDrift;
515 const uint32_t clOccPosTPC =
static_cast<uint32_t
>(tpcTime * mOccupancyBinsPerTF / mTimeBinsPerTF);
516 clData.occCl.emplace_back((clOccPosTPC < mClusterOccupancy.size()) ? mClusterOccupancy[clOccPosTPC] : -1);
522 auto trf = tr.getOuterParam();
524 float time0 = tr.getTime0();
525 if (time0custom > 0) {
529 if (!trackRefit(trf, time0, chi2refit) || !trackProp(trf)) {
535 if (!trackProp(tr)) {
539 if (mWriteTrackClusters) {
544 dcar = dcaz = dcarRef = dcazRef = 9999.f;
545 if ((trf.getPt() > mDCAMinPt) && (tr.getNClusters() > mDCAMinNCl)) {
546 getDCAs(trf, dcarRef, dcazRef);
556 <<
"tfCounter=" << mTFCount
563 <<
"chi2refit=" << chi2refit;
568 <<
"tsallisWeight=" << tsallisWeight
570 <<
"sampleMB=" << sampleMB;
573 if (mWriteTrackClusters) {
575 <<
"clSector=" << clData.clSector
576 <<
"clRow=" << clData.clRow;
578 if ((mWriteTrackClusters & 0x1) == 0x1) {
580 <<
"cl=" << clData.clNative;
583 if ((mWriteTrackClusters & 0x2) == 0x2) {
585 <<
"clX=" << clData.clX
586 <<
"clY=" << clData.clY
587 <<
"clZ=" << clData.clZ;
590 if ((mWriteTrackClusters & 0x4) == 0x4) {
592 <<
"clXI=" << clData.clXI
593 <<
"clYI=" << clData.clYI
594 <<
"clZI=" << clData.clZI;
597 if ((mWriteTrackClusters & 0x8) == 0x8) {
599 <<
"clOcc=" << clData.occCl;
609 <<
"itstpc=" << *itstpc;
616 <<
"dcarRef=" << dcarRef
617 <<
"dcazRef=" << dcazRef;
622 <<
"mcLabel=" << lbl;
638 float bcTB =
bc / 8. + mTPCTBBias;
642 TParticlePDG* pPDG = TDatabasePDG::Instance()->GetParticle(mcTrack->
GetPdgCode());
649 if (!mctrO2.rotate(tr.getAlpha()) || !prop->PropagateToXBxByBz(mctrO2, tr.getX())) {
654 auto trfm = tr.getOuterParam();
657 if (!trackRefit(trfm, bcTB, chi2refit) || !trfm.rotate(tr.getAlpha()) || !prop->PropagateToXBxByBz(trfm, tr.getX())) {
658 LOGP(warn,
"Failed to propagate MC-time refitted track#{} [{}] to X/alpha of original track [{}]",
counter, trfm.asString(), tr.asString());
662 dz = (tr.getTime0() - bcTB) * mVdriftTB;
663 if (tr.hasCSideClustersOnly()) {
669 (*streamer) <<
"tpcMC"
671 <<
"movTrackRef=" << trfm
672 <<
"mcTrack=" << mctrO2
673 <<
"imposedTB=" << bcTB
674 <<
"chi2refit=" << chi2refit
676 <<
"clX=" << clData.clX
677 <<
"clY=" << clData.clY
678 <<
"clZ=" << clData.clZ
691 const auto invBinWidth = 1.f /
par.ZbinWidth;
693 for (
const auto& cosmic : mCosmics) {
695 const GTrackID gidTopBot[] = {cosmic.getRefTop(), cosmic.getRefBottom()};
698 bool hasGoodTime[2] = {
false,
false};
699 std::array<GTrackID, GTrackID::NSources> contributorsGID[2];
700 for (
int i = 0;
i < 2;
i++) {
704 if (!hasGoodTime[0] && !hasGoodTime[1]) {
707 float trackTime = cosmic.getTimeMUS().getTimeStamp() * invBinWidth;
709 for (
int i = 0;
i < 2;
i++) {
710 if (!contributorsGID[
i][
GTrackID::TPC].isSourceSet() || (mIgnorLegsWOGoodTime && !hasGoodTime[
i])) {
713 const auto& trackTPC = mTPCTracksArray[contributorsGID[
i][
GTrackID::TPC]];
714 float useTrackTime = trackTime, dummyError = 0.f;
715 if (mUseCosmicLegTiming && hasGoodTime[
i]) {
716 recoData.
getTrackTime(gidTopBot[
i], useTrackTime, dummyError);
717 useTrackTime *= invBinWidth;
719 processTPCTrack(trackTPC, mUseMC ? mTPCTrkLabels[contributorsGID[
i][
GTrackID::TPC]] :
o2::
MCCompLabel{}, mDBGOutCosmics.
get(), nullptr, nullptr, false, useTrackTime);
726 std::vector<OutputSpec> outputs;
728 {
"target-x", VariantType::Float, 83.f, {
"Try to propagate to this radius"}},
729 {
"dump-clusters", VariantType::Bool,
false, {
"dump all clusters"}},
730 {
"write-track-clusters", VariantType::Int, 3, {
"Bitmask write clusters associated to the track, full native cluster (0x1), corrected (0x2) and uncorrected (0x4) positions, (0x8) occupancy info"}},
731 {
"tf-start", VariantType::Int, 0, {
"1st TF to process"}},
732 {
"tf-end", VariantType::Int, 999999999, {
"last TF to process"}},
733 {
"use-gpu-fitter", VariantType::Bool,
false, {
"use GPU track model for refit instead of TrackParCov"}},
734 {
"do-refit", VariantType::Bool,
false, {
"do refitting of TPC track"}},
735 {
"use-r-as-x", VariantType::Bool,
false, {
"Use radius instead of target sector X"}},
736 {
"enable-dcas", VariantType::Bool,
false, {
"Propagate to DCA and add it to the tree"}},
737 {
"dcaMinPt", VariantType::Float, 1.f, {
"Min pT of tracks propagated to DCA"}},
738 {
"dcaMinNCl", VariantType::Int, 80, {
"Min number of clusters for tracks propagated to DCA"}},
739 {
"sqrts", VariantType::Float, 13600.f, {
"Centre of mass energy used for downsampling"}},
740 {
"do-sampling", VariantType::Bool,
false, {
"Perform sampling, min. bias and on Tsallis function, using 'sampling-factor'"}},
741 {
"sampling-factor", VariantType::Float, 0.1f, {
"Sampling factor in case sample-unbinned-tsallis is used"}},
742 {
"study-type", VariantType::Int, 1, {
"Bitmask of study type: 0x1 = TPC only, 0x2 = TPC + ITS, 0x4 = Cosmics"}},
743 {
"writer-type", VariantType::Int, 1, {
"Bitmask of writer type: 0x1 = per track streamer, 0x2 = per TF vectors"}},
744 {
"occupancy-bins-per-drift", VariantType::UInt32, 31u, {
"number of bin for occupancy histogram per drift time (500tb)"}},
745 {
"ignore-legs-wo-outer-det", VariantType::Bool,
false, {
"Ignore cosmic legs w/o TRD or TOF constraint even if other leg is well constrained"}},
746 {
"use-cosmic-leg-timing", VariantType::Bool,
false, {
"Use leg-specific timestamp instead of cosmic track final timestamp"}},
748 auto dataRequest = std::make_shared<DataRequest>();
750 dataRequest->requestTracks(srcTracks, useMC);
751 dataRequest->requestClusters(srcClusters, useMC);
752 if (requestCosmics) {
753 dataRequest->requestCoscmicTracks(useMC);
755 auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(
false,
769 AlgorithmSpec{adaptFromTask<TPCRefitterSpec>(dataRequest, ggRequest, srcTracks, useMC)},
o2::raw::RawFileWriter * raw
Helper for geometry and GRP related CCDB requests.
Global index for barrel track: provides provenance (detectors combination), index in respective array...
Header to collect LHC related constants.
Definition of the parameter class for the detector electronics.
Wrapper container for different reconstructed object types.
Result of top-bottom cosmic tracks leg matching.
Helper class to extract VDrift from different sources.
Double_t GetStartVertexMomentumZ() const
Double_t GetStartVertexMomentumX() const
Double_t GetStartVertexCoordinatesY() const
Double_t GetStartVertexCoordinatesZ() const
Double_t GetStartVertexMomentumY() const
Double_t GetStartVertexCoordinatesX() const
Int_t GetPdgCode() const
Accessors.
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)
static const HBFUtils & Instance()
Static class with identifiers, bitmasks and names for ALICE detectors.
T get(const char *key) const
ServiceRegistryRef services()
ConfigParamRegistry const & options()
InputRecord & inputs()
The inputs associated with this processing context.
ServiceRegistryRef services()
The services registry associated with this processing context.
std::vector< o2::InteractionTimeRecord > & getEventRecords(bool withQED=false)
bool initFromDigitContext(std::string_view filename)
DigitizationContext const * getDigitizationContext() const
MCTrack const * getTrack(o2::MCCompLabel const &) const
static void requestCCDBInputs(std::vector< o2::framework::InputSpec > &inputs, bool laser=true, bool itstpcTgl=true)
void extractCCDBInputs(o2::framework::ProcessingContext &pc, bool laser=true, bool itstpcTgl=true)
const VDriftCorrFact & getVDriftObject() const
bool accountCCDBInputs(const o2::framework::ConcreteDataMatcher &matcher, void *obj)
TPCRefitterSpec(std::shared_ptr< DataRequest > dr, std::shared_ptr< o2::base::GRPGeomRequest > gr, GTrackID::mask_t src, bool useMC)
void process(o2::globaltracking::RecoContainer &recoData)
void run(ProcessingContext &pc) final
void init(InitContext &ic) final
void endOfStream(EndOfStreamContext &ec) final
This is invoked whenever we have an EndOfStream event.
@ ITSTPC
TPC + ITS matched tracks.
~TPCRefitterSpec() final=default
bool getDCAs(const o2::track::TrackPar &track, float &dcar, float &dcaz)
@ Streamer
Write per track streamer information.
@ TFVectors
Writer vectors per TF.
void finaliseCCDB(ConcreteDataMatcher &matcher, void *obj) final
GLdouble GLdouble GLdouble z
constexpr o2::header::DataOrigin gDataOriginTPC
uint8_t itsSharedClusterMap uint8_t
constexpr double LHCBunchSpacingMUS
constexpr int LHCMaxBunches
Node par(int index)
Parameters.
Defining ITS Vertex explicitly as messageable.
std::vector< ConfigParamSpec > Options
std::tuple< T, T > rotateZ(T xL, T yL, T snAlp, T csAlp)
detail::Bracket< float > Bracketf_t
o2::math_utils::Bracketf_t TBracket
o2::framework::DataProcessorSpec getTPCRefitterSpec(o2::dataformats::GlobalTrackID::mask_t srcTracks, o2::dataformats::GlobalTrackID::mask_t srcClus, bool useMC, bool requestCosmics=false)
create a processor spec
o2::dataformats::VtxTrackRef V2TRef
o2::dataformats::VtxTrackIndex VTIndex
@ sampleTsallis
perform sampling on tsallis pdf
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
std::unique_ptr< GPUReconstructionTimeframe > tf
auto getITSTracks() const
GlobalIDSet getSingleDetectorRefs(GTrackID gidx) const
auto getTPCITSTracks() const
auto getTPCTracksClusterRefs() const
gsl::span< const unsigned char > clusterShMapTPC
externally set TPC clusters sharing map
void collectData(o2::framework::ProcessingContext &pc, const DataRequest &request)
auto getTPCTracksMCLabels() const
std::unique_ptr< o2::tpc::internal::getWorkflowTPCInput_ret > inputsTPCclusters
auto getTPCTracks() const
void getTrackTime(GTrackID gid, float &t, float &tErr) const
gsl::span< const unsigned int > occupancyMapTPC
externally set TPC clusters occupancy map
auto getCosmicTracks() const
static bool downsampleTsallisCharged(float pt, float factorPt, float sqrts, float &weight, float rnd, float mass=0.13957)
int nHBFPerTF
number of orbits per BC
unsigned int nClusters[constants::MAXSECTOR][constants::MAXGLOBALPADROW]
const ClusterNative * clusters[constants::MAXSECTOR][constants::MAXGLOBALPADROW]
unsigned int clusterOffset[constants::MAXSECTOR][constants::MAXGLOBALPADROW]
float getTimeOffset() const
std::uniform_int_distribution< unsigned long long > distr