/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Reconstruction/TofEnergyRec/TofEnergyRec-00-00-11/src/TofShower.cxx

Go to the documentation of this file.
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)   // m_output wird auf false und m_isData auf true gesetzt
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   //Get TOF Calibtration Service
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     std::cout << "Test TofEnergyCalibSvc  getCalibConst= " 
00107               << m_TofEnergyCalibSvc -> getCalibConst() 
00108               <<"para1="<<m_TofEnergyCalibSvc -> getPara1()
00109               <<"para2="<<m_TofEnergyCalibSvc -> getPara2()
00110               <<"para3="<<m_TofEnergyCalibSvc -> getPara3()
00111               <<"para4="<<m_TofEnergyCalibSvc -> getPara4()
00112               <<"para5="<<m_TofEnergyCalibSvc -> getPara5()
00113               << std::endl;
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         //from data CalibSvc
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         //double energy = q*0.0036;
00156         //double energy = tofq*m_calibConst;  //new calibration result in 2009.9.27
00157         //cout<< "TofShower       Barrel energy " << energy << endl;
00158 
00159         zpos /= 100.;   //cm->m
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         //cout<<"tofenergy="<<energy<<endl;
00176         //cout<<"tofenergy-old="<<tofq*m_calibConst<<endl;
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         //cout<<"endcap"<<endl;
00198         //ETofData* eTofData = dynamic_cast<ETofData*>(*it);
00199         //TofData* bTofData = (*it);
00200         //double energy = 2*eTofData->adcChannel()/140;
00201         //eTofData->setEnergy(energy);
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       //from data CalibSvc
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       //double energy = q*0.0036;
00239       double energy = tofq*m_calibConst;  //new calibration result in 2009.9.27
00240       //cout<< "TofShower       Barrel energy " << energy << endl;
00241       zpos /= 100.;   //cm->m
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) {    //barrel
00278       int num = im+layer*88;
00279       if(num<88) {   //layer1 
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 {    //endcap
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 { // mrpc
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;           //whether NeighborVec already includes this crystal
00382   bool flagNeighbor=false;   //whether this crystal belongs to NeighborVec
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){  //this crystal is already included
00398           flag=true;
00399           break;
00400         }
00401       }
00402 
00403       if(!flag){       //find a new crystal
00404         //for(ci_tmpNV1=tmpNeighborVec.begin();
00405         //    ci_tmpNV1!=tmpNeighborVec.end();
00406         //    ci_tmpNV1++){
00407         //  if(*ci_tmpNNV==*ci_tmpNV1){  //this crystal belongs to NeighborVec
00408         //    flagNeighbor=true;
00409         //    break;
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()) {   //barrel
00446       TofData* bTofData = (*it);
00447 
00448       //cout << "Identifier(bTofData->identify())  " << Identifier(bTofData->identify()) << endl;
00449       //std::cout << "TofShower  bTofData->energy()  =   "  << bTofData->energy() << std::endl;
00450       if(bTofData->energy()<5.) continue;   //seed energy cut = 6MeV
00451 
00452       max=true;
00453       vector<Identifier> NeighborVec=getNextNeighbors(Identifier(bTofData->identify()));
00454       
00455       //const Identifier & help = Identifier(bTofData->identify());
00456       //cout << "TofShower::findSeed    Barrel Track base  "<<TofID::layer(help) << "  " << TofID::phi_module(help) << endl;
00457 
00458       vector<Identifier>::iterator iNeigh;
00459       for(iNeigh=NeighborVec.begin();
00460           iNeigh!=NeighborVec.end();
00461           iNeigh++) {
00462         
00463         //const Identifier & help2 = Identifier(*iNeigh);
00464         //cout << "TofShower::findSeed    Barrel Track neigh  "<<TofID::layer(help2) << "  " << TofID::phi_module(help2) << endl;
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 {    //endcap
00482      
00483       //cout << "TofShower::findSeed    Endcap Track" << endl;
00484       TofData* eTofData = (*it);
00485       if(eTofData->energy()<5.) continue;   //seed energy cut = 5MeV
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             }//close for 
00502         }//Close for
00503     }//close if(!is_mrpc)
00504 
00505     }
00506     else
00507       {
00508 
00509       TofData* etfData = (*it);
00510       if(etfData->energy()<2.) continue; //Seed energy cut = 2 MeV
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           //cout << "TofShower::findSeed    Phimodule MRPC " << TofID::phi_module(*iNeigh) <<endl;
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             }//close for                         
00528         }//Close for 
00529       //cout << "TofShower::findSeed    Both forloops done" << endl;
00530       }//Close else if(is_mrpc)
00531 
00532     if(max) {
00533       m_seedVec.push_back(Identifier((*it)->identify()));
00534     }
00535 
00536   }//close loop over tofdata
00537 }//close find seed
00538 
00539 
00540 void TofShower::findShower(vector<TofData*>& tofDataVec, RecTofTrackCol* recTofTrackCol, double t0)
00541 {
00542   
00543   energyCalib(tofDataVec, recTofTrackCol);
00544   //cout << "TofShower::findShower    energycalib OK" << endl;
00545   findSeed(tofDataVec);
00546   //cout << "TofShower::findShower    findseed OK" << endl;
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) //Old TofDetector + barrel
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           //match with Tof charged track
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           //energy sum of seed and its neighbors
00588           //use avarage mean to calculation position
00589           double zpos=0;
00590           double energy=0;
00591           double seedPos=0;
00592 
00593           //cout << "Energhy =0 " << endl;
00594           vector<TofData*>::iterator it;
00595           for(it=tofDataVec.begin(); it!=tofDataVec.end(); it++) 
00596             {
00597               if((*it)->identify()==*iSeed) {
00598                 //cout<<"iSeed="<<*iSeed<<endl;
00599                 if((*it)->barrel()) {
00600                   TofData* bTofData = (*it);
00601                   zpos+=bTofData->zpos()*bTofData->energy();
00602                   energy+=bTofData->energy();
00603                   seedPos=bTofData->zpos();
00604           
00605                   //cout << "Add energy barrel seed "<< TofID::layer(*iSeed) <<"  " << TofID::phi_module(*iSeed) << "   " << bTofData->energy() << "   --->   "<< energy  <<endl;
00606                 } else {
00607                   TofData* eTofData = (*it);
00608                   energy+=eTofData->energy();
00609 
00610                   //cout << "Add energy"  << endl;
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                     //cout<<"iNeigh="<<*iNeigh<<endl;
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                       //cout << "Add energy barrel neig " << TofID::layer(*iNeigh) <<"  "  <<  TofID::phi_module(*iNeigh) << "   " << bTofData2->energy() << "   --->   "<< energy  <<endl;
00638                     } else {
00639                       TofData* eTofData2 = (*it2);
00640                       energy+=eTofData2->energy();
00641                     }
00642                     break;
00643                   }
00644                 }
00645             }
00646           if(energy>0) zpos/=energy;
00647 
00648           //for charged track, set energy
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           //for neutral track
00657           if(fabs(zpos)<1.15&&energy>5.&&energy<1000) {    //shower energy cut = 10MeV
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);  //MeV-->GeV
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         }//close if(!is_mrpc)
00677       else // mrpc_case
00678         {
00679           //Determine wether the track is a neutral one or not:(Compare with charged tracks)
00680           //cout << "TofShower::findShower    Seed is mrpc" << endl;
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           //match with Tof charged track
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           //energy sum of seed and its neighbors
00714           //use avarage mean to calculation position
00715           double zpos=0;
00716           double energy=0;
00717           double seedPos=0;
00718 
00719           //cout << "Energhy =0 " << endl;
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                       //cout << "Add energy barrel neig " << TofID::layer(*iNeigh) <<"  "  <<  TofID::phi_module(*iNeigh) << "   " << bTofData2->energy() << "   --->   "<< energy  <<endl;
00751                       break;
00752                   }
00753                 }
00754             }
00755           if(energy>0) zpos/=energy;
00756 
00757           //for charged track, set energy
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           //for neutral track
00766           if(fabs(zpos)<1.15&&energy>5.&&energy<1000) {    //shower energy cut = 10MeV
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);  //MeV-->GeV
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 

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