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");
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 {
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");
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 {
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
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
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
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
00248
00249
00250
00251
00252
00253
00254
00255
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
00272 }
00273
00274
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
00286
00287
00288
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
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
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
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
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
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
00376
00377
00378
00379
00380
00381
00382
00383
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
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
00411 }
00412 }
00413
00414 void McTestAlg::RetrieveEmc()
00415 {
00416
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
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438 }
00439
00440 }
00441
00442
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
00454
00455
00456
00457
00458 }
00459
00460 }
00461 }
00462
00463 void McTestAlg::RetrieveMuc()
00464 {
00465
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
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487 }
00488
00489 }
00490
00491
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
00503
00504
00505
00506 }
00507
00508 }
00509 }
00510
00511
00512