55 void InitTask()
final;
57 bool setWorkingDirectory(std::string
const& dir);
62 template <
typename T,
typename V>
63 V insertAdd(std::map<T, V>&
m, T
const&
key, V
value);
66 bool isDataComplete(T checksum, T nparts);
68 void consumeHits(
int eventID, fair::mq::Parts&
data,
int&
index);
70 template <
typename T,
typename BT>
71 void consumeData(
int eventID, fair::mq::Parts&
data,
int&
index, BT&
buffer);
78 bool waitForControlInput();
80 bool ConditionalRun()
override;
82 bool handleSimData(fair::mq::Parts&
data,
int );
85 void cleanEvent(
int eventID);
88 void backInsert(T
const& from, T& to);
90 void reorderAndMergeMCTracks(
int eventID, TTree*
target,
const std::vector<int>& nprimaries,
const std::vector<int>& nsubevents, std::function<
void(std::vector<MCTrack>
const&)> tracks_analysis_hook,
o2::dataformats::MCEventHeader const* mceventheader);
92 template <
typename T,
typename M>
93 void remapTrackIdsAndMerge(std::string brname,
int eventID, TTree&
target,
94 const std::vector<int>& trackoffsets,
const std::vector<int>& nprimaries,
const std::vector<int>& subevOrdered, M& mapOfVectorOfTs);
96 void updateTrackIdWithOffset(
MCTrack& track, Int_t nprim, Int_t idelta0, Int_t idelta1);
98 void updateTrackIdWithOffset(
TrackReference&
ref, Int_t nprim, Int_t idelta0, Int_t idelta1);
100 void initHitTreeAndOutFile(std::string prefix,
int detID);
105 bool mergeAndFlushData();
107 std::map<uint32_t, uint32_t> mPartsCheckSum;
108 std::string mOutFileName;
111 TFile* mOutFile =
nullptr;
112 TTree* mOutTree =
nullptr;
113 TFile* mMCHeaderOnlyOutFile =
nullptr;
114 TTree* mMCHeaderTree =
nullptr;
116 template <
class K,
class V>
117 using Hashtable = tbb::concurrent_unordered_map<K, V>;
118 Hashtable<int, TFile*> mDetectorOutFiles;
119 Hashtable<int, TTree*> mDetectorToTTreeMap;
122 std::thread mMergerIOThread;
123 std::atomic<bool> mergingInProgress{
false};
125 Hashtable<int, std::vector<std::vector<o2::MCTrack>*>> mMCTrackBuffer;
126 Hashtable<int, std::vector<std::vector<o2::TrackReference>*>> mTrackRefBuffer;
127 Hashtable<int, std::list<o2::data::SubEventInfo*>> mSubEventInfoBuffer;
128 Hashtable<int, bool> mFlushableEvents;
130 int mEventChecksum = 0;
131 int mNExpectedEvents = 0;
132 int mNextFlushID = 1;
135 bool mAsService =
false;
136 bool mForwardKine =
true;
137 bool mWriteToDisc =
true;
139 int mPipeToDriver = -1;
141 std::vector<std::unique_ptr<o2::base::Detector>> mDetectorInstances;
142 std::vector<int> mExternalDetIDs;
145 std::string mInitialOutputDir;
146 std::string mCurrentOutputDir;
149 fair::mq::Channel mPubChannel;
152 void initDetInstances();
153 void initExternalDetInstances();
154 void initHitFiles(std::string prefix);