00001 #include "TrigReadProc.h"
00002 #include "TrigSim/ITsTriggerTool.h"
00003
00004 #include "Event/SimTrigHeader.h"
00005 #include "Event/ElecHeader.h"
00006 #include "Event/ElecPulseHeader.h"
00007 #include "Event/ElecCrateHeader.h"
00008 #include "Event/ReadoutPmtCrate.h"
00009 #include "Event/ReadoutRpcCrate.h"
00010 #include "Event/GenHeader.h"
00011 #include "MuonProphet/MpMuonFate.h"
00012
00013 #include <vector>
00014
00015 TrigReadProc::TrigReadProc(const std::string& name, ISvcLocator* pSvcLocator)
00016 : StageProcessor<SimReadoutHeader>(name,pSvcLocator)
00017 {
00018
00019 m_trigToolNames.push_back("TsMultTriggerTool");
00020 declareProperty("TrigTools",m_trigToolNames,
00021 "Tools to generate Triggers");
00022 declareProperty("TriggerFilter",m_trigFilterName="TsSortTool",
00023 "Tool to do final filtering / combining of triggers");
00024
00025
00026 m_roToolNames.push_back("ROsFeeReadoutTool");
00027 m_roToolNames.push_back("ROsFecReadoutTool");
00028 declareProperty("RoTools",m_roToolNames,
00029 "Tools to generate Triggers");
00030 declareProperty("TrigPackagerTool",m_roTrigPackName="ROsTriggerDataPackerTool",
00031 "Tool to convert trigger commands from TrigSim to TriggerDataPackage");
00032
00033
00034 declareProperty("FastTrigReadSimTool", m_fastToolName = "FastTrigReadSimTool" , "Fast trigger and readout simulation tool");
00035
00036 }
00037
00038 TrigReadProc::~TrigReadProc()
00039 {
00040 }
00041
00042 StatusCode TrigReadProc::initialize()
00043 {
00044 StatusCode sc = StageProcessor<SimReadoutHeader>::initialize();
00045 if (sc.isFailure()) return sc;
00046
00047
00048 for (size_t ind=0; ind < m_trigToolNames.size(); ++ind) {
00049 std::string tgr = m_trigToolNames[ind];
00050 try {
00051 m_trigTools.push_back(tool<ITsTriggerTool>(tgr));
00052 }
00053 catch(const GaudiException& exg) {
00054 fatal() << "Failed to get Trigger Tool: \"" << tgr << "\"" << endreq;
00055 return StatusCode::FAILURE;
00056 }
00057 info () << "Added trigger tool " << tgr << endreq;
00058 }
00059 try {
00060 m_triggerSorter = tool<ITsTriggerTool>(m_trigFilterName);
00061 }
00062 catch(const GaudiException& exg){
00063 fatal() << "Failed to get TriggerFilterTool: \"" << m_trigFilterName
00064 << "\"" << endreq;
00065 return StatusCode::FAILURE;
00066 }
00067
00068
00069
00070 try{
00071 m_roTrigPackTool = tool<IROsTriggerDataPackerTool>(m_roTrigPackName);
00072 }catch(const GaudiException& exg){
00073 fatal() << "Failed to get Readout Trigger Package Tool: \""
00074 << m_roTrigPackName << "\"" << endreq;
00075 return StatusCode::FAILURE;
00076 }
00077
00078 for (size_t ind=0; ind < m_roToolNames.size(); ++ind) {
00079 std::string rotool = m_roToolNames[ind];
00080 try {
00081 m_roTools.push_back(tool<IROsReadoutTool>(rotool));
00082 }
00083 catch(const GaudiException& exg) {
00084 fatal() << "Failed to get Readout Tool: \"" << rotool << "\"" << endreq;
00085 return StatusCode::FAILURE;
00086 }
00087 info () << "Added readout tool " << rotool << endreq;
00088 }
00089
00090
00091 m_fastTool = tool<IFastTrigReadSimTool>(m_fastToolName);
00092 info() << "Added fast simulation tool: " << m_fastToolName << endreq;
00093
00095 m_currentTime=0;
00096 m_SimRODataList.clear();
00097
00098
00099 return StatusCode::SUCCESS;
00100 }
00101
00102 StatusCode TrigReadProc::execute()
00103 {
00104 debug()<<"executing... "<<endreq;
00105
00106
00107 static bool first_time = true;
00108 if (!first_time && m_currentTime > thisStage()->currentTime()) {
00109 return StatusCode::SUCCESS;
00110 }
00111
00114 FFTimeStamp tm(0,0);
00115 FFTimeStamp dt(0,0);
00116 FFTimeStamp localtime(0,0);
00117
00118 SimReadoutData::DataList::iterator SimROit;
00119
00120 if(first_time) {
00121
00122 } else {
00123 SimROit=m_SimRODataList.begin();
00124 localtime=SimROit->first;
00125 }
00126
00128
00129
00130 while(first_time||localtime>=lowerStage()->currentTime()) {
00131 first_time=false;
00133
00134
00135 IStageData* pIStageData=0;
00136 StatusCode sc = lowerStage()->nextElement(pIStageData);
00137 if (sc.isFailure()) {
00138 error() << "Failed to pull ElecHeader" << endreq;
00139 return sc;
00140 }
00141
00142 ElecData* pElecData=0;
00143 try{
00144 pElecData = dynamic_cast<ElecData*>(pIStageData);
00145 }
00146 catch(...) {
00147 error() << "Failed to get GnrtrData pointer" <<endreq;
00148 }
00149
00150
00157
00158 tm=pElecData->time();
00159
00160
00162 preExecute();
00163 SimReadoutData* pSimROData=0;
00164
00166
00167
00168 ElecHeader* ehead = &(pElecData->header());
00169 debug()<<"ehead at "<<ehead<<endreq;
00170
00172 bool G4Noble = false;
00173 const DayaBay::ElecPulseHeader* pPulse = ehead -> pulseHeader();
00174 const DayaBay::ElecCrateHeader* pCrate = ehead -> crateHeader();
00176 if( pPulse == 0 && pCrate == 0 ) {
00178 debug()<<"input header size " << ehead->inputHeaders().size()<<endreq;
00179 const DayaBay::IHeader* iSheader = (ehead -> inputHeaders()) [0];
00180 const DayaBay::IHeader* iGheader = (iSheader->inputHeaders()) [0];
00181 const DayaBay::GenHeader* genHeader = dynamic_cast<const DayaBay::GenHeader*>(iGheader);
00182 const HepMC::GenEvent* genEvent = genHeader->event();
00183
00184 if( genEvent ) {
00185 HepMC::GenEvent::particle_const_iterator pci, pci_end = genEvent->particles_end();
00186
00187 for( pci = genEvent->particles_begin(); pci != pci_end; ++pci ) {
00188 if( (*pci)->pdg_id() == 13 || (*pci)->pdg_id() == -13 ) {
00189 if( (*pci)->status() != MpMuonFate::kNeedSim ) {
00190 G4Noble = true;
00191 }
00192 }
00193 }
00194 }
00195 }
00196
00197
00198 SimReadoutHeader* srhead=MakeHeaderObject();
00199 debug()<<"exec num "<<srhead->execNumber()<<endreq;
00200
00201 if(G4Noble) {
00202
00203 sc = this->fastTrigReadSim( ehead, srhead );
00204 if (sc.isFailure()) return sc;
00205 debug()<<"exec num "<<srhead->execNumber()<<endreq;
00206 } else {
00207
00208 sc = this->TR_execute( ehead, srhead );
00209 if (sc.isFailure()) return sc;
00210 debug()<<"exec num "<<srhead->execNumber()<<endreq;
00211 }
00212
00213
00214 pSimROData=new SimReadoutData(*srhead);
00215 debug()<<"exec num "<<srhead->execNumber()<<endreq;
00217
00218 this->AppendInputHeader( ehead );
00219
00220 postExecute();
00221
00222
00223 delete pElecData; pElecData = 0;
00224
00225
00226
00227
00228
00229 m_SimRODataList.insert(SimReadoutData::DataList::value_type(pSimROData->time(),pSimROData));
00230
00232 SimROit=m_SimRODataList.begin();
00233 localtime=SimROit->first;
00234
00235
00236 }
00237
00238 m_currentTime=localtime;
00239
00240
00243
00244 SimROit=m_SimRODataList.begin();
00245 debug() << "to grep: new data pushed out at time " << SimROit->first << endreq;
00246 debug() << "New SimReadoutHeader at "<<&(SimROit->second->header())<<endreq;
00247 debug() << "It has "<<SimROit->second->header().readouts().size()<<" readouts"<<endreq;
00248 debug() << "TimeStamp "<<SimROit->second->header().timeStamp()<<endreq;
00249 debug() << "Earliest "<<SimROit->second->header().earliest()<<endreq;
00250 debug() << "Latest "<<SimROit->second->header().latest()<<endreq;
00251
00252 thisStage()->pushElement(SimROit->second);
00253 this->registerData(*(SimROit->second));
00254 m_SimRODataList.erase(SimROit);
00255
00256
00257 return StatusCode::SUCCESS;
00258 }
00259
00260 StatusCode TrigReadProc::finalize()
00261 {
00262
00263 for (size_t ind=0; ind < m_trigTools.size(); ++ind) {
00264 m_trigTools[ind]->release();
00265 }
00266 m_trigTools.clear();
00267 m_triggerSorter->release();
00268
00269
00270 for (size_t ind=0; ind < m_roTools.size(); ++ind) {
00271 m_roTools[ind]->release();
00272 }
00273 m_roTools.clear();
00274
00275 return this->StageProcessor<SimReadoutHeader>::finalize();
00276 }
00277
00278 StatusCode TrigReadProc::runTrigSim(const ElecHeader& ehead,
00279 SimTrigHeader*& thead)
00280 {
00281 thead->setCommandHeader(new SimTrigCommandHeader(thead));
00282
00283
00284 thead->setContext(ehead.context());
00285 thead->setTimeStamp(ehead.timeStamp());
00286 thead->setEarliest(ehead.earliest());
00287 thead->setLatest(ehead.latest());
00288 debug()<<"runTrigSim "<<thead->earliest()<<endreq;
00289
00290
00291 for (size_t ind = 0; ind< m_trigTools.size(); ++ind) {
00292 debug () << "Running trigger tool #" << ind << " " << m_trigToolNames[ind] << endreq;
00293
00294 StatusCode sc = m_trigTools[ind]->mutate(thead,ehead);
00295 if (sc.isFailure()) {
00296 fatal() << "Trigger Tool " << m_trigToolNames[ind]
00297 << " failed" << endreq;
00298 delete thead; thead = 0;
00299 return StatusCode::FAILURE;
00300 }
00301 }
00302 if ( m_triggerSorter->mutate(thead,ehead).isFailure()){
00303 fatal() << "Trigger Tool " << m_triggerSorter
00304 << " failed" << endreq;
00305 return StatusCode::FAILURE;
00306 }
00307
00308 return StatusCode::SUCCESS;
00309 }
00310
00311 StatusCode TrigReadProc::runReadoutSim(const ElecHeader& ehead,
00312 const SimTrigHeader& thead,
00313 SimReadoutHeader*& srhead)
00314 {
00315
00316 srhead->setContext(ehead.context());
00317 srhead->setTimeStamp(ehead.timeStamp());
00318 srhead->setEarliest(ehead.earliest());
00319 srhead->setLatest(ehead.latest());
00320 debug()<<"runReadoutSim "<<srhead->earliest()<<endreq;
00321
00322
00323
00324
00325 debug() <<"Creating Trigger Data Packages" << endreq;
00327 std::vector<DayaBay::ReadoutTriggerDataPkg*> trigPkgs;
00329 m_roTrigPackTool->fillDataPakages(trigPkgs,thead);
00330
00331
00332 for (size_t ind = 0; ind< m_roTools.size(); ++ind) {
00333
00334 debug () << "Running readout tool #" << ind << " " << m_roToolNames[ind] << endreq;
00335
00336 debug()<<"before mutate: exec num "<<srhead->execNumber()<<endreq;
00337 StatusCode sc = m_roTools[ind]->mutate(srhead,trigPkgs,ehead);
00338 if (sc.isFailure()) {
00339 fatal() << "Readout Tool " << m_roToolNames[ind]
00340 << " failed" << endreq;
00341 delete srhead; srhead = 0;
00342 return StatusCode::FAILURE;
00343 }
00344 }
00345
00346 return StatusCode::SUCCESS;
00347 }
00348
00349 StatusCode TrigReadProc::TR_execute(const ElecHeader* ehead,SimReadoutHeader*& srhead)
00350 {
00351 StatusCode sc;
00352 debug() << "Runing Trigger and Readout Simulation" << endreq;
00353
00354 {
00355 const ElecPulseHeader::PulseCollectionMap& pcmap = ehead->pulseHeader()->pulseCollection();
00356 debug() << "TR_execute() got " << pcmap.size() << " pulse collections:\n";
00357 ElecPulseHeader::PulseCollectionMap::const_iterator it, done=pcmap.end();
00358 for (it=pcmap.begin(); it != done; ++it) {
00359 debug() << "\tdetector: " << it->first << " has " << it->second->pulses().size() << "\n";
00360 }
00361 debug() << endreq;
00362 }
00363
00364
00365 SimTrigHeader* thead = new SimTrigHeader;
00366 sc = this->runTrigSim(*ehead,thead);
00367 if (sc.isFailure() || !thead) {
00368 error() << "fillReadouts(): Failed to run TrigRead" << endreq;
00369 return StatusCode::FAILURE;
00370 }
00371 put(thead,thead->defaultLocation());
00372
00373 std::vector<const DayaBay::IHeader*> iElecHeaders;
00374 iElecHeaders.push_back(ehead);
00375 thead->setInputHeaders(iElecHeaders);
00376
00377 thead->setExecNumber(srhead->execNumber());
00378
00379
00380 debug()<<"exec num "<<srhead->execNumber()<<endreq;
00381 sc = this->runReadoutSim(*ehead,*thead,srhead);
00382 if (sc.isFailure() || !srhead) {
00383 error() << "fillReadouts(): Failed to run ReadoutSim" << endreq;
00384 return StatusCode::FAILURE;
00385 }
00386
00387 AppendInputHeader(thead);
00388
00389 return StatusCode::SUCCESS;
00390 }
00391
00392 StatusCode TrigReadProc::fastTrigReadSim(const ElecHeader* ehead,SimReadoutHeader*& srhead)
00393 {
00394 SimTrigHeader *sthead = new SimTrigHeader;
00395
00396 StatusCode sc;
00397 sc = this->m_fastTool->mutate( srhead, sthead, *ehead );
00398 if (sc.isFailure()) return sc;
00399
00401 sthead->setContext( ehead->context());
00402 sthead->setTimeStamp( ehead->timeStamp());
00403 sthead->setEarliest( ehead->earliest());
00404 sthead->setLatest( ehead->latest());
00405
00406
00407 srhead->setContext( ehead->context());
00408 srhead->setTimeStamp( ehead->timeStamp());
00409 srhead->setEarliest( ehead->earliest());
00410 srhead->setLatest( ehead->latest());
00411
00412
00413
00414 put( sthead, sthead->defaultLocation());
00415
00416
00417 std::vector<const DayaBay::IHeader*> iElecHeaders;
00418 iElecHeaders.push_back( ehead );
00419 sthead->setInputHeaders( iElecHeaders );
00420
00421
00422 sthead->setExecNumber(srhead->execNumber());
00423
00424
00425 AppendInputHeader( sthead );
00426
00427 return StatusCode::SUCCESS;
00428 }
00429
00430
00431
00432
00433