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);
339 mTPCRefitter->setTrackReferenceX(900);
344 auto dumpClusters = [
this] {
346 const auto* corrMap = this->mTPCCorrMapsLoader.getCorrMap();
347 for (
int sector = 0; sector < 36; sector++) {
348 float alp = ((sector % 18) * 20 + 10) * TMath::DegToRad();
349 float sn = TMath::Sin(alp), cs = TMath::Cos(alp);
351 for (
int ic = 0; ic < this->mTPCClusterIdxStruct->
nClusters[sector][
row]; ic++) {
352 const auto cl = this->mTPCClusterIdxStruct->
clusters[sector][
row][ic];
353 float x,
y,
z, xG, yG;
354 corrMap->TransformIdeal(sector,
row, cl.getPad(), cl.getTime(),
x,
y,
z, 0);
356 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);
357 (*mDBGOutCl) <<
"tpccl"
358 <<
"tf=" <<
tf <<
"sect=" << sector <<
"row=" <<
row <<
"pad=" << cl.getPad() <<
"time=" << cl.getTime() <<
"qmax=" << cl.getQmax() <<
"qtot=" << cl.getQtot()
359 <<
"sigT=" << cl.getSigmaTime() <<
"sigP=" << cl.getSigmaPad()
360 <<
"flags=" << cl.getFlags()
361 <<
"x=" <<
x <<
"y=" <<
y <<
"z=" <<
z <<
"xg=" << xG <<
"yg=" << yG
374 for (
size_t itr = 0; itr < mTPCTracksArray.size(); itr++) {
375 processTPCTrack(mTPCTracksArray[itr], mUseMC ? mTPCTrkLabels[itr] :
o2::MCCompLabel{}, mDBGOutTPC.get());
380 for (
const auto& tpcitsTrack : mITSTPCTracksArray) {
381 const auto idxTPC = tpcitsTrack.getRefTPC().getIndex();
382 const auto idxITS = tpcitsTrack.getRefITS().getIndex();
383 if (idxITS >= mITSTracksArray.size()) {
384 LOGP(fatal,
"ITS index {} out of array size {}", idxITS, mITSTracksArray.size());
386 if (idxTPC >= mTPCTracksArray.size()) {
387 LOGP(fatal,
"TPC index {} out of array size {}", idxTPC, mTPCTracksArray.size());
389 processTPCTrack(mTPCTracksArray[idxTPC], mUseMC ? mTPCTrkLabels[idxTPC] :
o2::MCCompLabel{}, mDBGOutITSTPC.get(), &mITSTracksArray[idxITS], &tpcitsTrack);
393 if (mCosmics.size() > 0) {
394 LOGP(info,
"Procssing {} cosmics", mCosmics.size());
395 processCosmics(recoData);
402 mDBGOutITSTPC.reset();
403 mDBGOutTPCTF.reset();
404 mDBGOutITSTPCTF.reset();
405 mDBGOutCosmics.reset();
425 std::array<float, 2> dca;
428 const auto ok = propagator->propagateToDCABxByBz(refPoint, propTrack, 2., o2::base::Propagator::MatCorrType::USEMatCorrLUT, &dca);
444 std::vector<int> occCl;
445 std::vector<short> clSector, clRow;
446 std::vector<float> clX, clY, clZ, clXI, clYI, clZI;
447 std::vector<tpc::ClusterNative> clNative;
449 float dcar, dcaz, dcarRef, dcazRef;
452 if (tr.hasBothSidesClusters()) {
456 bool sampleTsallis =
false;
457 bool sampleMB =
false;
458 float tsallisWeight = 0;
460 std::uniform_real_distribution<>
distr(0., 1.);
462 sampleTsallis =
true;
464 if (
distr(mGenerator) < mSamplingFactor) {
468 if (!sampleMB && !sampleTsallis) {
474 auto trackRefit = [&tr,
this](
o2::track::TrackParCov& trc,
float t,
float chi2refit,
bool outward =
false) ->
bool {
475 int retVal = mUseGPUModel ? this->mTPCRefitter->RefitTrackAsGPU(trc, tr.getClusterRef(), t, &chi2refit, outward,
true)
476 :
this->mTPCRefitter->RefitTrackAsTrackParCov(trc, tr.getClusterRef(), t, &chi2refit, outward, true);
478 LOGP(warn,
"Refit failed ({}) with time={}: track#{}[{}]",
retVal, t,
counter, trc.asString());
485 if (!trc.rotate(tr.getAlpha())) {
486 LOGP(warn,
"Rotation to original track alpha {} failed, track#{}[{}]", tr.getAlpha(),
counter, trc.asString());
489 float xtgt = this->mXRef;
494 if (!prop->PropagateToXBxByBz(trc, xtgt)) {
495 LOGP(warn,
"Propagation to X={} failed, track#{}[{}]", xtgt,
counter, trc.asString());
502 auto prepClus = [
this, &tr, &clData](
float t) {
503 int count = tr.getNClusters();
504 const auto* corrMap = this->mTPCCorrMapsLoader.getCorrMap();
506 for (
int ic =
count; ic--;) {
508 uint32_t clusterIndex;
509 o2::tpc::TrackTPC::getClusterReference(mTPCTrackClusIdx, ic, sector,
row, clusterIndex, tr.getClusterRef());
510 unsigned int absoluteIndex = mTPCClusterIdxStruct->
clusterOffset[sector][
row] + clusterIndex;
511 cl = &mTPCClusterIdxStruct->
clusters[sector][
row][clusterIndex];
512 uint8_t clflags = cl->getFlags();
516 clData.clSector.emplace_back(sector);
517 clData.clRow.emplace_back(
row);
518 auto& clCopy = clData.clNative.emplace_back(*cl);
519 clCopy.setFlags(clflags);
523 corrMap->TransformIdeal(sector,
row, cl->getPad(), cl->getTime(),
x,
y,
z, t);
524 clData.clXI.emplace_back(
x);
525 clData.clYI.emplace_back(
y);
526 clData.clZI.emplace_back(
z);
529 mTPCCorrMapsLoader.Transform(sector,
row, cl->getPad(), cl->getTime(),
x,
y,
z, t);
530 clData.clX.emplace_back(
x);
531 clData.clY.emplace_back(
y);
532 clData.clZ.emplace_back(
z);
535 const auto tpcTime = cl->getTime() + mTimeBinsPerDrift;
536 const uint32_t clOccPosTPC =
static_cast<uint32_t
>(tpcTime * mOccupancyBinsPerTF / mTimeBinsPerTF);
537 clData.occCl.emplace_back((clOccPosTPC < mClusterOccupancy.size()) ? mClusterOccupancy[clOccPosTPC] : -1);
543 auto trf = tr.getOuterParam();
545 float time0 = tr.getTime0();
546 if (time0custom > 0) {
550 if (!trackRefit(trf, time0, chi2refit) || !trackProp(trf)) {
556 if (!trackProp(tr)) {
560 if (mWriteTrackClusters) {
565 dcar = dcaz = dcarRef = dcazRef = 9999.f;
566 if ((trf.getPt() > mDCAMinPt) && (tr.getNClusters() > mDCAMinNCl)) {
567 getDCAs(trf, dcarRef, dcazRef);
577 <<
"tfCounter=" << mTFCount
584 <<
"chi2refit=" << chi2refit;
589 <<
"tsallisWeight=" << tsallisWeight
591 <<
"sampleMB=" << sampleMB;
594 if (mWriteTrackClusters) {
596 <<
"clSector=" << clData.clSector
597 <<
"clRow=" << clData.clRow;
599 if ((mWriteTrackClusters & 0x1) == 0x1) {
601 <<
"cl=" << clData.clNative;
604 if ((mWriteTrackClusters & 0x2) == 0x2) {
606 <<
"clX=" << clData.clX
607 <<
"clY=" << clData.clY
608 <<
"clZ=" << clData.clZ;
611 if ((mWriteTrackClusters & 0x4) == 0x4) {
613 <<
"clXI=" << clData.clXI
614 <<
"clYI=" << clData.clYI
615 <<
"clZI=" << clData.clZI;
618 if ((mWriteTrackClusters & 0x8) == 0x8) {
620 <<
"clOcc=" << clData.occCl;
630 <<
"itstpc=" << *itstpc;
637 <<
"dcarRef=" << dcarRef
638 <<
"dcazRef=" << dcazRef;
643 <<
"mcLabel=" << lbl;
659 float bcTB =
bc / 8. + mTPCTBBias;
663 TParticlePDG* pPDG = TDatabasePDG::Instance()->GetParticle(mcTrack->
GetPdgCode());
670 if (!mctrO2.rotate(tr.getAlpha()) || !prop->PropagateToXBxByBz(mctrO2, tr.getX())) {
675 auto trfm = tr.getOuterParam();
678 if (!trackRefit(trfm, bcTB, chi2refit) || !trfm.rotate(tr.getAlpha()) || !prop->PropagateToXBxByBz(trfm, tr.getX())) {
679 LOGP(warn,
"Failed to propagate MC-time refitted track#{} [{}] to X/alpha of original track [{}]",
counter, trfm.asString(), tr.asString());
683 dz = (tr.getTime0() - bcTB) * mVdriftTB;
684 if (tr.hasCSideClustersOnly()) {
690 (*streamer) <<
"tpcMC"
692 <<
"movTrackRef=" << trfm
693 <<
"mcTrack=" << mctrO2
694 <<
"imposedTB=" << bcTB
695 <<
"chi2refit=" << chi2refit
697 <<
"clX=" << clData.clX
698 <<
"clY=" << clData.clY
699 <<
"clZ=" << clData.clZ
713 const auto invBinWidth = 1.f /
par.ZbinWidth;
715 for (
const auto& cosmic : mCosmics) {
717 const auto& gidtop = cosmic.getRefTop();
718 const auto& gidbot = cosmic.getRefBottom();
723 const auto trackTime = cosmic.getTimeMUS().getTimeStamp() * invBinWidth;
727 for (
const auto& comsmicInfo : contributorsGID) {
730 if (tpcGlobal.isIndexSet() && tofGlobal.isIndexSet()) {
731 const auto itrTPC = tpcGlobal.getIndex();
732 const auto itrTOF = tofGlobal.getIndex();
733 const auto& tofCl = tof[itrTOF];
734 const auto tofTime = tofCl.getTime() * 1e-6 * invBinWidth;
735 const auto tofTimeRaw = tofCl.getTimeRaw() * 1e-6 * invBinWidth;
736 const auto& trackTPC = mTPCTracksArray[itrTPC];
738 processTPCTrack(trackTPC, mUseMC ? mTPCTrkLabels[itrTPC] :
o2::
MCCompLabel{}, mDBGOutCosmics.
get(), nullptr, nullptr, false, tofTime);
746 std::vector<OutputSpec> outputs;
748 {
"target-x", VariantType::Float, 83.f, {
"Try to propagate to this radius"}},
749 {
"dump-clusters", VariantType::Bool,
false, {
"dump all clusters"}},
750 {
"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"}},
751 {
"tf-start", VariantType::Int, 0, {
"1st TF to process"}},
752 {
"tf-end", VariantType::Int, 999999999, {
"last TF to process"}},
753 {
"use-gpu-fitter", VariantType::Bool,
false, {
"use GPU track model for refit instead of TrackParCov"}},
754 {
"do-refit", VariantType::Bool,
false, {
"do refitting of TPC track"}},
755 {
"use-r-as-x", VariantType::Bool,
false, {
"Use radius instead of target sector X"}},
756 {
"enable-dcas", VariantType::Bool,
false, {
"Propagate to DCA and add it to the tree"}},
757 {
"dcaMinPt", VariantType::Float, 1.f, {
"Min pT of tracks propagated to DCA"}},
758 {
"dcaMinNCl", VariantType::Int, 80, {
"Min number of clusters for tracks propagated to DCA"}},
759 {
"sqrts", VariantType::Float, 13600.f, {
"Centre of mass energy used for downsampling"}},
760 {
"do-sampling", VariantType::Bool,
false, {
"Perform sampling, min. bias and on Tsallis function, using 'sampling-factor'"}},
761 {
"sampling-factor", VariantType::Float, 0.1f, {
"Sampling factor in case sample-unbinned-tsallis is used"}},
762 {
"study-type", VariantType::Int, 1, {
"Bitmask of study type: 0x1 = TPC only, 0x2 = TPC + ITS, 0x4 = Cosmics"}},
763 {
"writer-type", VariantType::Int, 1, {
"Bitmask of writer type: 0x1 = per track streamer, 0x2 = per TF vectors"}},
764 {
"occupancy-bins-per-drift", VariantType::UInt32, 31u, {
"number of bin for occupancy histogram per drift time (500tb)"}},
766 auto dataRequest = std::make_shared<DataRequest>();
768 dataRequest->requestTracks(srcTracks, useMC);
769 dataRequest->requestClusters(srcClusters, useMC);
770 if (requestCosmics) {
771 dataRequest->requestCoscmicTracks(useMC);
773 auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(
false,
788 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