| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

Ana15.cc

Go to the documentation of this file.
00001 
00007 
00008 #include "Ana15.h"
00009 #include "Stage/HeaderStageData.h"
00011 
00012 // for GenHeader
00013 #include "Event/GenHeader.h"
00014 
00015 // for GenEvent
00016 #include "HepMC/GenEvent.h"
00017 
00018 // detector element
00019 #include "DetDesc/IGeometryInfo.h"
00020 #include "DetDesc/DetectorElement.h"
00021 #include "DetDesc/SolidBase.h"
00022 
00023 // for SimHit
00024 #include "Event/SimHeader.h"
00025 #include "Event/SimHitHeader.h"
00026 #include "Event/SimHitCollection.h"
00027 #include "Event/SimPmtHit.h"
00028 #include "Event/SimHit.h"
00029 
00030 // for ElecEvent
00031 #include "Event/ElecHeader.h"
00032 
00033 // SimTrig
00034 #include "Event/SimTrigHeader.h"
00035 
00036 // SimReadout
00037 #include "Event/SimReadoutHeader.h"
00038 
00039 // for Readout
00040 #include "Event/ReadoutHeader.h"
00041 #include "Event/ReadoutPmtCrate.h"
00042 #include "Event/ReadoutRpcCrate.h"
00043 
00044 // for history info
00045 
00046 //#include "Event/SimParticleHistoryHeader.h"
00047 #include "Event/SimParticleHistory.h"
00048 #include "Event/SimUnobservableStatisticsHeader.h"
00049 #include "Event/SimStatistic.h"
00050 
00051 // for Detector ID etc.
00052 #include "Conventions/Detectors.h"
00053 
00054 #include "GaudiKernel/ITHistSvc.h"
00055 
00056 #include <Event/HeaderObject.h>
00057 
00058 using namespace std;
00059 using namespace DayaBay;
00060 
00061 Ana15::Ana15(const std::string& name, ISvcLocator* pSvcLocator):
00062   GaudiAlgorithm(name, pSvcLocator)
00063 {
00065   declareProperty("TopStage",m_TopStage="SingleLoader","Name of top stage");  
00067 }
00068 
00069 Ana15::~Ana15()
00070 {
00071 }
00072 
00073 StatusCode Ana15::initialize()
00074 {
00075   this->GaudiAlgorithm::initialize();
00076 
00077   // init path
00078   if(m_TopStage=="SingleLoader") m_path = ReadoutHeader::defaultLocation();
00079   if(m_TopStage=="TrigRead")     m_path = SimReadoutHeader::defaultLocation();
00080   if(m_TopStage=="Electronic")   m_path = ElecHeader::defaultLocation();
00081   if(m_TopStage=="Detector")     m_path = SimHeader::defaultLocation();
00082   if(m_TopStage=="Kinematic")    m_path = GenHeader::defaultLocation();
00083   
00084   // init root tree
00085   m_valiTree=new ValidationTree;
00086   m_valiTree->create();
00087 
00088   StatusCode status;
00089 
00090   return StatusCode::SUCCESS;
00091 }
00092 
00093 StatusCode Ana15::execute()
00094 {
00095   double m_e=5.109989e-1;  // MeV
00096   double m_alpha=3727.379; // MeV
00097 
00099   m_valiTree->reset();
00100 
00102   StatusCode   sc;
00103   DataObject   *pObject;
00104   sc=eventSvc()->retrieveObject(m_path,pObject);     // get a new data
00105   if(sc.isFailure()) {
00106     error()<<"Failed to read data"<<endreq;
00107     return sc;
00108   }
00109 
00110   const HeaderObject     *pHeader=0;
00111   pHeader=dynamic_cast<HeaderObject*>(pObject);
00112 
00113   info()<<"to grep: new data arrived at time: "<<pHeader->earliest()<<endreq;
00114 
00115   const GenHeader        *pGenHeader=0;
00116   const SimHeader        *pSimHeader=0;
00117   const ElecHeader       *pElecHeader=0;
00118   const SimTrigHeader    *pSimTrigHeader=0;
00119   const SimReadoutHeader *pSimReadoutHeader=0;
00120   const ReadoutHeader    *pReadoutHeader=0;
00121 
00122   const IHeader* firstHeader=0;
00123 
00124   // get the header object pointer of the top stage
00125   if(m_TopStage=="SingleLoader") {
00126     // ReadoutHeader
00127     pReadoutHeader=dynamic_cast<ReadoutHeader*>(pObject);
00128   } else if(m_TopStage=="TrigRead") { 
00129     // SimReadoutHeader
00130     pSimReadoutHeader=dynamic_cast<SimReadoutHeader*>(pObject);
00131   } else if(m_TopStage=="Electronic") {
00132     // ElecHeader
00133     pElecHeader=dynamic_cast<ElecHeader*>(pObject);
00134   } else if (m_TopStage=="Detector") {
00135     // SimHeader
00136     pSimHeader=dynamic_cast<SimHeader*>(pObject);
00137   } else if (m_TopStage=="Kinematic") {
00138     // GenHeader
00139     pGenHeader=dynamic_cast<GenHeader*>(pObject);
00140   }
00141 
00142   // get the header object pointer of it lower stages
00143   // only the first one, for low event rate, it is enough
00144   if(pReadoutHeader!=0) {
00145     // SimReadoutHeader
00146     if(pReadoutHeader->inputHeaders().size() != 0) {
00147       firstHeader=*((pReadoutHeader->inputHeaders()).begin());
00148       pSimReadoutHeader= dynamic_cast<const SimReadoutHeader*>(firstHeader);
00149     }
00150   }
00151   if(pSimReadoutHeader!=0) {
00152     debug() << "Number of input SimTrigHeaders:" << pSimReadoutHeader->inputHeaders().size() << endreq;
00153     // SimTrigHeader
00154     if(pSimReadoutHeader->inputHeaders().size() != 0) {
00155       firstHeader=*((pSimReadoutHeader->inputHeaders()).begin());
00156       pSimTrigHeader= dynamic_cast<const SimTrigHeader*>(firstHeader);
00157     }
00158   }
00159   if(pSimTrigHeader!=0) {
00160     // ElecHeader
00161     if(pSimTrigHeader->inputHeaders().size() != 0) {
00162       firstHeader=*((pSimTrigHeader->inputHeaders()).begin());
00163       pElecHeader= dynamic_cast<const ElecHeader*>(firstHeader);
00164     }
00165   }
00166   if(pElecHeader!=0) {
00167     // SimHeader
00168     if(pElecHeader->inputHeaders().size() != 0) {
00169       firstHeader=*((pElecHeader->inputHeaders()).begin());
00170       pSimHeader= dynamic_cast<const SimHeader*>(firstHeader);
00171     }
00172   }
00173   if(pSimHeader!=0) {
00174     // GenHeader
00175     if(pSimHeader->inputHeaders().size() != 0) {
00176       firstHeader=*((pSimHeader->inputHeaders()).begin());
00177       pGenHeader= dynamic_cast<const GenHeader*>(firstHeader);
00178     }
00179   }
00180 
00181 
00182   // event information
00183   m_valiTree->time=pHeader->earliest().GetSeconds();
00184 
00185   // check ReadoutHeader information
00186   if(pReadoutHeader!=0) {
00187     m_valiTree->execSing=pReadoutHeader->execNumber();
00188     
00189     // adc tdc
00190     const Readout* pReadout = pReadoutHeader->readout();
00191     Detector det = pReadout->detector();
00192     
00193     if(det.detectorId() == DetectorId::kAD1 ||  // AD information
00194        det.detectorId() == DetectorId::kAD2 ||
00195        det.detectorId() == DetectorId::kAD3 ||
00196        det.detectorId() == DetectorId::kAD4) {
00197       
00198       // convert it to PMT Crate Readout
00199       const ReadoutPmtCrate* pmtcrate = 0;
00200       pmtcrate = dynamic_cast<const ReadoutPmtCrate*>(pReadout);
00201       
00202       // channnel map
00203       const ReadoutPmtCrate::PmtChannelReadouts& channelMap
00204           = pmtcrate->channelReadout();
00205       
00206       ReadoutPmtCrate::PmtChannelReadouts::const_iterator cmci;
00207 
00208       for(cmci=channelMap.begin();cmci!=channelMap.end();++cmci) {
00209         const FeeChannelId&      channelId = cmci->first;
00210         const ReadoutPmtChannel& aChannel  = cmci->second;
00211 
00212         const vector<int>&          tdc=aChannel.tdc();
00213         const vector<int>&          adc=aChannel.adc();
00214 
00215         int raw_tdc=tdc[0];
00216         int raw_adc=adc[0];
00217         
00218         m_valiTree->adc_sum+=raw_adc;
00219 
00220         verbose()<<channelId<<" tdc "<<raw_tdc<<" adc "<<raw_adc<<endreq;
00221       }
00222     }  // end of AD crate
00223   } // end of pReadoutHeader
00224 
00225   // check SimReadoutHeader information
00226   if(pSimReadoutHeader!=0) {
00227     m_valiTree->execTrig=pSimReadoutHeader->execNumber();
00228 
00229     const SimReadoutHeader::SimReadoutContainer 
00230       simReadout=pSimReadoutHeader->readouts();
00231     debug()<<"No. of SimReadout: "<<simReadout.size()<<endreq;
00232     debug()<<pSimReadoutHeader->execNumber()<<endreq;
00233   } // end of pSimReadoutHeader
00234 
00235   // check electrontic simulation information if available
00236   if(pElecHeader!=0) {
00237     m_valiTree->execElec=pElecHeader->execNumber();
00238   } // end of pElecHeader
00239 
00240   // check trigger header information if available
00241   if(pSimTrigHeader!=0) {
00242     debug()<<pSimTrigHeader->commandHeader()->collections().size();
00243   }
00244 
00245   // check detector simulation information if available
00246   if(pSimHeader!=0) {
00247     m_valiTree->execDets=pSimHeader->execNumber();
00250     const SimHitHeader* simhitheader = pSimHeader->hits();
00252     const SimHitHeader::hc_map& hcmap = simhitheader->hitCollection();
00253     SimHitHeader::hc_map::const_iterator it;
00254 
00256     m_valiTree->SimHitsEntries=0;
00257     int index(0);
00258 
00259     debug()<<"size of hit collection "<< hcmap.size()<<endreq;
00260     for (it=hcmap.begin(); it != hcmap.end(); ++it) {
00261 
00262       Detector det(it->first);
00263       debug() << "Got hit collection from " << det.detName()<<" id= "
00264               << det.siteDetPackedData()<<endreq;
00265 
00267       const std::vector<SimHit*>& hitvec=it->second->collection();
00268       std::vector<SimHit*>::const_iterator it_hvec;
00269       
00270       debug() <<"size of hit vector "<< hitvec.size()<<endreq;
00271       for (it_hvec=hitvec.begin(); it_hvec!=hitvec.end(); ++it_hvec) {
00272         
00273         index=m_valiTree->SimHitsEntries;
00274         if(index<MaxSimHitEntries){
00275 
00276           m_valiTree->hitTime[index]  = (*it_hvec)->hitTime();
00277           m_valiTree->hitx[index]     = (*it_hvec)->localPos().x();
00278           m_valiTree->hity[index]     = (*it_hvec)->localPos().y();
00279           m_valiTree->hitz[index]     = (*it_hvec)->localPos().z();
00280           m_valiTree->sensID[index]   = (*it_hvec)->sensDetId();
00281           m_valiTree->weight[index]   = (*it_hvec)->weight();
00282           
00283           // optical photon's ancestor's pdg
00284           if((*it_hvec)->ancestor().track()) {
00285             m_valiTree->ancestorPdg[index] = (*it_hvec)->ancestor().track()->particle();
00286           }
00287           else {
00288             m_valiTree->ancestorPdg[index] = 0;
00289           }
00290           //optical photon's wavelength
00291           const SimPmtHit* pmthit = static_cast<const SimPmtHit*>(*it_hvec);
00292           m_valiTree->wavelength[index]   = (*pmthit).wavelength();
00293           m_valiTree->polx[index]   = (*pmthit).pol().x();
00294           m_valiTree->poly[index]   = (*pmthit).pol().y();
00295           m_valiTree->polz[index]   = (*pmthit).pol().z();
00296           m_valiTree->px[index]   = (*pmthit).dir().x();
00297           m_valiTree->py[index]   = (*pmthit).dir().y();
00298           m_valiTree->pz[index]   = (*pmthit).dir().z();
00299           
00300           m_valiTree->SimHitsEntries = index+1;
00301           
00302         }
00303         else {
00304           debug()<< " Reached the max hit limit!!!!!" <<endl;
00305         }
00306       }
00307     }
00308   } // end of pSimHeader
00309 
00311   //  if(0==1) {
00312   if(pGenHeader!=0) {
00313     m_valiTree->execKine=pGenHeader->execNumber();
00314     debug()<<"Generator name: "<<pGenHeader->generatorName()<<endreq;
00315     debug()<<"execNum: "<<pGenHeader->execNumber()<<endreq;
00316 
00317     const HepMC::GenEvent* event=pGenHeader->event();
00318     //  event->print();
00319 
00320     HepMC::GenEvent::particle_const_iterator p;
00321     int count=0;
00322     for ( p = event->particles_begin(); p!=event->particles_end(); ++p ) {      
00323       (*p)->print();
00324       if((*p)->production_vertex()) {   // only outgoing particle has a production vertex
00325         count++;
00326 
00327         if(count==1) {
00328           
00329           m_valiTree->trk1_pdgId=(*p)->pdg_id();
00330           
00331           m_valiTree->trk1_px=(*p)->momentum().px();
00332           m_valiTree->trk1_py=(*p)->momentum().py();
00333           m_valiTree->trk1_pz=(*p)->momentum().pz();
00334           m_valiTree->trk1_e =(*p)->momentum().e();
00335           
00336           m_valiTree->trk1_x=(*p)->production_vertex()->position().x();
00337           m_valiTree->trk1_y=(*p)->production_vertex()->position().y();
00338           m_valiTree->trk1_z=(*p)->production_vertex()->position().z();
00339           m_valiTree->trk1_t=(*p)->production_vertex()->position().t();
00340 
00341           debug()<<"trk1_pdgId: "<<m_valiTree->trk1_pdgId<<endreq;
00342           
00343           if(m_valiTree->trk1_pdgId==22) { // gamma
00344             m_valiTree->trk1_ke=m_valiTree->trk1_e;
00345             m_valiTree->trk1_ve=m_valiTree->trk1_e;
00346           }else if (m_valiTree->trk1_pdgId==11) { // e-
00347             m_valiTree->trk1_ke=m_valiTree->trk1_e-m_e;
00348             m_valiTree->trk1_ve=m_valiTree->trk1_e-m_e;
00349           }else if (m_valiTree->trk1_pdgId==-11) { // e+
00350             m_valiTree->trk1_ke=m_valiTree->trk1_e-m_e;
00351             m_valiTree->trk1_ve=m_valiTree->trk1_e+m_e;
00352           }else if (m_valiTree->trk1_pdgId==1000020040) { // alpha
00353             m_valiTree->trk1_ke=m_valiTree->trk1_e-m_alpha;
00354             m_valiTree->trk1_ve=m_valiTree->trk1_e-m_alpha;
00355           }
00356         }  // outgoing particle 1
00357         if(count==2) {
00358           m_valiTree->trk2_pdgId=(*p)->pdg_id();
00359           
00360           m_valiTree->trk2_px=(*p)->momentum().px();
00361           m_valiTree->trk2_py=(*p)->momentum().py();
00362           m_valiTree->trk2_pz=(*p)->momentum().pz();
00363           m_valiTree->trk2_e =(*p)->momentum().e();
00364           
00365           m_valiTree->trk2_x=(*p)->production_vertex()->position().x();
00366           m_valiTree->trk2_y=(*p)->production_vertex()->position().y();
00367           m_valiTree->trk2_z=(*p)->production_vertex()->position().z();
00368           m_valiTree->trk2_t=(*p)->production_vertex()->position().t();
00369           if(m_valiTree->trk2_pdgId==22) { // gamma
00370             m_valiTree->trk2_ke=m_valiTree->trk2_e;
00371             m_valiTree->trk2_ve=m_valiTree->trk2_e;
00372           }else if (m_valiTree->trk2_pdgId==11) { // e-
00373             m_valiTree->trk2_ke=m_valiTree->trk2_e-m_e;
00374             m_valiTree->trk2_ve=m_valiTree->trk2_e-m_e;
00375           }else if (m_valiTree->trk2_pdgId==-11) { // e+
00376             m_valiTree->trk2_ke=m_valiTree->trk2_e-m_e;
00377             m_valiTree->trk2_ve=m_valiTree->trk2_e+m_e;
00378           }else if (m_valiTree->trk2_pdgId==1000020040) { // alpha
00379             m_valiTree->trk2_ke=m_valiTree->trk2_e-m_alpha;
00380             m_valiTree->trk2_ve=m_valiTree->trk2_e-m_alpha;
00381           }
00382         }  // outgoing particle 2
00383       } // end of outgoing particles
00384     }
00385   } // end of pGenHeader
00386 
00388   m_valiTree->fill();
00389   return StatusCode::SUCCESS;
00390 }
00391 
00392 StatusCode Ana15::finalize()
00393 {
00394   m_valiTree->close();
00395   delete m_valiTree;
00396 
00397   return this->GaudiAlgorithm::finalize();
00398 }
00399 
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:36:44 2011 for Sim15 by doxygen 1.4.7