14#include <TStopwatch.h>
67 : mDataRequest(dr), mGGCCDBRequest(gr), mTracksSrc(
src), mUseMC(useMC)
77 void process(
o2::globaltracking::RecoContainer& recoData);
78 bool getDCAs(const
o2::track::TrackPar& track,
float& dcar,
float& dcaz);
83 std::shared_ptr<
o2::base::GRPGeomRequest> mGGCCDBRequest;
84 o2::tpc::VDriftHelper mTPCVDriftHelper{};
87 bool mUseGPUModel{
false};
91 int mTFEnd = 999999999;
97 float mSamplingFactor{0.1};
99 bool mEnableDCA =
false;
100 int mWriteTrackClusters = 0;
101 bool mDoSampling{
false};
103 std::vector<size_t> mClusterOccupancy;
104 std::vector<size_t> mITSTPCTrackOccupanyTPCTime;
105 std::vector<size_t> mITSTPCTrackOccupanyCombinedTime;
106 std::unique_ptr<o2::utils::TreeStreamRedirector> mDBGOutTPC;
107 std::unique_ptr<o2::utils::TreeStreamRedirector> mDBGOutITSTPC;
108 std::unique_ptr<o2::utils::TreeStreamRedirector> mDBGOutTPCTF;
109 std::unique_ptr<o2::utils::TreeStreamRedirector> mDBGOutITSTPCTF;
110 std::unique_ptr<o2::utils::TreeStreamRedirector> mDBGOutCosmics;
111 std::unique_ptr<o2::utils::TreeStreamRedirector> mDBGOutCl;
112 float mITSROFrameLengthMUS = 0.;
115 std::mt19937 mGenerator;
118 uint32_t mTimeBinsPerTF{};
119 uint32_t mOccupancyBinsPerTF{};
120 uint32_t mTimeBinsPerDrift{500};
124 gsl::span<const o2::tpc::TPCClRefElem> mTPCTrackClusIdx;
125 gsl::span<const o2::tpc::TrackTPC> mTPCTracksArray;
126 gsl::span<const o2::dataformats::TrackTPCITS> mITSTPCTracksArray;
127 gsl::span<const o2::its::TrackITS> mITSTracksArray;
128 gsl::span<const o2::dataformats::TrackCosmics> mCosmics;
129 gsl::span<const unsigned char> mTPCRefitterShMap;
130 gsl::span<const unsigned int> mTPCRefitterOccMap;
132 gsl::span<const o2::MCCompLabel> mTPCTrkLabels;
133 std::unique_ptr<o2::gpu::GPUO2InterfaceRefit> mTPCRefitter;
134 std::vector<o2::InteractionTimeRecord> mIntRecs;
146 mEnableDCA = ic.
options().
get<
bool>(
"enable-dcas");
147 mUseGPUModel = ic.
options().
get<
bool>(
"use-gpu-fitter");
150 mDCAMinPt = ic.
options().
get<
float>(
"dcaMinPt");
151 mDCAMinNCl = ic.
options().
get<
float>(
"dcaMinNCl");
153 mSamplingFactor = ic.
options().
get<
float>(
"sampling-factor");
154 mDoSampling = ic.
options().
get<
bool>(
"do-sampling");
155 mDoRefit = ic.
options().
get<
bool>(
"do-refit");
156 mStudyType = ic.
options().
get<
int>(
"study-type");
157 mWriterType = ic.
options().
get<
int>(
"writer-type");
158 mWriteTrackClusters = ic.
options().
get<
int>(
"write-track-clusters");
159 const auto occBinsPerDrift = ic.
options().
get<uint32_t>(
"occupancy-bins-per-drift");
161 mOccupancyBinsPerTF =
static_cast<uint32_t
>(std::ceil(
float(mTimeBinsPerTF * occBinsPerDrift) / mTimeBinsPerDrift));
162 mClusterOccupancy.resize(mOccupancyBinsPerTF);
163 mITSTPCTrackOccupanyTPCTime.resize(mOccupancyBinsPerTF);
164 mITSTPCTrackOccupanyCombinedTime.resize(mOccupancyBinsPerTF);
165 LOGP(info,
"Using {} bins for the occupancy per TF", mOccupancyBinsPerTF);
169 mDBGOutTPC = std::make_unique<o2::utils::TreeStreamRedirector>(
"tpctracks-study-streamer.root",
"recreate");
172 mDBGOutITSTPC = std::make_unique<o2::utils::TreeStreamRedirector>(
"itstpctracks-study-streamer.root",
"recreate");
175 mDBGOutCosmics = std::make_unique<o2::utils::TreeStreamRedirector>(
"cosmics-study-streamer.root",
"recreate");
178 if (ic.
options().
get<
bool>(
"dump-clusters")) {
179 mDBGOutCl = std::make_unique<o2::utils::TreeStreamRedirector>(
"tpc-trackStudy-cl.root",
"recreate");
185 mGenerator = std::mt19937(std::random_device{}());
186 mTPCCorrMapsLoader.
init(ic);
192 if (mTFCount < mTFStart || mTFCount > mTFEnd) {
193 LOGP(info,
"Skipping TF {}", mTFCount);
199 updateTimeDependentParams(pc);
200 fillOccupancyVectors(recoData);
203 if (mTFCount >= mTFEnd) {
204 LOGP(info,
"Stopping processing after TF {}", mTFCount);
215 static bool initOnceDone =
false;
221 bool updateMaps =
false;
227 LOGP(info,
"Updating TPC fast transform map with new VDrift factor of {} wrt reference {} and DriftTimeOffset correction {} wrt {} from source {}",
242 std::fill(mClusterOccupancy.begin(), mClusterOccupancy.end(), 0u);
243 std::fill(mITSTPCTrackOccupanyTPCTime.begin(), mITSTPCTrackOccupanyTPCTime.end(), 0u);
244 std::fill(mITSTPCTrackOccupanyCombinedTime.begin(), mITSTPCTrackOccupanyCombinedTime.end(), 0u);
249 for (
int sector = 0; sector <
MAXSECTOR; ++sector) {
251 for (
size_t icl = 0; icl < clusterIndex.nClusters[sector][
padrow]; ++icl) {
252 const auto& cl = clusterIndex.clusters[sector][
padrow][icl];
254 const auto tpcTime = cl.getTime() + mTimeBinsPerDrift;
255 const uint32_t clOccPos =
static_cast<uint32_t
>(tpcTime * mOccupancyBinsPerTF / mTimeBinsPerTF);
256 if (clOccPos >= mOccupancyBinsPerTF) {
257 LOGP(error,
"cluster with time {} outside TPC acceptanc", cl.getTime());
259 ++mClusterOccupancy[clOccPos];
270 for (
const auto& tpcitsTrack : itstpcTracks) {
271 const auto idxTPC = tpcitsTrack.getRefTPC().getIndex();
272 if (idxTPC >= tpcTracks.size()) {
273 LOGP(fatal,
"TPC index {} out of array size {}", idxTPC, tpcTracks.size());
275 const auto& tpcTrack = tpcTracks[idxTPC];
277 const auto tpcTime = tpcTrack.getTime0() + mTimeBinsPerDrift;
279 const uint32_t clOccPosTPC =
static_cast<uint32_t
>(tpcTime * mOccupancyBinsPerTF / mTimeBinsPerTF);
280 if (clOccPosTPC < mITSTPCTrackOccupanyTPCTime.size()) {
281 ++mITSTPCTrackOccupanyTPCTime[clOccPosTPC];
283 LOGP(warn,
"TF {}: TPC occupancy index {} out of range {}", mTFCount, clOccPosTPC, mITSTPCTrackOccupanyTPCTime.size());
288 const auto tpcitsTime = tpcitsTrack.getTimeMUS().getTimeStamp() / paramEle.ZbinWidth + mTimeBinsPerDrift;
289 if (tpcitsTime > 0) {
290 const uint32_t clOccPosITSTPC =
static_cast<uint32_t
>(tpcitsTime * mOccupancyBinsPerTF / mTimeBinsPerTF);
291 if (clOccPosITSTPC < mITSTPCTrackOccupanyCombinedTime.size()) {
292 ++mITSTPCTrackOccupanyCombinedTime[clOccPosITSTPC];
299 *streamer <<
"occupancy"
300 <<
"tfCounter=" << mTFCount
301 <<
"clusterOcc=" << mClusterOccupancy
302 <<
"tpcTrackTimeOcc=" << mITSTPCTrackOccupanyTPCTime
303 <<
"itstpcTrackTimeOcc=" << mITSTPCTrackOccupanyCombinedTime
308 fillDebug(mDBGOutTPC.get());
309 fillDebug(mDBGOutITSTPC.get());
326 LOGP(info,
"Processing TF {} with {} its, {} tpc, {} its-tpc tracks and {} comsmics", mTFCount, mITSTracksArray.size(), mTPCTracksArray.size(), mITSTPCTracksArray.size(), mCosmics.size());
330 throw std::invalid_argument(
"initialization of MCKinematicsReader failed");
337 mTPCRefitter = std::make_unique<o2::gpu::GPUO2InterfaceRefit>(mTPCClusterIdxStruct, &mTPCCorrMapsLoader, prop->getNominalBz(), mTPCTrackClusIdx.data(), 0, mTPCRefitterShMap.data(), mTPCRefitterOccMap.data(), mTPCRefitterOccMap.size(),
nullptr, prop);
338 mTPCRefitter->setTrackReferenceX(900);
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();
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)
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)
recalculate inverse correction
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
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
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