@@ -41,7 +41,7 @@ namespace calibration
4141class ResidualAggregatorDevice : public o2 ::framework::Task
4242{
4343 public:
44- ResidualAggregatorDevice (std::shared_ptr<o2::base::GRPGeomRequest> req, bool trackInput, bool ctpInput, bool writeUnbinnedResiduals, bool writeBinnedResiduals, bool writeTrackData, std::shared_ptr<o2::globaltracking::DataRequest> dataRequest) : mCCDBRequest (req), mTrackInput (trackInput), mCTPInput (ctpInput), mWriteUnbinnedResiduals (writeUnbinnedResiduals), mWriteBinnedResiduals (writeBinnedResiduals), mWriteTrackData (writeTrackData), mDataRequest (dataRequest) {}
44+ ResidualAggregatorDevice (std::shared_ptr<o2::base::GRPGeomRequest> req, bool trackInput, bool ctpInput, bool writeUnbinnedResiduals, bool writeBinnedResiduals, bool writeTrackData, bool mcInput, std::shared_ptr<o2::globaltracking::DataRequest> dataRequest) : mCCDBRequest (req), mTrackInput (trackInput), mCTPInput (ctpInput), mWriteUnbinnedResiduals (writeUnbinnedResiduals), mWriteBinnedResiduals (writeBinnedResiduals), mWriteTrackData (writeTrackData), mMCInput (mcInput ), mDataRequest (dataRequest) {}
4545
4646 void init (o2::framework::InitContext& ic) final
4747 {
@@ -97,6 +97,7 @@ class ResidualAggregatorDevice : public o2::framework::Task
9797 mAggregator ->setWriteBinnedResiduals (mWriteBinnedResiduals );
9898 mAggregator ->setWriteUnbinnedResiduals (mWriteUnbinnedResiduals );
9999 mAggregator ->setWriteTrackData (mWriteTrackData );
100+ mAggregator ->setWriteTrackDataMC (mMCInput );
100101 mAggregator ->setCompression (ic.options ().get <int >(" compression" ));
101102 }
102103
@@ -141,6 +142,14 @@ class ResidualAggregatorDevice : public o2::framework::Task
141142 trkData.emplace (pc.inputs ().get <gsl::span<o2::tpc::TrackData>>(" trkData" ));
142143 trkDataPtr = &trkData.value ();
143144 }
145+ // MC truth of the track data (optional, MC only)
146+ const gsl::span<const o2::tpc::TrackDataMC>* trkDataMCPtr = nullptr ;
147+ using trkDataMCType = std::decay_t <decltype (pc.inputs ().get <gsl::span<o2::tpc::TrackDataMC>>(" " ))>;
148+ std::optional<trkDataMCType> trkDataMC;
149+ if (mMCInput ) {
150+ trkDataMC.emplace (pc.inputs ().get <gsl::span<o2::tpc::TrackDataMC>>(" trkDataMC" ));
151+ trkDataMCPtr = &trkDataMC.value ();
152+ }
144153 // CTP lumi input (optional)
145154 const o2::ctp::LumiInfo* lumi = nullptr ;
146155 using lumiDataType = std::decay_t <decltype (pc.inputs ().get <o2::ctp::LumiInfo>(" " ))>;
@@ -152,7 +161,7 @@ class ResidualAggregatorDevice : public o2::framework::Task
152161
153162 o2::base::TFIDInfoHelper::fillTFIDInfo (pc, mAggregator ->getCurrentTFInfo ());
154163 LOG (detail) << " Processing TF " << mAggregator ->getCurrentTFInfo ().tfCounter << " with " << trkData->size () << " tracks and " << residualsData.size () << " unbinned residuals associated to them" ;
155- mAggregator ->process (residualsData, residualsDataDet, trackRefs, trkDataPtr, lumi);
164+ mAggregator ->process (residualsData, residualsDataDet, trackRefs, trkDataPtr, trkDataMCPtr, lumi);
156165 std::chrono::duration<double , std::milli> runDuration = std::chrono::high_resolution_clock::now () - runStartTime;
157166 LOGP (debug, " Duration for run method: {} ms. From this taken for time dependent param update: {} ms" ,
158167 std::chrono::duration_cast<std::chrono::milliseconds>(runDuration).count (),
@@ -205,6 +214,7 @@ class ResidualAggregatorDevice : public o2::framework::Task
205214 bool mWriteBinnedResiduals {false }; // /< flag, whether to write binned residuals to output file
206215 bool mWriteUnbinnedResiduals {false }; // /< flag, whether to write unbinned residuals to output file
207216 bool mWriteTrackData {false }; // /< flag, whether to write track data to output file
217+ bool mMCInput {false }; // /< flag whether to expect the MC truth of the track data as input
208218 bool mRunStopRequested {false }; // /< flag in case the run was stopped
209219 bool mInitDone {false }; // /< flag whether initialization was done for current run
210220};
@@ -214,7 +224,7 @@ class ResidualAggregatorDevice : public o2::framework::Task
214224namespace framework
215225{
216226
217- DataProcessorSpec getTPCResidualAggregatorSpec (bool trackInput, bool ctpInput, bool writeUnbinnedResiduals, bool writeBinnedResiduals, bool writeTrackData)
227+ DataProcessorSpec getTPCResidualAggregatorSpec (bool trackInput, bool ctpInput, bool writeUnbinnedResiduals, bool writeBinnedResiduals, bool writeTrackData, bool mcInput = false )
218228{
219229 std::shared_ptr<o2::globaltracking::DataRequest> dataRequest = std::make_shared<o2::globaltracking::DataRequest>();
220230 if (ctpInput) {
@@ -227,6 +237,9 @@ DataProcessorSpec getTPCResidualAggregatorSpec(bool trackInput, bool ctpInput, b
227237 inputs.emplace_back (" trackRefs" , " GLO" , " TRKREFS" );
228238 if (trackInput) {
229239 inputs.emplace_back (" trkData" , " GLO" , " TRKDATA" );
240+ if (mcInput) {
241+ inputs.emplace_back (" trkDataMC" , " GLO" , " TRKDATAMC" );
242+ }
230243 }
231244 auto ccdbRequest = std::make_shared<o2::base::GRPGeomRequest>(true , // orbitResetTime
232245 true , // GRPECS=true
@@ -240,7 +253,7 @@ DataProcessorSpec getTPCResidualAggregatorSpec(bool trackInput, bool ctpInput, b
240253 " residual-aggregator" ,
241254 inputs,
242255 Outputs{},
243- AlgorithmSpec{adaptFromTask<o2::calibration::ResidualAggregatorDevice>(ccdbRequest, trackInput, ctpInput, writeUnbinnedResiduals, writeBinnedResiduals, writeTrackData, dataRequest)},
256+ AlgorithmSpec{adaptFromTask<o2::calibration::ResidualAggregatorDevice>(ccdbRequest, trackInput, ctpInput, writeUnbinnedResiduals, writeBinnedResiduals, writeTrackData, trackInput && mcInput, dataRequest)},
244257 Options{
245258 {" sec-per-slot" , VariantType::UInt32, 600u , {" number of seconds per calibration time slot (put 0 for infinite slot length)" }},
246259 {" updateInterval" , VariantType::UInt32, 6'000u , {" update interval in number of TFs (only used in case slot length is infinite)" }},
0 commit comments