14#include <TStopwatch.h>
67 : mDataRequest(dr), mGGCCDBRequest(gr), mTracksSrc(
src), mUseMC(useMC)
78 void process(
o2::globaltracking::RecoContainer& recoData);
79 bool getDCAs(const
o2::track::TrackPar& track,
float& dcar,
float& dcaz);
84 std::shared_ptr<
o2::base::GRPGeomRequest> mGGCCDBRequest;
85 o2::tpc::VDriftHelper mTPCVDriftHelper{};
88 bool mUseGPUModel{
false};
92 int mTFEnd = 999999999;
98 float mSamplingFactor{0.1};
100 bool mEnableDCA =
false;
101 int mWriteTrackClusters = 0;
102 bool mDoSampling{
false};
104 std::vector<size_t> mClusterOccupancy;
105 std::vector<size_t> mITSTPCTrackOccupanyTPCTime;
106 std::vector<size_t> mITSTPCTrackOccupanyCombinedTime;
107 std::unique_ptr<o2::utils::TreeStreamRedirector> mDBGOutTPC;
108 std::unique_ptr<o2::utils::TreeStreamRedirector> mDBGOutITSTPC;
109 std::unique_ptr<o2::utils::TreeStreamRedirector> mDBGOutTPCTF;
110 std::unique_ptr<o2::utils::TreeStreamRedirector> mDBGOutITSTPCTF;
111 std::unique_ptr<o2::utils::TreeStreamRedirector> mDBGOutCosmics;
112 std::unique_ptr<o2::utils::TreeStreamRedirector> mDBGOutCl;
113 float mITSROFrameLengthMUS = 0.;
116 std::mt19937 mGenerator;
119 uint32_t mTimeBinsPerTF{};
120 uint32_t mOccupancyBinsPerTF{};
121 uint32_t mTimeBinsPerDrift{500};
125 gsl::span<const o2::tpc::TPCClRefElem> mTPCTrackClusIdx;
126 gsl::span<const o2::tpc::TrackTPC> mTPCTracksArray;
127 gsl::span<const o2::dataformats::TrackTPCITS> mITSTPCTracksArray;
128 gsl::span<const o2::its::TrackITS> mITSTracksArray;
129 gsl::span<const o2::dataformats::TrackCosmics> mCosmics;
130 gsl::span<const unsigned char> mTPCRefitterShMap;
131 gsl::span<const unsigned int> mTPCRefitterOccMap;
133 gsl::span<const o2::MCCompLabel> mTPCTrkLabels;
134 std::unique_ptr<o2::gpu::GPUO2InterfaceRefit> mTPCRefitter;
135 std::vector<o2::InteractionTimeRecord> mIntRecs;
147 mEnableDCA = ic.
options().
get<
bool>(
"enable-dcas");
148 mUseGPUModel = ic.
options().
get<
bool>(
"use-gpu-fitter");
151 mDCAMinPt = ic.
options().
get<
float>(
"dcaMinPt");
152 mDCAMinNCl = ic.
options().
get<
float>(
"dcaMinNCl");
154 mSamplingFactor = ic.
options().
get<
float>(
"sampling-factor");
155 mDoSampling = ic.
options().
get<
bool>(
"do-sampling");
156 mDoRefit = ic.
options().
get<
bool>(
"do-refit");
157 mStudyType = ic.
options().
get<
int>(
"study-type");
158 mWriterType = ic.
options().
get<
int>(
"writer-type");
159 mWriteTrackClusters = ic.
options().
get<
int>(
"write-track-clusters");
160 const auto occBinsPerDrift = ic.
options().
get<uint32_t>(
"occupancy-bins-per-drift");
162 mOccupancyBinsPerTF =
static_cast<uint32_t
>(std::ceil(
float(mTimeBinsPerTF * occBinsPerDrift) / mTimeBinsPerDrift));
163 mClusterOccupancy.resize(mOccupancyBinsPerTF);
164 mITSTPCTrackOccupanyTPCTime.resize(mOccupancyBinsPerTF);
165 mITSTPCTrackOccupanyCombinedTime.resize(mOccupancyBinsPerTF);
166 LOGP(info,
"Using {} bins for the occupancy per TF", mOccupancyBinsPerTF);
170 mDBGOutTPC = std::make_unique<o2::utils::TreeStreamRedirector>(
"tpctracks-study-streamer.root",
"recreate");
173 mDBGOutITSTPC = std::make_unique<o2::utils::TreeStreamRedirector>(
"itstpctracks-study-streamer.root",
"recreate");
176 mDBGOutCosmics = std::make_unique<o2::utils::TreeStreamRedirector>(
"cosmics-study-streamer.root",
"recreate");
179 if (ic.
options().
get<
bool>(
"dump-clusters")) {
180 mDBGOutCl = std::make_unique<o2::utils::TreeStreamRedirector>(
"tpc-trackStudy-cl.root",
"recreate");
186 mGenerator = std::mt19937(std::random_device{}());
187 mTPCCorrMapsLoader.
init(ic);
193 if (mTFCount < mTFStart || mTFCount > mTFEnd) {
194 LOGP(info,
"Skipping TF {}", mTFCount);
200 updateTimeDependentParams(pc);
201 fillOccupancyVectors(recoData);
204 if (mTFCount >= mTFEnd) {
205 LOGP(info,
"Stopping processing after TF {}", mTFCount);
216 static bool initOnceDone =
false;
222 bool updateMaps =
false;
228 LOGP(info,
"Updating TPC fast transform map with new VDrift factor of {} wrt reference {} and DriftTimeOffset correction {} wrt {} from source {}",
243 std::fill(mClusterOccupancy.begin(), mClusterOccupancy.end(), 0u);
244 std::fill(mITSTPCTrackOccupanyTPCTime.begin(), mITSTPCTrackOccupanyTPCTime.end(), 0u);
245 std::fill(mITSTPCTrackOccupanyCombinedTime.begin(), mITSTPCTrackOccupanyCombinedTime.end(), 0u);
250 for (
int sector = 0; sector <
MAXSECTOR; ++sector) {
252 for (
size_t icl = 0; icl < clusterIndex.nClusters[sector][
padrow]; ++icl) {
253 const auto& cl = clusterIndex.clusters[sector][
padrow][icl];
255 const auto tpcTime = cl.getTime() + mTimeBinsPerDrift;
256 const uint32_t clOccPos =
static_cast<uint32_t
>(tpcTime * mOccupancyBinsPerTF / mTimeBinsPerTF);
257 if (clOccPos >= mOccupancyBinsPerTF) {
258 LOGP(error,
"cluster with time {} outside TPC acceptanc", cl.getTime());
260 ++mClusterOccupancy[clOccPos];
271 for (
const auto& tpcitsTrack : itstpcTracks) {
272 const auto idxTPC = tpcitsTrack.getRefTPC().getIndex();
273 if (idxTPC >= tpcTracks.size()) {
274 LOGP(fatal,
"TPC index {} out of array size {}", idxTPC, tpcTracks.size());
276 const auto& tpcTrack = tpcTracks[idxTPC];
278 const auto tpcTime = tpcTrack.getTime0() + mTimeBinsPerDrift;
280 const uint32_t clOccPosTPC =
static_cast<uint32_t
>(tpcTime * mOccupancyBinsPerTF / mTimeBinsPerTF);
281 if (clOccPosTPC < mITSTPCTrackOccupanyTPCTime.size()) {
282 ++mITSTPCTrackOccupanyTPCTime[clOccPosTPC];
284 LOGP(warn,
"TF {}: TPC occupancy index {} out of range {}", mTFCount, clOccPosTPC, mITSTPCTrackOccupanyTPCTime.size());
289 const auto tpcitsTime = tpcitsTrack.getTimeMUS().getTimeStamp() / paramEle.ZbinWidth + mTimeBinsPerDrift;
290 if (tpcitsTime > 0) {
291 const uint32_t clOccPosITSTPC =
static_cast<uint32_t
>(tpcitsTime * mOccupancyBinsPerTF / mTimeBinsPerTF);
292 if (clOccPosITSTPC < mITSTPCTrackOccupanyCombinedTime.size()) {
293 ++mITSTPCTrackOccupanyCombinedTime[clOccPosITSTPC];
300 *streamer <<
"occupancy"
301 <<
"tfCounter=" << mTFCount
302 <<
"clusterOcc=" << mClusterOccupancy
303 <<
"tpcTrackTimeOcc=" << mITSTPCTrackOccupanyTPCTime
304 <<
"itstpcTrackTimeOcc=" << mITSTPCTrackOccupanyCombinedTime
309 fillDebug(mDBGOutTPC.get());
310 fillDebug(mDBGOutITSTPC.get());
327 LOGP(info,
"Processing TF {} with {} its, {} tpc, {} its-tpc tracks and {} comsmics", mTFCount, mITSTracksArray.size(), mTPCTracksArray.size(), mITSTPCTracksArray.size(), mCosmics.size());
331 throw std::invalid_argument(
"initialization of MCKinematicsReader failed");
338 mTPCRefitter = std::make_unique<o2::gpu::GPUO2InterfaceRefit>(mTPCClusterIdxStruct, &mTPCCorrMapsLoader, prop->getNominalBz(), mTPCTrackClusIdx.data(), 0, mTPCRefitterShMap.data(), mTPCRefitterOccMap.data(), mTPCRefitterOccMap.size(),
nullptr, prop);
343 auto dumpClusters = [
this] {
345 const auto* corrMap = this->mTPCCorrMapsLoader.getCorrMap();
346 for (
int sector = 0; sector < 36; sector++) {
347 float alp = ((sector % 18) * 20 + 10) * TMath::DegToRad();
348 float sn = TMath::Sin(alp), cs = TMath::Cos(alp);
350 for (
int ic = 0; ic < this->mTPCClusterIdxStruct->
nClusters[sector][
row]; ic++) {
351 const auto cl = this->mTPCClusterIdxStruct->
clusters[sector][
row][ic];
352 float x,
y,
z, xG, yG;
353 corrMap->TransformIdeal(sector,
row, cl.getPad(), cl.getTime(),
x,
y,
z, 0);
355 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);
356 (*mDBGOutCl) <<
"tpccl"
357 <<
"tf=" <<
tf <<
"sect=" << sector <<
"row=" <<
row <<
"pad=" << cl.getPad() <<
"time=" << cl.getTime() <<
"qmax=" << cl.getQmax() <<
"qtot=" << cl.getQtot()
358 <<
"sigT=" << cl.getSigmaTime() <<
"sigP=" << cl.getSigmaPad()
359 <<
"flags=" << cl.getFlags()
360 <<
"x=" <<
x <<
"y=" <<
y <<
"z=" <<
z <<
"xg=" << xG <<
"yg=" << yG
373 for (
size_t itr = 0; itr < mTPCTracksArray.size(); itr++) {
374 processTPCTrack(mTPCTracksArray[itr], mUseMC ? mTPCTrkLabels[itr] :
o2::MCCompLabel{}, mDBGOutTPC.get());
379 for (
const auto& tpcitsTrack : mITSTPCTracksArray) {
380 const auto idxTPC = tpcitsTrack.getRefTPC().getIndex();
381 const auto idxITS = tpcitsTrack.getRefITS().getIndex();
382 if (idxITS >= mITSTracksArray.size()) {
383 LOGP(fatal,
"ITS index {} out of array size {}", idxITS, mITSTracksArray.size());
385 if (idxTPC >= mTPCTracksArray.size()) {
386 LOGP(fatal,
"TPC index {} out of array size {}", idxTPC, mTPCTracksArray.size());
388 processTPCTrack(mTPCTracksArray[idxTPC], mUseMC ? mTPCTrkLabels[idxTPC] :
o2::MCCompLabel{}, mDBGOutITSTPC.get(), &mITSTracksArray[idxITS], &tpcitsTrack);
392 if (mCosmics.size() > 0) {
393 LOGP(info,
"Procssing {} cosmics", mCosmics.size());
394 processCosmics(recoData);
401 mDBGOutITSTPC.reset();
402 mDBGOutTPCTF.reset();
403 mDBGOutITSTPCTF.reset();
404 mDBGOutCosmics.reset();
424 std::array<float, 2> dca;
427 const auto ok = propagator->propagateToDCABxByBz(refPoint, propTrack, 2., o2::base::Propagator::MatCorrType::USEMatCorrLUT, &dca);
443 std::vector<int> occCl;
444 std::vector<short> clSector, clRow;
445 std::vector<float> clX, clY, clZ, clXI, clYI, clZI;
446 std::vector<tpc::ClusterNative> clNative;
448 float dcar, dcaz, dcarRef, dcazRef;
451 if (tr.hasBothSidesClusters()) {
455 bool sampleTsallis =
false;
456 bool sampleMB =
false;
457 float tsallisWeight = 0;
459 std::uniform_real_distribution<>
distr(0., 1.);
461 sampleTsallis =
true;
463 if (
distr(mGenerator) < mSamplingFactor) {
467 if (!sampleMB && !sampleTsallis) {
473 auto trackRefit = [&tr,
this](
o2::track::TrackParCov& trc,
float t,
float chi2refit,
bool outward =
false) ->
bool {
474 int retVal = mUseGPUModel ? this->mTPCRefitter->RefitTrackAsGPU(trc, tr.getClusterRef(), t, &chi2refit, outward,
true)
475 :
this->mTPCRefitter->RefitTrackAsTrackParCov(trc, tr.getClusterRef(), t, &chi2refit, outward, true);
477 LOGP(warn,
"Refit failed ({}) with time={}: track#{}[{}]",
retVal, t,
counter, trc.asString());
484 if (!trc.rotate(tr.getAlpha())) {
485 LOGP(warn,
"Rotation to original track alpha {} failed, track#{}[{}]", tr.getAlpha(),
counter, trc.asString());
488 float xtgt = this->mXRef;
493 if (!prop->PropagateToXBxByBz(trc, xtgt)) {
494 LOGP(warn,
"Propagation to X={} failed, track#{}[{}]", xtgt,
counter, trc.asString());
501 auto prepClus = [
this, &tr, &clData](
float t) {
502 int count = tr.getNClusters();
503 const auto* corrMap = this->mTPCCorrMapsLoader.getCorrMap();
505 for (
int ic =
count; ic--;) {
507 uint32_t clusterIndex;
508 o2::tpc::TrackTPC::getClusterReference(mTPCTrackClusIdx, ic, sector,
row, clusterIndex, tr.getClusterRef());
509 unsigned int absoluteIndex = mTPCClusterIdxStruct->
clusterOffset[sector][
row] + clusterIndex;
510 cl = &mTPCClusterIdxStruct->
clusters[sector][
row][clusterIndex];
511 uint8_t clflags = cl->getFlags();
515 clData.clSector.emplace_back(sector);
516 clData.clRow.emplace_back(
row);
517 auto& clCopy = clData.clNative.emplace_back(*cl);
518 clCopy.setFlags(clflags);
522 corrMap->TransformIdeal(sector,
row, cl->getPad(), cl->getTime(),
x,
y,
z, t);
523 clData.clXI.emplace_back(
x);
524 clData.clYI.emplace_back(
y);
525 clData.clZI.emplace_back(
z);
528 mTPCCorrMapsLoader.Transform(sector,
row, cl->getPad(), cl->getTime(),
x,
y,
z, t);
529 clData.clX.emplace_back(
x);
530 clData.clY.emplace_back(
y);
531 clData.clZ.emplace_back(
z);
534 const auto tpcTime = cl->getTime() + mTimeBinsPerDrift;
535 const uint32_t clOccPosTPC =
static_cast<uint32_t
>(tpcTime * mOccupancyBinsPerTF / mTimeBinsPerTF);
536 clData.occCl.emplace_back((clOccPosTPC < mClusterOccupancy.size()) ? mClusterOccupancy[clOccPosTPC] : -1);
542 auto trf = tr.getOuterParam();
544 float time0 = tr.getTime0();
545 if (time0custom > 0) {
549 if (!trackRefit(trf, time0, chi2refit) || !trackProp(trf)) {
555 if (!trackProp(tr)) {
559 if (mWriteTrackClusters) {
564 dcar = dcaz = dcarRef = dcazRef = 9999.f;
565 if ((trf.getPt() > mDCAMinPt) && (tr.getNClusters() > mDCAMinNCl)) {
566 getDCAs(trf, dcarRef, dcazRef);
576 <<
"tfCounter=" << mTFCount
583 <<
"chi2refit=" << chi2refit;
588 <<
"tsallisWeight=" << tsallisWeight
590 <<
"sampleMB=" << sampleMB;
593 if (mWriteTrackClusters) {
595 <<
"clSector=" << clData.clSector
596 <<
"clRow=" << clData.clRow;
598 if ((mWriteTrackClusters & 0x1) == 0x1) {
600 <<
"cl=" << clData.clNative;
603 if ((mWriteTrackClusters & 0x2) == 0x2) {
605 <<
"clX=" << clData.clX
606 <<
"clY=" << clData.clY
607 <<
"clZ=" << clData.clZ;
610 if ((mWriteTrackClusters & 0x4) == 0x4) {
612 <<
"clXI=" << clData.clXI
613 <<
"clYI=" << clData.clYI
614 <<
"clZI=" << clData.clZI;
617 if ((mWriteTrackClusters & 0x8) == 0x8) {
619 <<
"clOcc=" << clData.occCl;
629 <<
"itstpc=" << *itstpc;
636 <<
"dcarRef=" << dcarRef
637 <<
"dcazRef=" << dcazRef;
642 <<
"mcLabel=" << lbl;
658 float bcTB =
bc / 8. + mTPCTBBias;
662 TParticlePDG* pPDG = TDatabasePDG::Instance()->GetParticle(mcTrack->
GetPdgCode());
669 if (!mctrO2.rotate(tr.getAlpha()) || !prop->PropagateToXBxByBz(mctrO2, tr.getX())) {
674 auto trfm = tr.getOuterParam();
677 if (!trackRefit(trfm, bcTB, chi2refit) || !trfm.rotate(tr.getAlpha()) || !prop->PropagateToXBxByBz(trfm, tr.getX())) {
678 LOGP(warn,
"Failed to propagate MC-time refitted track#{} [{}] to X/alpha of original track [{}]",
counter, trfm.asString(), tr.asString());
682 dz = (tr.getTime0() - bcTB) * mVdriftTB;
683 if (tr.hasCSideClustersOnly()) {
689 (*streamer) <<
"tpcMC"
691 <<
"movTrackRef=" << trfm
692 <<
"mcTrack=" << mctrO2
693 <<
"imposedTB=" << bcTB
694 <<
"chi2refit=" << chi2refit
696 <<
"clX=" << clData.clX
697 <<
"clY=" << clData.clY
698 <<
"clZ=" << clData.clZ
712 const auto invBinWidth = 1.f /
par.ZbinWidth;
714 for (
const auto& cosmic : mCosmics) {
716 const auto& gidtop = cosmic.getRefTop();
717 const auto& gidbot = cosmic.getRefBottom();
722 const auto trackTime = cosmic.getTimeMUS().getTimeStamp() * invBinWidth;
726 for (
const auto& comsmicInfo : contributorsGID) {
729 if (tpcGlobal.isIndexSet() && tofGlobal.isIndexSet()) {
730 const auto itrTPC = tpcGlobal.getIndex();
731 const auto itrTOF = tofGlobal.getIndex();
732 const auto& tofCl = tof[itrTOF];
733 const auto tofTime = tofCl.getTime() * 1e-6 * invBinWidth;
734 const auto tofTimeRaw = tofCl.getTimeRaw() * 1e-6 * invBinWidth;
735 const auto& trackTPC = mTPCTracksArray[itrTPC];
737 processTPCTrack(trackTPC, mUseMC ? mTPCTrkLabels[itrTPC] :
o2::
MCCompLabel{}, mDBGOutCosmics.
get(), nullptr, nullptr, false, tofTime);
745 std::vector<OutputSpec> outputs;
747 {
"target-x", VariantType::Float, 83.f, {
"Try to propagate to this radius"}},
748 {
"dump-clusters", VariantType::Bool,
false, {
"dump all clusters"}},
749 {
"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"}},
750 {
"tf-start", VariantType::Int, 0, {
"1st TF to process"}},
751 {
"tf-end", VariantType::Int, 999999999, {
"last TF to process"}},
752 {
"use-gpu-fitter", VariantType::Bool,
false, {
"use GPU track model for refit instead of TrackParCov"}},
753 {
"do-refit", VariantType::Bool,
false, {
"do refitting of TPC track"}},
754 {
"use-r-as-x", VariantType::Bool,
false, {
"Use radius instead of target sector X"}},
755 {
"enable-dcas", VariantType::Bool,
false, {
"Propagate to DCA and add it to the tree"}},
756 {
"dcaMinPt", VariantType::Float, 1.f, {
"Min pT of tracks propagated to DCA"}},
757 {
"dcaMinNCl", VariantType::Int, 80, {
"Min number of clusters for tracks propagated to DCA"}},
758 {
"sqrts", VariantType::Float, 13600.f, {
"Centre of mass energy used for downsampling"}},
759 {
"do-sampling", VariantType::Bool,
false, {
"Perform sampling, min. bias and on Tsallis function, using 'sampling-factor'"}},
760 {
"sampling-factor", VariantType::Float, 0.1f, {
"Sampling factor in case sample-unbinned-tsallis is used"}},
761 {
"study-type", VariantType::Int, 1, {
"Bitmask of study type: 0x1 = TPC only, 0x2 = TPC + ITS, 0x4 = Cosmics"}},
762 {
"writer-type", VariantType::Int, 1, {
"Bitmask of writer type: 0x1 = per track streamer, 0x2 = per TF vectors"}},
763 {
"occupancy-bins-per-drift", VariantType::UInt32, 31u, {
"number of bin for occupancy histogram per drift time (500tb)"}},
765 auto dataRequest = std::make_shared<DataRequest>();
767 dataRequest->requestTracks(srcTracks, useMC);
768 dataRequest->requestClusters(srcClusters, useMC);
769 if (requestCosmics) {
770 dataRequest->requestCoscmicTracks(useMC);
772 auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(
false,
787 AlgorithmSpec{adaptFromTask<TPCRefitterSpec>(dataRequest, ggRequest, sclOpts, srcTracks, useMC)},
Helper class to access load maps from CCDB.
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
ConfigParamRegistry const & options()
ServiceRegistryRef services()
The services registry associated with this processing context.
void setLumiScaleType(int32_t v)
void setLumiScaleMode(int32_t v)
void setCheckCTPIDCConsistency(bool v)
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
void extractCCDBInputs(o2::framework::ProcessingContext &pc)
void updateVDrift(float vdriftCorr, float vdrifRef, float driftTimeOffset=0)
bool accountCCDBInputs(const o2::framework::ConcreteDataMatcher &matcher, void *obj)
static void requestCCDBInputs(std::vector< o2::framework::InputSpec > &inputs, std::vector< o2::framework::ConfigParamSpec > &options, const CorrectionMapsLoaderGloOpts &gloOpts)
void init(o2::framework::InitContext &ic)
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)
static std::string_view getSourceName(Source s)
TPCRefitterSpec(std::shared_ptr< DataRequest > dr, std::shared_ptr< o2::base::GRPGeomRequest > gr, const o2::tpc::CorrectionMapsLoaderGloOpts &sclOpts, 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
uint8_t itsSharedClusterMap uint8_t
constexpr double LHCBunchSpacingMUS
constexpr int LHCMaxBunches
Node par(int index)
Parameters.
Defining PrimaryVertex 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
constexpr int MAXGLOBALPADROW
o2::math_utils::Bracketf_t TBracket
o2::dataformats::VtxTrackRef V2TRef
o2::dataformats::VtxTrackIndex VTIndex
o2::framework::DataProcessorSpec getTPCRefitterSpec(o2::dataformats::GlobalTrackID::mask_t srcTracks, o2::dataformats::GlobalTrackID::mask_t srcClus, bool useMC, const o2::tpc::CorrectionMapsLoaderGloOpts &sclOpts, bool requestCosmics=false)
create a processor spec
@ sampleTsallis
perform sampling on tsallis pdf
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
Defining DataPointCompositeObject explicitly as copiable.
std::unique_ptr< GPUReconstructionTimeframe > tf
auto getITSTracks() const
GlobalIDSet getSingleDetectorRefs(GTrackID gidx) const
auto getTPCITSTracks() const
auto getTPCTracksClusterRefs() const
auto getTOFClusters() 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
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]
int lumiType
what estimator to used for corrections scaling: 0: no scaling, 1: CTP, 2: IDC
bool checkCTPIDCconsistency
int lumiMode
what corrections method to use: 0: classical scaling, 1: Using of the derivative map,...
float refTimeOffset
additive time offset reference (\mus)
float refVDrift
reference vdrift for which factor was extracted
float getTimeOffset() const
float timeOffsetCorr
additive time offset correction (\mus)
float corrFact
drift velocity correction factor (multiplicative)
std::uniform_int_distribution< unsigned long long > distr