BOSS 7.0.4
BESIII Offline Software System
Loading...
Searching...
No Matches
MixerAlg.cxx
Go to the documentation of this file.
1
2#include "GaudiKernel/MsgStream.h"
3#include "GaudiKernel/INTuple.h"
4#include "GaudiKernel/INTupleSvc.h"
5#include "BesEventMixer/MixerAlg.h"
6#include "RawDataCnv/EventManagement/RAWEVENT.h"
7#include "IRawFile/RawFileExceptions.h"
8//#include "DatabaseSvc/IDatabaseSvc.h"
9#include "EventModel/EventModel.h"
10#include "EventModel/Event.h"
11#include "EventModel/EventHeader.h"
12
13#include "TrigEvent/TrigGTD.h"
14#include "HltEvent/DstHltInf.h"
15
16#include "BesKernel/IBesRndmGenSvc.h"
17#include "CLHEP/Random/Random.h"
18#include "CLHEP/Random/RandFlat.h"
19#include "CLHEP/Random/RandExponential.h"
20
21#include "RawDataCnv/Util/MdcConverter.h"
22#include "RawDataCnv/Util/MucConverter.h"
23#include "RawDataCnv/Util/TofConverter.h"
24#include "RawDataCnv/Util/EmcConverter.h"
25
26#include "RootCnvSvc/RootInterface.h"
27
28#include <vector>
29#include <map>
30#include <algorithm>
31
32#include <libgen.h>
33
34using namespace std;
35using namespace CLHEP;
36
37MixerAlg::MixerAlg(const std::string& name, ISvcLocator* pSvcLocator) : Algorithm(name, pSvcLocator){
38 declareProperty("MixMdcDigi", b_mdc=true);
39 declareProperty("MixEmcDigi", b_emc=true);
40 declareProperty("MixMucDigi", b_muc=true);
41 declareProperty("MixTofDigi", b_tof=true);
42
43 declareProperty("DBUserRequest", m_dbUserRequest=false);
44 declareProperty("RandomTrgRun", m_run);
45 declareProperty("RandomTrgRunRange", m_runs);
46 declareProperty("RandomTrgTimeRange", m_dates);
47
48 declareProperty("BackgroundDataFiles", m_bgfiles);
49 declareProperty("NumRanTrgEvents", m_ranTrgEvents);
50 declareProperty("NBgEventsToSignal", m_nevent=1);
51 // declareProperty("LoopBgData", b_loop=true);
52 declareProperty("ReplaceDataPath", m_pattern);
53 declareProperty("UseNewDataDir", m_newdatadir);
54 declareProperty("IfSkip", m_skip=true);
55 declareProperty("NSkip", m_NSkip=150);
56 declareProperty("OutPut", m_ifOutPut=false);
57 declareProperty("MixingMethod", m_mixingMethod=1);
58 declareProperty("MaxLoop", m_maxLoop=10);
59 declareProperty("SmearT0", m_ifSmearT0=true);
60 declareProperty("ReadBGMethod", m_readBGMethod=1);
61
62 declareProperty("ExWireFromRun", m_exRunFrom = 0 );
63 declareProperty("ExWireToRun", m_exRunTo = 999999);
64
65 declareProperty("UsingFilter", m_usingFilter = true);
66
67 m_raw_event = 0;
68 m_fr = 0;
69 m_runNo = 0;
70 m_skipCount = 0;
71 currentBGFile = "";
72 currentMCFile = "";
73 m_totalEvent = 0;
74 m_totEvtNumInCurFile = 0;
75 m_nEventsToEnd = 0;
76 m_ranStepLenInCurrentFile.clear();
77
78 m_mdcCnv = MdcConverter::instance();
79 m_mucCnv = MucConverter::instance();
80 m_tofCnv = TofConverter::instance();
81 m_emcCnv = EmcConverter::instance();
82}
83
85{
86 std::string query = "SELECT FilePath,FileName,NumEvent FROM RanTrgData";
87
88 if (! m_run.empty() || m_runs.size()==2 || m_dates.size()==2)
89 { // use additional parameters for query
90 query = query + " WHERE ";
91 bool use_and = false;
92 if(! m_run.empty() )
93 {
94 query = query + " RunNo=" + m_run;
95 use_and = true;
96 }
97 if( m_runs.size()==2 )
98 {
99 if(use_and) query = query + " AND ";
100 query = query + " RunNo>=" + m_runs[0] + " AND RunNo<=" + m_runs[1];
101 use_and = true;
102 }
103 if( m_dates.size()==2 )
104 {
105 if(use_and) query = query + " AND ";
106 query = query + " TimeSOR>='" + m_dates[0] + "' AND TimeEOR<='" + m_dates[1] + "'";
107 }
108 }
109
110 query = query + ";";
111 return query;
112}
113
114
116{
117 log = new MsgStream(messageService(), name() );
118 //Caogf add
119 IRealizationSvc *tmpReal;
120 StatusCode status = service("RealizationSvc",tmpReal);
121 if (!status.isSuccess())
122 {
123 (*log) << MSG::FATAL << " Could not initialize Realization Service" << endreq;
124 } else {
125 m_RealizationSvc=dynamic_cast<RealizationSvc*>(tmpReal);
126 }
127
128 if(m_RealizationSvc->UseDBFlag() == true && m_RealizationSvc->ifReadRandTrg() == true && m_dbUserRequest == true) {
129 std::string query = prepareDbQuery();
130 m_bgfiles = m_RealizationSvc->getBgFileName(query);
131 }
132
133 if(! m_pattern.empty())
134 {
135 for(unsigned int k = 0; k < m_bgfiles.size(); k++) {
136 size_t pos_round = m_bgfiles[k].rfind("round");
137 (*log) << MSG::INFO <<"m_bgfiles: "<<m_bgfiles[k]<<endreq;
138 if(pos_round!=string::npos){
139 m_bgfiles[k].replace(m_bgfiles[k].begin(), m_bgfiles[k].begin()+pos_round, m_pattern);
140 (*log) << MSG::INFO<<"new random trigger data path: "<<m_bgfiles[k]<<endreq;
141 }
142 else{
143 (*log) << MSG::ERROR<<"string 'round' not found in random trigger path!"<<endreq;
144 exit(-1);
145 }
146 }
147 }
148 if (! m_newdatadir.empty())
149 {
150 for(unsigned int k = 0; k < m_bgfiles.size(); k++) {
151 char tmp[255];
152 std::strcpy (tmp, m_bgfiles[k].c_str());
153 string fname = basename(tmp);
154 m_bgfiles[k].replace(m_bgfiles[k].begin(), m_bgfiles[k].end(), m_newdatadir+'/'+fname);
155 (*log) << MSG::INFO<<"new random trigger data path: "<<m_bgfiles[k]<<endreq;
156 }
157 }
158
159
160 // initialize MDC converter
161 m_mdcCnv->init(m_exRunFrom,m_exRunTo);
162
163 //caogf for random seed
164 static const bool CREATEIFNOTTHERE(true);
165 StatusCode RndmStatus = service("BesRndmGenSvc", p_BesRndmGenSvc, CREATEIFNOTTHERE);
166 if (!RndmStatus.isSuccess() || 0 == p_BesRndmGenSvc)
167 {
168 (*log) << MSG::ERROR << " Could not initialize Random Number Service" << endreq;
169 return RndmStatus;
170 }
171
172 //get jobSvc
173 IDataInfoSvc *tmpInfoSvc;
174 status = service("DataInfoSvc",tmpInfoSvc);
175 if (status.isSuccess()) {
176 (*log) << MSG::INFO << "get the DataInfoSvc" << endreq;
177 m_jobInfoSvc=dynamic_cast<DataInfoSvc *>(tmpInfoSvc);
178 }else {
179 (*log) << MSG::WARNING << "could not get the DataInfoSvc." << endreq;
180 }
181 //end caogf add
182
183 if(m_RealizationSvc->UseDBFlag() == false || m_dbUserRequest == true) {
184 if(m_bgfiles.empty()) {
185 (*log) << MSG::WARNING << "No background datafiles found" << endreq;
186 return StatusCode::SUCCESS;
187 }
188
189 // open background stream
190 try {
191 m_bgfilesIndex.clear();
192 for(unsigned int bg_index = 0; bg_index < m_bgfiles.size(); bg_index++) {
193 m_bgfilesIndex.push_back(m_bgfiles[bg_index] + ".idx");
194 }
195 if(m_skip == true && m_readBGMethod == 1) m_fr = new RawFileReader(m_bgfiles, m_bgfilesIndex) ;
196 else m_fr = new RawFileReader(m_bgfiles) ;
197 }
198 catch (RawFileException& ex) {
199 ex.print();
200 return StatusCode::FAILURE;
201 }
202
203 }
204 m_raw_event = new RAWEVENT;
205
206 if(m_ifOutPut) {
207 NTuplePtr nt1(ntupleSvc(), "FILE1/n1");
208 if(nt1) m_tuple1 = nt1;
209 else {
210 m_tuple1 = ntupleSvc()->book("FILE1/n1",CLID_ColumnWiseTuple,"Field");
211 if( m_tuple1 ) {
212 status = m_tuple1->addItem("time1", m_time1 );
213 status = m_tuple1->addItem("time2", m_time2 );
214 status = m_tuple1->addItem("time3", m_time3 );
215 }
216 else {
217 (*log) << MSG::ERROR << " Cannot book N-tuple:" <<long(m_tuple1)<< endreq;
218 return StatusCode::FAILURE;
219 }
220 }
221
222 NTuplePtr nt2(ntupleSvc(), "FILE1/n2");
223 if(nt2) m_tuple2 = nt2;
224 else {
225 m_tuple2 = ntupleSvc()->book("FILE1/n2",CLID_ColumnWiseTuple,"Field");
226 if( m_tuple2 ) {
227 status = m_tuple2->addItem("tdc", m_tdc );
228 }
229 else {
230 (*log) << MSG::ERROR << " Cannot book N-tuple:" <<long(m_tuple2)<< endreq;
231 return StatusCode::FAILURE;
232 }
233 }
234
235 NTuplePtr nt3(ntupleSvc(), "FILE1/n3");
236 if(nt3) m_tuple3 = nt3;
237 else {
238 m_tuple3 = ntupleSvc()->book("FILE1/n3",CLID_ColumnWiseTuple,"Field");
239 if( m_tuple3 ) {
240 status = m_tuple3->addItem("time4", m_time4 );
241 status = m_tuple3->addItem("time5", m_time5 );
242 }
243 else {
244 (*log) << MSG::ERROR << " Cannot book N-tuple:" <<long(m_tuple3)<< endreq;
245 return StatusCode::FAILURE;
246 }
247 }
248
249 status = service("BesTimerSvc", m_timersvc);
250 if (status.isFailure()) {
251 (*log) << MSG::ERROR << name() << ": Unable to locate BesTimer Service" << endreq;
252 return StatusCode::FAILURE;
253 }
254 m_timer = m_timersvc->addItem("Read field Time");
255 m_timer1 = m_timersvc->addItem("Read raw files");
256 }
257
258 //For random seed added by caogf. Note the position of the code, otherwise it is not available.
259 CLHEP::HepRandomEngine* engine = p_BesRndmGenSvc->GetEngine("MIX");
260 HepRandom::setTheEngine(engine);
261 HepRandom::showEngineStatus();
262
263 return StatusCode::SUCCESS;
264}
265
266StatusCode MixerAlg::execute()
267{
268 //calculate time
269 if(m_ifOutPut) {
270 m_timer->start();
271 }
272
273 //caogf add
274 SmartDataPtr<Event::EventHeader> evt(eventSvc(),"/Event/EventHeader");
275 if( !evt ){
276 return StatusCode::FAILURE;
277 }
278
279 if(m_RealizationSvc->UseDBFlag() == true && m_RealizationSvc->ifReadRandTrg() == true && m_dbUserRequest == false) {
280 int runNo = evt -> runNumber();
281 if((runNo != m_runNo) || (RootInterface::Instance(*log)->getCurrentFileName() != currentMCFile)) {
282 m_runNo = runNo;
283 currentMCFile = RootInterface::Instance(*log)->getCurrentFileName();
284 m_mdcCnv->setRunId(runNo);
285 std::vector<std::string> bgfiles = m_RealizationSvc->getBgFileName();
286 if(bgfiles.size() == 0) {
287 (*log) << MSG::ERROR << "No random trigger files are found in the run " << m_runNo << std::endl;
288 exit(-1);
289 }
290 //m_ranTrgEvents = m_RealizationSvc->getRanTrgEvtNum();
291 if(! m_pattern.empty())
292 {
293 for(unsigned int k = 0; k < bgfiles.size(); k++) {
294 size_t pos_round = bgfiles[k].rfind("round");
295 (*log) << MSG::INFO<<"bgfiles: "<<bgfiles[k]<<endreq;
296 if(pos_round!=string::npos){
297 bgfiles[k].replace(bgfiles[k].begin(), bgfiles[k].begin()+pos_round, m_pattern);
298 (*log) << MSG::INFO<<"new random trigger data path: "<<bgfiles[k]<<endreq;
299 }
300 else{
301 (*log) << MSG::ERROR<<"string 'round' not found in random trigger path!"<<endreq;
302 exit(-1);
303 }
304 }
305 }
306 if (! m_newdatadir.empty())
307 {
308 for(unsigned int k = 0; k < bgfiles.size(); k++) {
309 char tmp[255];
310 std::strcpy (tmp, bgfiles[k].c_str());
311 string fname = basename(tmp);
312 bgfiles[k].replace(bgfiles[k].begin(), bgfiles[k].end(), m_newdatadir+'/'+fname);
313 (*log) << MSG::INFO<<"new random trigger data path: "<<bgfiles[k]<<endreq;
314 }
315 }
316
317 // achieve bg index files
318 std::vector<std::string> bgfilesIndex;
319 bgfilesIndex.clear();
320 for(unsigned int bg_index = 0; bg_index < bgfiles.size(); bg_index++) {
321 bgfilesIndex.push_back(bgfiles[bg_index] + ".idx");
322 }
323
324 // get event number of each bg file
325 if(m_fr) delete m_fr;
326 m_fr = new RawFileReader(bgfiles);
327 std::vector<int> ranTrgEvents = m_fr->getEventNumber(bgfilesIndex);
328
329 // remove bg files with 0 event
330 m_bgfiles.clear();
331 m_bgfilesIndex.clear();
332 m_ranTrgEvents.clear();
333 for(unsigned int bg_index = 0; bg_index < bgfiles.size(); bg_index++) {
334 if(ranTrgEvents[bg_index] > 0) {
335 m_bgfiles.push_back(bgfiles[bg_index]);
336 m_bgfilesIndex.push_back(bgfilesIndex[bg_index]);
337 m_ranTrgEvents.push_back(ranTrgEvents[bg_index]);
338 }
339 }
340
341 // get event number of each bg file
342 if(m_fr) delete m_fr;
343 m_fr = new RawFileReader(m_bgfiles);
344
345 // clear temp vector
346 bgfiles.clear();
347 bgfilesIndex.clear();
348 ranTrgEvents.clear();
349
350 // bg files exist?
351 if(m_bgfiles.empty() || m_ranTrgEvents.empty()) {
352 (*log) << MSG::WARNING << "No background datafiles found!!!" << endreq;
353 return StatusCode::SUCCESS;
354 }
355
356 if(m_skip == true) {
357 if(m_mixingMethod == 1) {
358 // Initialize
359 m_ranStepLenInCurrentFile.clear();
360 currentBGFile = "";
361 m_skipCount = 0;
362 m_totalEvent = 0;
363
364 // sort random trigger files by time increasing
365 bool ifsucc = file_sort(m_bgfiles,m_ranTrgEvents);
366 if( !ifsucc ) return StatusCode::FAILURE;
367
368 // achieve bg index files
369 m_bgfilesIndex.clear();
370 for(unsigned int bg_index = 0; bg_index < m_bgfiles.size(); bg_index++) {
371 m_bgfilesIndex.push_back(m_bgfiles[bg_index] + ".idx");
372 }
373
374 //count number of sets, total bg events in each set and total bg events in this run
375 m_vRanEvtNumInSubSet.clear();
376 m_vStreamNumInSubSet.clear();
377 m_totRanEvtNum = 0;
378 int set_no = -1;
379 int ranEvtNumInSubSet = 0;
380 int nstream = 0;
381 for(unsigned int i = 0; i < m_ranTrgEvents.size(); i++) {
382 if(i == 0) set_no = m_numSets[i];
383 if((i != 0) && (set_no != m_numSets[i])) {
384 m_vRanEvtNumInSubSet.push_back(ranEvtNumInSubSet);
385 m_vStreamNumInSubSet.push_back(nstream);
386 ranEvtNumInSubSet = 0;
387 nstream = 0;
388 set_no = m_numSets[i];
389 }
390
391 m_totRanEvtNum += m_ranTrgEvents[i];
392 ranEvtNumInSubSet += m_ranTrgEvents[i];
393 nstream++;
394 if(i == m_ranTrgEvents.size() - 1) {
395 m_vRanEvtNumInSubSet.push_back(ranEvtNumInSubSet);
396 m_vStreamNumInSubSet.push_back(nstream);
397 }
398 }
399
400 //get total event number in this run
401 int evtNumInRun = -1;
402 std::vector<int> vtotEvtNo = m_jobInfoSvc->getTotEvtNo();
403 for(unsigned int ii = 0; ii < vtotEvtNo.size(); ii+=2) {
404 if(std::abs(runNo) == std::abs(vtotEvtNo[ii]))
405 evtNumInRun = vtotEvtNo[ii+1];
406 }
407
408 //generate step length(event number) for each MC event to select background event
409 double tau = m_RealizationSvc->getTauValue();
410 double totalTime = m_RealizationSvc->getRunTotalTime();
411 if(m_RealizationSvc->getTauValue() == 0. || m_RealizationSvc->getRunTotalTime() == 0.) {
412 std::cout << "ERROR: In MixerAlg::execute() ---> The tau value or total run time is 0, please check it. Exit! " << std::endl;
413 exit(1);
414 }
415
416 bool using_exp = true;
417 if(totalTime*100 < tau) using_exp = false;
418 m_vStepLength.clear();
419 while(1) {
420 double ranNum;
421 if(using_exp == true) ranNum = RandExponential::shoot(tau);
422 else ranNum = RandFlat::shoot(0., totalTime);
423 if(ranNum > totalTime) continue;
424 ranNum = ranNum*m_totRanEvtNum/totalTime;
425 m_vStepLength.push_back((int)ranNum);
426 if(m_vStepLength.size() == evtNumInRun) break;
427 }
428
429 sort(m_vStepLength.begin(), m_vStepLength.end());
430
431 //
432 //Add a protect here
433 //
434 if(evtNumInRun <= 0 || m_totRanEvtNum <= 0) {
435 (*log) << MSG::ERROR << "The event number (or random trigger event number) in run " << evt->runNumber() << " is zero" << endreq;
436 return StatusCode::FAILURE;
437 }
438
439 //
440 //assigned step length and the number of selected bg events for each bg file
441 //
442 //1. define a map to store step length selected from each bg file
443 map_stepLength.clear();
444 for(unsigned int i = 0; i < m_ranTrgEvents.size(); i++) {
445 std::vector<int> vstepLength;
446 typedef pair<int, std::vector<int> > vpair;
447 map_stepLength.insert(vpair(i,vstepLength));
448 }
449 //2. assign step length for each bg file
450 for(unsigned int i = 0; i < m_ranTrgEvents.size(); ) {
451 //2.1 calculate total bg event number in this set and previous sets
452 int pre_ranEvtNumSubSet = 0;
453 int cur_ranEvtNumSubSet = 0;
454 set_no = m_numSets[i];
455 for(int j = 0; j < set_no; j++) {
456 if(j != (set_no - 1)) pre_ranEvtNumSubSet += m_vRanEvtNumInSubSet[j];
457 cur_ranEvtNumSubSet += m_vRanEvtNumInSubSet[j];
458 }
459 //2.2 assign step length
460 for(unsigned j = 0; j < m_vStepLength.size(); j++) {
461 //if current step length is in current set
462 if((m_vStepLength[j] >= pre_ranEvtNumSubSet) && (m_vStepLength[j] < cur_ranEvtNumSubSet)) {
463 int sub_stepLength = int((m_vStepLength[j]-pre_ranEvtNumSubSet)/m_vStreamNumInSubSet[set_no - 1]);
464 int file_id = 0;
465 int begin_fileId = -1, end_fileId = -1;
466 for(std::map<int,std::vector<int> >::iterator iter = map_stepLength.begin(); iter != map_stepLength.end(); iter++) {
467 //check current set number
468 if(set_no == m_numSets[iter->first]) {
469 if(begin_fileId == -1) begin_fileId = iter->first;
470 file_id++;
471 }
472 }
473 end_fileId = begin_fileId + file_id;
474 bool add_succ = false;
475 long loop_count = 0;
476
477 while(1) {
478 int random_file = int(RandFlat::shootInt(long(begin_fileId), long(end_fileId))); //exclude end_fileId
479 if(sub_stepLength < m_ranTrgEvents[random_file]) {
480 map_stepLength[random_file].push_back(sub_stepLength);
481 add_succ = true;
482 loop_count = 0;
483 }
484 if(add_succ) break;
485 loop_count++;
486 if(loop_count >= MAX_LOOP_TIMES) {
487 (*log) << MSG::ALWAYS << "Loop time is larger than MAX_LOOP_TIMES(" << MAX_LOOP_TIMES << ") in MixAlg, when assigning step length for each bg file." << endreq;
488 exit(1);
489 }
490 }
491 } //endif current step length is in current set
492 } //end assign step length
493 i += m_vStreamNumInSubSet[set_no - 1];
494 }
495
496 // check selected bg events number, equal to MC events?
497 unsigned int ranSelectedNum = 0;
498 for(std::map<int,std::vector<int> >::iterator iter = map_stepLength.begin(); iter != map_stepLength.end(); iter++) {
499 ranSelectedNum += (iter->second).size();
500 //std::cout << "file_id: " << iter->first << " ranEvtNumSelected: " << (iter->second).size() << std::endl;
501 }
502 if(ranSelectedNum != m_vStepLength.size()) {
503 (*log) << MSG::ERROR << "In MixerAlg::excute()--> selected bg events number not equal to MC events" << endreq;
504 return StatusCode::FAILURE;
505 }
506 }
507 }
508
509 if(m_mixingMethod == 2) {
510 // open background stream
511 if (m_fr) delete m_fr;
512 m_fr = NULL;
513 try {
514 m_bgfilesIndex.clear();
515 for(unsigned int bg_index = 0; bg_index < m_bgfiles.size(); bg_index++) {
516 m_bgfilesIndex.push_back(m_bgfiles[bg_index] + ".idx");
517 }
518 if(m_skip == true && m_readBGMethod == 1) m_fr = new RawFileReader(m_bgfiles, m_bgfilesIndex) ;
519 else m_fr = new RawFileReader(m_bgfiles) ;
520 }
521 catch (RawFileException& ex) {
522 ex.print();
523 return StatusCode::FAILURE;
524 }
525 }
526
527 m_raw_event->reset();
528 }
529 }
530 if(m_ifOutPut) {
531 m_timer->stop();
532 m_time1 = m_timer->elapsed();
533 m_timer->start();
534 }
535 //end caogf add
536 SmartDataPtr<MdcDigiCol> mdcMcDigits(eventSvc(),"/Event/Digi/MdcDigiCol");
537 if( ! mdcMcDigits )
538 (*log) << MSG::ERROR << "Unable to retrieve MdcDigiCol" << endreq;
539 else
540 (*log) << MSG::INFO << "MdcDigiCol retrieved of size "<< mdcMcDigits->size() << endreq;
541
542 SmartDataPtr<EmcDigiCol> emcMcDigits(eventSvc(),"/Event/Digi/EmcDigiCol");
543 if( ! emcMcDigits )
544 (*log) << MSG::ERROR << "Unable to retrieve EmcDigiCol" << endreq;
545 else
546 (*log) << MSG::INFO << "EmcDigiCol retrieved of size "<< emcMcDigits->size() << endreq;
547
548 SmartDataPtr<MucDigiCol> mucMcDigits(eventSvc(),"/Event/Digi/MucDigiCol");
549 if( ! mucMcDigits )
550 (*log) << MSG::ERROR << "Unable to retrieve MucDigiCol" << endreq;
551 else
552 (*log) << MSG::INFO << "MucDigiCol retrieved of size "<< mucMcDigits->size() << endreq;
553
554 SmartDataPtr<TofDigiCol> tofMcDigits(eventSvc(),"/Event/Digi/TofDigiCol");
555 if( ! tofMcDigits )
556 (*log) << MSG::ERROR << "Unable to retrieve TofDigiCol" << endreq;
557 else
558 (*log) << MSG::INFO << "TofDigiCol retrieved of size "<< tofMcDigits->size() << endreq;
559
560 for(int ievent = 0; ievent<m_nevent; ievent++)
561 {
562 (*log) << MSG::INFO << "Mixing BG Event " << ievent << endreq;
563 //if(m_skip == true) {
564 // nskipped = 0;
565 // m_skipCount = (int(m_NSkip*(RandFlat::shoot())) + 1);
566 //}
567 bool next = false;
568 if(m_skip == true) {
569 int nskip = 0;
570 if(m_mixingMethod == 1) {
571 if(m_RealizationSvc->UseDBFlag() == true && m_dbUserRequest == false) {
572 if(m_skipCount >= m_ranStepLenInCurrentFile.size()) {
573 m_ranStepLenInCurrentFile.clear();
574 for(std::map<int,std::vector<int> >::iterator iter = map_stepLength.begin(); iter != map_stepLength.end(); iter++) {
575 if(currentBGFile == "") {
576 if((iter->second).size() == 0) continue;
577 if(m_fr) delete m_fr;
578 try {
579 if(m_readBGMethod == 1) m_fr = new RawFileReader(m_bgfiles[iter->first], m_bgfiles[iter->first]+".idx") ;
580 else m_fr = new RawFileReader(m_bgfiles[iter->first]) ;
581 m_totEvtNumInCurFile = m_ranTrgEvents[iter->first];
582 }
583 catch (RawFileException& ex) {
584 ex.print();
585 }
586 m_ranStepLenInCurrentFile = iter->second;
587 m_skipCount = 0;
588 currentBGFile = m_fr->currentFile();
589 break;
590 }
591 if(currentBGFile == m_bgfiles[iter->first]) {
592 iter++;
593 if(iter == map_stepLength.end()) return StatusCode::FAILURE;
594 if((iter->second).size() == 0) {
595 while(1) {
596 iter++;
597 if(iter == map_stepLength.end()) return StatusCode::FAILURE;
598 if((iter->second).size() > 0) break;
599 }
600 }
601 if(m_fr) delete m_fr;
602 try {
603 if(m_readBGMethod == 1) m_fr = new RawFileReader(m_bgfiles[iter->first], m_bgfiles[iter->first]+".idx") ;
604 else m_fr = new RawFileReader(m_bgfiles[iter->first]) ;
605 m_totEvtNumInCurFile = m_ranTrgEvents[iter->first];
606 }
607 catch (RawFileException& ex) {
608 ex.print();
609 }
610 m_ranStepLenInCurrentFile = iter->second;
611 m_skipCount = 0;
612 currentBGFile = m_fr->currentFile();
613 break;
614 }
615 }
616 }
617 //std::cout << "skipcount: " << m_skipCount << " stepLength: " << m_ranStepLenInCurrentFile[m_skipCount] <<" total event number: " << m_totEvtNumInCurFile << std::endl;
618
619 if(m_skipCount == 0) nskip = m_ranStepLenInCurrentFile[m_skipCount];
620 else nskip = m_ranStepLenInCurrentFile[m_skipCount] - m_ranStepLenInCurrentFile[m_skipCount - 1];
621
622 m_nEventsToEnd = (m_totEvtNumInCurFile - 1) - m_ranStepLenInCurrentFile[m_skipCount]; //number of events to the end of current file
623
624 if(m_skipCount == 0 && nskip == 0) nskip = 1;
625 //std::cout << "nskip: " << nskip << std::endl;
626 m_skipCount++;
627 }
628 if(m_RealizationSvc->UseDBFlag() == false || m_dbUserRequest == true) nskip = int (2*m_NSkip*(RandFlat::shoot())) + 1;
629 if(m_totalEvent == 0 && nskip == 0) nskip = 1;
630 }
631 if(m_mixingMethod == 2) {
632 nskip = int (2*m_NSkip*(RandFlat::shoot())) + 1;
633 }
634 if(m_ifOutPut) {
635 m_timer->stop();
636 m_time2 = m_timer->elapsed();
637 m_timer->start();
638 }
639
640 // get that bg event
641 if(m_readBGMethod == 0) {
642 // same with previous versions
643 for(int j = 0; j < nskip; j++) {
644 next = nextEvent();
645 if ( ! next )
646 {
647 (*log) << MSG::ERROR << "Cannot get next background event" << endreq;
648 return StatusCode::FAILURE;
649 }
650 }
651 }
652 if(m_readBGMethod == 1) {
653 // new method to read bg events, using index file.
654 next = nextEvent(nskip,0,m_nEventsToEnd);
655 if ( ! next )
656 {
657 (*log) << MSG::ERROR << "Cannot get next background event" << endreq;
658 return StatusCode::FAILURE;
659 }
660 }
661 if(m_readBGMethod == 2) {
662 // new method to read bg events, using rude localizer.
663 next = nextEvent(nskip, 14*1024);
664 if ( ! next )
665 {
666 (*log) << MSG::ERROR << "Cannot get next background event" << endreq;
667 return StatusCode::FAILURE;
668 }
669 }
670 }
671 else { // if skip = false
672 next = nextEvent();
673 }
674
675 if(m_mixingMethod == 1) {
676 if ( !next && m_totalEvent == 0) {
677 (*log) << MSG::ERROR << "Cannot get next background event" << endreq;
678 return StatusCode::FAILURE;
679 }
680 }
681
682 if(m_mixingMethod == 2) {
683 if ( !next ) {
684 (*log) << MSG::ERROR << "Cannot get next background event" << endreq;
685 return StatusCode::FAILURE;
686 }
687 }
688
689 mixDigi(mdcMcDigits, emcMcDigits, mucMcDigits, tofMcDigits);
690 }
691
692 m_totalEvent++;
693
694 if(m_ifOutPut) {
695 m_timer->stop();
696 m_time3 = m_timer->elapsed();
697 m_tuple1->write();
698 }
699
700
701 return StatusCode::SUCCESS;
702}
703
704StatusCode MixerAlg::finalize() {
705 if( m_raw_event ) delete m_raw_event;
706 if( log ) delete log;
707 if( m_fr) delete m_fr;
708 return StatusCode::SUCCESS;
709}
710
711// Read the next event.
712bool MixerAlg::nextEvent(int nskip, int evtbyte, int eventsToEnd)
713{
714
715 m_raw_event->reset();
716
717 try {
718 if(m_ifOutPut) {
719 m_timer1->start();
720 }
721
722 const uint32_t* fragment;
723 if(m_skip == true && m_readBGMethod == 0) fragment = m_fr->nextEvent();
724 if(m_skip == true && m_readBGMethod == 1) {
725 if(nskip == 0) fragment = m_fr->currentEvent();
726 else fragment = m_fr->nextEvent(nskip - 1);
727 }
728 if(m_skip == true && m_readBGMethod == 2) {
729 if(nskip == 0) fragment = m_fr->currentEvent();
730 else fragment = m_fr->roughlyNextEvent(nskip - 1, evtbyte);
731 }
732 if(m_skip == false) fragment = m_fr->nextEvent();
733
734 if(m_ifOutPut) {
735 m_timer1->stop();
736 m_time4 = m_timer1->elapsed();
737 m_timer1->start();
738 }
739 //if (fragment == NULL) {
740 // (*log) << MSG::ERROR << "RawFileReader::nextEvent() Failed!!!" << endreq;
741 // exit(1);
742 // }
743
744 RawEvent f(fragment);
745 if (!f.check()) {
746 std::cerr << "Found invalid event (traceback):" << std::endl;
747 std::exit(1);
748 }
749 //1.print basic event information
750 uint32_t fFragmentSize = f.fragment_size_word();
751 (*log) << MSG::DEBUG << "[Event No. #" << f.global_id()
752 << "] " << f.fragment_size_word() << " words in "
753 << f.nchildren() << " subdetectors "
754 << endreq;
755 m_raw_event->setRunNo(f.run_no());
756 m_raw_event->setEventNo(f.global_id());
757
758 //fucd: get event filter information
759 const uint32_t* ef=NULL;
760 f.event_filter_info(ef);
761 if(!ef){
762 (*log) << MSG::ERROR << "Event Filter Data Failed!!!" << endreq;
763 exit(1);
764 }
765 else{
766 (*log) << MSG::DEBUG<< "Event Filter Information*********" <<std::hex<<endreq
767 <<*ef<< " "<<*(ef+1)<<" "<<*(ef+2)<<" "<<*(ef+3)<<std::dec<<endreq;
768 m_raw_event->addReHltRaw((uint32_t*)ef, (uint32_t)4);
769 }
770
771 uint32_t *robs[64];
772 int nrobs = eformat::get_robs(fragment, (const uint32_t **)robs, 64);
773
774 for (int robi = 0; robi < nrobs; robi++) {
775 eformat::ROBFragment<uint32_t*> rob(robs[robi]);
776 if ((rob.rod_detev_type() & 0x2) != 0) continue; //bad data caogf add
777 uint32_t* dataptr = NULL;
778 rob.rod_data(dataptr);
779
780 uint32_t source_id_number = rob.rod_source_id();
781 //std::cout<<"#####source_id_number#####"<<source_id_number<<std::endl;
782 source_id_number <<= 8;
783 source_id_number >>= 24;
784 //std::cout<<"#####(source_id_number<<24)>>29#####"<<source_id_number<<std::endl;
785 //be careful here!!!
786 switch(source_id_number) {
787 case 161:
788 m_raw_event->addReMdcDigi(dataptr, rob.rod_ndata());
789 break;
790 case 163:
791 m_raw_event->addReEmcDigi(dataptr, rob.rod_ndata());
792 break;
793 case 162:
794 m_raw_event->addReTofDigi(dataptr, rob.rod_ndata());
795 break;
796 case 167:
797 m_raw_event->addReEtfDigi(dataptr, rob.rod_ndata());
798 break;
799 case 164:
800 m_raw_event->addReMucDigi(dataptr, rob.rod_ndata());
801 break;
802 case 165: // trigger !!!
803 //std::cout << "Get Trigger Data -" << std::endl;
804 //for (int i = 0; i < rob.rod_ndata(); i++) {
805 // std::cout << "\t0x" << std::hex << dataptr[i] << std::dec << std::endl;
806 //}
807 m_raw_event->addReTrigGTD(dataptr, rob.rod_ndata());
808 break;
809 case 124: // EventFilter
810 m_raw_event->addReHltRaw(dataptr, rob.rod_ndata());
811 break;
812 case 241: // McParticle
813 m_raw_event->addMcParticle(dataptr, rob.rod_ndata());
814 break;
815 default:
816 //std::cerr << "no such subdetector type: " << source_id_number << std::endl;
817 break;
818 }
819 }
820 if(m_ifOutPut) {
821 m_timer1->stop();
822 m_time5 = m_timer1->elapsed();
823 m_tuple3->write();
824 }
825
826 if(m_usingFilter == true) {
827 if(eventType() == "GHadron" || eventType() == "GEBhabha" || eventType() == "GBBhabha" || eventType() == "GCosmic" || eventType() == "GDimuon") {
828 if(m_skip == true && m_readBGMethod == 0) {
829 return nextEvent(1, evtbyte, eventsToEnd);
830 }
831 if(m_skip == true && m_readBGMethod == 1) {
832 if(m_RealizationSvc->UseDBFlag() == false || m_dbUserRequest == true) return nextEvent(1, evtbyte, eventsToEnd);
833 if(eventsToEnd > 0 && m_RealizationSvc->UseDBFlag() == true && m_dbUserRequest == false ) {
834 eventsToEnd--;
835 return nextEvent(1, evtbyte, eventsToEnd);
836 }
837 }
838 if(m_skip == true && m_readBGMethod == 2) {
839 return nextEvent(1, evtbyte, eventsToEnd);
840 }
841 if(m_skip == false) return nextEvent(nskip, evtbyte, eventsToEnd);
842 }
843 }
844
845 return true;
846 }
847 catch (ReachEndOfFileList& ex){
848 ex.print();
849
850 delete m_fr;
851 try {
852 if(m_skip == true && m_readBGMethod == 1) m_fr = new RawFileReader(m_bgfiles, m_bgfilesIndex) ;
853 else m_fr = new RawFileReader(m_bgfiles);
854 }
855 catch (RawFileException& ex) {
856 ex.print();
857 return false;
858 }
859
860 return nextEvent(nskip, evtbyte, eventsToEnd);
861 }
862 catch (RawFileException& ex) {
863 ex.print();
864 }
865 catch (eformat::Issue& ex) {
866 std::cerr << std::endl << "Uncaught eformat issue: " << ex.what() << std::endl;
867 }
868 catch (ers::Issue& ex) {
869 std::cerr << std::endl << "Uncaught ERS issue: " << ex.what() << std::endl;
870 }
871 catch (std::exception& ex) {
872 std::cerr << std::endl << "Uncaught std exception: " << ex.what() << std::endl;
873 }
874 catch (...) {
875 std::cerr << std::endl << "Uncaught unknown exception" << std::endl;
876 }
877
878 return false;
879}
880
881template <class T1, class T2>
882void combineDigits (SmartDataPtr<T1>& mcDigits, T1& bgDigits, int verbosity)
883{
884 vector<T2*> newDigiCol;
885 typename T1::iterator mc;
886 typename T1::const_iterator bg;
887 bool new_digi;
888 for(bg = bgDigits.begin(); bg != bgDigits.end(); bg++ )
889 {
890 new_digi = true;
891 for(mc = mcDigits->begin(); mc != mcDigits->end(); mc++ )
892 {
893 if((*mc)->identify()==(*bg)->identify())
894 {
895 if( verbosity < 2 )
896 {
897 cout << "****************************************"<<endl;
898 cout << "MC id " << (*mc)->identify().get_value()
899 << " BG Id " << (*bg)->identify().get_value() << endl;
900 cout<<"==> MC Digi : ";
901 (*mc)->fillStream(cout);
902 cout<<"==> BG Digi : ";
903 (*bg)->fillStream(cout);
904 }
905
906 (*mc)->setTrackIndex((*mc)->getTrackIndex() - 999);
907 *(*mc) += *(*bg);
908
909 new_digi = false;
910 if( verbosity < 2 )
911 {
912 cout<<"==> New MC Digi: ";
913 (*mc)->fillStream(cout);
914 cout << "****************************************"<<endl;
915 }
916 }
917 }
918
919 // no signal digi in this channel. Create new digi with BG only
920 if (new_digi) {
921 (*bg)->setTrackIndex(-1000);
922 newDigiCol.push_back(*bg);
923 }
924 }
925
926 for(bg=newDigiCol.begin(); bg!=newDigiCol.end(); bg++ )
927 mcDigits->push_back(*bg);
928}
929
930void combineMdcDigits (SmartDataPtr<MdcDigiCol>& mcDigits, MdcDigiCol& bgDigits, int verbosity)
931{
932 vector<MdcDigi*> newDigiCol;
933 MdcDigiCol::const_iterator mc;
934 MdcDigiCol::const_iterator bg;
935 bool new_digi;
936 for(bg = bgDigits.begin(); bg != bgDigits.end(); bg++ )
937 {
938 if((*bg)->getChargeChannel() < 0x7FFFFFFF) (*bg)->setChargeChannel(0);
939 new_digi = true;
940 for(mc = mcDigits->begin(); mc != mcDigits->end(); mc++ )
941 {
942 if((*mc)->identify()==(*bg)->identify())
943 {
944 if( verbosity < 2 )
945 {
946 cout << "****************************************"<<endl;
947 cout << "MC id " << (*mc)->identify().get_value()
948 << " BG Id " << (*bg)->identify().get_value() << endl;
949 cout<<"==> MC Digi : ";
950 (*mc)->fillStream(cout);
951 cout<<"==> BG Digi : ";
952 (*bg)->fillStream(cout);
953 }
954
955 (*mc)->setTrackIndex((*mc)->getTrackIndex() - 999);
956 *(*mc) += *(*bg);
957
958 new_digi = false;
959 if( verbosity < 2 )
960 {
961 cout<<"==> New MC Digi: ";
962 (*mc)->fillStream(cout);
963 cout << "****************************************"<<endl;
964 }
965 }
966 }
967
968 // no signal digi in this channel. Create new digi with BG only
969 if (new_digi) {
970 (*bg)->setTrackIndex(-1000);
971 newDigiCol.push_back(*bg);
972 }
973 }
974
975 for(bg=newDigiCol.begin(); bg!=newDigiCol.end(); bg++ )
976 mcDigits->push_back(*bg);
977}
978
979void combineTofDigits(SmartDataPtr<TofDigiCol>& mcDigits, TofDigiCol& bgDigits, int verbosity)
980{
981 vector<TofDigi*> newDigiCol;
982 //typename TofDigiCol::const_iterator bg;
983 TofDigiCol::const_iterator bgTof = bgDigits.begin();
984 for(; bgTof!=bgDigits.end(); bgTof++ )
985 {
986 (*bgTof)->setTrackIndex(-1000);
987 newDigiCol.push_back(*bgTof);
988 }
989 for(bgTof=newDigiCol.begin(); bgTof!=newDigiCol.end(); bgTof++ ) {
990 mcDigits->push_back(*bgTof);
991 }
992}
993
994void MixerAlg::mixDigi(SmartDataPtr<MdcDigiCol>& mdcMcDigits,
995 SmartDataPtr<EmcDigiCol>& emcMcDigits,
996 SmartDataPtr<MucDigiCol>& mucMcDigits,
997 SmartDataPtr<TofDigiCol>& tofMcDigits)
998{
999 if( b_mdc )// MDC
1000 {
1001 MdcDigiCol mdcCol;
1002 decodeMdc(&mdcCol);
1003 //combineDigits<MdcDigiCol, MdcDigi>(mdcMcDigits, mdcCol, log->level());
1004
1005 // Find minimal tdc and maximum tdc and calculate mean tdc.
1006 if(m_ifSmearT0 && getTiming() > 0) {
1007 int tdc_min = -9, tdc_max = -9, tdc_tot = 0, tdc_num = 0;
1008 for(MdcDigiCol::const_iterator bg = mdcCol.begin(); bg != mdcCol.end(); bg++ )
1009 {
1010 if((*bg)->getTimeChannel() < 0x7FFFFFFF) {
1011 tdc_tot += (*bg)->getTimeChannel();
1012 tdc_num++;
1013 if(tdc_min < 0) tdc_min = (*bg)->getTimeChannel();
1014 else {
1015 if(tdc_min > (*bg)->getTimeChannel()) tdc_min = (*bg)->getTimeChannel();
1016 }
1017 if(tdc_max < 0) tdc_max = (*bg)->getTimeChannel();
1018 else {
1019 if(tdc_max < (*bg)->getTimeChannel()) tdc_max = (*bg)->getTimeChannel();
1020 }
1021 }
1022 }
1023 int tdc_mean = (int) ((double)tdc_tot/(double)tdc_num);
1024 tdc_num = 0;
1025 int tdc_shift;
1026 while(1) {
1027 tdc_shift = tdc_mean - CLHEP::RandFlat::shootInt(long(0), long(80*24/0.09375));
1028 if((tdc_min - tdc_shift)>=0 && (tdc_max - tdc_shift) <= int(80*24/0.09375)) break;
1029 tdc_num++;
1030 if(tdc_num > m_maxLoop) break;
1031 }
1032
1033 // Set new tdc
1034 for(MdcDigiCol::const_iterator bg = mdcCol.begin(); bg != mdcCol.end(); bg++ )
1035 {
1036 if((*bg)->getTimeChannel() >= 0x7FFFFFFF) continue;
1037 int newTDC = (*bg)->getTimeChannel() - tdc_shift;
1038 if(newTDC < 0 || newTDC > int(80*24/0.09375)) newTDC = int(CLHEP::RandFlat::shoot()*80*24/0.09375);
1039 (*bg)->setTimeChannel(newTDC);
1040
1041 //m_tdc = (*bg)->getTimeChannel();
1042 //m_tuple2->write();
1043 }
1044 }
1045 //combineDigits<MdcDigiCol, MdcDigi>(mdcMcDigits, mdcCol, log->level());
1046 combineMdcDigits(mdcMcDigits, mdcCol, log->level());
1047 }
1048 if( b_emc )//EMC
1049 {
1050 EmcDigiCol emcCol;
1051 decodeEmc(&emcCol);
1052 combineDigits<EmcDigiCol, EmcDigi>(emcMcDigits, emcCol, log->level());
1053 }
1054 if( b_muc )// MUC
1055 {
1056 MucDigiCol mucCol;
1057 decodeMuc(&mucCol);
1058 combineDigits<MucDigiCol, MucDigi>(mucMcDigits, mucCol, log->level());
1059 }
1060 if( b_tof )// TOF
1061 {
1062 TofDigiCol tofCol;
1063 decodeTof(&tofCol);
1064 //combineDigits<TofDigiCol, TofDigi>(tofMcDigits, tofCol, log->level());
1065 combineTofDigits(tofMcDigits, tofCol, log->level());
1066 }
1067}
1068
1070{
1071 const BufferHolder& mdcBuf = m_raw_event->getMdcBuf();
1072 m_mdcCnv->convert(mdcBuf, digiCol);
1073}
1074
1076{
1077 const BufferHolder& mucBuf = m_raw_event->getMucBuf();
1078 m_mucCnv->convert(mucBuf, digiCol);
1079}
1080
1082{
1083 const BufferHolder& emcBuf = m_raw_event->getEmcBuf();
1084 m_emcCnv->convert(emcBuf, digiCol);
1085}
1086
1088{
1089 const BufferHolder& tofBuf = m_raw_event->getTofBuf();
1090 const BufferHolder& etfBuf = m_raw_event->getEtfBuf();
1091 if( etfBuf.nBuf()>0 ) {
1092 m_tofCnv->convert(tofBuf, etfBuf, digiCol);
1093 }
1094 else {
1095 m_tofCnv->convert(tofBuf, digiCol);
1096 }
1097}
1098
1100{
1101 const BufferHolder& hltBuf = m_raw_event->getHltBuf();
1102 DstHltInf* hlt = new DstHltInf();
1103 hlt->setEventType(hltBuf(0)[0]);
1104
1105 std::string evtType = hlt->getEventName();
1106
1107 if(hlt) delete hlt;
1108
1109 return evtType;
1110}
1111
1113{
1114 int timing = 0;
1115
1116 TrigGTD* trigGTD = NULL;
1117 TrigGTDCol* gtdCol = new TrigGTDCol;
1118
1119 const BufferHolder& gtdBuf = m_raw_event->getGTDBuf();
1120 uint32_t nbuf = gtdBuf.nBuf();
1121
1122 for (uint32_t i = 0; i < nbuf; i++) {
1123 uint32_t* buf = gtdBuf(i);
1124 uint32_t bufSize = gtdBuf.bufSize(i);
1125 uint32_t index = 0;
1126 while (bufSize - index > 1) {
1127 uint32_t blockSize = ( ((*(buf+index))>>14) & 0x3FF);
1128 uint32_t id = ((*(buf+index))>>24);
1129 if (blockSize == 0 || (index+blockSize) > bufSize) break;
1130 if ((id> 0xD1 && id < 0xD8 && id != 0xD5) || id == 0xDA || (id > 0xE1 && id < 0xED)) {
1131 trigGTD = new TrigGTD(buf+index);
1132 gtdCol->push_back(trigGTD);
1133 }
1134 index += blockSize;
1135 }
1136 }
1137
1138 TrigGTDCol::iterator iter = gtdCol->begin();
1139 for (;iter != gtdCol->end(); iter++ ) {
1140 const uint32_t boardId = (*iter)->getId(); //The board Id 0xd3: GTL, 0xD2: SAF1, 0xD4: SAF2, 0xD6: SAF3
1141 const uint32_t timeWindow = (*iter)->getTimeWindow(); //Time window, bit8 to bit13, total: 0--31
1142 const uint32_t size = (*iter)->getDataSize(); //The size of trigger data, not include head
1143 const uint32_t* trigData = (*iter)->getDataPtr(); //Trigger data
1144
1145 //Get data group 5 in GTL, including trigger channel, timing and prescale.
1146 if(boardId == 0xd3) {
1147 if(size%timeWindow != 0) {
1148 std::cout << "GTL data is NOT completed, exit." << std::endl;
1149 exit(0);
1150 }
1151 for(uint32_t j = 0; j < size; j++) {
1152 uint32_t dataId = ((trigData[j] >> 24) & 0x7);
1153 if(dataId != 5) continue; //find data group 5
1154 for(uint32_t i = 1, loop = 0; loop < 24; i <<= 1, loop++) {
1155 if((loop == 16) && (trigData[j] & i)) timing = 1;
1156 if((loop == 17) && (trigData[j] & i) && (timing != 1)) timing = 2;
1157 if((loop == 18) && (trigData[j] & i) && (timing == 0)) timing = 3;
1158 }
1159 }
1160 }
1161 }
1162
1163 return timing;
1164}
1165
1166bool MixerAlg::file_sort(std::vector<std::string>& files, std::vector<int>& ranEvtNums) {
1167 std::vector<std::string> tmp_files = files;
1168 std::vector<int> tmp_ranEvtNums = ranEvtNums;
1169 files.clear();
1170 ranEvtNums.clear();
1171 m_numSets.clear();
1172
1173 const char* file_index[100];
1174 int num_index[100];
1175 int set_index[100];
1176 for(int i = 0; i < 100; i++) {
1177 file_index[i] = "";
1178 num_index[i] = 0;
1179 set_index[i] = 0;
1180 }
1181
1182 if(tmp_files.size() >= 100) {
1183 std::cout << "ERROR: In MixerAlg::file_sort(), please change bigger array size" << std::endl;
1184 return false;
1185 }
1186
1187 for(unsigned int i = 0; i < tmp_files.size(); i++) {
1188 int index = 0;
1189 const char* file1 = tmp_files[i].c_str();
1190 const char* substr1 = strstr(file1,"_file");
1191 int strlen1 = strlen(substr1);
1192 char cset1[4];
1193 char cnum1[2];
1194
1195 for(int sub1 = 0; sub1 < strlen1; sub1++) {
1196 if(substr1[sub1] == 'e') {
1197 cset1[0] = substr1[sub1+1];
1198 cset1[1] = substr1[sub1+2];
1199 cset1[2] = substr1[sub1+3];
1200 cset1[3] = '\0';
1201 }
1202 else if(substr1[sub1] == '-') {
1203 cnum1[0] = substr1[sub1+1];
1204 cnum1[1] = '\0';
1205 break;
1206 }
1207 else {
1208 continue;
1209 }
1210 }
1211
1212 int set1 = atoi(cset1);
1213 int num1 = atoi(cnum1);
1214 int encode_set1 = set1*100 + num1;
1215
1216 for(unsigned int j = 0; j < tmp_files.size(); j++) {
1217 if(i == j) continue;
1218 const char* file2 = tmp_files[j].c_str();
1219 const char* substr2 = strstr(file2,"_file");
1220 int strlen2 = strlen(substr2);
1221 char cset2[4];
1222 char cnum2[2];
1223 for(int sub2 = 0; sub2 < strlen2; sub2++) {
1224 if(substr2[sub2] == 'e') {
1225 cset2[0] = substr2[sub2+1];
1226 cset2[1] = substr2[sub2+2];
1227 cset2[2] = substr2[sub2+3];
1228 cset2[3] = '\0';
1229 }
1230 else if(substr2[sub2] == '-') {
1231 cnum2[0] = substr2[sub2+1];
1232 cnum2[1] = '\0';
1233 break;
1234 }
1235 else {
1236 continue;
1237 }
1238 }
1239 int set2 = atoi(cset2);
1240 int num2 = atoi(cnum2);
1241 int encode_set2 = set2*100 + num2;
1242 if(encode_set1 > encode_set2) index++;
1243 }
1244 file_index[index] = tmp_files[i].c_str();
1245 num_index[index] = tmp_ranEvtNums[i];
1246 set_index[index] = set1;
1247 }
1248
1249 int setNo = -10;
1250 for(unsigned int i = 0; i < tmp_files.size(); i++) {
1251 files.push_back(file_index[i]);
1252 ranEvtNums.push_back(num_index[i]);
1253 if(setNo != set_index[i]) {
1254 setNo = set_index[i];
1255 int numSets_size = m_numSets.size();
1256 if(numSets_size == 0) m_numSets.push_back(1);
1257 if(numSets_size != 0) m_numSets.push_back(m_numSets[numSets_size - 1] + 1);
1258 }
1259 else {
1260 int numSets_size = m_numSets.size();
1261 m_numSets.push_back(m_numSets[numSets_size - 1]);
1262 }
1263 }
1264
1265 return true;
1266}
int runNo
Definition: DQA_TO_DB.cxx:12
ObjectVector< TrigGTD > TrigGTDCol
EvtStreamInputIterator< typename Generator::result_type > iter(Generator gen, int N=0)
ObjectVector< MdcDigi > MdcDigiCol
ObjectVector< MucDigi > MucDigiCol
ObjectVector< TofDigi > TofDigiCol
void combineMdcDigits(SmartDataPtr< MdcDigiCol > &mcDigits, MdcDigiCol &bgDigits, int verbosity)
Definition: MixerAlg.cxx:930
void combineTofDigits(SmartDataPtr< TofDigiCol > &mcDigits, TofDigiCol &bgDigits, int verbosity)
Definition: MixerAlg.cxx:979
void combineDigits(SmartDataPtr< T1 > &mcDigits, T1 &bgDigits, int verbosity)
Definition: MixerAlg.cxx:882
void combineMdcDigits(SmartDataPtr< MdcDigiCol > &mcDigits, MdcDigiCol &bgDigits, int verbosity)
Definition: MixerAlg.cxx:930
void combineTofDigits(SmartDataPtr< TofDigiCol > &mcDigits, TofDigiCol &bgDigits, int verbosity)
Definition: MixerAlg.cxx:979
void bg(int i, double p)
Definition: betagamma.cxx:1
void start(void)
Definition: BesTimer.cxx:27
void stop(void)
Definition: BesTimer.cxx:39
const string & getEventName() const
Definition: DstHltInf.cxx:61
static EmcConverter * instance(int runMode=2)
Definition: EmcConverter.cxx:9
StatusCode convert(const BufferHolder &src, EmcDigiCol *des)
virtual CLHEP::HepRandomEngine * GetEngine(const std::string &StreamName)=0
Interface to the CLHEP engine.
virtual BesTimer * addItem(const std::string &name)=0
static MdcConverter * instance(int runMode=2)
Definition: MdcConverter.cxx:6
void init(int runFrom, int runTo)
StatusCode convert(const BufferHolder &src, MdcDigiCol *des)
std::string prepareDbQuery()
Definition: MixerAlg.cxx:84
bool file_sort(std::vector< std::string > &files, std::vector< int > &ranEvtNums)
Definition: MixerAlg.cxx:1166
void mixDigi(SmartDataPtr< MdcDigiCol > &mdcMcDigits, SmartDataPtr< EmcDigiCol > &emcMcDigits, SmartDataPtr< MucDigiCol > &mucMcDigits, SmartDataPtr< TofDigiCol > &tofMcDigits)
Definition: MixerAlg.cxx:994
void decodeMuc(MucDigiCol *digiCol)
Definition: MixerAlg.cxx:1075
void decodeEmc(EmcDigiCol *digiCol)
Definition: MixerAlg.cxx:1081
StatusCode finalize()
Definition: MixerAlg.cxx:704
bool nextEvent(int nskip=0, int evtbyte=0, int eventsToEnd=0)
Definition: MixerAlg.cxx:712
MixerAlg(const std::string &name, ISvcLocator *pSvcLocator)
Definition: MixerAlg.cxx:37
int getTiming()
Definition: MixerAlg.cxx:1112
StatusCode execute()
Definition: MixerAlg.cxx:266
StatusCode initialize()
Definition: MixerAlg.cxx:115
void decodeMdc(MdcDigiCol *digiCol)
Definition: MixerAlg.cxx:1069
void decodeTof(TofDigiCol *digiCol)
Definition: MixerAlg.cxx:1087
std::string eventType()
Definition: MixerAlg.cxx:1099
static MucConverter * instance()
Definition: MucConverter.cxx:5
StatusCode convert(const BufferHolder &src, MucDigiCol *des)
void reset()
Definition: RAWEVENT.cxx:6
virtual void print() const
const uint32_t * roughlyNextEvent(int nIgnore, int evtByte=0)
const uint32_t * nextEvent()
static std::vector< int > getEventNumber(const VFileNames_t &idxfnames)
std::string currentFile()
virtual void print() const
static RootInterface * Instance(MsgStream log)
singleton behaviour
StatusCode convert(const BufferHolder &src, TofDigiCol *des, LumiDigiCol *des2=0)
static TofConverter * instance()
Definition: TofConverter.cxx:6
TFile f("ana_bhabha660a_dqa_mcPat_zy_old.root")
size_t get_robs(const uint32_t *fragment, const uint32_t **rob, size_t max_count)
Definition: util.cxx:105