13#include <TStopwatch.h>
55 : mDataRequest(dr), mGGCCDBRequest(gr), mTracksSrc(
src), mUseMC(useMC) {}
61 void process(
o2::globaltracking::RecoContainer& recoData);
66 std::shared_ptr<
o2::base::GRPGeomRequest> mGGCCDBRequest;
68 std::unique_ptr<o2::utils::TreeStreamRedirector> mDBGOut;
71 std::vector<long> mGlobalBC;
75 float mITSROFrameLengthMUS = 0;
76 float mMFTROFrameLengthMUS = 0;
77 float mMaxTPCDriftTimeMUS = 0;
78 float mTPCTDriftOffset = 0.f;
79 float mTPCBin2MUS = 0;
85 mDBGOut = std::make_unique<o2::utils::TreeStreamRedirector>(
"trackStudy.root",
"recreate");
88 mVerbose = ic.
options().
get<
int>(
"dump-verbosity");
89 auto bcstr = ic.
options().
get<std::string>(
"sel-bc");
92 LOG(error) <<
"empty BC list is provided " << bcstr;
94 for (
auto& bcs : bctok) {
96 long bcglo = std::stol(bcs);
97 mGlobalBC.push_back(bcglo);
98 LOGP(info,
"adding {} to global BCs to dump", bcglo);
100 LOGP(fatal,
"failed to extract global BC from {}", bcstr);
109 updateTimeDependentParams(pc);
117 static bool initOnceDone =
false;
125 LOGP(info,
"VertexTrackMatcher ITSROFrameLengthMUS:{} MFTROFrameLengthMUS:{}", mITSROFrameLengthMUS, mMFTROFrameLengthMUS);
132 mTPCBin2MUS = elParam.ZbinWidth;
134 mMaxTPCDriftTimeMUS = detParam.TPClength / (vd.refVDrift * vd.corrFact);
135 mTPCTDriftOffset = vd.getTimeOffset();
141 std::vector<TBracket> selBCTF;
145 LOGP(info,
"TF dump for {}:{}", irMin.asString(), irMax.asString());
147 for (
const auto&
bc : mGlobalBC) {
148 if (
bc >= irMin.toLong() &&
bc < irMax.toLong()) {
151 LOGP(info,
"Selected BC {}({}) -> {}({}) : {}({}) mus",
bc, bcir.
asString(),
152 t - tBCErr, (bcir - mBCToler).asString(),
153 t + tBCErr, (bcir + mBCToler).asString());
154 selBCTF.emplace_back(t - tBCErr, t + tBCErr);
157 if (selBCTF.empty()) {
158 LOGP(info,
"No selections for {}:{}", irMin.asString(), irMax.asString());
170 auto creator = [
this, &selBCTF, itsBias, mftBias, &recoData, &prevSrc](
auto& _tr,
GTrackID _origID,
float t0,
float terr) {
172 if constexpr (isTPCTrack<decltype(_tr)>()) {
174 t0 *= this->mTPCBin2MUS;
175 t0 -= this->mTPCTDriftOffset;
176 terr *= this->mTPCBin2MUS;
177 }
else if constexpr (isITSTrack<decltype(_tr)>()) {
179 terr *= this->mITSROFrameLengthMUS;
180 }
else if constexpr (isMFTTrack<decltype(_tr)>()) {
182 terr *= this->mMFTROFrameLengthMUS;
183 }
else if constexpr (!(isMCHTrack<decltype(_tr)>() || isGlobalFwdTrack<decltype(_tr)>())) {
185 terr *= PVParams.nSigmaTimeTrack;
188 terr += PVParams.timeMarginTrackTime;
190 for (
const auto& stb : selBCTF) {
191 if (tb.isOutside(stb)) {
196 if (prevSrc != curSrc) {
202 if constexpr (isGlobalFwdTrack<decltype(_tr)>() || isMFTTrack<decltype(_tr)>() || isMCHTrack<decltype(_tr)>() || isMIDTrack<decltype(_tr)>()) {
203 outs = fmt::format(
"{:>15} {:8.3f}/{:5.3f} -> ", _origID.asString(),
t0, terr);
205 outs = fmt::format(
"{:>15} {:8.3f}/{:5.3f} |{}| -> ", _origID.asString(),
t0, terr, ((
o2::track::TrackPar)_tr).asString());
210 for (
auto r : refs) {
211 if (
r.isSourceSet()) {
212 outs += fmt::format(
" {}",
r.asString());
223 for (
const auto& pv : pvvec) {
224 TBracket pbv{pv.getIRMin().differenceInBCMUS(irMin), pv.getIRMax().differenceInBCMUS(irMin)};
225 for (
const auto& stb : selBCTF) {
226 if (!stb.isOutside(pbv)) {
227 LOG(info) <<
"#" << pvcnt <<
" " << pv;
228 LOG(info) <<
"References: " << vtxRefs[pvcnt];
230 int ncontrib = 0, nambig = 0;
231 int idMin = vtxRefs[pvcnt].getFirstEntryOfSource(is), idMax = idMin + vtxRefs[pvcnt].getEntriesOfSource(is);
232 for (
int i = idMin;
i < idMax;
i++) {
233 if (trackIndex[
i].isPVContributor()) {
235 }
else if (trackIndex[
i].isAmbiguous()) {
239 if (vtxRefs[pvcnt].getEntriesOfSource(is)) {
240 LOGP(info,
"{} : total attached: {}, contributors: {}, ambiguous: {}",
VTIndex::getSourceName(is), vtxRefs[pvcnt].getEntriesOfSource(is), ncontrib, nambig);
247 for (
int i = idMin;
i < idMax;
i++) {
248 if (mVerbose > 2 || trackIndex[
i].isPVContributor()) {
249 trIDs += trackIndex[
i].asString() +
" ";
250 if (!((++cntT) % 15)) {
256 if (!trIDs.empty()) {
280 LOG(info) <<
"ITS Alpide param updated";
282 par.printKeyValues();
286 LOG(info) <<
"MFT Alpide param updated";
288 par.printKeyValues();
295 std::vector<OutputSpec> outputs;
296 auto dataRequest = std::make_shared<DataRequest>();
298 dataRequest->requestTracks(srcTracks, useMC);
299 dataRequest->requestClusters(srcClusters, useMC);
300 dataRequest->requestPrimaryVertices(useMC);
301 auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(
false,
315 AlgorithmSpec{adaptFromTask<DumpTracksSpec>(dataRequest, ggRequest, srcTracks, useMC)},
317 {
"sel-bc", VariantType::String,
"", {
"Dump tracks compatible with global BC list"}},
318 {
"bc-margin", VariantType::Int, 0, {
"Apply margin in BC to selected global BCs list"}},
319 {
"dump-verbosity", VariantType::Int, 0, {
"Dump verbosity level"}}}};
Helper for geometry and GRP related CCDB requests.
Global index for barrel track: provides provenance (detectors combination), index in respective array...
Definition of the Names Generator class.
Definition of the parameter class for the detector.
Definition of the parameter class for the detector electronics.
Wrapper container for different reconstructed object types.
Result of refitting TPC-ITS matched track.
Helper class to extract VDrift from different sources.
Referenc on track indices contributing to the vertex, with possibility chose tracks from specific sou...
void checkUpdates(o2::framework::ProcessingContext &pc)
static int getNHBFPerTF()
static GRPGeomHelper & instance()
void setRequest(std::shared_ptr< GRPGeomRequest > req)
static const DPLAlpideParam< N > & Instance()
Static class with identifiers, bitmasks and names for ALICE detectors.
T get(const char *key) const
ConfigParamRegistry const & options()
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)
void init(InitContext &ic) final
void finaliseCCDB(ConcreteDataMatcher &matcher, void *obj) final
~DumpTracksSpec() final=default
void process(o2::globaltracking::RecoContainer &recoData)
void run(ProcessingContext &pc) final
DumpTracksSpec(std::shared_ptr< DataRequest > dr, std::shared_ptr< o2::base::GRPGeomRequest > gr, GTrackID::mask_t src, bool useMC)
void endOfStream(EndOfStreamContext &ec) final
This is invoked whenever we have an EndOfStream event.
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t0
constexpr double LHCBunchSpacingMUS
constexpr int LHCMaxBunches
constexpr double LHCBunchSpacingNS
Defining PrimaryVertex explicitly as messageable.
std::vector< ConfigParamSpec > Options
detail::Bracket< float > Bracketf_t
o2::framework::DataProcessorSpec getDumpTracksSpec(o2::dataformats::GlobalTrackID::mask_t srcTracks, o2::dataformats::GlobalTrackID::mask_t srcClus, bool useMC)
create a processor spec
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
Defining DataPointCompositeObject explicitly as copiable.
std::string asString() const
o2::InteractionRecord startIR
GlobalIDSet getSingleDetectorRefs(GTrackID gidx) const
auto getPrimaryVertices() const
auto getPrimaryVertexMatchedTracks() const
void createTracksVariadic(T creator, GTrackID::mask_t srcSel=GTrackID::getSourcesMask("all")) const
auto getPrimaryVertexMatchedTrackRefs() const
void collectData(o2::framework::ProcessingContext &pc, const DataRequest &request)
static std::vector< std::string > tokenize(const std::string &src, char delim, bool trimToken=true, bool skipEmpty=true)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"