diff --git a/EventVisualisation/Workflow/include/EveWorkflow/EveWorkflowHelper.h b/EventVisualisation/Workflow/include/EveWorkflow/EveWorkflowHelper.h index 1c3a50d6a7131..1d89ff30777c6 100644 --- a/EventVisualisation/Workflow/include/EveWorkflow/EveWorkflowHelper.h +++ b/EventVisualisation/Workflow/include/EveWorkflow/EveWorkflowHelper.h @@ -136,7 +136,7 @@ class EveWorkflowHelper using Bracket = o2::math_utils::Bracketf_t; - EveWorkflowHelper(const FilterSet& enabledFilters = {}, std::size_t maxNTracks = -1, const Bracket& timeBracket = {}, const Bracket& etaBracket = {}, bool primaryVertexMode = false); + EveWorkflowHelper(const FilterSet& enabledFilters = {}, std::size_t maxNTracks = -1, const Bracket& timeBracket = {}, const Bracket& etaBracket = {}, bool primaryVertexMode = false, float mftPropagationZMin = -39.f, float mftPropagationZMax = -86.f); static std::vector getTrackPoints(const o2::track::TrackPar& trc, float minR, float maxR, float maxStep, float minZ = -25000, float maxZ = 25000); void selectTracks(const CalibObjectsConst* calib, GID::mask_t maskCl, GID::mask_t maskTrk, GID::mask_t maskMatch); void selectTowers(); @@ -202,6 +202,8 @@ class EveWorkflowHelper Bracket mTimeBracket; Bracket mEtaBracket; bool mPrimaryVertexMode; + float mMFTPropagationZMin; + float mMFTPropagationZMax; const o2::globaltracking::RecoContainer* mRecoCont = nullptr; const o2::globaltracking::RecoContainer* getRecoContainer() const { return mRecoCont; } void setRecoContainer(const o2::globaltracking::RecoContainer* rc) { mRecoCont = rc; } diff --git a/EventVisualisation/Workflow/include/EveWorkflow/O2DPLDisplay.h b/EventVisualisation/Workflow/include/EveWorkflow/O2DPLDisplay.h index f89e5b7fed529..d00ebf5e6d71a 100644 --- a/EventVisualisation/Workflow/include/EveWorkflow/O2DPLDisplay.h +++ b/EventVisualisation/Workflow/include/EveWorkflow/O2DPLDisplay.h @@ -58,8 +58,8 @@ class O2DPLDisplaySpec : public o2::framework::Task std::chrono::milliseconds timeInterval, int numberOfFiles, int numberOfTracks, bool eveHostNameMatch, int minITSTracks, int minTracks, bool filterITSROF, bool filterTime, const EveWorkflowHelper::Bracket& timeBracket, bool removeTPCEta, - const EveWorkflowHelper::Bracket& etaBracket, bool trackSorting, int onlyNthEvent, bool primaryVertex, int maxPrimaryVertices, bool primaryVertexTriggers) - : mUseMC(useMC), mTrkMask(trkMask), mClMask(clMask), mDataRequest(dataRequest), mGGCCDBRequest(gr), mJsonPath(jsonPath), mExt(ext), mTimeInterval(timeInterval), mNumberOfFiles(numberOfFiles), mNumberOfTracks(numberOfTracks), mEveHostNameMatch(eveHostNameMatch), mMinITSTracks(minITSTracks), mMinTracks(minTracks), mFilterITSROF(filterITSROF), mFilterTime(filterTime), mTimeBracket(timeBracket), mRemoveTPCEta(removeTPCEta), mEtaBracket(etaBracket), mTrackSorting(trackSorting), mOnlyNthEvent(onlyNthEvent), mPrimaryVertexMode(primaryVertex), mMaxPrimaryVertices(maxPrimaryVertices), mPrimaryVertexTriggers(primaryVertexTriggers) + const EveWorkflowHelper::Bracket& etaBracket, bool trackSorting, int onlyNthEvent, bool primaryVertex, int maxPrimaryVertices, bool primaryVertexTriggers, float mftPropagationZMin, float mftPropagationZMax) + : mUseMC(useMC), mTrkMask(trkMask), mClMask(clMask), mDataRequest(dataRequest), mGGCCDBRequest(gr), mJsonPath(jsonPath), mExt(ext), mTimeInterval(timeInterval), mNumberOfFiles(numberOfFiles), mNumberOfTracks(numberOfTracks), mEveHostNameMatch(eveHostNameMatch), mMinITSTracks(minITSTracks), mMinTracks(minTracks), mFilterITSROF(filterITSROF), mFilterTime(filterTime), mTimeBracket(timeBracket), mRemoveTPCEta(removeTPCEta), mEtaBracket(etaBracket), mTrackSorting(trackSorting), mOnlyNthEvent(onlyNthEvent), mPrimaryVertexMode(primaryVertex), mMaxPrimaryVertices(maxPrimaryVertices), mPrimaryVertexTriggers(primaryVertexTriggers), mMFTPropagationZMin(mftPropagationZMin), mMFTPropagationZMax(mftPropagationZMax) { this->mTimeStamp = std::chrono::high_resolution_clock::now() - timeInterval; // first run meets condition @@ -92,6 +92,8 @@ class O2DPLDisplaySpec : public o2::framework::Task int mOnlyNthEvent; // process only every nth event. int mMaxPrimaryVertices; // max number of primary vertices to draw per time frame bool mPrimaryVertexTriggers; // instead of drawing vertices with tracks (and maybe calorimeter triggers), draw vertices with calorimeter triggers (and maybe tracks) + float mMFTPropagationZMin; // Minimum z position for propagating MFT tracks + float mMFTPropagationZMax; // Maximum z position for propagating MFT tracks int mEventCounter = 0; std::chrono::time_point mTimeStamp; diff --git a/EventVisualisation/Workflow/src/EveWorkflowHelper.cxx b/EventVisualisation/Workflow/src/EveWorkflowHelper.cxx index c43b8f47c22fc..e233e8b24bf28 100644 --- a/EventVisualisation/Workflow/src/EveWorkflowHelper.cxx +++ b/EventVisualisation/Workflow/src/EveWorkflowHelper.cxx @@ -781,7 +781,7 @@ void EveWorkflowHelper::drawAODFwd(AODForwardTrack const& track, float trackTime void EveWorkflowHelper::drawMFTTrack(o2::track::TrackParFwd tr, float trackTime) { - tr.propagateParamToZlinear(mftZPositions.front()); // Fix the track starting position. + tr.propagateParamToZlinear(mMFTPropagationZMin); // Fix the track starting position. auto vTrack = mEvent.addTrack({.time = static_cast(trackTime), .charge = (int)tr.getCharge(), @@ -793,10 +793,16 @@ void EveWorkflowHelper::drawMFTTrack(o2::track::TrackParFwd tr, float trackTime) .gid = GID::getSourceName(GID::MFT), .source = GID::MFT}); + tr.propagateParamToZlinear(mMFTPropagationZMin); + vTrack->addPolyPoint((float)tr.getX(), (float)tr.getY(), (float)tr.getZ()); + for (auto zPos : mftZPositions) { tr.propagateParamToZlinear(zPos); vTrack->addPolyPoint((float)tr.getX(), (float)tr.getY(), (float)tr.getZ()); } + + tr.propagateParamToZlinear(mMFTPropagationZMax); + vTrack->addPolyPoint((float)tr.getX(), (float)tr.getY(), (float)tr.getZ()); } void EveWorkflowHelper::drawForwardTrack(mch::TrackParam track, const std::string& gidString, GID::Source source, float startZ, float endZ, float trackTime) @@ -1029,7 +1035,7 @@ void EveWorkflowHelper::drawTRDClusters(const o2::trd::TrackTRD& tpcTrdTrack, fl } } -EveWorkflowHelper::EveWorkflowHelper(const FilterSet& enabledFilters, std::size_t maxNTracks, const Bracket& timeBracket, const Bracket& etaBracket, bool primaryVertexMode) : mEnabledFilters(enabledFilters), mMaxNTracks(maxNTracks), mTimeBracket(timeBracket), mEtaBracket(etaBracket), mPrimaryVertexMode(primaryVertexMode) +EveWorkflowHelper::EveWorkflowHelper(const FilterSet& enabledFilters, std::size_t maxNTracks, const Bracket& timeBracket, const Bracket& etaBracket, bool primaryVertexMode, float mftPropagationZMin, float mftPropagationZMax) : mEnabledFilters(enabledFilters), mMaxNTracks(maxNTracks), mTimeBracket(timeBracket), mEtaBracket(etaBracket), mPrimaryVertexMode(primaryVertexMode), mMFTPropagationZMin(mftPropagationZMin), mMFTPropagationZMax(mftPropagationZMax) { o2::mch::TrackExtrap::setField(); this->mMFTGeom = o2::mft::GeometryTGeo::Instance(); diff --git a/EventVisualisation/Workflow/src/O2DPLDisplay.cxx b/EventVisualisation/Workflow/src/O2DPLDisplay.cxx index 0cd513b32303a..b8372be3fcf40 100644 --- a/EventVisualisation/Workflow/src/O2DPLDisplay.cxx +++ b/EventVisualisation/Workflow/src/O2DPLDisplay.cxx @@ -73,7 +73,9 @@ void customize(std::vector& workflowOptions) {"only-nth-event", VariantType::Int, 0, {"process only every nth event"}}, {"primary-vertex-mode", VariantType::Bool, false, {"produce jsons with individual primary vertices, not total time frame data"}}, {"max-primary-vertices", VariantType::Int, 5, {"maximum number of primary vertices to draw per time frame"}}, - {"primary-vertex-triggers", VariantType::Bool, false, {"instead of drawing vertices with tracks (and maybe calorimeter triggers), draw vertices with calorimeter triggers (and maybe tracks)"}}}; + {"primary-vertex-triggers", VariantType::Bool, false, {"instead of drawing vertices with tracks (and maybe calorimeter triggers), draw vertices with calorimeter triggers (and maybe tracks)"}}, + {"mft-propagation-z-min", VariantType::Float, -39.f, {"Set minimum z position for propagating MFT tracks"}}, + {"mft-propagation-z-max", VariantType::Float, -86.f, {"Set maximum z position for propagating MFT tracks"}}}; o2::raw::HBFUtilsInitializer::addConfigOption(options); std::swap(workflowOptions, options); } @@ -112,8 +114,7 @@ void O2DPLDisplaySpec::run(ProcessingContext& pc) enabledFilters.set(EveWorkflowHelper::Filter::TimeBracket, this->mFilterTime); enabledFilters.set(EveWorkflowHelper::Filter::EtaBracket, this->mRemoveTPCEta); enabledFilters.set(EveWorkflowHelper::Filter::TotalNTracks, this->mNumberOfTracks != -1); - - EveWorkflowHelper helper(enabledFilters, this->mNumberOfTracks, this->mTimeBracket, this->mEtaBracket, this->mPrimaryVertexMode); + EveWorkflowHelper helper(enabledFilters, this->mNumberOfTracks, this->mTimeBracket, this->mEtaBracket, this->mPrimaryVertexMode, this->mMFTPropagationZMin, this->mMFTPropagationZMax); helper.setRecoContainer(&recoCont); helper.setITSROFs(); @@ -337,6 +338,8 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) auto onlyNthEvent = cfgc.options().get("only-nth-event"); auto tracksSorting = cfgc.options().get("track-sorting"); auto primaryVertexTriggers = cfgc.options().get("primary-vertex-triggers"); + auto mftPropagationZMin = cfgc.options().get("mft-propagation-z-min"); + auto mftPropagationZMax = cfgc.options().get("mft-propagation-z-max"); if (numberOfTracks == -1) { tracksSorting = false; // do not sort if all tracks are allowed @@ -354,7 +357,7 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) "o2-eve-export", dataRequest->inputs, {}, - AlgorithmSpec{adaptFromTask(useMC, srcTrk, srcCl, dataRequest, ggRequest, jsonFolder, ext, timeInterval, numberOfFiles, numberOfTracks, eveHostNameMatch, minITSTracks, minTracks, filterITSROF, filterTime, timeBracket, removeTPCEta, etaBracket, tracksSorting, onlyNthEvent, primaryVertexMode, maxPrimaryVertices, primaryVertexTriggers)}}); + AlgorithmSpec{adaptFromTask(useMC, srcTrk, srcCl, dataRequest, ggRequest, jsonFolder, ext, timeInterval, numberOfFiles, numberOfTracks, eveHostNameMatch, minITSTracks, minTracks, filterITSROF, filterTime, timeBracket, removeTPCEta, etaBracket, tracksSorting, onlyNthEvent, primaryVertexMode, maxPrimaryVertices, primaryVertexTriggers, mftPropagationZMin, mftPropagationZMax)}}); // configure dpl timer to inject correct firstTForbit: start from the 1st orbit of TF containing 1st sampled orbit o2::raw::HBFUtilsInitializer hbfIni(cfgc, specs);