1515#include < cassert>
1616#include " Framework/RootSerializationSupport.h"
1717#include " TPCDigitizerSpec.h"
18+ #include " TPCSectorDigitization.h"
1819#include " Framework/ControlService.h"
1920#include " Framework/ParallelContext.h"
2021#include " Framework/ConfigParamRegistry.h"
2122#include " Framework/DataProcessorSpec.h"
2223#include " Framework/DataRefUtils.h"
2324#include " Framework/Lifetime.h"
2425#include " Framework/DeviceSpec.h"
25- #include " DetectorsRaw/HBFUtils.h"
2626#include " Headers/DataHeader.h"
2727#include " TStopwatch.h"
2828#include " Steer/HitProcessingManager.h" // for DigitizationContext
@@ -92,20 +92,6 @@ void writeToBranchHelper<o2::dataformats::MCTruthContainer<o2::MCCompLabel>>(TTr
9292 targetbr->DropBaskets (" all" );
9393}
9494
95- std::string getBranchNameLeft (int sector)
96- {
97- std::stringstream branchnamestreamleft;
98- branchnamestreamleft << " TPCHitsShiftedSector" << int (o2::tpc::Sector::getLeft (o2::tpc::Sector (sector)));
99- return branchnamestreamleft.str ();
100- }
101-
102- std::string getBranchNameRight (int sector)
103- {
104- std::stringstream branchnamestreamright;
105- branchnamestreamright << " TPCHitsShiftedSector" << sector;
106- return branchnamestreamright.str ();
107- }
108-
10995using namespace o2 ::base;
11096class TPCDPLDigitizerTask : public BaseDPLDigitizer
11197{
@@ -178,23 +164,23 @@ class TPCDPLDigitizerTask : public BaseDPLDigitizer
178164 {
179165 std::stringstream brname;
180166 brname << " TPCDigit_" << mSector ;
181- auto br = o2::base::getOrMakeBranch (*mInternalROOTFlushTTree , brname.str ().c_str (), &mDigits );
167+ auto br = o2::base::getOrMakeBranch (*mInternalROOTFlushTTree , brname.str ().c_str (), &mFlushBuffers . digits );
182168 br->Fill ();
183169 br->ResetAddress ();
184170 }
185171 if (mWithMCTruth ) {
186172 // labels
187173 std::stringstream brname;
188174 brname << " TPCDigitMCTruth_" << mSector ;
189- auto br = o2::base::getOrMakeBranch (*mInternalROOTFlushTTree , brname.str ().c_str (), &mLabels );
175+ auto br = o2::base::getOrMakeBranch (*mInternalROOTFlushTTree , brname.str ().c_str (), &mFlushBuffers . labels );
190176 br->Fill ();
191177 br->ResetAddress ();
192178 }
193179 {
194180 // common
195181 std::stringstream brname;
196182 brname << " TPCCommonMode_" << mSector ;
197- auto br = o2::base::getOrMakeBranch (*mInternalROOTFlushTTree , brname.str ().c_str (), &mCommonMode );
183+ auto br = o2::base::getOrMakeBranch (*mInternalROOTFlushTTree , brname.str ().c_str (), &mFlushBuffers . commonMode );
198184 br->Fill ();
199185 br->ResetAddress ();
200186 }
@@ -286,7 +272,6 @@ class TPCDPLDigitizerTask : public BaseDPLDigitizer
286272 }
287273 // TODO: make generic reset method?
288274 mFlushCounter = 0 ;
289- mDigitCounter = 0 ;
290275 }
291276 }
292277 }
@@ -391,88 +376,24 @@ class TPCDPLDigitizerTask : public BaseDPLDigitizer
391376 throw std::runtime_error (" Digitizer can only work on single sectors" );
392377 }
393378
394- mDigitizer .setSector (sector);
395- mDigitizer .setSeedingTimeframe (dh->tfCounter );
396- mDigitizer .init ();
397-
398- auto & eventParts = context->getEventParts ();
379+ TStopwatch timer;
380+ timer.Start ();
399381
400- auto flushDigitsAndLabels = [this , digitsAccum, &labelAccum, &commonModeAccum](bool finalFlush = false ) {
382+ auto onFlush = [this , digitsAccum, &labelAccum, &commonModeAccum]() {
401383 mFlushCounter ++;
402- // flush previous buffer
403- mDigits .clear ();
404- mLabels .clear ();
405- mCommonMode .clear ();
406- mDigitizer .flush (mDigits , mLabels , mCommonMode , finalFlush);
407- LOG (info) << " TPC: Flushed " << mDigits .size () << " digits, " << mLabels .getNElements () << " labels and " << mCommonMode .size () << " common mode entries" ;
408-
409384 if (mInternalWriter ) {
410385 // the natural place to write out this independent datachunk immediately ...
411386 writeToROOTFile ();
412387 } else {
413388 // ... or to accumulate and later forward to next DPL proc
414- std::copy (mDigits . begin (), mDigits .end (), std::back_inserter (*digitsAccum));
389+ std::copy (mFlushBuffers . digits . begin (), mFlushBuffers . digits .end (), std::back_inserter (*digitsAccum));
415390 if (mWithMCTruth ) {
416- labelAccum.mergeAtBack (mLabels );
391+ labelAccum.mergeAtBack (mFlushBuffers . labels );
417392 }
418- std::copy (mCommonMode . begin (), mCommonMode .end (), std::back_inserter (commonModeAccum));
393+ std::copy (mFlushBuffers . commonMode . begin (), mFlushBuffers . commonMode .end (), std::back_inserter (commonModeAccum));
419394 }
420- mDigitCounter += mDigits .size ();
421395 };
422-
423- if (isContinuous) {
424- auto & hbfu = o2::raw::HBFUtils::Instance ();
425- double time = hbfu.getFirstIRofTF (o2::InteractionRecord (0 , hbfu.orbitFirstSampled )).bc2ns () / 1000 .;
426- mDigitizer .setOutputDigitTimeOffset (time);
427- if (!irecords.empty ()) {
428- mDigitizer .setStartTime (irecords[0 ].getTimeNS () / 1000 .f );
429- }
430- }
431-
432- TStopwatch timer;
433- timer.Start ();
434-
435- // loop over all composite collisions given from context
436- // (aka loop over all the interaction records)
437- for (int collID = 0 ; collID < irecords.size (); ++collID) {
438- const double eventTime = irecords[collID].getTimeNS () / 1000 .f ;
439- LOG (info) << " TPC: Event time " << eventTime << " us" ;
440- mDigitizer .setEventTime (eventTime);
441- if (!isContinuous) {
442- mDigitizer .setStartTime (eventTime);
443- }
444- size_t startSize = mDigitCounter ; // digitsAccum->size();
445-
446- // for each collision, loop over the constituents event and source IDs
447- // (background signal merging is basically taking place here)
448- for (auto & part : eventParts[collID]) {
449- const int eventID = part.entryID ;
450- const int sourceID = part.sourceID ;
451-
452- // get the hits for this event and this source
453- std::vector<o2::tpc::HitGroup> hitsLeft;
454- std::vector<o2::tpc::HitGroup> hitsRight;
455- context->retrieveHits (mSimChains , getBranchNameLeft (sector).c_str (), part.sourceID , part.entryID , &hitsLeft);
456- context->retrieveHits (mSimChains , getBranchNameRight (sector).c_str (), part.sourceID , part.entryID , &hitsRight);
457- LOG (debug) << " TPC: Found " << hitsLeft.size () << " hit groups left and " << hitsRight.size () << " hit groups right in collision " << collID << " eventID " << part.entryID ;
458-
459- mDigitizer .process (hitsLeft, eventID, sourceID);
460- mDigitizer .process (hitsRight, eventID, sourceID);
461-
462- flushDigitsAndLabels ();
463-
464- if (!isContinuous) {
465- eventAccum.emplace_back (startSize, mDigits .size ());
466- }
467- }
468- }
469-
470- // final flushing step; getting everything not yet written out
471- if (isContinuous) {
472- LOG (info) << " TPC: Final flush" ;
473- flushDigitsAndLabels (true );
474- eventAccum.emplace_back (0 , mDigitCounter ); // all digits are grouped to 1 super-event pseudo-triggered mode
475- }
396+ eventAccum = digitizeSector (mDigitizer , *context, mSimChains , sector, dh->tfCounter , mFlushBuffers , onFlush);
476397
477398 if (!mInternalWriter ) {
478399 // send out to next stage
@@ -490,13 +411,10 @@ class TPCDPLDigitizerTask : public BaseDPLDigitizer
490411 o2::tpc::Digitizer mDigitizer ;
491412 o2::tpc::VDriftHelper mTPCVDriftHelper {};
492413 std::vector<TChain*> mSimChains ;
493- std::vector<o2::tpc::Digit> mDigits ;
494- o2::dataformats::MCTruthContainer<o2::MCCompLabel> mLabels ;
495- std::vector<o2::tpc::CommonMode> mCommonMode ;
496- std::vector<int > mListOfSectors ; // a list of sectors treated by this task
414+ SectorFlushBuffers mFlushBuffers ; // output of the latest flush
415+ std::vector<int > mListOfSectors ; // a list of sectors treated by this task
497416 TFile* mInternalROOTFlushFile = nullptr ;
498417 TTree* mInternalROOTFlushTTree = nullptr ;
499- size_t mDigitCounter = 0 ;
500418 size_t mFlushCounter = 0 ;
501419 int mLaneId = 0 ; // the id of the current process within the parallel pipeline
502420 int mSector = 0 ;
0 commit comments