00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "DetSimVali.h"
00014
00015
00016 #include "Event/GenHeader.h"
00017 #include "HepMC/GenEvent.h"
00018
00019
00020 #include "DetDesc/IGeometryInfo.h"
00021 #include "DetDesc/DetectorElement.h"
00022 #include "DetDesc/SolidBase.h"
00023
00024
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
00032
00033 #include "Event/SimParticleHistory.h"
00034 #include "Event/SimUnobservableStatisticsHeader.h"
00035 #include "Event/SimStatistic.h"
00036
00037
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
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
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
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
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
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
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
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
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
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
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
00648
00649
00650
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