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

In This Package:

DetSimVali.cc

Go to the documentation of this file.
00001 /*
00002  * DetSimVali -- DetSimValidation
00003  *
00004  * May, 2008 Zhe Wang, Kevin Zhang
00005  * Sep, 2008 Wei Wang, make following changes:
00006  * 1. Adding in the neutron capture info and relevant tree branch changes
00007  *    in corresponding header files;
00008  * 2. Adding in the center-of-gravity of deposited energy and relavant
00009  *    tree branch changes in cooresponding header files;;
00010  * 3. Restructuring the loop of the program to make it faster.
00011  */
00012 
00013 #include "DetSimVali.h"
00014 
00015 // for GenHeader
00016 #include "Event/GenHeader.h"
00017 #include "HepMC/GenEvent.h"
00018 
00019 // detector element
00020 #include "DetDesc/IGeometryInfo.h"
00021 #include "DetDesc/DetectorElement.h"
00022 #include "DetDesc/SolidBase.h"
00023 
00024 // for SimHit
00025 #include "Event/SimHeader.h"
00026 #include "Event/SimHitHeader.h"
00027 #include "Event/SimHitCollection.h"
00028 #include "Event/SimPmtHit.h"
00029 #include "Event/SimHit.h"
00030 
00031 // for history info
00032 
00033 #include "Event/SimParticleHistory.h"
00034 #include "Event/SimUnobservableStatisticsHeader.h"
00035 #include "Event/SimStatistic.h"
00036 
00037 // for Detector ID etc.
00038 #include "Conventions/Detectors.h"
00039 
00040 #include "GaudiKernel/ITHistSvc.h"
00041 
00042 #include "DetHelpers/ICoordSysSvc.h"
00043 
00044 #include "CLHEP/Units/SystemOfUnits.h"
00045 
00046 using namespace std;
00047 
00048 DetSimVali::DetSimVali(const std::string& name, ISvcLocator* pSvcLocator):
00049   GaudiAlgorithm(name, pSvcLocator), m_tsvc(0),m_csvc(0)
00050 {
00051   declareProperty("Volume",m_volume="",
00052                   "TDS path of volume used to generated vertices");  
00053 }
00054 
00055 DetSimVali::~DetSimVali()
00056 {
00057 }
00058 
00059 StatusCode DetSimVali::initialize()
00060 {
00061   this->GaudiAlgorithm::initialize();
00062   
00063   if ( service("THistSvc", m_tsvc).isFailure()) {
00064     error() << " No THistSvc available." << endreq;
00065     return StatusCode::FAILURE;
00066   } 
00067   
00068   if ( service("CoordSysSvc", m_csvc).isFailure()) {
00069     error() << " No CoordSysSvc available." << endreq;
00070     return StatusCode::FAILURE;
00071   }
00072   
00073   m_valiTree=new ValidationTree;
00074   m_valiTree->create();
00075   
00076   return StatusCode::SUCCESS;
00077 }
00078 
00079 StatusCode DetSimVali::execute()
00080 {
00081   debug()<<"executing ... "<<endreq;
00082   
00084   m_valiTree->reset();
00085 
00086   
00088   DayaBay::GenHeader* genheader = 
00089     get<DayaBay::GenHeader>(DayaBay::GenHeaderLocation::Default);
00090     
00091   HepMC::GenEvent* genevt = genheader->event();
00092   if (!genevt) { 
00093     warning() << "No gen event!!" << endreq;
00094     //        return StatusCode::SUCCESS; 
00095   }
00096 
00097   HepMC::GenEvent::vertex_const_iterator vtxIter, vtxEnd = genevt->vertices_end();
00098   for(vtxIter = genevt->vertices_begin(); vtxIter != vtxEnd; vtxIter++){  
00099     HepMC::GenVertex* genvtx = *vtxIter;
00100     HepMC::GenVertex::particles_out_const_iterator pt = genvtx->particles_out_const_begin(), done = genvtx->particles_out_const_end();
00101   
00102     double energy=0;
00103     for (; pt != done; ++pt) {
00104       HepMC::GenParticle* part = *pt;
00105       if (part->pdg_id()==13 || part->pdg_id()==-13){
00106         HepMC::FourVector momentum = part->momentum();
00107         
00108         m_valiTree->MuonE=momentum.e();
00109         m_valiTree->MuonPx=momentum.x();
00110         m_valiTree->MuonPy=momentum.y();
00111         m_valiTree->MuonPz=momentum.z();
00112       }
00113     }
00114     
00115     //get the Detector Element:
00116     
00117     DetectorElement* detelem=0;
00118     
00119     if ("" == m_volume) {
00120       warning() << "No Volume property set, guessing at volume bounds." 
00121                 << endreq;
00122     }
00123     
00124     if (!existDet<DetectorElement>(m_volume)) {
00125       fatal() << "Failed to get detector element " << m_volume 
00126               << ", will guess at volume bounds" << endreq;
00127     } else {
00128       detelem = getDet<DetectorElement>(m_volume);
00129     }
00130     
00131     if (detelem) {
00132       m_geo = detelem->geometry();
00133       
00134       HepMC::FourVector r4 = genvtx->position();
00135     
00136       Gaudi::XYZPoint gp(r4.x(),r4.y(),r4.z());
00137       Gaudi::XYZPoint lp = m_geo->toLocal(gp);
00138       
00139       m_valiTree->MuonTime=r4.t()/CLHEP::second;
00140       m_valiTree->MuonX=lp.x()/CLHEP::meter;
00141       m_valiTree->MuonY=lp.y()/CLHEP::meter;
00142       m_valiTree->MuonZ=lp.z()/CLHEP::meter;
00143     }
00144   }
00145 
00147   DayaBay::SimHeader* simheader = 
00148     get<DayaBay::SimHeader>(DayaBay::SimHeaderLocation::Default);
00149   
00151   
00153   const DayaBay::SimHitHeader*         simhitheader = simheader->hits();
00154   
00156   const DayaBay::SimHitHeader::hc_map& hcmap = simhitheader->hitCollection();
00157   
00158   DayaBay::SimHitHeader::hc_map::const_iterator it;
00159   
00161   m_valiTree->SimHitsEntries=0;
00162   int index(0);
00163   
00164   for (it=hcmap.begin(); it != hcmap.end(); ++it) {
00165     
00166     DayaBay::Detector det(it->first);
00167     debug() << "Got hit collection from " << det.detName()<<" id= "
00168             << det.siteDetPackedData()<<endreq;
00169     
00171     const std::vector<DayaBay::SimHit*>& hitvec=it->second->collection();
00172     std::vector<DayaBay::SimHit*>::const_iterator it_hvec;
00173 
00174     for (it_hvec=hitvec.begin(); it_hvec!=hitvec.end(); ++it_hvec) {
00175       
00176       index=m_valiTree->SimHitsEntries;
00177       if(index<MaxSimHitEntries){
00178         
00179         m_valiTree->hitTime[index]  = (*it_hvec)->hitTime();
00180         m_valiTree->hitx[index]     = (*it_hvec)->localPos().x();
00181         m_valiTree->hity[index]     = (*it_hvec)->localPos().y();
00182         m_valiTree->hitz[index]     = (*it_hvec)->localPos().z();
00183         m_valiTree->sensID[index]   = (*it_hvec)->sensDetId();
00184         m_valiTree->weight[index]   = (*it_hvec)->weight();
00185         
00186         // optical photon's ancestor's pdg
00187         if((*it_hvec)->ancestor().track()) {
00188           m_valiTree->ancestorPdg[index] = 
00189             (*it_hvec)->ancestor().track()->particle();
00190         } else {
00191           m_valiTree->ancestorPdg[index] = 0;
00192         }
00193         //optical photon's wavelength
00194         const DayaBay::SimPmtHit* pmthit = 
00195           static_cast<const DayaBay::SimPmtHit*>(*it_hvec);
00196         m_valiTree->wavelength[index]   = (*pmthit).wavelength();
00197         m_valiTree->polx[index]   = (*pmthit).pol().x();
00198         m_valiTree->poly[index]   = (*pmthit).pol().y();
00199         m_valiTree->polz[index]   = (*pmthit).pol().z();
00200         m_valiTree->px[index]   = (*pmthit).dir().x();
00201         m_valiTree->py[index]   = (*pmthit).dir().y();
00202         m_valiTree->pz[index]   = (*pmthit).dir().z();
00203         
00204         m_valiTree->SimHitsEntries = index+1;
00205         
00206       } else {
00207         warning()<< " Reached the max hit limit!!!!!" <<endl;
00208       }
00209     }
00210   }
00212 
00213   
00214   // Get Primary Track Info. <<<<<<<<<<<<<--------------
00215   const DayaBay::SimParticleHistory* shist = simheader->particleHistory();
00216   const std::list<const DayaBay::SimTrack*>& priTrks = shist->primaryTracks();
00217   std::list<const DayaBay::SimTrack*>::const_iterator vt,priIt, priEnd=priTrks.end();
00218   
00219   /*
00220   if(priTrks.size()!=0){
00221     
00222     for (vt=priTrks.begin(); vt != priEnd; ++vt) {
00223       cout<<"IDIDID:"<<(*vt)->parentParticle()<<endl;;
00224       if((*vt)->parentParticle()==0 ){
00225         const std::vector<DayaBay::SimVertex*> pvtx=(*vt)->vertices();
00226         std::vector<DayaBay::SimVertex*>::const_iterator tt, tEt=pvtx.end();
00227         cout<<""<<pvtx.back()->volume()->
00228         
00229         for(tt=pvtx.begin();tt!=tEt;tt++){
00230           cout<<"!!!!!!!"<<(*tt)->process().name()<<endl;
00231         }
00232                 
00233                   std::string pname=(*vt)->vertices().back()->process().name();
00234                   if(pname=="Decay")
00235                   m_valiTree->StopFlag = 1;
00236                   if(pname=="muMinusCaptureAtRest")
00237                   m_valiTree->StopFlag = 2;
00238                   cout<<"!!!!!!!!!!"<<pname<<endl;
00239         
00240       }
00241     }
00242   }
00243   else
00244     debug()<<" Empty Track List" <<endreq;
00245   */
00246   // end of track information ------------>>>>>>>>>>>
00247 
00248   
00249   //Get UnObservable Statistics info <<<<<<<<<<<<<----------
00250   const DayaBay::SimUnobservableStatisticsHeader* unobSt = 
00251     simheader->unobservableStatistics();
00252   const DayaBay::SimUnobservableStatisticsHeader::stat_map& 
00253     statmap = unobSt->stats();
00254   DayaBay::SimUnobservableStatisticsHeader::stat_map::const_iterator 
00255     st, stdone = statmap.end();
00256   
00257   debug()<<"UnObs size "<<statmap.size()<<endreq;
00258   
00259   if(unobSt) {
00260     
00261     double ptrk1,vxtrk1,vytrk1,vztrk1;
00262     double ptrk2,vxtrk2,vytrk2,vztrk2;
00263     double QESum;
00264     double xQESumGdLS, yQESumGdLS, zQESumGdLS;
00265     double xQESumLS, yQESumLS, zQESumLS;
00266     double xQESumMO, yQESumMO, zQESumMO;
00267     
00268     for (st=statmap.begin(); st != stdone; ++st) {
00269       
00270       // Muon information
00271       
00272       if(st->first=="MuonTrkLengthInOws")  
00273         m_valiTree->MuonTrkLengthInOws = st->second.sum();
00274       if(st->first=="MuonTrkLengthInIws")  
00275         m_valiTree->MuonTrkLengthInIws = st->second.sum();
00276       if(st->first=="MuonTrkLengthInLS")  
00277         m_valiTree->MuonTrkLengthInLS = st->second.sum();
00278       if(st->first=="MuonTrkLengthInGdLS")  
00279         m_valiTree->MuonTrkLengthInGdLS = st->second.sum();
00280 
00281       if(st->first=="dEInn")  m_valiTree->dEInn = st->second.sum();
00282       if(st->first=="dEOut")  m_valiTree->dEOut = st->second.sum();
00283       if(st->first=="MuonStop" && st->second.sum()>0) {
00284         m_valiTree->StopFlag=int(st->second.sum());
00285         cout<< "EEEE: "<<st->second.sum();
00286       }
00287       
00288       // Energy information
00289       
00290       if(st->first=="EDepInGdLS") 
00291         m_valiTree->EDepInGdLS = st->second.sum();
00292       if(st->first=="EDepInLS") 
00293           m_valiTree->EDepInLS = st->second.sum();
00294       if(st->first=="EDepInIAV") 
00295          m_valiTree->EDepInIAV = st->second.sum();
00296       if(st->first=="EDepInOAV") 
00297          m_valiTree->EDepInOAV = st->second.sum();
00298       if(st->first=="EDepInOIL") 
00299          m_valiTree->EDepInOIL = st->second.sum();
00300       
00301       if(st->first=="QEDepInGdLS") 
00302         m_valiTree->QEDepInGdLS = st->second.sum();
00303       if(st->first=="QEDepInLS")                  
00304           m_valiTree->QEDepInLS = st->second.sum();
00305       if(st->first=="QEDepInIAV")                 
00306          m_valiTree->QEDepInIAV = st->second.sum();
00307       if(st->first=="QEDepInOAV")                 
00308          m_valiTree->QEDepInOAV = st->second.sum();
00309       if(st->first=="QEDepInOIL")                 
00310          m_valiTree->QEDepInOIL = st->second.sum();
00311       
00312       if(st->first == "tQESumGdLS")
00313         m_valiTree->tQESumGdLS = st->second.sum();
00314       if(st->first == "xQESumGdLS")
00315         xQESumGdLS = st->second.sum();
00316       if(st->first == "yQESumGdLS")
00317         yQESumGdLS = st->second.sum();
00318       if(st->first == "zQESumGdLS")
00319         zQESumGdLS = st->second.sum();
00320       
00321       if(st->first == "tQESumLS")
00322         m_valiTree->tQESumLS = st->second.sum();
00323       if(st->first == "xQESumLS")
00324         xQESumLS = st->second.sum();
00325       if(st->first == "yQESumLS")
00326         yQESumLS = st->second.sum();
00327       if(st->first == "zQESumLS")
00328         zQESumLS = st->second.sum();
00329       
00330       if(st->first == "tQESumMO") 
00331         m_valiTree->tQESumMO = st->second.sum();
00332       if(st->first == "xQESumMO")                                 
00333         xQESumMO = st->second.sum();
00334       if(st->first == "yQESumMO")                                 
00335         yQESumMO = st->second.sum();
00336       if(st->first == "zQESumMO")                                 
00337         zQESumMO = st->second.sum();
00338       
00339       // Neutron Capture
00340 
00341       if(st->first == "tGen") 
00342         m_valiTree->t_gen = st->second.sum()/CLHEP::microsecond;
00343       if(st->first == "xGen")                                  
00344         m_valiTree->x_gen = st->second.sum();
00345       if(st->first == "yGen")                                  
00346         m_valiTree->y_gen = st->second.sum();
00347       if(st->first == "zGen")                                  
00348         m_valiTree->z_gen = st->second.sum();
00349       
00350       if(st->first == "tCap") 
00351         m_valiTree->t_cap = st->second.sum()/CLHEP::microsecond;
00352       if(st->first == "xCap")                                  
00353         m_valiTree->x_cap = st->second.sum();
00354       if(st->first == "yCap")                                  
00355         m_valiTree->y_cap = st->second.sum();
00356       if(st->first == "zCap")                                  
00357         m_valiTree->z_cap = st->second.sum();
00358       
00359       if(st->first=="capTarget") m_valiTree->capTarget = (int)st->second.sum();
00360       
00362       
00363       if(st->first=="pdgId_Trk1")  
00364         m_valiTree->pdgId_Trk1 = (int)st->second.sum();
00365 
00366       if(st->first=="t_Trk1")      
00367         m_valiTree->t_Trk1 = st->second.sum()/CLHEP::microsecond;
00368       if(st->first=="x_Trk1")      
00369         m_valiTree->x_Trk1 = st->second.sum();
00370       if(st->first=="y_Trk1")      
00371         m_valiTree->y_Trk1 = st->second.sum();
00372       if(st->first=="z_Trk1")      
00373         m_valiTree->z_Trk1 = st->second.sum();
00374 
00375       if(st->first=="tEnd_Trk1") 
00376         m_valiTree->tEnd_Trk1 = st->second.sum()/CLHEP::microsecond;
00377       if(st->first=="xEnd_Trk1")                                   
00378         m_valiTree->xEnd_Trk1 = st->second.sum();
00379       if(st->first=="yEnd_Trk1")                                   
00380         m_valiTree->yEnd_Trk1 = st->second.sum();
00381       if(st->first=="zEnd_Trk1")                                   
00382         m_valiTree->zEnd_Trk1 = st->second.sum();
00383       
00384       if(st->first=="e_Trk1")
00385         m_valiTree->e_Trk1 = st->second.sum() / CLHEP::MeV;
00386 
00387       if(st->first=="p_Trk1")  ptrk1 = st->second.sum() / CLHEP::MeV;
00388       if(st->first=="vx_Trk1") vxtrk1 = st->second.sum();
00389       if(st->first=="vy_Trk1") vytrk1 = st->second.sum();
00390       if(st->first=="vz_Trk1") vztrk1 = st->second.sum();
00391       
00392       if(st->first=="ke_Trk1") 
00393         m_valiTree->ke_Trk1 = st->second.sum() / CLHEP::MeV;
00394       
00395       if(st->first=="TrkLength_GD_Trk1")  
00396         m_valiTree->TrkLength_GD_Trk1 = st->second.sum()/CLHEP::centimeter;
00397       if(st->first=="TrkLength_iAV_Trk1") 
00398         m_valiTree->TrkLength_iAV_Trk1 = st->second.sum()/CLHEP::centimeter;
00399       if(st->first=="TrkLength_LS_Trk1")  
00400         m_valiTree->TrkLength_LS_Trk1 = st->second.sum()/CLHEP::centimeter;
00401       if(st->first=="TrkLength_oAV_Trk1") 
00402         m_valiTree->TrkLength_oAV_Trk1 = st->second.sum()/CLHEP::centimeter;
00403       if(st->first=="TrkLength_Oil_Trk1") 
00404         m_valiTree->TrkLength_Oil_Trk1 = st->second.sum()/CLHEP::centimeter;
00405 
00407 
00408       if(st->first=="pdgId_Trk2")  
00409         m_valiTree->pdgId_Trk2 = (int)st->second.sum();
00410       if(st->first=="t_Trk2")      
00411         m_valiTree->t_Trk2 = st->second.sum()/CLHEP::microsecond;
00412       if(st->first=="x_Trk2")      
00413         m_valiTree->x_Trk2 = st->second.sum();
00414       if(st->first=="y_Trk2")      
00415         m_valiTree->y_Trk2 = st->second.sum();
00416       if(st->first=="z_Trk2")      
00417         m_valiTree->z_Trk2 = st->second.sum();
00418       
00419       if(st->first=="tEnd_Trk2") 
00420         m_valiTree->tEnd_Trk2 = st->second.sum()/CLHEP::microsecond;
00421       if(st->first=="xEnd_Trk2")                                   
00422         m_valiTree->xEnd_Trk2 = st->second.sum();
00423       if(st->first=="yEnd_Trk2")                                   
00424         m_valiTree->yEnd_Trk2 = st->second.sum();
00425       if(st->first=="zEnd_Trk2")                                   
00426         m_valiTree->zEnd_Trk2 = st->second.sum();
00427       
00428       if(st->first=="e_Trk2") 
00429         m_valiTree->e_Trk2 = st->second.sum() / CLHEP::MeV;
00430 
00431       if(st->first=="p_Trk2")  ptrk2 = st->second.sum() / CLHEP::MeV;
00432       if(st->first=="vx_Trk2") vxtrk2 = st->second.sum();
00433       if(st->first=="vy_Trk2") vytrk2 = st->second.sum();
00434       if(st->first=="vz_Trk2") vztrk2 = st->second.sum();
00435                                                             
00436       if(st->first=="ke_Trk2")                              
00437         m_valiTree->ke_Trk2 = st->second.sum() / CLHEP::MeV;
00438       
00439       if(st->first=="TrkLength_GD_Trk2")  
00440         m_valiTree->TrkLength_GD_Trk2 = st->second.sum()/CLHEP::centimeter;
00441       if(st->first=="TrkLength_iAV_Trk2") 
00442         m_valiTree->TrkLength_iAV_Trk2 = st->second.sum()/CLHEP::centimeter;
00443       if(st->first=="TrkLength_LS_Trk2")  
00444         m_valiTree->TrkLength_LS_Trk2 = st->second.sum()/CLHEP::centimeter;
00445       if(st->first=="TrkLength_oAV_Trk2") 
00446         m_valiTree->TrkLength_oAV_Trk2 = st->second.sum()/CLHEP::centimeter;
00447       if(st->first=="TrkLength_Oil_Trk2") 
00448         m_valiTree->TrkLength_Oil_Trk2 = st->second.sum()/CLHEP::centimeter;
00449       
00450     }
00451     
00452     Gaudi::XYZPoint gp;
00453     Gaudi::XYZPoint lp;
00454     IDetectorElement *de;
00455     
00456     if(m_valiTree->pdgId_Trk1==2112 || m_valiTree->pdgId_Trk2==2112)
00457     {
00458       gp.SetCoordinates(m_valiTree->x_gen,m_valiTree->y_gen,m_valiTree->z_gen);
00459       if(gp.x()!=0 || gp.y()!=0 || gp.z()!=0)
00460       {
00461         de = m_csvc->coordSysDE(gp);
00462         if(de!=0)
00463         {
00464           lp = de->geometry()->toLocal(gp);
00465           m_valiTree->x_gen = lp.x()/CLHEP::centimeter;
00466           m_valiTree->y_gen = lp.y()/CLHEP::centimeter;
00467           m_valiTree->z_gen = lp.z()/CLHEP::centimeter;
00468         }
00469         else
00470         {
00471           m_valiTree->x_gen = 0;
00472           m_valiTree->y_gen = 0;
00473           m_valiTree->z_gen = 0;
00474         }
00475       }
00476       
00477       gp.SetCoordinates(m_valiTree->x_cap,m_valiTree->y_cap,m_valiTree->z_cap);
00478       if(gp.x()!=0 || gp.y()!=0 || gp.z()!=0)
00479       {
00480         de = m_csvc->coordSysDE(gp);
00481         if(de!=0)
00482         {
00483           lp = de->geometry()->toLocal(gp);
00484           m_valiTree->x_cap = lp.x()/CLHEP::centimeter;
00485           m_valiTree->y_cap = lp.y()/CLHEP::centimeter;
00486           m_valiTree->z_cap = lp.z()/CLHEP::centimeter;
00487         }
00488         else
00489         {
00490           m_valiTree->x_cap = 0;
00491           m_valiTree->y_cap = 0;
00492           m_valiTree->z_cap = 0;
00493         }
00494       }
00495     }
00496     
00497     gp.SetCoordinates(m_valiTree->x_Trk1,m_valiTree->y_Trk1,m_valiTree->z_Trk1);
00498     if(gp.x()!=0 || gp.y()!=0 || gp.z()!=0)
00499     {
00500       de = m_csvc->coordSysDE(gp);
00501       if(de!=0)
00502       {
00503         lp = de->geometry()->toLocal(gp);
00504         m_valiTree->x_Trk1 = lp.x()/CLHEP::centimeter;
00505         m_valiTree->y_Trk1 = lp.y()/CLHEP::centimeter;
00506         m_valiTree->z_Trk1 = lp.z()/CLHEP::centimeter;
00507       }
00508       else
00509       {
00510         m_valiTree->x_Trk1 = 0;
00511         m_valiTree->y_Trk1 = 0;
00512         m_valiTree->z_Trk1 = 0;
00513       }
00514     }
00515     
00516     gp.SetCoordinates(m_valiTree->xEnd_Trk1,m_valiTree->yEnd_Trk1,m_valiTree->zEnd_Trk1);
00517     if(gp.x()!=0 || gp.y()!=0 || gp.z()!=0)
00518     {
00519       de = m_csvc->coordSysDE(gp);
00520       if(de!=0)
00521       {
00522         lp = de->geometry()->toLocal(gp);
00523         m_valiTree->xEnd_Trk1 = lp.x()/CLHEP::centimeter;
00524         m_valiTree->yEnd_Trk1 = lp.y()/CLHEP::centimeter;
00525         m_valiTree->zEnd_Trk1 = lp.z()/CLHEP::centimeter;
00526       }
00527       else
00528       {
00529         m_valiTree->xEnd_Trk1 = 0;
00530         m_valiTree->yEnd_Trk1 = 0;
00531         m_valiTree->zEnd_Trk1 = 0;
00532       }
00533     }
00534     
00535     gp.SetCoordinates(m_valiTree->x_Trk2,m_valiTree->y_Trk2,m_valiTree->z_Trk2);
00536     if(gp.x()!=0 || gp.y()!=0 || gp.z()!=0)
00537     {
00538       de = m_csvc->coordSysDE(gp);
00539       if(de!=0)
00540       {
00541         lp = de->geometry()->toLocal(gp);
00542         m_valiTree->x_Trk2 = lp.x()/CLHEP::centimeter;
00543         m_valiTree->y_Trk2 = lp.y()/CLHEP::centimeter;
00544         m_valiTree->z_Trk2 = lp.z()/CLHEP::centimeter;
00545       }
00546       else
00547       {
00548         m_valiTree->x_Trk2 = 0;
00549         m_valiTree->y_Trk2 = 0;
00550         m_valiTree->z_Trk2 = 0;
00551       }
00552     }
00553     
00554     gp.SetCoordinates(m_valiTree->xEnd_Trk2,m_valiTree->yEnd_Trk2,m_valiTree->zEnd_Trk2);
00555     if(gp.x()!=0 || gp.y()!=0 || gp.z()!=0)
00556     {
00557       de = m_csvc->coordSysDE(gp);
00558       if(de!=0)
00559       {
00560         lp = de->geometry()->toLocal(gp);
00561         m_valiTree->xEnd_Trk2 = lp.x()/CLHEP::centimeter;
00562         m_valiTree->yEnd_Trk2 = lp.y()/CLHEP::centimeter;
00563         m_valiTree->zEnd_Trk2 = lp.z()/CLHEP::centimeter;
00564       }
00565       else
00566       {
00567         m_valiTree->xEnd_Trk2 = 0;
00568         m_valiTree->yEnd_Trk2 = 0;
00569         m_valiTree->zEnd_Trk2 = 0;
00570       }
00571     }
00572     
00573     m_valiTree->px_Trk1 = ptrk1 * vxtrk1;
00574     m_valiTree->py_Trk1 = ptrk1 * vytrk1;
00575     m_valiTree->pz_Trk1 = ptrk1 * vztrk1;
00576     
00577     m_valiTree->px_Trk2 = ptrk2 * vxtrk2;
00578     m_valiTree->py_Trk2 = ptrk2 * vytrk2;
00579     m_valiTree->pz_Trk2 = ptrk2 * vztrk2;
00580     
00581     if (m_valiTree->QEDepInGdLS > 0.) {
00582       m_valiTree->tQESumGdLS /= (m_valiTree->QEDepInGdLS * CLHEP::microsecond);
00583       Gaudi::XYZPoint grQESumGdLS(xQESumGdLS / m_valiTree->QEDepInGdLS, 
00584                                   yQESumGdLS / m_valiTree->QEDepInGdLS, 
00585                                   zQESumGdLS / m_valiTree->QEDepInGdLS);
00586       Gaudi::XYZPoint lrQESumGdLS = m_geo->toLocal(grQESumGdLS);
00587     
00588       m_valiTree->xQESumGdLS = lrQESumGdLS.x()/CLHEP::centimeter;
00589       m_valiTree->yQESumGdLS = lrQESumGdLS.y()/CLHEP::centimeter;
00590       m_valiTree->zQESumGdLS = lrQESumGdLS.z()/CLHEP::centimeter;
00591     }
00592 
00593     if (m_valiTree->QEDepInLS > 0.) {
00594       m_valiTree->tQESumLS /= (m_valiTree->QEDepInLS * CLHEP::microsecond);
00595       Gaudi::XYZPoint grQESumLS(xQESumLS / m_valiTree->QEDepInGdLS, 
00596                                 yQESumLS / m_valiTree->QEDepInGdLS, 
00597                                 zQESumLS / m_valiTree->QEDepInGdLS);
00598       
00599       Gaudi::XYZPoint lrQESumLS = m_geo->toLocal(grQESumLS);
00600 
00601       m_valiTree->xQESumLS = lrQESumLS.x()/CLHEP::centimeter;
00602       m_valiTree->yQESumLS = lrQESumLS.y()/CLHEP::centimeter;
00603       m_valiTree->zQESumLS = lrQESumLS.z()/CLHEP::centimeter;
00604     }
00605 
00606     QESum = m_valiTree->QEDepInGdLS + m_valiTree->QEDepInLS;
00607     if (QESum > 0.) {
00608       m_valiTree->tCtrQE = 
00609         (m_valiTree->tQESumGdLS + m_valiTree->tQESumLS) / QESum
00610         / CLHEP::microsecond;
00611       Gaudi::XYZPoint grCtrQE( (xQESumGdLS + xQESumLS) / QESum, 
00612                                (yQESumGdLS + yQESumLS) / QESum,
00613                                (zQESumGdLS + zQESumLS) / QESum );
00614       Gaudi::XYZPoint lrCtrQE = m_geo->toLocal(grCtrQE);
00615       m_valiTree->xCtrQE = lrCtrQE.x()/CLHEP::centimeter;
00616       m_valiTree->yCtrQE = lrCtrQE.y()/CLHEP::centimeter;
00617       m_valiTree->zCtrQE = lrCtrQE.z()/CLHEP::centimeter;
00618     }
00619     
00620     debug() << "Capture target: " << m_valiTree->capTarget << endreq;
00621     
00622   } else {
00623 
00624     m_valiTree->MuonTrkLengthInOws = 0;
00625     m_valiTree->MuonTrkLengthInIws = 0;
00626     m_valiTree->MuonTrkLengthInLS = 0;
00627     m_valiTree->MuonTrkLengthInGdLS = 0;
00628     m_valiTree->StopFlag=0;
00629     m_valiTree->dEInn = 0;
00630     m_valiTree->dEOut =0;
00631 
00632   }
00633   
00635   const DayaBay::SimParticleHistory* history = simheader->particleHistory();
00636   
00637   if(history) {
00639     const std::list<DayaBay::SimTrack*>& TrackList = history->tracks();
00640     std::list<DayaBay::SimTrack*>::const_iterator cit;
00641 
00642     debug() << "Track list size: " << TrackList.size() << endreq;
00643 
00644     double t0, x0, y0, z0;
00645     double t1, x1, y1, z1;
00646     
00647     /* the center of AD1 in the global frame */
00648     /* Hard-coding is bad. But for now, it is only for test purpose.
00649        the information is available in the *_gen and *_cap branches.
00650        --- Wei */
00651     const Double_t AD1ctr_x = -1496.055;
00652     const Double_t AD1ctr_y = -80452.055;
00653     const Double_t AD1ctr_z = -710.0;
00654     
00655     for(cit=TrackList.begin(); cit!=TrackList.end(); ++cit) {
00656 
00657       debug()<<"pdg: "<<(*cit)->particle()<<endreq;
00658       debug()<<"parent:"<<(*cit)->parentParticle()<<endreq;
00659       
00660       const std::vector<DayaBay::SimVertex*>& trkVtxList = (*cit)->vertices();
00661       std::vector<DayaBay::SimVertex*>::const_iterator vtxi;
00662       
00663       debug() << "# of vertices: " << trkVtxList.size() << endreq;
00664       
00665       int trkVtxSize = trkVtxList.size();
00666       int count = 0;
00667       
00668       for (vtxi=trkVtxList.begin(); vtxi != trkVtxList.end(); vtxi++) {
00669         
00670         Gaudi::XYZPoint gp = (*vtxi)->position();
00671         Gaudi::XYZPoint lp = m_geo->toLocal(gp);
00672         
00673         if (count == 0) {
00674           
00675           m_valiTree->tBuff1 = (*vtxi)->time()/CLHEP::microsecond;
00676           
00677           m_valiTree->xBuff1 = lp.x()/CLHEP::centimeter;
00678           m_valiTree->yBuff1 = lp.y()/CLHEP::centimeter;
00679           m_valiTree->zBuff1 = lp.z()/CLHEP::centimeter;
00680           
00681           m_valiTree->xBuff2 = 
00682             (*vtxi)->position().x()/CLHEP::centimeter - AD1ctr_x;
00683           m_valiTree->yBuff2 = 
00684             (*vtxi)->position().y()/CLHEP::centimeter - AD1ctr_y;
00685           m_valiTree->zBuff2 = 
00686             (*vtxi)->position().z()/CLHEP::centimeter - AD1ctr_z;
00687           
00688         } 
00689         
00690         if (count == trkVtxSize-1) {
00691           t1 = (*vtxi)->time()/CLHEP::microsecond;
00692           x1 = (*vtxi)->position().x()/CLHEP::centimeter - AD1ctr_x;
00693           y1 = (*vtxi)->position().y()/CLHEP::centimeter - AD1ctr_y;
00694           z1 = (*vtxi)->position().z()/CLHEP::centimeter - AD1ctr_z;
00695         }
00696         
00697         debug() << "Neutron verties of track: "
00698                 << (*vtxi)->process() << endreq;
00699         debug() << "Time: "
00700                 << (*vtxi)->time()/CLHEP::microsecond << endreq;
00701         count++;
00702       }
00703       
00704     }
00705     
00707     const std::list<DayaBay::SimVertex*>& VertexList = history->vertices();
00708     std::list<DayaBay::SimVertex*>::const_iterator ci;
00709     
00710     int count=0;
00711     debug()<<"vertex list size: "<<VertexList.size()<<endreq;
00712 
00713     for(ci=VertexList.begin(); ci!=VertexList.end(); ++ci) {
00714       count++;
00715       if(count<30) {
00716         debug()<<"process: "<<(*ci)->process()<<endreq;
00717         debug()<<"energy: "<<(*ci)->totalEnergy()<<endreq;      
00718         debug()<< "secondaries: " << (*ci)->secondaries().size() << endreq;
00719         debug()<<"mass: "<<(*ci)->mass()<<endreq;
00720         debug()<<"totalEnergy: "<<(*ci)->totalEnergy()<<endreq;
00721         debug()<<"kineticEnergy: "<<(*ci)->kineticEnergy()<<endreq;
00722       }
00723     }
00724 
00725   }
00726   
00728   m_valiTree->fill();  
00729   
00730   return StatusCode::SUCCESS;
00731 }
00732 
00733 StatusCode DetSimVali::finalize()
00734 {
00735   m_valiTree->close();
00736   delete m_valiTree;
00737 
00738   return this->GaudiAlgorithm::finalize();
00739 }
00740 
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:56:26 2011 for DetSimValidation by doxygen 1.4.7