3030#include < chrono>
3131
3232using namespace o2 ::framework;
33+ using GID = o2::dataformats::GlobalTrackID;
3334
3435namespace o2
3536{
@@ -39,7 +40,7 @@ namespace calibration
3940class ResidualAggregatorDevice : public o2 ::framework::Task
4041{
4142 public:
42- ResidualAggregatorDevice (std::shared_ptr<o2::base::GRPGeomRequest> req, bool trackInput, bool writeOutput, bool writeUnbinnedResiduals, bool writeBinnedResiduals, bool writeTrackData) : mCCDBRequest (req), mTrackInput (trackInput), mWriteOutput (writeOutput), mWriteUnbinnedResiduals (writeUnbinnedResiduals), mWriteBinnedResiduals (writeBinnedResiduals), mWriteTrackData (writeTrackData) {}
43+ ResidualAggregatorDevice (std::shared_ptr<o2::base::GRPGeomRequest> req, bool trackInput, bool ctpInput, bool writeOutput, bool writeUnbinnedResiduals, bool writeBinnedResiduals, bool writeTrackData, std::shared_ptr<o2::globaltracking::DataRequest> dataRequest ) : mCCDBRequest (req), mTrackInput (trackInput), mCTPInput (ctpInput), mWriteOutput (writeOutput), mWriteUnbinnedResiduals (writeUnbinnedResiduals), mWriteBinnedResiduals (writeBinnedResiduals), mWriteTrackData (writeTrackData), mDataRequest (dataRequest ) {}
4344
4445 void init (o2::framework::InitContext& ic) final
4546 {
@@ -92,11 +93,12 @@ class ResidualAggregatorDevice : public o2::framework::Task
9293 void run (o2::framework::ProcessingContext& pc) final
9394 {
9495 auto runStartTime = std::chrono::high_resolution_clock::now ();
96+ o2::globaltracking::RecoContainer recoCont;
97+ recoCont.collectData (pc, *mDataRequest );
9598 updateTimeDependentParams (pc);
9699 std::chrono::duration<double , std::milli> ccdbUpdateTime = std::chrono::high_resolution_clock::now () - runStartTime;
97100
98101 auto residualsData = pc.inputs ().get <gsl::span<o2::tpc::UnbinnedResid>>(" unbinnedRes" );
99-
100102 // track data input is optional
101103 const gsl::span<const o2::tpc::TrackData>* trkDataPtr = nullptr ;
102104 using trkDataType = std::decay_t <decltype (pc.inputs ().get <gsl::span<o2::tpc::TrackData>>(" " ))>;
@@ -105,11 +107,20 @@ class ResidualAggregatorDevice : public o2::framework::Task
105107 trkData.emplace (pc.inputs ().get <gsl::span<o2::tpc::TrackData>>(" trkData" ));
106108 trkDataPtr = &trkData.value ();
107109 }
110+ // CTP lumi input (optional)
111+ const o2::ctp::LumiInfo* lumi = nullptr ;
112+ using lumiDataType = std::decay_t <decltype (pc.inputs ().get <o2::ctp::LumiInfo>(" " ))>;
113+ std::optional<lumiDataType> lumiInput;
114+ if (mCTPInput ) {
115+ recoCont.getCTPLumi ();
116+ lumiInput = recoCont.getCTPLumi ();
117+ lumi = &lumiInput.value ();
118+ }
108119
109120 auto data = std::make_pair<gsl::span<const o2::tpc::TrackData>, gsl::span<const o2::tpc::UnbinnedResid>>(std::move (*trkData), std::move (residualsData));
110121 o2::base::TFIDInfoHelper::fillTFIDInfo (pc, mAggregator ->getCurrentTFInfo ());
111122 LOG (info) << " Processing TF " << mAggregator ->getCurrentTFInfo ().tfCounter << " with " << trkData->size () << " tracks and " << residualsData.size () << " unbinned residuals associated to them" ;
112- mAggregator ->process (data);
123+ mAggregator ->process (data, lumi );
113124 std::chrono::duration<double , std::milli> runDuration = std::chrono::high_resolution_clock::now () - runStartTime;
114125 LOGP (info, " Duration for run method: {} ms. From this taken for time dependent param update: {} ms" ,
115126 std::chrono::duration_cast<std::chrono::milliseconds>(runDuration).count (),
@@ -135,7 +146,9 @@ class ResidualAggregatorDevice : public o2::framework::Task
135146 }
136147 std::unique_ptr<o2::tpc::ResidualAggregator> mAggregator ; // /< the TimeSlotCalibration device
137148 std::shared_ptr<o2::base::GRPGeomRequest> mCCDBRequest ;
149+ std::shared_ptr<o2::globaltracking::DataRequest> mDataRequest ; // /< optional CTP input
138150 bool mTrackInput {false }; // /< flag whether to expect track data as input
151+ bool mCTPInput {false }; // /< flag whether to expect luminosity input from CTP
139152 bool mWriteOutput {true }; // /< if false, no output file will be written
140153 bool mWriteBinnedResiduals {false }; // /< flag, whether to write binned residuals to output file
141154 bool mWriteUnbinnedResiduals {false }; // /< flag, whether to write unbinned residuals to output file
@@ -147,9 +160,13 @@ class ResidualAggregatorDevice : public o2::framework::Task
147160namespace framework
148161{
149162
150- DataProcessorSpec getTPCResidualAggregatorSpec (bool trackInput, bool writeOutput, bool writeUnbinnedResiduals, bool writeBinnedResiduals, bool writeTrackData)
163+ DataProcessorSpec getTPCResidualAggregatorSpec (bool trackInput, bool ctpInput, bool writeOutput, bool writeUnbinnedResiduals, bool writeBinnedResiduals, bool writeTrackData)
151164{
152- std::vector<InputSpec> inputs;
165+ std::shared_ptr<o2::globaltracking::DataRequest> dataRequest = std::make_shared<o2::globaltracking::DataRequest>();
166+ if (ctpInput) {
167+ dataRequest->requestClusters (GID::getSourcesMask (" CTP" ), false );
168+ }
169+ auto & inputs = dataRequest->inputs ;
153170 inputs.emplace_back (" unbinnedRes" , " GLO" , " UNBINNEDRES" );
154171 if (trackInput) {
155172 inputs.emplace_back (" trkData" , " GLO" , " TRKDATA" );
@@ -165,7 +182,7 @@ DataProcessorSpec getTPCResidualAggregatorSpec(bool trackInput, bool writeOutput
165182 " residual-aggregator" ,
166183 inputs,
167184 Outputs{},
168- AlgorithmSpec{adaptFromTask<o2::calibration::ResidualAggregatorDevice>(ccdbRequest, trackInput, writeOutput, writeUnbinnedResiduals, writeBinnedResiduals, writeTrackData)},
185+ AlgorithmSpec{adaptFromTask<o2::calibration::ResidualAggregatorDevice>(ccdbRequest, trackInput, ctpInput, writeOutput, writeUnbinnedResiduals, writeBinnedResiduals, writeTrackData, dataRequest )},
169186 Options{
170187 {" tf-per-slot" , VariantType::UInt32, 6'000u , {" number of TFs per calibration time slot (put 0 for infinite slot length)" }},
171188 {" updateInterval" , VariantType::UInt32, 6'000u , {" update interval in number of TFs in case slot length is infinite" }},
0 commit comments