00001 #include "GaudiKernel/MsgStream.h"
00002 #include "GaudiKernel/Bootstrap.h"
00003 #include "GaudiKernel/ISvcLocator.h"
00004 #include "GaudiKernel/PropertyMgr.h"
00005 #include "GaudiKernel/IJobOptionsSvc.h"
00006 #include "GaudiKernel/INTupleSvc.h"
00007 #include "TofEnergyRec/TofShower.h"
00008 #include "Identifier/Identifier.h"
00009 #include "Identifier/TofID.h"
00010 #include "RawDataProviderSvc/TofData.h"
00011 #include "TofCaliSvc/ITofCaliSvc.h"
00012 #include "TofQCorrSvc/ITofQCorrSvc.h"
00013 #include "TofQElecSvc/ITofQElecSvc.h"
00014 #include "TofEnergyCalibSvc/ITofEnergyCalibSvc.h"
00015
00016
00017 #include "DstEvent/TofHitStatus.h"
00018 #include "globals.hh"
00019 #include <G4String.hh>
00020 #include <iostream>
00021 #include <fstream>
00022 #include <math.h>
00023 #include <string>
00024 #include "TofSim/BesTofDigitizer.hh"
00025 #include "EvTimeEvent/RecEsTime.h"
00026 #include "RawEvent/RawDataUtil.h"
00027
00028
00029
00030
00031 TofShower::TofShower():m_output(false),m_isData(true)
00032 {
00033 IJobOptionsSvc* jobSvc;
00034 Gaudi::svcLocator()->service("JobOptionsSvc", jobSvc);
00035 jobSvc->setMyProperties("TofShower", &m_propMgr);
00036
00037 }
00038
00039 void TofShower::BookNtuple(NTuple::Tuple*& tuple, NTuple::Tuple*& tuple1, NTuple::Tuple*& tuple2)
00040 {
00041 m_output = true;
00042 m_tuple = tuple;
00043 if(!m_tuple) {
00044 std::cerr << "Invalid ntuple in TofEnergyRec!" << std::endl;
00045 } else {
00046 m_tuple->addItem ("part", m_part);
00047 m_tuple->addItem ("layer", m_layer);
00048 m_tuple->addItem ("im", m_im);
00049 m_tuple->addItem ("end", m_end);
00050 m_tuple->addItem ("zpos", m_zpos);
00051 m_tuple->addItem ("adc1", m_adc1);
00052 m_tuple->addItem ("adc2", m_adc2);
00053 m_tuple->addItem ("tdc1", m_tdc1);
00054 m_tuple->addItem ("tdc2", m_tdc2);
00055 m_tuple->addItem ("energy", m_energy);
00056 }
00057
00058 m_tuple1 = tuple1;
00059 if(!m_tuple1) {
00060 std::cerr << "Invalid ntuple1 in TofEnergyRec!" << std::endl;
00061 } else {
00062 m_tuple1->addItem ("part", m_shower_part);
00063 m_tuple1->addItem ("layer", m_shower_layer);
00064 m_tuple1->addItem ("im", m_shower_im);
00065 m_tuple1->addItem ("zpos", m_shower_zpos);
00066 m_tuple1->addItem ("energy", m_shower_energy);
00067 }
00068
00069 m_tuple2 = tuple2;
00070 if(!m_tuple2) {
00071 std::cerr << "Invalid ntuple2 in TofEnergyRec!" << std::endl;
00072 } else {
00073 m_tuple2->addItem ("dist", m_seed_dist);
00074 }
00075 }
00076
00077 void TofShower::energyCalib(vector<TofData*>& tofDataVec, RecTofTrackCol* recTofTrackCol)
00078 {
00079
00080 ISvcLocator* svcLocator = Gaudi::svcLocator();
00081 ITofCaliSvc* tofCaliSvc;
00082 StatusCode sc = svcLocator->service("TofCaliSvc", tofCaliSvc);
00083 if (sc != StatusCode::SUCCESS) {
00084 cout << "TofEnergyRec Get Calibration Service Failed !! " << endl;
00085 }
00086
00087 ITofQCorrSvc* tofQCorrSvc;
00088 sc = svcLocator->service("TofQCorrSvc", tofQCorrSvc);
00089 if (sc != StatusCode::SUCCESS) {
00090 cout << "TofEnergyRec Get QCorr Service Failed !! " << endl;
00091 }
00092
00093 ITofQElecSvc* tofQElecSvc;
00094 sc = svcLocator->service("TofQElecSvc", tofQElecSvc);
00095 if (sc != StatusCode::SUCCESS) {
00096 cout << "TofEnergyRec Get QElec Service Failed !! " << endl;
00097 }
00098
00099 ITofEnergyCalibSvc* m_TofEnergyCalibSvc=0;
00100 sc = svcLocator->service("TofEnergyCalibSvc", m_TofEnergyCalibSvc);
00101 if( sc != StatusCode::SUCCESS){
00102 cout << "can not use TofEnergyCalibSvc" << endreq;
00103 }
00104 else {
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115 }
00116
00117
00118
00119 vector<TofData*>::iterator it;
00120 for(it=tofDataVec.begin();
00121 it!=tofDataVec.end();
00122 it++) {
00123
00124 Identifier id((*it)->identify());
00125 if( TofID::is_scin(id) ) {
00126 int barrel_ec = TofID::barrel_ec(id);
00127 int layer = TofID::layer(id);
00128 int im = TofID::phi_module(id);
00129 int end = TofID::end(id);
00130
00131 if(m_output) {
00132 m_part = barrel_ec;
00133 m_layer = layer;
00134 m_im = im;
00135 m_end = end;
00136 }
00137
00138 if((*it)->barrel()) {
00139 TofData* bTofData = (*it);
00140 bTofData->setZpos(99.);
00141 bTofData->setEnergy(0.);
00142 if(bTofData->tdc1()<=0||bTofData->tdc1()>8000||bTofData->tdc2()<=0||bTofData->tdc2()>8000) continue;
00143
00144 double adc1,adc2,tdc1,tdc2;
00145 tdc1 = bTofData->tdc1();
00146 tdc2 = bTofData->tdc2();
00147 adc1 = bTofData->adc1();
00148 adc2 = bTofData->adc2();
00149
00150
00151 double zpos = tofCaliSvc->ZTDC( tdc1, tdc2, bTofData->tofId() );
00152 if(fabs(zpos)>115) continue;
00153 double tofq = tofCaliSvc->BPh( adc1, adc2, zpos, bTofData->tofId());
00154 if(tofq<100||tofq>10000) continue;
00155
00156
00157
00158
00159 zpos /= 100.;
00160
00162
00163
00164 double CalibPar[5];
00165
00166 CalibPar[0]=m_TofEnergyCalibSvc -> getPara1();
00167 CalibPar[1]=m_TofEnergyCalibSvc -> getPara2();
00168 CalibPar[2]=m_TofEnergyCalibSvc -> getPara3();
00169 CalibPar[3]=m_TofEnergyCalibSvc -> getPara4();
00170 CalibPar[4]=m_TofEnergyCalibSvc -> getPara5();
00171
00172 double TofEnCalibConst=CalibPar[0]+CalibPar[1]*zpos+CalibPar[2]*pow(zpos,2)+CalibPar[3]*pow(zpos,3)+CalibPar[4]*pow(zpos,4);
00173 double energy = tofq*TofEnCalibConst;
00174
00175
00176
00178 bTofData->setZpos(zpos);
00179 bTofData->setEnergy(energy);
00180
00181 if(m_output) {
00182 m_part = barrel_ec;
00183 m_layer = layer;
00184 m_im = im;
00185 m_end = end;
00186 m_adc1 = bTofData->adc1();
00187 m_adc2 = bTofData->adc2();
00188 m_tdc1 = bTofData->tdc1();
00189 m_tdc2 = bTofData->tdc2();
00190 m_zpos = zpos;
00191 m_energy = energy;
00192 m_tuple->write();
00193 }
00194
00195 }
00196 else {
00197
00198
00199
00200
00201
00202 }
00203 }
00204 else {
00205 int barrel_ec = TofID::barrel_ec(id);
00206 int endcap = TofID::endcap(id);
00207 int module = TofID::module(id);
00208 int strip = TofID::strip(id);
00209 int end = TofID::end(id);
00210
00211 if( barrel_ec!=3 || ( endcap!=0 && endcap!=1 ) ) {
00212 cout << "TofEnergyRec Get ETF(MRPC) data ERROR !! barrel_ec:" << barrel_ec << " endcap:" << endcap << endl;
00213 }
00214
00215 if(m_output) {
00216 m_part = barrel_ec;
00217 m_layer = endcap;
00218 m_im = module;
00219 m_end = strip;
00220 }
00221
00222 TofData* etfData = (*it);
00223 etfData->setZpos(99.);
00224 etfData->setEnergy(0.);
00225 if(etfData->tdc1()<=0||etfData->tdc1()>8000||etfData->tdc2()<=0||etfData->tdc2()>8000) continue;
00226
00227 double adc1,adc2,tdc1,tdc2;
00228 tdc1 = etfData->tdc1();
00229 tdc2 = etfData->tdc2();
00230 adc1 = etfData->adc1();
00231 adc2 = etfData->adc2();
00232
00233
00234 double zpos = tofCaliSvc->ZTDC( tdc1, tdc2, etfData->tofId() );
00235 if(fabs(zpos)>115) continue;
00236 double tofq = tofCaliSvc->BPh( adc1, adc2, zpos, etfData->tofId());
00237 if(tofq<100||tofq>10000) continue;
00238
00239 double energy = tofq*m_calibConst;
00240
00241 zpos /= 100.;
00242
00243 etfData->setZpos(zpos);
00244 etfData->setEnergy(energy);
00245
00246 if(m_output) {
00247 m_part = barrel_ec;
00248 m_layer = endcap;
00249 m_im = module;
00250 m_end = strip;
00251 m_adc1 = etfData->adc1();
00252 m_adc2 = etfData->adc2();
00253 m_tdc1 = etfData->tdc1();
00254 m_tdc2 = etfData->tdc2();
00255 m_zpos = zpos;
00256 m_energy = energy;
00257 m_tuple->write();
00258 }
00259 }
00260 }
00261 return;
00262 }
00263
00264 vector<Identifier> TofShower::getNeighbors(const Identifier& id)
00265 {
00266 vector<int> NeighborVec;
00267 vector<Identifier> NeighborIdVec;
00268 NeighborVec.clear();
00269 NeighborIdVec.clear();
00270
00271 if( TofID::is_scin(id) ) {
00272 int barrel_ec = TofID::barrel_ec(id);
00273 int layer = TofID::layer(id);
00274 int im = TofID::phi_module(id);
00275 int end = TofID::end(id);
00276
00277 if(barrel_ec==1) {
00278 int num = im+layer*88;
00279 if(num<88) {
00280 if(num==0) {
00281 NeighborVec.push_back(1);
00282 NeighborVec.push_back(87);
00283 NeighborVec.push_back(88);
00284 NeighborVec.push_back(89);
00285 } else if(num==87) {
00286 NeighborVec.push_back(0);
00287 NeighborVec.push_back(86);
00288 NeighborVec.push_back(88);
00289 NeighborVec.push_back(175);
00290 } else {
00291 NeighborVec.push_back(num+1);
00292 NeighborVec.push_back(num-1);
00293 NeighborVec.push_back(num+88);
00294 NeighborVec.push_back(num+88+1);
00295 }
00296 } else {
00297 if(num==88) {
00298 NeighborVec.push_back(89);
00299 NeighborVec.push_back(175);
00300 NeighborVec.push_back(0);
00301 NeighborVec.push_back(87);
00302 } else if(num==175) {
00303 NeighborVec.push_back(88);
00304 NeighborVec.push_back(174);
00305 NeighborVec.push_back(86);
00306 NeighborVec.push_back(87);
00307 } else {
00308 NeighborVec.push_back(num+1);
00309 NeighborVec.push_back(num-1);
00310 NeighborVec.push_back(num-88);
00311 NeighborVec.push_back(num-88-1);
00312 }
00313 }
00314
00315 int size=NeighborVec.size();
00316 for(int i=0;i<size;i++) {
00317 layer = NeighborVec[i]/88;
00318 im = NeighborVec[i]%88;
00319 NeighborIdVec.push_back(TofID::cell_id(barrel_ec,layer,im,end));
00320 }
00321 }
00322
00323 else {
00324 if(im==0) {
00325 NeighborVec.push_back(1);
00326 NeighborVec.push_back(47);
00327 } else if(im==47) {
00328 NeighborVec.push_back(0);
00329 NeighborVec.push_back(46);
00330 } else {
00331 NeighborVec.push_back(im-1);
00332 NeighborVec.push_back(im+1);
00333 }
00334
00335 int size=NeighborVec.size();
00336 for(int i=0;i<size;i++) {
00337 im = NeighborVec[i];
00338 NeighborIdVec.push_back(TofID::cell_id(barrel_ec,layer,im,end));
00339 }
00340 }
00341 }
00342 else {
00343 int barrel_ec = TofID::barrel_ec(id);
00344 int endcap = TofID::endcap(id);
00345 int module = TofID::module(id);
00346 int strip = TofID::strip(id);
00347 int end = TofID::end(id);
00348
00349 if( module==0 ) {
00350 NeighborVec.push_back(1);
00351 NeighborVec.push_back(35);
00352 } else if( module==35 ) {
00353 NeighborVec.push_back(0);
00354 NeighborVec.push_back(34);
00355 } {
00356 NeighborVec.push_back(module-1);
00357 NeighborVec.push_back(module+1);
00358 }
00359
00360 int size=NeighborVec.size();
00361 for(int i=0;i<size;i++) {
00362 int im = NeighborVec[i];
00363 for(int j=-2; j<3; j++ ) {
00364 int ist = strip + j;
00365 if( ist<0 || ist>11 ) continue;
00366 NeighborIdVec.push_back(TofID::cell_id(barrel_ec,endcap,module,ist,end));
00367 }
00368 }
00369
00370 }
00371
00372 return NeighborIdVec;
00373 }
00374
00375 vector<Identifier> TofShower::getNextNeighbors(const Identifier& id)
00376 {
00377 vector<Identifier> NeighborVec,tmpNeighborVec,tmpNextNeighborVec;
00378 vector<Identifier>::iterator ci_NV,ci_tmpNV,ci_tmpNNV;
00379 NeighborVec=getNeighbors(id);
00380 tmpNeighborVec=getNeighbors(id);
00381 bool flag=false;
00382 bool flagNeighbor=false;
00383
00384
00385 for(ci_tmpNV=tmpNeighborVec.begin();
00386 ci_tmpNV!=tmpNeighborVec.end();
00387 ci_tmpNV++){
00388 tmpNextNeighborVec=getNeighbors(*ci_tmpNV);
00389
00390 for(ci_tmpNNV=tmpNextNeighborVec.begin();
00391 ci_tmpNNV!=tmpNextNeighborVec.end();
00392 ci_tmpNNV++){
00393
00394 for(ci_NV=NeighborVec.begin();
00395 ci_NV!=NeighborVec.end();
00396 ci_NV++){
00397 if(*ci_tmpNNV==*ci_NV){
00398 flag=true;
00399 break;
00400 }
00401 }
00402
00403 if(!flag){
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413 if(*ci_tmpNNV==id)
00414 flagNeighbor=true;
00415
00416 if(!flagNeighbor)
00417 NeighborVec.push_back(*ci_tmpNNV);
00418 else
00419 flagNeighbor=false;
00420 }
00421 else
00422 flag=false;
00423 }
00424
00425 }
00426
00427
00428 return NeighborVec;
00429 }
00430
00431
00432
00433
00434 void TofShower::findSeed(vector<TofData*>& tofDataVec)
00435 {
00436 bool max=false;
00437 m_seedVec.clear();
00438
00439 vector<TofData*>::iterator it;
00440 for(it=tofDataVec.begin();
00441 it!=tofDataVec.end();
00442 it++) {
00443
00444 if( !((*it)->is_mrpc()) ) {
00445 if((*it)->barrel()) {
00446 TofData* bTofData = (*it);
00447
00448
00449
00450 if(bTofData->energy()<5.) continue;
00451
00452 max=true;
00453 vector<Identifier> NeighborVec=getNextNeighbors(Identifier(bTofData->identify()));
00454
00455
00456
00457
00458 vector<Identifier>::iterator iNeigh;
00459 for(iNeigh=NeighborVec.begin();
00460 iNeigh!=NeighborVec.end();
00461 iNeigh++) {
00462
00463
00464
00465
00466 vector<TofData*>::iterator it2;
00467 for(it2=tofDataVec.begin();
00468 it2!=tofDataVec.end();
00469 it2++) {
00470 if((*it2)->identify()==*iNeigh) {
00471 TofData* bTofData2 = (*it2);
00472 if(bTofData2->energy()>bTofData->energy()) {
00473 max=false;
00474 }
00475 break;
00476 }
00477 }
00478
00479 }
00480 }
00481 else {
00482
00483
00484 TofData* eTofData = (*it);
00485 if(eTofData->energy()<5.) continue;
00486 max=true;
00487 vector<Identifier> NeighborVec=getNextNeighbors(Identifier(eTofData->identify()));
00488 vector<Identifier>::iterator iNeigh;
00489 for(iNeigh=NeighborVec.begin(); iNeigh!=NeighborVec.end(); iNeigh++)
00490 {
00491 vector<TofData*>::iterator it2;
00492 for(it2=tofDataVec.begin(); it2!=tofDataVec.end(); it2++)
00493 {
00494 if((*it2)->identify()==*iNeigh) {
00495 TofData* eTofData2 = (*it2);
00496 if(eTofData2->energy()>eTofData->energy()) {
00497 max=false;
00498 }
00499 break;
00500 }
00501 }
00502 }
00503 }
00504
00505 }
00506 else
00507 {
00508
00509 TofData* etfData = (*it);
00510 if(etfData->energy()<2.) continue;
00511 max=true;
00512 vector<Identifier> NeighborVec=getNextNeighbors(Identifier(etfData->identify()));
00513 vector<Identifier>::iterator iNeigh;
00514 for(iNeigh=NeighborVec.begin(); iNeigh!=NeighborVec.end(); iNeigh++)
00515 {
00516
00517 vector<TofData*>::iterator it2;
00518 for(it2=tofDataVec.begin(); it2!=tofDataVec.end(); it2++)
00519 {
00520 if((*it2)->identify()==*iNeigh) {
00521 TofData* etfData2 = (*it2);
00522 if(etfData2->energy()>etfData->energy()) {
00523 max=false;
00524 }
00525 break;
00526 }
00527 }
00528 }
00529
00530 }
00531
00532 if(max) {
00533 m_seedVec.push_back(Identifier((*it)->identify()));
00534 }
00535
00536 }
00537 }
00538
00539
00540 void TofShower::findShower(vector<TofData*>& tofDataVec, RecTofTrackCol* recTofTrackCol, double t0)
00541 {
00542
00543 energyCalib(tofDataVec, recTofTrackCol);
00544
00545 findSeed(tofDataVec);
00546
00547
00548 vector<Identifier>::iterator iSeed;
00549
00550 for(iSeed=m_seedVec.begin(); iSeed!=m_seedVec.end(); iSeed++)
00551 {
00552
00553 bool is_mrpc = TofID::is_mrpc(*iSeed);
00554
00555 if(!is_mrpc)
00556 {
00557 int barrel_ec = TofID::barrel_ec(*iSeed);
00558 int layer = TofID::layer(*iSeed);
00559 int im = TofID::phi_module(*iSeed);
00560 im += layer * 88;
00561
00562 bool neutral=true;
00563
00564 int dphi=999;
00565 RecTofTrackCol::iterator iTrack, iMatch;
00566 for(iTrack=recTofTrackCol->begin(); iTrack!=recTofTrackCol->end(); iTrack++)
00567 {
00568 TofHitStatus *status = new TofHitStatus;
00569 status->setStatus((*iTrack)->status());
00570 if( barrel_ec==1 && status->is_barrel() ) {
00571 dphi=abs(im-(*iTrack)->tofID());
00572 dphi = dphi>=44 ? 88-dphi : dphi;
00573 } else if( barrel_ec==2 && !(status->is_barrel()) && ((*iTrack)->tofID()>47) ) {
00574 dphi=abs(im-(*iTrack)->tofID()+48);
00575 dphi = dphi>=24 ? 48-dphi : dphi;
00576 } else if( barrel_ec==0 && !(status->is_barrel()) && ((*iTrack)->tofID()<48) ) {
00577 dphi=abs(im-(*iTrack)->tofID());
00578 dphi = dphi>=24 ? 48-dphi : dphi;
00579 }
00580 if(abs(dphi)<=2) {
00581 iMatch = iTrack;
00582 neutral=false;
00583 break;
00584 }
00585 }
00586
00587
00588
00589 double zpos=0;
00590 double energy=0;
00591 double seedPos=0;
00592
00593
00594 vector<TofData*>::iterator it;
00595 for(it=tofDataVec.begin(); it!=tofDataVec.end(); it++)
00596 {
00597 if((*it)->identify()==*iSeed) {
00598
00599 if((*it)->barrel()) {
00600 TofData* bTofData = (*it);
00601 zpos+=bTofData->zpos()*bTofData->energy();
00602 energy+=bTofData->energy();
00603 seedPos=bTofData->zpos();
00604
00605
00606 } else {
00607 TofData* eTofData = (*it);
00608 energy+=eTofData->energy();
00609
00610
00611 }
00612 break;
00613 }
00614 }
00615
00616 vector<Identifier> NeighborVec=getNextNeighbors(*iSeed);
00617 vector<Identifier>::iterator iNeigh;
00618 for(iNeigh=NeighborVec.begin(); iNeigh!=NeighborVec.end(); iNeigh++)
00619 {
00620
00621 vector<TofData*>::iterator it2;
00622 for(it2=tofDataVec.begin(); it2!=tofDataVec.end(); it2++)
00623 {
00624 if((*it2)->identify()==*iNeigh) {
00625
00626 if((*it)->barrel()) {
00627 TofData* bTofData2 = (*it2);
00628
00629 if(fabs(bTofData2->zpos())>2) continue;
00630 if(m_output) {
00631 m_seed_dist = seedPos-bTofData2->zpos();
00632 m_tuple2->write();
00633 }
00634 if(fabs(seedPos-bTofData2->zpos())>0.3) continue;
00635 zpos+=bTofData2->zpos()*bTofData2->energy();
00636 energy+=bTofData2->energy();
00637
00638 } else {
00639 TofData* eTofData2 = (*it2);
00640 energy+=eTofData2->energy();
00641 }
00642 break;
00643 }
00644 }
00645 }
00646 if(energy>0) zpos/=energy;
00647
00648
00649 if(neutral==false) {
00650 if(fabs(zpos)<1.15&&energy>5.&&energy<1000) {
00651 (*iMatch)->setEnergy(energy/1000);
00652 }
00653 continue;
00654 }
00655
00656
00657 if(fabs(zpos)<1.15&&energy>5.&&energy<1000) {
00658 RecTofTrack* tof = new RecTofTrack;
00659 tof->setTofID(*iSeed);
00660 TofHitStatus* hitStatus = new TofHitStatus;
00661 hitStatus->init();
00662 tof->setStatus( hitStatus->value());
00663 tof->setZrHit(zpos);
00664 tof->setEnergy(energy/1000);
00665 recTofTrackCol->push_back(tof);
00666
00667 if(m_output) {
00668 m_shower_part = barrel_ec;
00669 m_shower_layer = layer;
00670 m_shower_im = im;
00671 m_shower_zpos = zpos;
00672 m_shower_energy = energy;
00673 m_tuple1->write();
00674 }
00675 }
00676 }
00677 else
00678 {
00679
00680
00681
00682 int barrel_ec = TofID::barrel_ec(*iSeed);
00683 int endcap = TofID::endcap(*iSeed);
00684 int im = TofID::module(*iSeed);
00685 int strip = TofID::strip(*iSeed);
00686 int end = TofID::end(*iSeed);
00687 im += endcap * 36;
00688
00689 bool neutral=true;
00690
00691 int dphi=999, dtheta=999;
00692 RecTofTrackCol::iterator iTrack, iMatch;
00693 for(iTrack=recTofTrackCol->begin(); iTrack!=recTofTrackCol->end(); iTrack++)
00694 {
00695 TofHitStatus *status = new TofHitStatus;
00696 status->setStatus((*iTrack)->status());
00697 if( barrel_ec==3 && endcap==0 && ((*iTrack)->tofID()<36) ) {
00698 dphi = abs(im-(*iTrack)->tofID());
00699 dphi = dphi>=18 ? 36-dphi : dphi;
00700 dtheta = abs( strip - status->layer() );
00701 } else if( barrel_ec==3 && endcap==1 && ((*iTrack)->tofID()>35) ) {
00702 dphi=abs(im-(*iTrack)->tofID()+36);
00703 dphi = dphi>=18 ? 36-dphi : dphi;
00704 dtheta = abs( strip - status->layer() );
00705 }
00706 if( ( abs(dphi)==0 && abs(dtheta)<=2 ) || ( abs(dphi)==1 && abs(dtheta)<=1 ) ) {
00707 iMatch = iTrack;
00708 neutral = false;
00709 break;
00710 }
00711 }
00712
00713
00714
00715 double zpos=0;
00716 double energy=0;
00717 double seedPos=0;
00718
00719
00720 vector<TofData*>::iterator it;
00721 for(it=tofDataVec.begin(); it!=tofDataVec.end(); it++)
00722 {
00723 if((*it)->identify()==*iSeed) {
00724 TofData* etfData = (*it);
00725 zpos+=etfData->zpos()*etfData->energy();
00726 energy+=etfData->energy();
00727 seedPos=etfData->zpos();
00728 break;
00729 }
00730 }
00731
00732 vector<Identifier> NeighborVec=getNextNeighbors(*iSeed);
00733 vector<Identifier>::iterator iNeigh;
00734 for(iNeigh=NeighborVec.begin(); iNeigh!=NeighborVec.end(); iNeigh++)
00735 {
00736 vector<TofData*>::iterator it2;
00737 for(it2=tofDataVec.begin(); it2!=tofDataVec.end(); it2++)
00738 {
00739 if((*it)->barrel()) continue;
00740 if((*it2)->identify()==*iNeigh) {
00741 TofData* etfData2 = (*it2);
00742 if(fabs(etfData2->zpos())>2) continue;
00743 if(m_output) {
00744 m_seed_dist = seedPos-etfData2->zpos();
00745 m_tuple2->write();
00746 }
00747 if(fabs(seedPos-etfData2->zpos())>0.3) continue;
00748 zpos+=etfData2->zpos()*etfData2->energy();
00749 energy+=etfData2->energy();
00750
00751 break;
00752 }
00753 }
00754 }
00755 if(energy>0) zpos/=energy;
00756
00757
00758 if(neutral==false) {
00759 if(fabs(zpos)<1.15&&energy>5.&&energy<1000) {
00760 (*iMatch)->setEnergy(energy/1000);
00761 }
00762 continue;
00763 }
00764
00765
00766 if(fabs(zpos)<1.15&&energy>5.&&energy<1000) {
00767 RecTofTrack* tof = new RecTofTrack;
00768 tof->setTofID(*iSeed);
00769 TofHitStatus* hitStatus = new TofHitStatus;
00770 hitStatus->init();
00771 tof->setStatus( hitStatus->value());
00772 tof->setZrHit(zpos);
00773 tof->setEnergy(energy/1000);
00774 recTofTrackCol->push_back(tof);
00775
00776 if(m_output) {
00777 m_shower_part = barrel_ec;
00778 m_shower_layer = strip;
00779 m_shower_im = im;
00780 m_shower_zpos = zpos;
00781 m_shower_energy = energy;
00782 m_tuple1->write();
00783 }
00784 }
00785 }
00786
00787 }
00788 }
00789
00790 void TofShower::readCalibPar()
00791 {
00792 string paraPath = getenv("TOFENERGYRECROOT");
00793 paraPath += "/share/peak.dat";
00794 ifstream in;
00795 in.open(paraPath.c_str());
00796 assert(in);
00797 for(int i=0;i<176;i++) {
00798 in>>m_ecalib[i];
00799 }
00800 in.close();
00801
00802 paraPath = getenv("TOFENERGYRECROOT");
00803 paraPath += "/share/calib.dat";
00804 ifstream in1;
00805 in1.open(paraPath.c_str());
00806 assert(in1);
00807 for(int i=0;i<176;i++) {
00808 in1>>m_calib[i][0]>>m_calib[i][1]>>m_calib[i][2]>>m_calib[i][3];
00809 }
00810 in1.close();
00811 }
00812
00813 double TofShower::ecalib(const int nsci) const
00814 {
00815 if(nsci<176) {
00816 return m_ecalib[nsci];
00817 } else {
00818 return 0;
00819 }
00820 }
00821
00822 void TofShower::setEcalib(const int nsci, const double ecalib)
00823 {
00824 if(nsci<176) {
00825 m_ecalib[nsci]=ecalib;
00826 }
00827 }
00828
00829 double TofShower::calib(const int n, const int m) const
00830 {
00831 if(n<176&&m<4) {
00832 return m_calib[n][m];
00833 } else {
00834 return 0;
00835 }
00836 }
00837
00838 void TofShower::setCalib(const int n, const int m, const double ecalib)
00839 {
00840 if(n<176&&m<4) {
00841 m_calib[n][m]=ecalib;
00842 }
00843 }
00844