Definition at line 97 of file TofEnergyCalib.cxx.
References TofData::adc(), ITofCaliSvc::BPh(), cos(), Bes_Common::DEBUG, calibUtil::ERROR, EventModel::EvtRec::EvtRecEvent, EventModel::EvtRec::EvtRecTrackCol, genRecEmupikp::i, Bes_Common::INFO, TofID::layer(), m_adc1, m_adc2, m_energy, m_energy_ext, m_event, m_length, m_length_ext, m_npart, m_number, m_q, m_tdc1, m_tdc2, m_tuple, m_zpos, m_ztdc, msgSvc(), TofID::phi_module(), tan(), TofData::tdc(), DstExtTrack::tof1Momentum(), DstExtTrack::tof1Path(), DstExtTrack::tof1Position(), DstExtTrack::tof1VolumeNumber(), DstExtTrack::tof2Momentum(), DstExtTrack::tof2Path(), DstExtTrack::tof2Position(), DstExtTrack::tof2VolumeNumber(), tofCaliSvc, IRawDataProviderSvc::tofDataVectorTof(), tofDigiSvc, tofQCorrSvc, tofQElecSvc, and ITofCaliSvc::ZTDC().
00097 {
00098
00099
00100
00101
00102
00103
00104
00105 MsgStream log(msgSvc(), name());
00106 log << MSG::INFO << "in execute()" << endreq;
00107
00108 SmartDataPtr<Event::EventHeader> eventHeader(eventSvc(),"/Event/EventHeader");
00109 int run = eventHeader->runNumber();
00110 int event = eventHeader->eventNumber();
00111 if(m_event%1000==0) {
00112 std::cout << m_event << "-------------TofEnergyCalib run,event: " << run << "," << event << std::endl;
00113 }
00114 m_event++;
00115
00116 SmartDataPtr<EvtRecEvent> evtRecEvent(eventSvc(), EventModel::EvtRec::EvtRecEvent);
00117 SmartDataPtr<EvtRecTrackCol> evtRecTrkCol(eventSvc(), EventModel::EvtRec::EvtRecTrackCol);
00118
00119 log << MSG::DEBUG <<"ncharg, nneu, tottks = "
00120 << evtRecEvent->totalCharged() << " , "
00121 << evtRecEvent->totalNeutral() << " , "
00122 << evtRecEvent->totalTracks() <<endreq;
00123
00124 if(evtRecEvent->totalCharged() != 2) {
00125 return StatusCode::SUCCESS;
00126 }
00127
00128
00129 IRawDataProviderSvc* tofDigiSvc;
00130 StatusCode sc = service("RawDataProviderSvc", tofDigiSvc);
00131 if (sc != StatusCode::SUCCESS) {
00132 log << MSG::ERROR << "TofRec Get Tof Raw Data Service Failed !! " << endreq;
00133 return StatusCode::SUCCESS;
00134 }
00135
00136
00137 ITofCaliSvc* tofCaliSvc;
00138 StatusCode scc = service("TofCaliSvc", tofCaliSvc);
00139 if (scc != StatusCode::SUCCESS) {
00140 log << MSG::ERROR << "TofRec Get Calibration Service Failed !! " << endreq;
00141 return StatusCode::SUCCESS;
00142 }
00143
00144
00145 ITofQCorrSvc* tofQCorrSvc;
00146 sc = service("TofQCorrSvc", tofQCorrSvc);
00147 if (sc != StatusCode::SUCCESS) {
00148 log << MSG::ERROR << "TofRec Get QCorr Service Failed !! " << endreq;
00149 return StatusCode::SUCCESS;
00150 }
00151
00152 ITofQElecSvc* tofQElecSvc;
00153 sc = service("TofQElecSvc", tofQElecSvc);
00154 if (sc != StatusCode::SUCCESS) {
00155 log << MSG::ERROR << "TofRec Get QElec Service Failed !! " << endreq;
00156 return StatusCode::SUCCESS;
00157 }
00158
00159
00160 std::vector<TofData*> tofDataVec;
00161 tofDataVec = tofDigiSvc->tofDataVectorTof();
00162 const unsigned int ADC_MASK = 0x00001FFF;
00163
00164 for(int i = 0; i < evtRecEvent->totalCharged(); i++) {
00165 EvtRecTrackIterator itTrk = evtRecTrkCol->begin() + i;
00166
00167 if(!(*itTrk)->isExtTrackValid()) continue;
00168 RecExtTrack *extTrk = (*itTrk)->extTrack();
00169
00170 if(!(*itTrk)->isTofTrackValid()) continue;
00171
00172
00173 int npart, tof1, tof2;
00174 Hep3Vector pos1, pos2;
00175 Hep3Vector p1, p2;
00176
00177 tof1 = extTrk->tof1VolumeNumber();
00178 tof2 = extTrk->tof2VolumeNumber();
00179
00180
00181
00182 if(tof1>=0 && tof1<88 && tof2>=88 && tof2<176) {
00183 npart = 1;
00184 } else if(tof1>=176 && tof1<224) {
00185 tof1 -= 176;
00186 npart = 2;
00187 } else if(tof1>=224 && tof1<272) {
00188 tof1 -= 224;
00189 npart = 0;
00190 } else {
00191 continue;
00192 }
00193
00194 pos1 = extTrk->tof1Position();
00195 pos2 = extTrk->tof2Position();
00196
00197 p1 = extTrk->tof1Momentum();
00198 p2 = extTrk->tof2Momentum();
00199
00200 double zpos1=0, zpos2=0, l1=0, l2=0, lext=0;
00201 double z1, xy1, z2, xy2;
00202
00203 if(npart==1) {
00204
00205 const double tofDPhi = CLHEP::twopi / 88.;
00206 double tofPhi1 = tof1*tofDPhi + tofDPhi/2;
00207 double tofPhi2 = (tof2-88)*tofDPhi;
00208
00209
00210 double extTheta1, extTheta2, extPhi1, extPhi2;
00211 extTheta1 = pos1.theta();
00212 extTheta2 = pos2.theta();
00213 extPhi1 = pos1.phi();
00214 extPhi2 = pos2.phi();
00215
00216
00217
00218 z1 = 5/tan(extTheta1);
00219 xy1 = 5/cos(extPhi1-tofPhi1);
00220 l1 = sqrt(z1*z1+xy1*xy1);
00221 z2 = 5/tan(extTheta2);
00222 xy2 = 5/cos(extPhi2-tofPhi2);
00223 l2 = sqrt(z2*z2+xy2*xy2);
00224 zpos1 = (pos1.z()+z1/2)/100;
00225 zpos2 = (pos2.z()+z2/2)/100;
00226
00227
00228 lext = extTrk->tof2Path()-extTrk->tof1Path();
00229 }
00230
00231 else {
00232
00233 double extTheta1 = pos1.theta();
00234
00235
00236
00237 l1 = 5./fabs(cos(extTheta1));
00238 zpos1 = (sqrt(pos1.x()*pos1.x()+pos1.y()*pos1.y())+5.*tan(extTheta1)/2)/100;
00239 }
00240
00241 vector<TofData*>::iterator it;
00242
00243
00244 for(it=tofDataVec.begin();
00245 it!=tofDataVec.end();
00246 it++) {
00247
00248 Identifier idd((*it)->identify());
00249 int layer = TofID::layer(idd);
00250 int im = TofID::phi_module(idd);
00251 if(im+layer*88==tof1-1 || im+layer*88==tof1+1 ||
00252 im+layer*88==tof1-2 || im+layer*88==tof1+2) {
00253
00254 return StatusCode::SUCCESS;
00255 }
00256 }
00257
00258 for(it=tofDataVec.begin();
00259 it!=tofDataVec.end();
00260 it++) {
00261
00262 Identifier idd((*it)->identify());
00263 int layer = TofID::layer(idd);
00264 int im = TofID::phi_module(idd);
00265
00266 double adc1,adc2,tdc1,tdc2,ztdc,tofq;
00267 if((*it)->barrel()) {
00268 TofData* bTofData = *it;
00269 tdc1 = bTofData->tdc1();
00270 tdc2 = bTofData->tdc2();
00271 adc1 = bTofData->adc1();
00272 adc2 = bTofData->adc2();
00273
00274 ztdc = tofCaliSvc->ZTDC( tdc1, tdc2, bTofData->tofId() );
00275 tofq = tofCaliSvc->BPh( adc1, adc2, ztdc, bTofData->tofId());
00276 if(tofq<100||tofq>10000) continue;
00277
00278 npart = 1;
00279
00280 } else {
00281 TofData* eTofData = *it;
00282
00283 adc1 = eTofData->adc();
00284 tdc1 = eTofData->tdc();
00285 npart = 2;
00286 }
00287
00288
00289 if(im+layer*88==tof1) {
00290 m_adc1 = adc1;
00291 m_adc2 = adc2;
00292 m_tdc1 = tdc1;
00293 m_tdc2 = tdc2;
00294 m_ztdc = ztdc;
00295 m_q = tofq;
00296 m_npart = npart;
00297 m_number = tof1;
00298 m_zpos = zpos1;
00299 m_length = l1;
00300 m_length_ext = lext;
00301
00302 m_energy = l1*10.25/5.;
00303 m_energy_ext = lext*10.25/5.;
00304
00305 m_tuple->write();
00306 } else if((*it)->barrel() && im+layer*88 == tof2) {
00307 m_adc1 = adc1;
00308 m_adc2 = adc2;
00309 m_tdc1 = tdc1;
00310 m_tdc2 = tdc2;
00311 m_ztdc = ztdc;
00312 m_q = tofq;
00313 m_npart = npart;
00314 m_number = tof2;
00315 m_zpos = zpos2;
00316 m_length = l2;
00317 m_length_ext = lext;
00318
00319 m_energy = l2*10.25/5.;
00320 m_energy_ext = lext*10.25/5.;
00321
00322 m_tuple->write();
00323 }
00324 }
00325
00326 }
00327
00328 return sc;
00329 }