@@ -72,10 +72,15 @@ class CTFReaderSpec : public o2::framework::Task
7272 void run (o2::framework::ProcessingContext& pc) final ;
7373
7474 private:
75+ void openCTFFile (const std::string& flname);
76+
7577 DetID::mask_t mDets ; // detectors
7678 std::vector<std::string> mInput ; // input files
77- uint32_t mTFCounter = 0 ;
79+ std::unique_ptr<TFile> mCTFFile ;
80+ std::unique_ptr<TTree> mCTFTree ;
81+ uint32_t mCTFCounter = 0 ;
7882 size_t mNextToProcess = 0 ;
83+ int mCurrEntry = 0 ;
7984 int mLoops = 1 ;
8085 int mLoopsCounter = 0 ;
8186 int mDelayMUS = 0 ;
@@ -97,43 +102,52 @@ void CTFReaderSpec::init(InitContext& ic)
97102 mCTFDir = o2::utils::Str::rectifyDirectory (ic.options ().get <std::string>(" input-dir" ));
98103}
99104
105+ // /_______________________________________
106+ void CTFReaderSpec::openCTFFile (const std::string& flname)
107+ {
108+ mCTFFile .reset (TFile::Open (flname.c_str ()));
109+ if (!mCTFFile ->IsOpen () || mCTFFile ->IsZombie ()) {
110+ LOG (ERROR) << " Failed to open file " << flname;
111+ throw std::runtime_error (" failed to open CTF file" );
112+ }
113+ mCTFTree .reset ((TTree*)mCTFFile ->Get (std::string (o2::base::NameConf::CTFTREENAME).c_str ()));
114+ if (!mCTFTree ) {
115+ throw std::runtime_error (" failed to load CTF tree" );
116+ }
117+ mCurrEntry = 0 ;
118+ }
119+
100120// /_______________________________________
101121void CTFReaderSpec::run (ProcessingContext& pc)
102122{
103123 if (mNextToProcess >= mInput .size ()) {
104124 return ;
105125 }
106- if (mDelayMUS && mTFCounter > 0 ) {
126+ if (mDelayMUS && mCTFCounter > 0 ) {
107127 usleep (mDelayMUS );
108128 }
109129
110130 auto cput = mTimer .CpuTime ();
111131 mTimer .Start (false );
112- std::string inputFile = o2::utils::Str::concat_string (mCTFDir , mInput [mNextToProcess ]);
113- LOG (INFO) << " Reading CTF input " << mNextToProcess << ' ' << inputFile;
114132
115- TFile flIn (inputFile.c_str ());
116- if (!flIn.IsOpen () || flIn.IsZombie ()) {
117- LOG (ERROR) << " Failed to open file " << inputFile;
118- throw std::runtime_error (" failed to open CTF file" );
119- }
120- std::unique_ptr<TTree> tree ((TTree*)flIn.Get (std::string (o2::base::NameConf::CTFTREENAME).c_str ()));
121- if (!tree) {
122- throw std::runtime_error (" failed to load CTF tree" );
133+ if (!mCTFTree ) { // there is still a tree open with multiple entries
134+ std::string inputFile = o2::utils::Str::concat_string (mCTFDir , mInput [mNextToProcess ]);
135+ LOG (INFO) << " Reading CTF input " << mNextToProcess << ' ' << inputFile;
136+ openCTFFile (inputFile);
123137 }
124138 CTFHeader ctfHeader;
125- if (!readFromTree (*tree , " CTFHeader" , ctfHeader)) {
139+ if (!readFromTree (*( mCTFTree . get ()) , " CTFHeader" , ctfHeader, mCurrEntry )) {
126140 throw std::runtime_error (" did not find CTFHeader" );
127141 }
128142 LOG (INFO) << ctfHeader;
129143
130- auto setFirstTFOrbit = [&](const std::string& label) {
144+ auto setFirstTFOrbit = [&pc, &ctfHeader, this ](const std::string& label) {
131145 auto * hd = pc.outputs ().findMessageHeader ({label});
132146 if (!hd) {
133147 throw std::runtime_error (o2::utils::Str::concat_string (" failed to find output message header for " , label));
134148 }
135149 hd->firstTForbit = ctfHeader.firstTForbit ;
136- hd->tfCounter = mTFCounter ;
150+ hd->tfCounter = this -> mCTFCounter ;
137151 };
138152
139153 // send CTF Header
@@ -146,128 +160,134 @@ void CTFReaderSpec::run(ProcessingContext& pc)
146160 det = DetID::ITS;
147161 if (detsTF[det]) {
148162 auto & bufVec = pc.outputs ().make <std::vector<o2::ctf::BufferType>>({det.getName ()}, sizeof (o2::itsmft::CTF));
149- o2::itsmft::CTF::readFromTree (bufVec, *(tree .get ()), det.getName ());
163+ o2::itsmft::CTF::readFromTree (bufVec, *(mCTFTree .get ()), det.getName (), mCurrEntry );
150164 setFirstTFOrbit (det.getName ());
151165 }
152166
153167 det = DetID::MFT;
154168 if (detsTF[det]) {
155169 auto & bufVec = pc.outputs ().make <std::vector<o2::ctf::BufferType>>({det.getName ()}, sizeof (o2::itsmft::CTF));
156- o2::itsmft::CTF::readFromTree (bufVec, *(tree .get ()), det.getName ());
170+ o2::itsmft::CTF::readFromTree (bufVec, *(mCTFTree .get ()), det.getName (), mCurrEntry );
157171 setFirstTFOrbit (det.getName ());
158172 }
159173
160174 det = DetID::TPC;
161175 if (detsTF[det]) {
162176 auto & bufVec = pc.outputs ().make <std::vector<o2::ctf::BufferType>>({det.getName ()}, sizeof (o2::tpc::CTF));
163- o2::tpc::CTF::readFromTree (bufVec, *(tree .get ()), det.getName ());
177+ o2::tpc::CTF::readFromTree (bufVec, *(mCTFTree .get ()), det.getName (), mCurrEntry );
164178 setFirstTFOrbit (det.getName ());
165179 }
166180
167181 det = DetID::TRD;
168182 if (detsTF[det]) {
169183 auto & bufVec = pc.outputs ().make <std::vector<o2::ctf::BufferType>>({det.getName ()}, sizeof (o2::trd::CTF));
170- o2::trd::CTF::readFromTree (bufVec, *(tree .get ()), det.getName ());
184+ o2::trd::CTF::readFromTree (bufVec, *(mCTFTree .get ()), det.getName (), mCurrEntry );
171185 setFirstTFOrbit (det.getName ());
172186 }
173187
174188 det = DetID::FT0;
175189 if (detsTF[det]) {
176190 auto & bufVec = pc.outputs ().make <std::vector<o2::ctf::BufferType>>({det.getName ()}, sizeof (o2::ft0::CTF));
177- o2::ft0::CTF::readFromTree (bufVec, *(tree .get ()), det.getName ());
191+ o2::ft0::CTF::readFromTree (bufVec, *(mCTFTree .get ()), det.getName (), mCurrEntry );
178192 setFirstTFOrbit (det.getName ());
179193 }
180194
181195 det = DetID::FV0;
182196 if (detsTF[det]) {
183197 auto & bufVec = pc.outputs ().make <std::vector<o2::ctf::BufferType>>({det.getName ()}, sizeof (o2::fv0::CTF));
184- o2::fv0::CTF::readFromTree (bufVec, *(tree .get ()), det.getName ());
198+ o2::fv0::CTF::readFromTree (bufVec, *(mCTFTree .get ()), det.getName (), mCurrEntry );
185199 setFirstTFOrbit (det.getName ());
186200 }
187201
188202 det = DetID::FDD;
189203 if (detsTF[det]) {
190204 auto & bufVec = pc.outputs ().make <std::vector<o2::ctf::BufferType>>({det.getName ()}, sizeof (o2::fdd::CTF));
191- o2::fdd::CTF::readFromTree (bufVec, *(tree .get ()), det.getName ());
205+ o2::fdd::CTF::readFromTree (bufVec, *(mCTFTree .get ()), det.getName (), mCurrEntry );
192206 setFirstTFOrbit (det.getName ());
193207 }
194208
195209 det = DetID::TOF;
196210 if (detsTF[det]) {
197211 auto & bufVec = pc.outputs ().make <std::vector<o2::ctf::BufferType>>({det.getName ()}, sizeof (o2::tof::CTF));
198- o2::tof::CTF::readFromTree (bufVec, *(tree .get ()), det.getName ());
212+ o2::tof::CTF::readFromTree (bufVec, *(mCTFTree .get ()), det.getName (), mCurrEntry );
199213 setFirstTFOrbit (det.getName ());
200214 }
201215
202216 det = DetID::MID;
203217 if (detsTF[det]) {
204218 auto & bufVec = pc.outputs ().make <std::vector<o2::ctf::BufferType>>({det.getName ()}, sizeof (o2::mid::CTF));
205- o2::mid::CTF::readFromTree (bufVec, *(tree .get ()), det.getName ());
219+ o2::mid::CTF::readFromTree (bufVec, *(mCTFTree .get ()), det.getName (), mCurrEntry );
206220 setFirstTFOrbit (det.getName ());
207221 }
208222
209223 det = DetID::MCH;
210224 if (detsTF[det]) {
211225 auto & bufVec = pc.outputs ().make <std::vector<o2::ctf::BufferType>>({det.getName ()}, sizeof (o2::mch::CTF));
212- o2::mch::CTF::readFromTree (bufVec, *(tree .get ()), det.getName ());
226+ o2::mch::CTF::readFromTree (bufVec, *(mCTFTree .get ()), det.getName (), mCurrEntry );
213227 setFirstTFOrbit (det.getName ());
214228 }
215229
216230 det = DetID::EMC;
217231 if (detsTF[det]) {
218232 auto & bufVec = pc.outputs ().make <std::vector<o2::ctf::BufferType>>({det.getName ()}, sizeof (o2::emcal::CTF));
219- o2::emcal::CTF::readFromTree (bufVec, *(tree .get ()), det.getName ());
233+ o2::emcal::CTF::readFromTree (bufVec, *(mCTFTree .get ()), det.getName (), mCurrEntry );
220234 setFirstTFOrbit (det.getName ());
221235 }
222236
223237 det = DetID::PHS;
224238 if (detsTF[det]) {
225239 auto & bufVec = pc.outputs ().make <std::vector<o2::ctf::BufferType>>({det.getName ()}, sizeof (o2::phos::CTF));
226- o2::phos::CTF::readFromTree (bufVec, *(tree .get ()), det.getName ());
240+ o2::phos::CTF::readFromTree (bufVec, *(mCTFTree .get ()), det.getName (), mCurrEntry );
227241 setFirstTFOrbit (det.getName ());
228242 }
229243
230244 det = DetID::CPV;
231245 if (detsTF[det]) {
232246 auto & bufVec = pc.outputs ().make <std::vector<o2::ctf::BufferType>>({det.getName ()}, sizeof (o2::cpv::CTF));
233- o2::cpv::CTF::readFromTree (bufVec, *(tree .get ()), det.getName ());
247+ o2::cpv::CTF::readFromTree (bufVec, *(mCTFTree .get ()), det.getName (), mCurrEntry );
234248 setFirstTFOrbit (det.getName ());
235249 }
236250
237251 det = DetID::ZDC;
238252 if (detsTF[det]) {
239253 auto & bufVec = pc.outputs ().make <std::vector<o2::ctf::BufferType>>({det.getName ()}, sizeof (o2::zdc::CTF));
240- o2::zdc::CTF::readFromTree (bufVec, *(tree .get ()), det.getName ());
254+ o2::zdc::CTF::readFromTree (bufVec, *(mCTFTree .get ()), det.getName (), mCurrEntry );
241255 setFirstTFOrbit (det.getName ());
242256 }
243257
244258 det = DetID::HMP;
245259 if (detsTF[det]) {
246260 auto & bufVec = pc.outputs ().make <std::vector<o2::ctf::BufferType>>({det.getName ()}, sizeof (o2::hmpid::CTF));
247- o2::hmpid::CTF::readFromTree (bufVec, *(tree .get ()), det.getName ());
261+ o2::hmpid::CTF::readFromTree (bufVec, *(mCTFTree .get ()), det.getName (), mCurrEntry );
248262 setFirstTFOrbit (det.getName ());
249263 }
250264
251265 mTimer .Stop ();
252- LOGF (INFO, " Read CTF %s in %.3e s" , inputFile.c_str (), mTimer .CpuTime () - cput);
253-
254- bool moreToProcess = true ;
255- if (++mNextToProcess >= mInput .size ()) {
256- if (++mLoopsCounter >= mLoops ) {
257- moreToProcess = false ;
258- } else {
259- mNextToProcess = 0 ;
260- LOG (INFO) << " Starting new loop " << mNextToProcess << " of " << mLoops ;
266+ LOGP (INFO, " Read CTF#{} ({} of {} in {}) in {:.3f} s" , mCTFCounter , mCurrEntry , mCTFTree ->GetEntries (), mCTFFile ->GetName (), mTimer .CpuTime () - cput);
267+
268+ bool moreToProcess = (++mCurrEntry < mCTFTree ->GetEntries ());
269+ if (!moreToProcess) { // this file is done, check if there are other files
270+ mCTFTree .reset ();
271+ mCTFFile ->Close ();
272+ mCTFFile .reset ();
273+ moreToProcess = true ;
274+ if (++mNextToProcess >= mInput .size ()) {
275+ if (++mLoopsCounter >= mLoops ) {
276+ moreToProcess = false ;
277+ } else {
278+ mNextToProcess = 0 ;
279+ LOG (INFO) << " Starting new loop " << mNextToProcess << " of " << mLoops ;
280+ }
261281 }
262282 }
263283
264- mTFCounter ++;
284+ mCTFCounter ++;
265285
266286 if (!moreToProcess) {
267287 pc.services ().get <ControlService>().endOfStream ();
268288 pc.services ().get <ControlService>().readyToQuit (QuitRequest::Me);
269- LOGF (INFO, " CTF reading total timing: Cpu: %.3e Real: %.3e s for %u TFs in %d loops" ,
270- mTimer .CpuTime (), mTimer .RealTime (), mTFCounter , mLoops );
289+ LOGP (INFO, " CTF reading total timing: Cpu: {:.3f} Real: {:.3f} s for {} TFs in {} loops" ,
290+ mTimer .CpuTime (), mTimer .RealTime (), mCTFCounter , mLoops );
271291 }
272292}
273293
0 commit comments