/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Simulation/McTestAlg/McTestAlg-00-00-10/src/McTestAlg.cxx

Go to the documentation of this file.
00001 
00002 
00003 
00004 
00005 
00006 
00007 //
00008 #include "McTestAlg/McTestAlg.h"
00009 
00010 #include "GaudiKernel/IDataProviderSvc.h"
00011 #include "GaudiKernel/ISvcLocator.h"
00012 #include "GaudiKernel/Bootstrap.h"
00013 #include "GaudiKernel/SmartDataPtr.h"
00014 #include "GaudiKernel/RegistryEntry.h"
00015 #include "GaudiKernel/MsgStream.h"
00016 
00017 #include "CLHEP/Vector/LorentzVector.h"
00018 #include "CLHEP/Geometry/Point3D.h"
00019 
00020 #include "MdcRawEvent/MdcDigi.h"
00021 #include "TofRawEvent/TofDigi.h"
00022 #include "EmcRawEvent/EmcDigi.h"
00023 #include "MucRawEvent/MucDigi.h"
00024 
00025 #include "McTruth/McParticle.h"
00026 #include "McTruth/MdcMcHit.h"
00027 #include "McTruth/TofMcHit.h"
00028 #include "McTruth/EmcMcHit.h"
00029 #include "McTruth/MucMcHit.h"
00030 
00031 #include "Identifier/Identifier.h"
00032 #include "Identifier/MdcID.h"
00033 #include "Identifier/TofID.h"
00034 #include "Identifier/EmcID.h"
00035 #include "Identifier/MucID.h"
00036 
00037 #include "RawEvent/RawDataUtil.h"
00038 #include "RawEvent/DigiEvent.h"
00039 #include "McTruth/McEvent.h"
00040 #include "EventModel/EventModel.h"
00041 #include "EventModel/EventHeader.h"
00042 
00043 McTestAlg::McTestAlg(const std::string& name, ISvcLocator* pSvcLocator) :
00044 Algorithm(name, pSvcLocator)
00045 {
00046   declareProperty("ParticleRootFlag",m_particleRootFlag=false);
00047   declareProperty("MdcRootFlag",m_mdcRootFlag=false);
00048   declareProperty("TofRootFlag",m_tofRootFlag=false);
00049 }
00050 
00051 StatusCode McTestAlg::initialize()
00052 {
00053   MsgStream log(msgSvc(), name());
00054   log << MSG::INFO << " McTestAlg initialize()" << endreq;
00055  
00056   if(m_particleRootFlag)
00057   {
00058     StatusCode sc;
00059     NTuplePtr ntp(ntupleSvc(), "FILE900/particle");
00060     if(ntp) tupleParticle = ntp;
00061     else {
00062       tupleParticle = ntupleSvc()->book("FILE900/particle",CLID_ColumnWiseTuple,"McTestAlg");
00063       if(tupleParticle)
00064         sc = tupleParticle->addItem("me",me);
00065     }
00066   }
00067     
00068   if(m_mdcRootFlag) 
00069   { 
00070     StatusCode sc;
00071     NTuplePtr nt1(ntupleSvc(), "FILE901/n1");  //for Mdc McTruth
00072     if(nt1) tupleMdc1 = nt1;
00073     else {
00074       tupleMdc1 = ntupleSvc()->book("FILE901/n1",CLID_ColumnWiseTuple,"McTestAlg");
00075       if(tupleMdc1)
00076       {
00077         sc = tupleMdc1->addItem("truthIndex",truthMdcIndex);
00078         sc = tupleMdc1->addItem("truthLayer",truthMdcLayer);
00079         sc = tupleMdc1->addItem("truthWire",truthMdcWire);
00080         sc = tupleMdc1->addItem("truthEdep",truthMdcEdep);
00081         sc = tupleMdc1->addItem("truthDriftD",truthMdcDriftD);
00082         sc = tupleMdc1->addItem("truthX",truthMdcX);
00083         sc = tupleMdc1->addItem("truthY",truthMdcY);
00084         sc = tupleMdc1->addItem("truthZ",truthMdcZ);
00085         sc = tupleMdc1->addItem("ntruth",ntruthMdc);
00086       }
00087       else    {   // did not manage to book the N tuple....
00088         log << MSG::ERROR <<"Cannot book MDC N-tuple:" << long(tupleMdc1) << endmsg;
00089         return StatusCode::FAILURE;
00090       }
00091     }
00092   
00093     NTuplePtr nt2(ntupleSvc(), "FILE901/n2");  //for Mdc digit
00094     if(nt2) tupleMdc2 = nt2;
00095     else {
00096       tupleMdc2 = ntupleSvc()->book("FILE901/n2",CLID_ColumnWiseTuple,"McTestAlg");
00097       if(tupleMdc2)
00098       {
00099         sc = tupleMdc2->addItem("layer",m_layer);
00100         sc = tupleMdc2->addItem("cell",m_cell);
00101         sc = tupleMdc2->addItem("ADC",m_charge);
00102         sc = tupleMdc2->addItem("TDC",m_time);
00103       }
00104     }
00105   }
00106   
00107   if(m_tofRootFlag)
00108   {
00109     StatusCode sc;
00110     NTuplePtr nt(ntupleSvc(), "FILE902/lr");
00111     if(nt) tupleTof = nt;
00112     else {
00113       tupleTof=ntupleSvc()->book("FILE902/lr",CLID_ColumnWiseTuple,"McTestAlg");
00114       if(tupleTof)
00115       {
00116         sc = tupleTof->addItem("truthIndex",truthIndex);
00117         sc = tupleTof->addItem("truthPartId",truthPartId);
00118         sc = tupleTof->addItem("truthLayer",truthLayer);
00119         sc = tupleTof->addItem("truthScinNb",truthScinNb);
00120         sc = tupleTof->addItem("truthX",truthX);
00121         sc = tupleTof->addItem("truthY",truthY);
00122         sc = tupleTof->addItem("truthZ",truthZ);
00123         sc = tupleTof->addItem("ntruth",ntruth);
00124         sc = tupleTof->addItem("tleft",tleft);
00125         sc = tupleTof->addItem("tright",tright);
00126         sc = tupleTof->addItem("qleft",qleft);
00127         sc = tupleTof->addItem("qright",qright);
00128       }
00129       else    {   // did not manage to book the N tuple....
00130         log << MSG::ERROR <<"Cannot book N-tuple:" << long(tupleTof) << endmsg;
00131         return StatusCode::FAILURE;
00132       }
00133     }
00134   }  
00135   return StatusCode::SUCCESS;
00136 }
00137 
00138 StatusCode McTestAlg::finalize() 
00139 {
00140   MsgStream log(msgSvc(), name());
00141   log << MSG::INFO << "McTestAlg finalize()" << endreq;
00142       
00143   return StatusCode::SUCCESS;
00144   
00145 }
00146 
00147         
00148 StatusCode McTestAlg::execute()
00149 {
00150   //interface to event data service
00151   ISvcLocator* svcLocator = Gaudi::svcLocator();
00152   StatusCode sc=svcLocator->service("EventDataSvc", m_evtSvc);
00153   if (sc.isFailure())
00154     std::cout<<"Could not accesss EventDataSvc!"<<std::endl;
00155 
00156   SmartDataPtr<Event::EventHeader> eventHeader(m_evtSvc,"/Event/EventHeader");
00157   if(!eventHeader)
00158     std::cout<<"Could not retrieve EventHeader"<<std::endl;
00159 
00160   int event=eventHeader->eventNumber();
00161   std::cout<<"event: "<<event<<std::endl;
00162 
00163   RetrieveMcParticle();
00164   RetrieveMdc();
00165   RetrieveTof();
00166   RetrieveEmc();
00167   RetrieveMuc();
00168 
00169   return StatusCode::SUCCESS;
00170 
00171 }
00172 
00173 void McTestAlg::RetrieveMcParticle()
00174 {
00175   SmartDataPtr<Event::McParticleCol> mcParticleCol(m_evtSvc,"/Event/MC/McParticleCol");
00176   if(!mcParticleCol)
00177     std::cout<<"Could not retrieve McParticelCol"<<std::endl;
00178   else
00179   {
00180     int pdgcode;
00181     double px,py,pz,E,mass;
00182     int nflag=0;
00183     Event::McParticleCol::iterator iter_mc = mcParticleCol->begin();
00184     for (;iter_mc != mcParticleCol->end(); iter_mc++)
00185     {
00186       //Event::McParticle mp = (*iter_mc)->mother();
00187       pdgcode = (*iter_mc)->particleProperty();
00188       if((*iter_mc)->trackIndex()<0)
00189         std::cout<<"ERROR! trackIndex<0"<<std::endl;
00190       px=(*iter_mc)->initialFourMomentum().x();
00191       py=(*iter_mc)->initialFourMomentum().y();
00192       pz=(*iter_mc)->initialFourMomentum().z();
00193       E=(*iter_mc)->initialFourMomentum().t();
00194       if(E*E-px*px-py*py-pz*pz>=0)
00195         mass=sqrt(E*E-px*px-py*py-pz*pz);
00196       else
00197         mass=0;
00198 
00199       if(m_particleRootFlag)
00200       {
00201         if(abs(pdgcode)==11)
00202           me=mass;
00203         tupleParticle->write();
00204       }
00205       if(abs(pdgcode)==2212||abs(pdgcode)==211)
00206         nflag++;
00207     }
00208     if(nflag!=4)
00209       std::cout<<"nflag!=4"<<std::endl;
00210   }
00211 }
00212 
00213 void McTestAlg::MdcInit()
00214 {
00215   truthMdcIndex = -9;
00216   truthMdcLayer = -9;
00217   truthMdcWire = -9; 
00218   truthMdcEdep = -9;
00219   truthMdcDriftD = -9;
00220   truthMdcX = -9;
00221   truthMdcY = -9;
00222   truthMdcZ = -9;
00223   ntruthMdc = 0;
00224   
00225   m_layer = -9;
00226   m_cell = -9;
00227   m_charge = -9;
00228   m_time = -9;
00229 }     
00230 
00231 
00232 void McTestAlg::RetrieveMdc()
00233 {
00234   if(m_mdcRootFlag)  
00235      MdcInit();
00236 
00237   //retrieve MDC McTruth from TDS
00238   SmartDataPtr<Event::MdcMcHitCol> aMcHitCol(m_evtSvc,"/Event/MC/MdcMcHitCol");
00239   if(!aMcHitCol)
00240     std::cout<<"Could not retrieve MDC McTruth collection"<<std::endl;
00241   else
00242   {
00243     Event::MdcMcHitCol::iterator iMcHitCol;
00244     for(iMcHitCol=aMcHitCol->begin(); iMcHitCol!=aMcHitCol->end(); iMcHitCol++)
00245     {
00246       const Identifier ident = (*iMcHitCol)->identify();
00247       //std::cout<<(*iMcHitCol)->getTrackIndex();
00248       //std::cout<<" "<<MdcID::layer(ident);
00249       //std::cout<<" "<<MdcID::wire(ident);
00250       //std::cout<<" "<<(*iMcHitCol)->getDepositEnergy();
00251       //std::cout<<" "<<(*iMcHitCol)->getDriftDistance();
00252       //std::cout<<" "<<(*iMcHitCol)->getPositionX();
00253       //std::cout<<" "<<(*iMcHitCol)->getPositionY();
00254       //std::cout<<" "<<(*iMcHitCol)->getPositionZ();
00255       //std::cout<<std::endl;
00256 
00257      if(m_mdcRootFlag)
00258      {
00259       truthMdcIndex = (*iMcHitCol)->getTrackIndex();
00260       truthMdcLayer = MdcID::layer(ident);
00261       truthMdcWire = MdcID::wire(ident);
00262       truthMdcEdep = (*iMcHitCol)->getDepositEnergy();
00263       truthMdcDriftD = (*iMcHitCol)->getDriftDistance();
00264       truthMdcX = (*iMcHitCol)->getPositionX();
00265       truthMdcY = (*iMcHitCol)->getPositionY();
00266       truthMdcZ = (*iMcHitCol)->getPositionZ();
00267       ntruthMdc++; 
00268       tupleMdc1->write();
00269      }   
00270     }
00271     //std::cout<<"end of retrieve MDC McTruth collection"<<std::endl;
00272   }
00273   
00274   //retrieve MDC digits from TDS
00275   SmartDataPtr<MdcDigiCol> aDigiCol(m_evtSvc,"/Event/Digi/MdcDigiCol");
00276   if(!aDigiCol)
00277     std::cout<<"Could not retrieve MDC digi collection"<<std::endl;
00278 
00279   else
00280   {
00281     MdcDigiCol::iterator iDigiCol;
00282     for(iDigiCol=aDigiCol->begin(); iDigiCol!=aDigiCol->end(); iDigiCol++)
00283     {
00284       const Identifier ident = (*iDigiCol)->identify();
00285       //std::cout<<"layer: "<<MdcID::layer(ident);
00286       //std::cout<<"  cell: "<<MdcID::wire(ident);
00287       //std::cout<<"  charge: "<<(*iDigiCol)->getChargeChannel();
00288       //std::cout<<"  time: "<<(*iDigiCol)->getTimeChannel()<<std::endl;
00289       
00290      if(m_mdcRootFlag){     
00291       m_layer = MdcID::layer(ident);
00292       m_cell = MdcID::wire(ident);
00293       m_charge = (*iDigiCol)->getChargeChannel()/1.0e6;
00294       m_time = (*iDigiCol)->getTimeChannel()/1.0e5;
00295       tupleMdc2->write();
00296       }
00297     }
00298     //std::cout<<"end of retrieve MDC digi collection"<<std::endl;
00299   }
00300 }
00301 
00302 void McTestAlg::TofInit()
00303 { 
00304   truthIndex = -9;
00305   truthPartId = -9;
00306   truthLayer = -9;
00307   truthScinNb = -9;
00308   truthX = -9;
00309   truthY = -9;
00310   truthZ = -9;
00311   ntruth = 0;
00312   tleft = -9;
00313   tright = -9;
00314   qleft = -9;
00315   qright = -9;
00316 }
00317 
00318 
00319 void McTestAlg::RetrieveTof()
00320 { 
00321   int partId,layer,scinNb,end;
00322   double charge,time; 
00323   partId = layer = scinNb = end = -9;
00324   charge = time = -9;
00325   if(m_tofRootFlag)
00326     TofInit();
00327 
00328   //retrieve TOF McTruth from TDS
00329   SmartDataPtr<Event::TofMcHitCol> aMcHitCol(m_evtSvc,"/Event/MC/TofMcHitCol");
00330   if(!aMcHitCol)
00331     std::cout<<"Could not retrieve TOF McTruth collection"<<std::endl;
00332   else
00333   {
00334     Event::TofMcHitCol::iterator iMcHitCol;
00335     for(iMcHitCol=aMcHitCol->begin(); iMcHitCol!=aMcHitCol->end(); iMcHitCol++)  
00336     {
00337       const Identifier ident = (*iMcHitCol)->identify();
00338       /*std::cout<<(*iMcHitCol)->getTrackIndex();
00339       std::cout<<" "<<TofID::barrel_ec(ident);
00340       std::cout<<" "<<TofID::layer(ident);
00341       std::cout<<" "<<TofID::phi_module(ident);
00342       std::cout<<" "<<(*iMcHitCol)->getPositionX();
00343       std::cout<<" "<<(*iMcHitCol)->getPositionY();
00344       std::cout<<" "<<(*iMcHitCol)->getPositionZ();
00345       std::cout<<" "<<(*iMcHitCol)->getPx();
00346       std::cout<<" "<<(*iMcHitCol)->getPy();
00347       std::cout<<" "<<(*iMcHitCol)->getPz();
00348       std::cout<<" "<<(*iMcHitCol)->getTrackLength();
00349       std::cout<<" "<<(*iMcHitCol)->getFlightTime();
00350       std::cout<<std::endl;*/
00351       if(m_tofRootFlag)
00352       {
00353         truthIndex = (*iMcHitCol)->getTrackIndex();
00354         truthPartId = TofID::barrel_ec(ident);
00355         truthLayer = TofID::layer(ident);
00356         truthScinNb = TofID::phi_module(ident);
00357         truthX = (*iMcHitCol)->getPositionX();
00358         truthY = (*iMcHitCol)->getPositionY();
00359         truthZ = (*iMcHitCol)->getPositionZ();
00360         ntruth++;
00361       } 
00362     }
00363   }
00364 
00365   //retrieve TOF digits from TDS
00366   SmartDataPtr<TofDigiCol> aDigiCol(m_evtSvc,"/Event/Digi/TofDigiCol");
00367   if(!aDigiCol)
00368     std::cout<<"Could not retrieve TOF digi collection"<<std::endl;
00369   else
00370   { 
00371     TofDigiCol::iterator iDigiCol;
00372     for(iDigiCol=aDigiCol->begin(); iDigiCol!=aDigiCol->end(); iDigiCol++)
00373     {
00374       const Identifier ident = (*iDigiCol)->identify();
00375       //std::cout<<"partId: "<<TofID::barrel_ec(ident);
00376       //std::cout<<"  layer: "<<TofID::layer(ident);
00377       //std::cout<<"  scinNb: "<<TofID::phi_module(ident);
00378       //std::cout<<"  end: "<<TofID::end(ident);
00379       //std::cout<<std::endl;
00380       //std::cout<<"  charge: "<<(*iDigiCol)->getChargeChannel();
00381       //std::cout<<"  time: "<<(*iDigiCol)->getTimeChannel()<<std::endl;
00382       //if(TofID::barrel_ec(ident)==barrel_ec && layer == TofID::layer(ident) && 
00383       //   phi_module == TofID::phi_module(ident) )
00384       partId=TofID::barrel_ec(ident);
00385       layer=TofID::layer(ident);
00386       scinNb=TofID::phi_module(ident);
00387       end=TofID::end(ident);
00388       charge = (*iDigiCol)->getChargeChannel()/1.0e6;
00389       time = (*iDigiCol)->getTimeChannel()/1.0e6;
00390       if(m_tofRootFlag)
00391       {
00392         if(truthPartId==partId && truthLayer==layer && truthScinNb==scinNb)
00393         {
00394           if(end==0) {qright = charge; tright=time;}
00395           else  {qleft = charge; tleft = time;}
00396          //std::cout<<partId<<" "<<scinNb<<" "<<charge<<" "<<time<<std::endl; 
00397         }
00398         else
00399           std::cout<<"digi doesn't match"<<std::endl;
00400        }
00401      }
00402      if(m_tofRootFlag)
00403      {
00404        if(tleft>0&&tright>0&&qleft>0&&qright>0)
00405          tupleTof->write();
00406        else
00407          std::cout<<"no digi match MCtruth"<<std::endl;
00408      }
00409    
00410     //std::cout<<"end of retrieve TOF digits"<<std::endl;
00411   }
00412 }  
00413 
00414 void McTestAlg::RetrieveEmc()
00415 {
00416   //retrieve EMC McTruth from TDS
00417   SmartDataPtr<Event::EmcMcHitCol> aMcHitCol(m_evtSvc,"/Event/MC/EmcMcHitCol");
00418   if(!aMcHitCol)
00419     std::cout<<"Could not retrieve EMC McTruth collection"<<std::endl;
00420   else
00421   {
00422     Event::EmcMcHitCol::iterator iMcHitCol;
00423     for(iMcHitCol=aMcHitCol->begin(); iMcHitCol!=aMcHitCol->end(); iMcHitCol++)
00424     {
00425       const Identifier ident = (*iMcHitCol)->identify();
00426       //std::cout<<(*iMcHitCol)->getTrackIndex();
00427       //std::cout<<" "<<EmcID::barrel_ec(ident);
00428       //std::cout<<" "<<EmcID::theta_module(ident);
00429       //std::cout<<" "<<EmcID::phi_module(ident);
00430       //std::cout<<" "<<(*iMcHitCol)->getPositionX();
00431       //std::cout<<" "<<(*iMcHitCol)->getPositionY();
00432       //std::cout<<" "<<(*iMcHitCol)->getPositionZ();
00433       //std::cout<<" "<<(*iMcHitCol)->getPx();
00434       //std::cout<<" "<<(*iMcHitCol)->getPy();
00435       //std::cout<<" "<<(*iMcHitCol)->getPz();
00436       //std::cout<<" "<<(*iMcHitCol)->getDepositEnergy();
00437       //std::cout<<std::endl;
00438     }
00439     //std::cout<<"end of retrieve EMC McTruth"<<std::endl;
00440   }
00441 
00442   //retrieve EMC digits from TDS
00443   SmartDataPtr<EmcDigiCol> aDigiCol(m_evtSvc,"/Event/Digi/EmcDigiCol");
00444   if(!aDigiCol)
00445     std::cout<<"Could not retrieve EMC digi collection"<<std::endl;
00446 
00447   else
00448   {
00449     EmcDigiCol::iterator iDigiCol;
00450     for(iDigiCol=aDigiCol->begin(); iDigiCol!=aDigiCol->end(); iDigiCol++)
00451     {
00452       const Identifier ident = (*iDigiCol)->identify();
00453       //std::cout<<"barrel_ec: "<<EmcID::barrel_ec(ident);
00454       //std::cout<<"  theta: "<<EmcID::theta_module(ident);
00455       //std::cout<<"  phi: "<<EmcID::phi_module(ident);
00456       //std::cout<<"  charge: "<<(*iDigiCol)->getChargeChannel();
00457       //std::cout<<"  time: "<<(*iDigiCol)->getTimeChannel()<<std::endl;
00458     }
00459     //std::cout<<"end of retrieve EMC digits"<<std::endl;
00460   }
00461 }
00462  
00463 void McTestAlg::RetrieveMuc()
00464 {
00465   //retrieve MUC McTruth from TDS
00466   SmartDataPtr<Event::MucMcHitCol> aMcHitCol(m_evtSvc,"/Event/MC/MucMcHitCol");
00467   if(!aMcHitCol)
00468     std::cout<<"Could not retrieve MUC McTruth collection"<<std::endl;
00469   else
00470   {
00471     Event::MucMcHitCol::iterator iMcHitCol;
00472     for(iMcHitCol=aMcHitCol->begin(); iMcHitCol!=aMcHitCol->end(); iMcHitCol++)
00473     {
00474       const Identifier ident = (*iMcHitCol)->identify();
00475       //std::cout<<(*iMcHitCol)->getTrackIndex();
00476       //std::cout<<" "<<MucID::part(ident);
00477       //std::cout<<" "<<MucID::seg(ident);
00478       //std::cout<<" "<<MucID::gap(ident);
00479       //std::cout<<" "<<MucID::strip(ident);
00480       //std::cout<<" "<<(*iMcHitCol)->getPositionX();
00481       //std::cout<<" "<<(*iMcHitCol)->getPositionY();
00482       //std::cout<<" "<<(*iMcHitCol)->getPositionZ();
00483       //std::cout<<" "<<(*iMcHitCol)->getPx();
00484       //std::cout<<" "<<(*iMcHitCol)->getPy();
00485       //std::cout<<" "<<(*iMcHitCol)->getPz();
00486       //std::cout<<std::endl;
00487     }
00488     //std::cout<<"end of retrieve MUC McTruth"<<std::endl;
00489   }
00490 
00491   //retrieve MUC digits from TDS
00492   SmartDataPtr<MucDigiCol> aDigiCol(m_evtSvc,"/Event/Digi/MucDigiCol");
00493   if(!aDigiCol)
00494     std::cout<<"Could not retrieve MUC digi collection"<<std::endl;
00495 
00496   else
00497   {
00498     MucDigiCol::iterator iDigiCol;
00499     for(iDigiCol=aDigiCol->begin(); iDigiCol!=aDigiCol->end(); iDigiCol++)
00500     {
00501       const Identifier ident = (*iDigiCol)->identify();
00502       //std::cout<<"Part: "<<MucID::part(ident);
00503       //std::cout<<"  Seg: "<<MucID::seg(ident);
00504       //std::cout<<"  Gap: "<<MucID::gap(ident);
00505       //std::cout<<"  Strip: "<<MucID::strip(ident)<<std::endl;
00506     }
00507     //std::cout<<"end of retrieve MUC digits"<<std::endl;
00508   }
00509 }
00510 
00511 
00512 

Generated on Tue Nov 29 23:14:34 2016 for BOSS_7.0.2 by  doxygen 1.4.7