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;
00050 else log << MSG::FATAL << "wrong particle type" << endreq;
00051 m_p4 = (*it_trk)->p4(mass);
00052
00053 m_dr *= 10.0;
00054 m_dz *= 10.0;
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);
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;
00102 m_p4.setE(sqrt(p3 * p3 + mass * mass));
00103
00104 m_dr *= 10.0;
00105 m_dz *= 10.0;
00106
00107 m_pt = 1.0 / m_kappa;
00108 m_p = m_pt * sqrt( m_tanl * m_tanl + 1.0 );
00109
00110
00111
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
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
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;
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;
00197 int nhitLay2 = 0;
00198 int nhitLay3 = 0;
00199 int nhitLay4 = 0;
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;
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
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
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 }