/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Mdc/MdcCalibAlg/MdcCalibAlg-00-09-02/src/MdcCalRecTrk.cxx

Go to the documentation of this file.
00001 #include "MdcCalibAlg/MdcCalRecTrk.h"
00002 
00003 #include "GaudiKernel/MsgStream.h"
00004 #include "GaudiKernel/IMessageSvc.h"
00005 #include "GaudiKernel/StatusCode.h"
00006 #include "GaudiKernel/ISvcLocator.h"
00007 #include "GaudiKernel/Bootstrap.h"
00008 #include "GaudiKernel/SmartDataPtr.h"
00009 #include "GaudiKernel/IDataProviderSvc.h"
00010 #include "MdcRawEvent/MdcDigi.h"
00011 #include "McTruth/MdcMcHit.h"
00012 #include "CLHEP/Units/PhysicalConstants.h"
00013 
00014 MdcCalRecTrk::MdcCalRecTrk(int pid){
00015      m_pid = pid;
00016 }
00017 
00018 MdcCalRecTrk::~MdcCalRecTrk(){
00019      unsigned int i;
00020      for(i=0; i<m_rechit.size(); i++){
00021           delete m_rechit[i];
00022      }
00023      m_rechit.clear();
00024 }
00025 
00026 void MdcCalRecTrk::setRecTrk(RecMdcTrackCol::iterator it_trk){
00027      IMessageSvc *msgSvc;
00028      Gaudi::svcLocator()->service("MessageSvc", msgSvc);
00029      MsgStream log(msgSvc, "MdcCalRecTrk");
00030      log << MSG::DEBUG << "MdcCalRecTrk::setRecTrk()" << endreq;
00031 
00032      m_dr = (*it_trk)->helix(0);
00033      m_phi0 = (*it_trk)->helix(1);
00034      m_kappa = (*it_trk)->helix(2);
00035      m_dz = (*it_trk)->helix(3);
00036      m_tanl = (*it_trk)->helix(4);
00037      m_chisq = (*it_trk)->chi2();
00038      m_nhits = (*it_trk)->getNhits();
00039      m_helix = (*it_trk)->helix();
00040      m_helixerr = (*it_trk)->err();
00041      m_fgNoiseRatio = fgNoiseRatio(m_phi0);
00042 
00043      double mass;
00044      if(0 == m_pid) mass = 0.000511;
00045      else if(1 == m_pid) mass = 0.105658;
00046      else if(2 == m_pid) mass = 0.139570;
00047      else if(3 == m_pid) mass = 0.493677;
00048      else if(4 == m_pid) mass = 0.938272;
00049      else if(5 == m_pid) mass = 0.139570; // cosmic-ray
00050      else log << MSG::FATAL << "wrong particle type" << endreq;
00051      m_p4 = (*it_trk)->p4(mass);
00052 
00053      m_dr *= 10.0;              // cm -> mm
00054      m_dz *= 10.0;              // cm -> mm
00055 
00056      m_pt = 1.0 / m_kappa;
00057      m_p = m_pt * sqrt( m_tanl * m_tanl + 1.0 );
00058 
00059      HitRefVec gothits = (*it_trk) -> getVecHits();
00060      HitRefVec::iterator it_hit = gothits.begin();
00061      MdcCalRecHit* rechit;
00062      for(; it_hit != gothits.end(); it_hit++){
00063           rechit = new MdcCalRecHit();
00064           rechit->setRecHit(it_hit);
00065           m_rechit.push_back(rechit);
00066      }
00067 }
00068 
00069 void MdcCalRecTrk::setKalTrk(RecMdcKalTrackCol::iterator it_trk){
00070      IMessageSvc *msgSvc;
00071      Gaudi::svcLocator()->service("MessageSvc", msgSvc);
00072      MsgStream log(msgSvc, "MdcCalRecTrk");
00073      log << MSG::DEBUG << "MdcCalRecTrk::setKalTrk()" << endreq;
00074 
00075      if(0 == m_pid) RecMdcKalTrack::setPidType(RecMdcKalTrack::electron);
00076      else if(1 == m_pid) RecMdcKalTrack::setPidType(RecMdcKalTrack::muon);
00077      else if(2 == m_pid) RecMdcKalTrack::setPidType(RecMdcKalTrack::pion);
00078      else if(3 == m_pid) RecMdcKalTrack::setPidType(RecMdcKalTrack::kaon);
00079      else if(4 == m_pid) RecMdcKalTrack::setPidType(RecMdcKalTrack::proton);
00080      else if(5 == m_pid) RecMdcKalTrack::setPidType(RecMdcKalTrack::muon); // cosmic-ray
00081      else log << MSG::FATAL << "wrong particle type" << endreq;
00082 
00083      m_dr = (*it_trk)->dr();
00084      m_phi0 = (*it_trk)->fi0();
00085      m_kappa = (*it_trk)->kappa();
00086      m_dz = (*it_trk)->dz();
00087      m_tanl = (*it_trk)->tanl();
00088      m_chisq = (*it_trk)->chi2();
00089      m_fgNoiseRatio = fgNoiseRatio(m_phi0);
00090 
00091      m_p4.setPx(- sin(m_phi0) / fabs(m_kappa));
00092      m_p4.setPy(cos(m_phi0) / fabs(m_kappa));
00093      m_p4.setPz(m_tanl / fabs(m_kappa));
00094      double p3 = m_p4.mag();
00095      double mass;
00096      if(0 == m_pid) mass = 0.000511;
00097      else if(1 == m_pid) mass = 0.105658;
00098      else if(2 == m_pid) mass = 0.139570;
00099      else if(3 == m_pid) mass = 0.493677;
00100      else if(4 == m_pid) mass = 0.938272;
00101      else if(5 == m_pid) mass = 0.139570; // cosmic-ray
00102      m_p4.setE(sqrt(p3 * p3 + mass * mass));
00103 
00104      m_dr *= 10.0;              // cm -> mm
00105      m_dz *= 10.0;              // cm -> mm
00106 
00107      m_pt = 1.0 / m_kappa;
00108      m_p = m_pt * sqrt( m_tanl * m_tanl + 1.0 );
00109 
00110 //      cout << setw(15) << m_p << setw(15) << m_dr << setw(15) << m_phi0
00111 //        << setw(15) << m_kappa << setw(15) << m_dz << setw(15) << m_tanl << endl;
00112 
00113      HelixSegRefVec gothelixsegs = (*it_trk)->getVecHelixSegs();
00114      HelixSegRefVec::iterator it_hit = gothelixsegs.begin();
00115      MdcCalRecHit* rechit;
00116 
00117      int k = 0;
00118      for(; it_hit != gothelixsegs.end(); it_hit++){
00119           rechit = new MdcCalRecHit();
00120           rechit->setKalHit(it_hit);
00121           m_rechit.push_back(rechit);
00122 
00123           k++;
00124      }
00125      m_nhits = k;
00126 //      cout<<"hits "<<m_nhits <<endl;
00127 }
00128 
00129 bool MdcCalRecTrk::fgNoiseRatio(double phi0){
00130      IMessageSvc* msgSvc;
00131      Gaudi::svcLocator() -> service("MessageSvc", msgSvc);
00132      MsgStream log(msgSvc, "MdcCalib");
00133 
00134      IDataProviderSvc* eventSvc = NULL;
00135      Gaudi::svcLocator()->service("EventDataSvc", eventSvc);
00136      SmartDataPtr<MdcDigiCol> mdcDigiCol(eventSvc,"/Event/Digi/MdcDigiCol");
00137      if (!mdcDigiCol) {
00138           log << MSG::FATAL << "Could not find event" << endreq;
00139      }
00140 
00141      int lay;
00142      int cel;
00143      bool hitCel[43][288];
00144      for(lay=0; lay<43; lay++){
00145           for(cel=0; cel<288; cel++){
00146                hitCel[lay][cel] = false;
00147           }
00148      }
00149 
00150      MdcDigiCol::iterator iter = mdcDigiCol->begin();
00151      unsigned fgOverFlow;
00152      int digiId = 0;
00153      Identifier id;
00154      for(; iter != mdcDigiCol->end(); iter++, digiId++) {
00155           MdcDigi *aDigi = (*iter);
00156           id = (aDigi)->identify();
00157           lay = MdcID::layer(id);
00158           cel = MdcID::wire(id);
00159           fgOverFlow = (aDigi) -> getOverflow();
00160 
00161           bool goodTQ = true;
00162           if ( ((fgOverFlow & 3) !=0 ) || ((fgOverFlow & 12) != 0) ||
00163                (aDigi->getTimeChannel() == 0x7FFFFFFF) ||
00164                (aDigi->getChargeChannel() == 0x7FFFFFFF) ) goodTQ = false;
00165 
00166           bool goodT = true;
00167           if ( ((fgOverFlow & 1) !=0 ) || (aDigi->getTimeChannel() == 0x7FFFFFFF) ) goodT = false;
00168 
00169 //        if(!goodTQ) continue;
00170           if(!goodT) continue;
00171 
00172           hitCel[lay][cel] = true;
00173      }
00174 
00175      SmartDataPtr<RecMdcTrackCol> newtrkCol(eventSvc, "/Event/Recon/RecMdcTrackCol");
00176      if(!newtrkCol){
00177           log << MSG::ERROR << "Could not find RecMdcTrackCol" << endreq;
00178           return -1;
00179      }
00180 
00181      int nNoiRange = 4;         // number of cells
00182      double dphi = 1.0;
00183      RecMdcTrackCol::iterator it_trk = newtrkCol->begin();
00184      for(it_trk = newtrkCol->begin(); it_trk != newtrkCol->end(); it_trk++){
00185           HitRefVec gothits = (*it_trk) -> getVecHits();
00186           HitRefVec::iterator it_hit = gothits.begin();
00187           HepVector helix = (*it_trk)->helix();
00188           HepSymMatrix helixErr = (*it_trk)->err();
00189           double phi0Rec = (*it_trk)->helix(1);
00190           double delphi;
00191           if(phi0Rec>phi0) delphi = phi0Rec - phi0;
00192           else delphi = phi0 - phi0Rec;
00193           if(delphi > CLHEP::pi) delphi -= CLHEP::pi;
00194           if(delphi > (CLHEP::pi*0.17)) continue;
00195 
00196           int nhitLay1 = 0;     // lay0-3
00197           int nhitLay2 = 0;     // lay4-7
00198           int nhitLay3 = 0;     // lay8-19
00199           int nhitLay4 = 0;     // lay20-42
00200           int nhitT1 = 0;
00201           int nhitT2 = 0;
00202           int nhitT3 = 0;
00203           int nhitT4 = 0;
00204           for(lay=0; lay<8; lay++){
00205                double docamin = 0.7; // cm
00206                if(lay>7) docamin = 0.9;
00207                int celmin = -1;
00208                int ncel = m_mdcGeomSvc->Layer(lay)->NCell();
00209                for(cel=0; cel<ncel; cel++){
00210                     double wphi;
00211                     const MdcGeoWire* pWire = m_mdcGeomSvc -> Wire(lay, cel);
00212                     double xx = pWire->Backward().x();
00213                     double yy = pWire->Backward().y();
00214                     double rr = sqrt( (xx * xx) + (yy * yy) );
00215                     if( yy >= 0 )  wphi = acos(xx / rr);
00216                     else           wphi = CLHEP::twopi - acos(xx / rr);
00217 
00218                     double phiTrk = phi0 + CLHEP::halfpi;
00219                     if(phiTrk > CLHEP::twopi) phiTrk -= CLHEP::twopi;
00220                     if( !( (fabs(wphi-phiTrk) < dphi) || (fabs(wphi+CLHEP::twopi-phiTrk) < dphi) ||
00221                            (fabs(wphi-CLHEP::twopi-phiTrk) < dphi) ) ){
00222                          continue;
00223                     }
00224 
00225                     double doca = m_mdcUtilitySvc->doca(lay, cel, helix, helixErr);
00226 //                  cout << setw(5) << lay << setw(5) << cel << setw(15) << doca << endl;
00227                     if(fabs(doca) < fabs(docamin)){
00228                          docamin = doca;
00229                          celmin = cel;
00230                     }
00231                }
00232                if(celmin > -1){
00233                     if(lay<4) nhitLay1++;
00234                     else if(lay<8) nhitLay2++;
00235                     else if(lay<20) nhitLay3++;
00236                     else nhitLay4++;
00237                     for(int ii=(-nNoiRange); ii<=nNoiRange; ii++){
00238                          if(0==ii) continue;
00239                          int icell = celmin + ii;
00240                          if(icell >= ncel) icell -= ncel;
00241                          if(icell < 0) icell += ncel;
00242 //                       cout << "hit " << setw(5) << lay << setw(5) << celmin << setw(5) << icell << setw(5) << hitCel[lay][icell]<<endl;
00243                          if(hitCel[lay][icell]){
00244                               if(lay<4) nhitT1++;
00245                               else if(lay<8) nhitT2++;
00246                               else if(lay<20) nhitT3++;
00247                               else nhitT4++;
00248                          }
00249                     }
00250                }
00251           }
00252           if((nhitLay1<=0) || (nhitLay2<=0) || (nhitLay3<=0) || (nhitLay4<=0)) return false;
00253           double ratio1 = (double)nhitT1 / ((double)nhitLay1 * (double)nNoiRange*2.0);
00254           double ratio2 = (double)nhitT2 / ((double)nhitLay2 * (double)nNoiRange*2.0);
00255           double ratio3 = (double)nhitT3 / ((double)nhitLay3 * (double)nNoiRange*2.0);
00256           double ratio4 = (double)nhitT4 / ((double)nhitLay4 * (double)nNoiRange*2.0);
00257 
00258           if((ratio1>0.08) || (ratio2>0.08) || (ratio3>0.03) || (ratio4>0.03)) return false;
00259           else return true;
00260      }
00261      return false;
00262 }

Generated on Tue Nov 29 23:12:50 2016 for BOSS_7.0.2 by  doxygen 1.4.7