4444#include " DCAFitter/DCAFitterN.h"
4545#include " MathUtils/fit.h"
4646#include " GlobalTrackingStudy/V0Ext.h"
47+ #include " GPUO2InterfaceConfiguration.h"
48+ // #include "GPUSettingsO2.h"
49+ #include " GPUParam.h"
50+ #include " GPUParam.inc"
51+ #include " GPUO2InterfaceRefit.h"
52+ #include " GPUO2InterfaceUtils.h"
4753
4854namespace o2 ::svstudy
4955{
@@ -64,8 +70,8 @@ using timeEst = o2::dataformats::TimeStampWithError<float, float>;
6470class SVStudySpec : public Task
6571{
6672 public:
67- SVStudySpec (std::shared_ptr<DataRequest> dr, std::shared_ptr<o2::base::GRPGeomRequest> gr, GTrackID::mask_t src, bool useMC)
68- : mDataRequest (dr), mGGCCDBRequest (gr), mTracksSrc (src), mUseMC (useMC) {}
73+ SVStudySpec (std::shared_ptr<DataRequest> dr, std::shared_ptr<o2::base::GRPGeomRequest> gr, GTrackID::mask_t src, bool useTPCCl, bool useMC)
74+ : mDataRequest (dr), mGGCCDBRequest (gr), mTracksSrc (src), mUseTPCCl (useTPCCl), mUseMC (useMC) {}
6975 ~SVStudySpec () final = default ;
7076 void init (InitContext& ic) final ;
7177 void run (ProcessingContext& pc) final ;
@@ -83,11 +89,18 @@ class SVStudySpec : public Task
8389 std::unique_ptr<o2::utils::TreeStreamRedirector> mDBGOut ;
8490 float mSelK0 = -1 ;
8591 bool mRefit = false ;
92+ bool mUseTPCCl = false ;
8693 float mMaxEta = 0.8 ;
8794 float mBz = 0 ;
95+ int mNHBPerTF = 0 ;
96+ int mNTPCOccBinLength = 0 ; // /< TPC occ. histo bin length in TBs
97+ float mNTPCOccBinLengthInv ;
98+ float mTPCTBinMUSInv = 0 .f;
8899 GTrackID::mask_t mTracksSrc {};
89100 o2::vertexing::DCAFitterN<2 > mFitterV0 ;
101+ std::vector<float > mTBinClOccAft , mTBinClOccBef ;
90102 std::unique_ptr<o2::steer::MCKinematicsReader> mcReader; // reader of MC information
103+ std::shared_ptr<o2::gpu::GPUParam> mParam = nullptr ;
91104};
92105
93106void SVStudySpec::init (InitContext& ic)
@@ -107,6 +120,48 @@ void SVStudySpec::run(ProcessingContext& pc)
107120 o2::globaltracking::RecoContainer recoData;
108121 recoData.collectData (pc, *mDataRequest .get ()); // select tracks of needed type, with minimal cuts, the real selected will be done in the vertexer
109122 updateTimeDependentParams (pc); // Make sure this is called after recoData.collectData, which may load some conditions
123+
124+ size_t occupancyMapSizeBytes = o2::gpu::GPUO2InterfaceRefit::fillOccupancyMapGetSize (mNHBPerTF , mParam .get ());
125+ gsl::span<const unsigned int > TPCRefitterOccMap = recoData.occupancyMapTPC ;
126+ o2::gpu::GPUO2InterfaceUtils::paramUseExternalOccupancyMap (mParam .get (), mNHBPerTF , TPCRefitterOccMap.data (), occupancyMapSizeBytes);
127+
128+ mTBinClOccBef .resize (1 );
129+ mTBinClOccAft .resize (1 );
130+ if (recoData.inputsTPCclusters && mUseTPCCl ) {
131+ mNTPCOccBinLength = mParam ->rec .tpc .occupancyMapTimeBins ;
132+ mTBinClOccBef .clear ();
133+ mTBinClOccAft .clear ();
134+ // prepare TPC occupancy data
135+ if (mNTPCOccBinLength > 1 && recoData.occupancyMapTPC .size ()) {
136+ mNTPCOccBinLengthInv = 1 . / mNTPCOccBinLength ;
137+ int nTPCBins = mNHBPerTF * o2::constants::lhc::LHCMaxBunches / 8 , ninteg = 0 ;
138+ int nTPCOccBins = nTPCBins * mNTPCOccBinLengthInv , sumBins = std::max (1 , int (o2::constants::lhc::LHCMaxBunches / 8 * mNTPCOccBinLengthInv ));
139+ mTBinClOccAft .resize (nTPCOccBins);
140+ mTBinClOccBef .resize (nTPCOccBins);
141+ float sm = 0 ., tb = 0.5 * mNTPCOccBinLength ;
142+ std::vector<float > mltHistTB (nTPCOccBins);
143+ for (int i = 0 ; i < nTPCOccBins; i++) {
144+ mltHistTB[i] = mParam ->GetUnscaledMult (tb);
145+ tb += mNTPCOccBinLength ;
146+ }
147+ for (int i = nTPCOccBins; i--;) {
148+ sm += mltHistTB[i];
149+ if (i + sumBins < nTPCOccBins) {
150+ sm -= mltHistTB[i + sumBins];
151+ }
152+ mTBinClOccAft [i] = sm;
153+ }
154+ sm = 0 ;
155+ for (int i = 0 ; i < nTPCOccBins; i++) {
156+ sm += mltHistTB[i];
157+ if (i - sumBins > 0 ) {
158+ sm -= mltHistTB[i - sumBins];
159+ }
160+ mTBinClOccBef [i] = sm;
161+ }
162+ }
163+ }
164+
110165 process (recoData);
111166}
112167
@@ -133,6 +188,12 @@ void SVStudySpec::updateTimeDependentParams(ProcessingContext& pc)
133188 mFitterV0 .setMaxStep (svparam.maxStep );
134189 mFitterV0 .setMaxSnp (svparam.maxSnp );
135190 mFitterV0 .setMinXSeed (svparam.minXSeed );
191+
192+ mNHBPerTF = o2::base::GRPGeomHelper::instance ().getGRPECS ()->getNHBFPerTF ();
193+ if (!mParam ) {
194+ // for occupancy estimator
195+ mParam = o2::gpu::GPUO2InterfaceUtils::getFullParamShared (0 .f , mNHBPerTF );
196+ }
136197 }
137198 mBz = o2::base::Propagator::Instance ()->getNominalBz ();
138199 mFitterV0 .setBz (mBz );
@@ -268,8 +329,13 @@ void SVStudySpec::process(o2::globaltracking::RecoContainer& recoData)
268329 }
269330 if (v0extVec.size ()) {
270331 const auto & pv = recoData.getPrimaryVertex (pvID);
332+ float tpcOccBef = 0 ., tpcOccAft = 0 .;
333+ int tb = pv.getTimeStamp ().getTimeStamp () * mTPCTBinMUSInv * mNTPCOccBinLengthInv ;
334+ tpcOccBef = tb < 0 ? mTBinClOccBef [0 ] : (tb >= mTBinClOccBef .size () ? mTBinClOccBef .back () : mTBinClOccBef [tb]);
335+ tpcOccAft = tb < 0 ? mTBinClOccAft [0 ] : (tb >= mTBinClOccAft .size () ? mTBinClOccAft .back () : mTBinClOccAft [tb]);
336+
271337 (*mDBGOut ) << " v0"
272- << " orbit=" << recoData.startIR .orbit << " tfID=" << tfID
338+ << " orbit=" << recoData.startIR .orbit << " tfID=" << tfID << " tpcOccBef= " << tpcOccBef << " tpcOccAft= " << tpcOccAft
273339 << " v0Ext=" << v0extVec
274340 << " pv=" << pv
275341 << " \n " ;
@@ -334,12 +400,13 @@ void SVStudySpec::finaliseCCDB(ConcreteDataMatcher& matcher, void* obj)
334400 }
335401}
336402
337- DataProcessorSpec getSVStudySpec (GTrackID::mask_t srcTracks, bool useMC)
403+ DataProcessorSpec getSVStudySpec (GTrackID::mask_t srcTracks, GTrackID:: mask_t srcCls, bool useMC)
338404{
339405 std::vector<OutputSpec> outputs;
340406 auto dataRequest = std::make_shared<DataRequest>();
341407
342408 dataRequest->requestTracks (srcTracks, useMC);
409+ dataRequest->requestClusters (srcCls, false );
343410 dataRequest->requestPrimaryVertices (useMC);
344411 dataRequest->requestSecondaryVertices (useMC);
345412 dataRequest->inputs .emplace_back (" meanvtx" , " GLO" , " MEANVERTEX" , 0 , Lifetime::Condition, ccdbParamSpec (" GLO/Calib/MeanVertex" , {}, 1 ));
@@ -351,12 +418,12 @@ DataProcessorSpec getSVStudySpec(GTrackID::mask_t srcTracks, bool useMC)
351418 o2::base::GRPGeomRequest::None, // geometry
352419 dataRequest->inputs ,
353420 true );
354-
421+ bool useTPCcl = srcCls[GTrackID::TPC];
355422 return DataProcessorSpec{
356423 " sv-study" ,
357424 dataRequest->inputs ,
358425 outputs,
359- AlgorithmSpec{adaptFromTask<SVStudySpec>(dataRequest, ggRequest, srcTracks, useMC)},
426+ AlgorithmSpec{adaptFromTask<SVStudySpec>(dataRequest, ggRequest, srcTracks, useTPCcl, useMC)},
360427 Options{
361428 {" refit" , VariantType::Bool, false , {" refit SVertices" }},
362429 {" sel-k0" , VariantType::Float, -1 .f , {" If positive, select K0s with this mass margin" }},
0 commit comments