00001
00010
00011 #include "Sim15.h"
00012 #include "Stage/HeaderStageData.h"
00013 #include "Stage/IStageDataManager.h"
00015
00016
00017 #include "Event/GenHeader.h"
00018
00019
00020 #include "HepMC/GenEvent.h"
00021
00022
00023 #include "DetDesc/IGeometryInfo.h"
00024 #include "DetDesc/DetectorElement.h"
00025 #include "DetDesc/SolidBase.h"
00026
00027
00028 #include "Event/SimHeader.h"
00029 #include "Event/SimHitHeader.h"
00030 #include "Event/SimHitCollection.h"
00031 #include "Event/SimPmtHit.h"
00032 #include "Event/SimHit.h"
00033
00034
00035 #include "Event/ElecHeader.h"
00036
00037
00038 #include "Event/SimTrigHeader.h"
00039
00040
00041 #include "Event/SimReadoutHeader.h"
00042
00043
00044 #include "Event/ReadoutHeader.h"
00045 #include "Event/ReadoutPmtCrate.h"
00046 #include "Event/ReadoutRpcCrate.h"
00047
00048
00049
00050 #include "Event/SimParticleHistory.h"
00051 #include "Event/SimUnobservableStatisticsHeader.h"
00052 #include "Event/SimStatistic.h"
00053
00054
00055 #include "Conventions/Detectors.h"
00056
00057 #include "GaudiKernel/ITHistSvc.h"
00058
00059 #include <Event/HeaderObject.h>
00060
00061 #include "CLHEP/Units/SystemOfUnits.h"
00062
00063 using namespace std;
00064
00065 Sim15::Sim15(const std::string& name, ISvcLocator* pSvcLocator):
00066 GaudiAlgorithm(name, pSvcLocator)
00067 , m_TopStage(0)
00068 , m_sdmgr(0)
00069 {
00071 declareProperty("TopStage", m_TopStageName,"Name of top stage");
00073
00074 declareProperty("TimeRange", m_TimeRange = 365*24*60*60*CLHEP::second, "Time range to simulate, default 1 year.");
00075
00076 declareProperty("Monitor", m_monitor=false,"Generate a monitor.root");
00077 }
00078
00079 Sim15::~Sim15()
00080 {
00081 }
00082
00083 StatusCode Sim15::initialize()
00084 {
00085 StatusCode sc = this->GaudiAlgorithm::initialize();
00086 if (sc.isFailure()) return sc;
00087
00089 sc= toolSvc()->retrieveTool("Stage",m_TopStageName,m_TopStage);
00090 if( sc.isFailure() ) {
00091 error() << "Error retrieving the tool"<< m_TopStageName << endreq;
00092 }
00093 debug() << "Got top Stage \"" << m_TopStageName << "\" at " << (void*) m_TopStage << endreq;
00094
00095 sc = service("StageDataManager",m_sdmgr);
00096 if (sc.isFailure()) return sc;
00097 debug() << "Got StageDataManager at " << (void*) m_sdmgr << endreq;
00099
00100
00101 if(m_monitor) {
00102 m_valiTree=new ValidationTree;
00103 m_valiTree->create();
00104 }
00105
00107 if(m_TopStageName=="SingleLoader") {
00108
00109 m_TopStageNum = 5;
00110 } else if(m_TopStageName=="TrigRead") {
00111
00112 m_TopStageNum = 4;
00113 } else if(m_TopStageName=="Electronic") {
00114
00115 m_TopStageNum = 3;
00116 } else if (m_TopStageName=="Detector") {
00117
00118 m_TopStageNum = 2;
00119 } else if (m_TopStageName=="Kinematic") {
00120
00121 m_TopStageNum = 1;
00122 }
00123
00124 m_counter = 0;
00125
00126 sc = service("EventLoopMgr",m_EvtLoopMgr,false);
00127 if( sc.isFailure() ) {
00128 error() << "Failed to retrive EventLoopMgr service"<< endreq;
00129 }
00130 info()<<"Got EventLoopMgr service"<<endreq;
00131
00133 info()<<m_TimeRange/CLHEP::second<<" seconds detector simulation is required."<<endreq;
00134
00135 return StatusCode::SUCCESS;
00136 }
00137
00138 StatusCode Sim15::execute()
00139 {
00141 IStageData* pIStageData = 0;
00142 StatusCode sc = m_TopStage->nextElement(pIStageData);
00143 if (sc.isFailure()) return sc;
00144 debug() << "consuming stage data at " << pIStageData->time() << endreq;
00145 StatusCode sc2 = m_sdmgr->consumeData(*pIStageData);
00146 if (sc2.isFailure()) return sc2;
00148
00149
00150 m_counter++;
00151 if( m_counter==1 ) m_StartTime = pIStageData->time();
00152 m_CurrTime = pIStageData->time();
00153
00154 info()<<"New element #"<<m_counter<<" at time "<<pIStageData->time()<<endreq;
00155
00156
00157 if(m_monitor) {
00159 typedef HeaderStageData<DayaBay::GenHeader> GenData;
00160 typedef HeaderStageData<DayaBay::SimHeader> SimData;
00161 typedef HeaderStageData<DayaBay::ElecHeader> ElecData;
00162 typedef HeaderStageData<DayaBay::SimReadoutHeader> SimReadoutData;
00163 typedef HeaderStageData<DayaBay::ReadoutHeader> ReadoutData;
00164
00165 GenData *pGenData=0;
00166 SimData *pSimData=0;
00167 ElecData *pElecData=0;
00168 SimReadoutData *pSimReadoutData=0;
00169 ReadoutData *pReadoutData=0;
00170
00171 const DayaBay::GenHeader *pGenHeader=0;
00172 const DayaBay::SimHeader *pSimHeader=0;
00173 const DayaBay::ElecHeader *pElecHeader=0;
00174 const DayaBay::SimTrigHeader *pSimTrigHeader=0;
00175 const DayaBay::SimReadoutHeader *pSimReadoutHeader=0;
00176 const DayaBay::ReadoutHeader *pReadoutHeader=0;
00177
00178 const DayaBay::IHeader* firstHeader=0;
00179 const DayaBay::HeaderObject* pHeader=0;
00180
00181
00182 if(m_TopStageNum==5) {
00183
00184 pReadoutData=dynamic_cast<ReadoutData*>(pIStageData);
00185 pReadoutHeader=&(pReadoutData->header());
00186 pHeader=pReadoutHeader;
00187 } else if(m_TopStageNum==4) {
00188
00189 pSimReadoutData=dynamic_cast<SimReadoutData*>(pIStageData);
00190 pSimReadoutHeader=&(pSimReadoutData->header());
00191 pHeader=pSimReadoutHeader;
00192 } else if(m_TopStageNum==3) {
00193
00194 pElecData=dynamic_cast<ElecData*>(pIStageData);
00195 pElecHeader=&(pElecData->header());
00196 pHeader=pElecHeader;
00197 } else if (m_TopStageNum==2) {
00198
00199 pSimData=dynamic_cast<SimData*>(pIStageData);
00200 pSimHeader=&(pSimData->header());
00201 pHeader=pSimHeader;
00202 } else if (m_TopStageNum==1) {
00203
00204 pGenData=dynamic_cast<GenData*>(pIStageData);
00205 pGenHeader=&(pGenData->header());
00206 pHeader=pGenHeader;
00207 }
00208
00209
00210 double m_e=5.109989e-1;
00211 double m_alpha=3727.379;
00212
00214 m_valiTree->reset();
00215
00216
00217
00218 if(pReadoutHeader!=0) {
00219
00220 if(pReadoutHeader->inputHeaders().size() != 0) {
00221 firstHeader=*((pReadoutHeader->inputHeaders()).begin());
00222 pSimReadoutHeader= dynamic_cast<const DayaBay::SimReadoutHeader*>(firstHeader);
00223 }
00224 }
00225 if(pSimReadoutHeader!=0) {
00226 debug() << "Number of input SimTrigHeaders:" <<
00227 pSimReadoutHeader->inputHeaders().size() << endreq;
00228
00229 if(pSimReadoutHeader->inputHeaders().size() != 0) {
00230 firstHeader=*((pSimReadoutHeader->inputHeaders()).begin());
00231 pSimTrigHeader= dynamic_cast<const DayaBay::SimTrigHeader*>(firstHeader);
00232 }
00233 }
00234 if(pSimTrigHeader!=0) {
00235
00236 if(pSimTrigHeader->inputHeaders().size() != 0) {
00237 firstHeader=*((pSimTrigHeader->inputHeaders()).begin());
00238 pElecHeader= dynamic_cast<const DayaBay::ElecHeader*>(firstHeader);
00239 }
00240 }
00241 if(pElecHeader!=0) {
00242
00243 if(pElecHeader->inputHeaders().size() != 0) {
00244 firstHeader=*((pElecHeader->inputHeaders()).begin());
00245 pSimHeader= dynamic_cast<const DayaBay::SimHeader*>(firstHeader);
00246 }
00247 }
00248 if(pSimHeader!=0) {
00249
00250 if(pSimHeader->inputHeaders().size() != 0) {
00251 firstHeader=*((pSimHeader->inputHeaders()).begin());
00252 pGenHeader= dynamic_cast<const DayaBay::GenHeader*>(firstHeader);
00253 }
00254 }
00255
00256
00257
00258 m_valiTree->time=pIStageData->time().GetSeconds();
00259
00260
00261 if(pReadoutHeader!=0) {
00262 m_valiTree->execSing=pReadoutHeader->execNumber();
00263
00264
00265 const DayaBay::Readout* pReadout = pReadoutHeader->readout();
00266 DayaBay::Detector det = pReadout->detector();
00267
00268 if(det.detectorId() == DetectorId::kAD1 ||
00269 det.detectorId() == DetectorId::kAD2 ||
00270 det.detectorId() == DetectorId::kAD3 ||
00271 det.detectorId() == DetectorId::kAD4) {
00272
00273
00274 const DayaBay::ReadoutPmtCrate* pmtcrate = 0;
00275 pmtcrate = dynamic_cast<const DayaBay::ReadoutPmtCrate*>(pReadout);
00276
00277
00278 const DayaBay::ReadoutPmtCrate::PmtChannelReadouts& channelMap
00279 = pmtcrate->channelReadout();
00280
00281 DayaBay::ReadoutPmtCrate::PmtChannelReadouts::const_iterator cmci;
00282
00283 for(cmci=channelMap.begin();cmci!=channelMap.end();++cmci) {
00284
00285 const DayaBay::ReadoutPmtChannel& aChannel = cmci->second;
00286
00287
00288 m_valiTree->adc_sum=aChannel.sumAdc();
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300 }
00301 }
00302 }
00303
00304
00305 if(pSimReadoutHeader!=0) {
00306 m_valiTree->execTrig=pSimReadoutHeader->execNumber();
00307
00308 const DayaBay::SimReadoutHeader::SimReadoutContainer
00309 simReadout=pSimReadoutHeader->readouts();
00310 debug()<<"No. of SimReadout: "<<simReadout.size()<<endreq;
00311 debug()<<pSimReadoutHeader->execNumber()<<endreq;
00312 }
00313
00314
00315 if(pElecHeader!=0) {
00316 m_valiTree->execElec=pElecHeader->execNumber();
00317 }
00318
00319
00320 if(pSimTrigHeader!=0) {
00321 debug()<<pSimTrigHeader->commandHeader()->collections().size();
00322 }
00323
00324
00325 if(pSimHeader!=0) {
00326 m_valiTree->execDets=pSimHeader->execNumber();
00329 const DayaBay::SimHitHeader* simhitheader = pSimHeader->hits();
00330 if(simhitheader) {
00332 const DayaBay::SimHitHeader::hc_map& hcmap = simhitheader->hitCollection();
00333 DayaBay::SimHitHeader::hc_map::const_iterator it;
00334
00336 m_valiTree->SimHitsEntries=0;
00337 int index(0);
00338
00339 debug()<<"size of hit collection "<< hcmap.size()<<endreq;
00340 for (it=hcmap.begin(); it != hcmap.end(); ++it) {
00341
00342 DayaBay::Detector det(it->first);
00343 debug() << "Got hit collection from " << det.detName()<<" id= "
00344 << det.siteDetPackedData()<<endreq;
00345
00347 const std::vector<DayaBay::SimHit*>& hitvec=it->second->collection();
00348 std::vector<DayaBay::SimHit*>::const_iterator it_hvec;
00349
00350 debug() <<"size of hit vector "<< hitvec.size()<<endreq;
00351 for (it_hvec=hitvec.begin(); it_hvec!=hitvec.end(); ++it_hvec) {
00352
00353 index=m_valiTree->SimHitsEntries;
00354 if(index<MaxSimHitEntries){
00355
00356 m_valiTree->hitTime[index] = (*it_hvec)->hitTime();
00357 m_valiTree->hitx[index] = (*it_hvec)->localPos().x();
00358 m_valiTree->hity[index] = (*it_hvec)->localPos().y();
00359 m_valiTree->hitz[index] = (*it_hvec)->localPos().z();
00360 m_valiTree->sensID[index] = (*it_hvec)->sensDetId();
00361 m_valiTree->weight[index] = (*it_hvec)->weight();
00362
00363
00364 if((*it_hvec)->ancestor().track()) {
00365 m_valiTree->ancestorPdg[index] = (*it_hvec)->ancestor().track()->particle();
00366 }
00367 else {
00368 m_valiTree->ancestorPdg[index] = 0;
00369 }
00370
00371 const DayaBay::SimPmtHit* pmthit = static_cast<const DayaBay::SimPmtHit*>(*it_hvec);
00372 m_valiTree->wavelength[index] = (*pmthit).wavelength();
00373 m_valiTree->polx[index] = (*pmthit).pol().x();
00374 m_valiTree->poly[index] = (*pmthit).pol().y();
00375 m_valiTree->polz[index] = (*pmthit).pol().z();
00376 m_valiTree->px[index] = (*pmthit).dir().x();
00377 m_valiTree->py[index] = (*pmthit).dir().y();
00378 m_valiTree->pz[index] = (*pmthit).dir().z();
00379
00380 m_valiTree->SimHitsEntries = index+1;
00381
00382 }
00383 else {
00384 warning()<< " Reached the max hit limit!!!!!" <<endl;
00385 }
00386 }
00387 }
00388 }
00389 }
00390
00392
00393 if(pGenHeader!=0) {
00394 m_valiTree->execKine=pGenHeader->execNumber();
00395 debug()<<"Generator name: "<<pGenHeader->generatorName()<<endreq;
00396 debug()<<"execNum: "<<pGenHeader->execNumber()<<endreq;
00397
00398 const HepMC::GenEvent* event=pGenHeader->event();
00399
00400
00401 HepMC::GenEvent::particle_const_iterator p;
00402 int count=0;
00403 for ( p = event->particles_begin(); p!=event->particles_end(); ++p ) {
00404 (*p)->print();
00405 if((*p)->production_vertex()) {
00406 if( (*p)->status() == 1 ||
00407 abs((*p)->status()) > 1000 ) {
00408 count++;
00409
00410 if(count==1) {
00411
00412 m_valiTree->trk1_pdgId=(*p)->pdg_id();
00413
00414 m_valiTree->trk1_px=(*p)->momentum().px();
00415 m_valiTree->trk1_py=(*p)->momentum().py();
00416 m_valiTree->trk1_pz=(*p)->momentum().pz();
00417 m_valiTree->trk1_e =(*p)->momentum().e();
00418
00419 m_valiTree->trk1_x=(*p)->production_vertex()->position().x();
00420 m_valiTree->trk1_y=(*p)->production_vertex()->position().y();
00421 m_valiTree->trk1_z=(*p)->production_vertex()->position().z();
00422 m_valiTree->trk1_t=(*p)->production_vertex()->position().t();
00423
00424 debug()<<"trk1_pdgId: "<<m_valiTree->trk1_pdgId<<endreq;
00425
00426 if(m_valiTree->trk1_pdgId==22) {
00427 m_valiTree->trk1_ke=m_valiTree->trk1_e;
00428 m_valiTree->trk1_ve=m_valiTree->trk1_e;
00429 }else if (m_valiTree->trk1_pdgId==11) {
00430 m_valiTree->trk1_ke=m_valiTree->trk1_e-m_e;
00431 m_valiTree->trk1_ve=m_valiTree->trk1_e-m_e;
00432 }else if (m_valiTree->trk1_pdgId==-11) {
00433 m_valiTree->trk1_ke=m_valiTree->trk1_e-m_e;
00434 m_valiTree->trk1_ve=m_valiTree->trk1_e+m_e;
00435 }else if (m_valiTree->trk1_pdgId==1000020040) {
00436 m_valiTree->trk1_ke=m_valiTree->trk1_e-m_alpha;
00437 m_valiTree->trk1_ve=m_valiTree->trk1_e-m_alpha;
00438 }
00439 }
00440 if(count==2) {
00441 m_valiTree->trk2_pdgId=(*p)->pdg_id();
00442
00443 m_valiTree->trk2_px=(*p)->momentum().px();
00444 m_valiTree->trk2_py=(*p)->momentum().py();
00445 m_valiTree->trk2_pz=(*p)->momentum().pz();
00446 m_valiTree->trk2_e =(*p)->momentum().e();
00447
00448 m_valiTree->trk2_x=(*p)->production_vertex()->position().x();
00449 m_valiTree->trk2_y=(*p)->production_vertex()->position().y();
00450 m_valiTree->trk2_z=(*p)->production_vertex()->position().z();
00451 m_valiTree->trk2_t=(*p)->production_vertex()->position().t();
00452 if(m_valiTree->trk2_pdgId==22) {
00453 m_valiTree->trk2_ke=m_valiTree->trk2_e;
00454 m_valiTree->trk2_ve=m_valiTree->trk2_e;
00455 }else if (m_valiTree->trk2_pdgId==11) {
00456 m_valiTree->trk2_ke=m_valiTree->trk2_e-m_e;
00457 m_valiTree->trk2_ve=m_valiTree->trk2_e-m_e;
00458 }else if (m_valiTree->trk2_pdgId==-11) {
00459 m_valiTree->trk2_ke=m_valiTree->trk2_e-m_e;
00460 m_valiTree->trk2_ve=m_valiTree->trk2_e+m_e;
00461 }else if (m_valiTree->trk2_pdgId==1000020040) {
00462 m_valiTree->trk2_ke=m_valiTree->trk2_e-m_alpha;
00463 m_valiTree->trk2_ve=m_valiTree->trk2_e-m_alpha;
00464 }
00465 }
00466 }
00467 }
00468 }
00469 }
00470
00472 m_valiTree->n = m_counter;
00473 m_valiTree->fill();
00474 }
00475
00476 delete pIStageData;
00477 pIStageData=0;
00478
00479 if( (m_CurrTime-m_StartTime).GetSeconds()> (m_TimeRange/CLHEP::second) ) {
00480 info()<<m_TimeRange<<" seconds detector simulation finished. Issue scheduled stop."<<endreq;
00481 m_EvtLoopMgr->stopRun();
00482 }
00483
00484 return StatusCode::SUCCESS;
00485 }
00486
00487 StatusCode Sim15::finalize()
00488 {
00489 if(m_monitor) {
00490 m_valiTree->close();
00491 delete m_valiTree;
00492 }
00493
00494 return this->GaudiAlgorithm::finalize();
00495 }
00496