00179 {
00180
00181 MsgStream log(msgSvc(), name());
00182 log << MSG::INFO << "TofRec in execute()!" << endreq;
00183
00184 SmartDataPtr<Event::EventHeader> eventHeader(eventSvc(),"/Event/EventHeader");
00185 if( !eventHeader ) {
00186 log << MSG::FATAL << "TofRec could not find Event Header!" << endreq;
00187 return StatusCode::FAILURE;
00188 }
00189 int run = eventHeader->runNumber();
00190 int event = eventHeader->eventNumber();
00191 if( ( event % 1000 == 0 ) && m_printOutInfo ) {
00192 std::cout << "run:" << run << " event: " << event << std::endl;
00193 }
00194 log << MSG::INFO << "run= " << run << " event= " << event << endreq;
00195
00196 TofRecTDS tds;
00197 tds.RegisterNullRecTofTrackCol();
00198
00199
00200 if( m_acceleratorStatus == "Colliding" ) {
00201
00202 SmartDataPtr<RecEsTimeCol> estimeCol(eventSvc(),"/Event/Recon/RecEsTimeCol");
00203 if( !estimeCol || ( estimeCol->size() == 0 ) ) {
00204 log << MSG::WARNING << "TofRec Could not find RecEsTimeCol! Run = " << run << " Event = " << event << endreq;
00205 return StatusCode::SUCCESS;
00206 }
00207 RecEsTimeCol::iterator iter_ESTime=estimeCol->begin();
00208 double t0 = (*iter_ESTime)->getTest();
00209 int t0Stat = (*iter_ESTime)->getStat();
00210 log << MSG::INFO << "t0= " << t0 << " t0Stat= " << t0Stat << endreq;
00211
00212
00213 SmartDataPtr<RecMdcKalTrackCol> mdcKalTrackCol(eventSvc(),"/Event/Recon/RecMdcKalTrackCol");
00214 if( !mdcKalTrackCol ) {
00215 log << MSG::WARNING << "No MdcKalTrackCol in TDS! Run = " << run << " Event = " << event << endreq;
00216 return StatusCode::SUCCESS;
00217 }
00218
00219
00220 SmartDataPtr<RecExtTrackCol> extTrackCol(eventSvc(),"/Event/Recon/RecExtTrackCol");
00221 if( !extTrackCol ) {
00222 log << MSG::WARNING << "No ExtTrackCol in TDS! Run = " << run << " Event = " << event << endreq;
00223 return StatusCode::SUCCESS;
00224 }
00225 else {
00226 if( m_printOutInfo ) { m_printOut->setExtTrackNum( extTrackCol->size() ); }
00227 if( m_checkDigi && m_checkDigiExt ) { m_checkdigi_tuple->FillCol( *eventHeader, mdcKalTrackCol, extTrackCol ); }
00228 }
00229
00230
00231 if( m_forCalibration ) {
00232
00233 if( t0Stat%10 != 1 ) return StatusCode::SUCCESS;
00234
00235 if( extTrackCol->size() != 2 ) return StatusCode::SUCCESS;
00236
00237 SmartDataPtr<RecMdcTrackCol> mdcTrackCol(eventSvc(),"/Event/Recon/RecMdcTrackCol");
00238 if( !mdcTrackCol ) {
00239 log << MSG::FATAL << "Could NOT find RecMdcTrackCol in TDS! Run = " << run << " Event = " << event << endreq;
00240 return StatusCode::SUCCESS;
00241 }
00242 if( mdcTrackCol->size() != 2 ) return StatusCode::SUCCESS;
00243
00244 SmartDataPtr<RecEmcShowerCol> emcShowerCol(eventSvc(),"/Event/Recon/RecEmcShowerCol");
00245 if( !emcShowerCol ) {
00246 log << MSG::FATAL << "Could NOT find EmcRecShowerCol in TDS! Run = " << run << " Event = " << event << endreq;
00247 return StatusCode::SUCCESS;
00248 }
00249
00250 if( emcShowerCol->size() < 2 ) return StatusCode::SUCCESS;
00251
00252 RecMdcTrackCol::iterator iter_mdc1 = mdcTrackCol->begin();
00253 RecMdcTrackCol::iterator iter_mdc2 = mdcTrackCol->begin() + 1;
00254
00255 RecMdcKalTrackCol::iterator iter_kal1 = mdcKalTrackCol->begin();
00256 RecMdcKalTrackCol::iterator iter_kal2 = mdcKalTrackCol->begin() + 1;
00257
00258 RecExtTrackCol::iterator iter_ext1 = extTrackCol->begin();
00259 RecExtTrackCol::iterator iter_ext2 = extTrackCol->begin() + 1;
00260 Hep3Vector extPos1 = (*iter_ext1)->emcPosition();
00261 Hep3Vector extPos2 = (*iter_ext2)->emcPosition();
00262
00263 RecEmcShowerCol::iterator iter_emc1 = emcShowerCol->begin();
00264 RecEmcShowerCol::iterator iter_emc2 = emcShowerCol->begin() + 1;
00265 Hep3Vector emcPos1((*iter_emc1)->x(),(*iter_emc1)->y(),(*iter_emc1)->z());
00266 Hep3Vector emcPos2((*iter_emc2)->x(),(*iter_emc2)->y(),(*iter_emc2)->z());
00267
00268 Hep3Vector pep = (*iter_mdc1)->p3();
00269 Hep3Vector pem = (*iter_mdc2)->p3();
00270 double delta_angle = 180.0 - pep.angle( pem.unit() )*180.0/pi;
00271 double delta_phi = abs( (*iter_mdc1)->phi() - (*iter_mdc2)->phi() )*180.0/pi;
00272
00273 Hep3Vector distant1 = extPos1 - emcPos1;
00274 Hep3Vector distant2 = extPos2 - emcPos1;
00275 if( distant1.r() > distant2.r() ) {
00276 RecEmcShowerCol::iterator iter_tmp = iter_emc1;
00277 iter_emc1 = iter_emc2;
00278 iter_emc2 = iter_tmp;
00279 Hep3Vector emc_tmp = emcPos1;
00280 emcPos1 = emcPos2;
00281 emcPos2 = emc_tmp;
00282 }
00283 distant1 = extPos1 - emcPos1;
00284 distant2 = extPos2 - emcPos2;
00285
00286 double e1 = (*iter_emc1)->energy();
00287 double e2 = (*iter_emc2)->energy();
00288 double etot = 0.0;
00289 RecEmcShowerCol::iterator iter_emc = emcShowerCol->begin();
00290 for( ; iter_emc != emcShowerCol->end(); iter_emc++ ) {
00291 etot += (*iter_emc)->energy();
00292 }
00293
00294 if( m_checkDigi ) { m_checkdigi_tuple->FillCol( *eventHeader, extTrackCol, mdcTrackCol, emcShowerCol, mdcKalTrackCol ); }
00295
00296 if( ( (*iter_mdc1)->charge() + (*iter_mdc2)->charge() )!= 0 ) return StatusCode::SUCCESS;
00297
00298
00299 if( delta_angle > 10.0 ) return StatusCode::SUCCESS;
00300 if( distant1.r()>6.0 || distant2.r()>6.0 ) return StatusCode::SUCCESS;
00301 if( m_calibData == "Bhabha" ) {
00302 if( (*iter_kal1)->getStat(1,0)!=0 || (*iter_kal2)->getStat(1,0)!=0 ) return StatusCode::SUCCESS;
00303 if( m_data == "jpsi" ) {
00304 if( (*iter_mdc1)->x()<-0.2 || (*iter_mdc1)->x()>0.4 || (*iter_mdc1)->y()<-0.5 || (*iter_mdc1)->y()>0.1 || abs((*iter_mdc1)->z())>4.0 ) return StatusCode::SUCCESS;
00305 if( (*iter_mdc2)->x()<-0.2 || (*iter_mdc2)->x()>0.4 || (*iter_mdc2)->y()<-0.5 || (*iter_mdc2)->y()>0.1 || abs((*iter_mdc2)->z())>4.0 ) return StatusCode::SUCCESS;
00306 if( delta_phi<174.0 || delta_phi>183.0 ) return StatusCode::SUCCESS;
00307 if( e1 < 1.1 || e2 < 1.1 ) return StatusCode::SUCCESS;
00308 }
00309 else if( m_data == "psip" ) {
00310 if( (*iter_mdc1)->x()<-0.2 || (*iter_mdc1)->x()>0.4 || (*iter_mdc1)->y()<-0.5 || (*iter_mdc1)->y()>0.1 || abs((*iter_mdc1)->z())>4.0 ) return StatusCode::SUCCESS;
00311 if( (*iter_mdc2)->x()<-0.2 || (*iter_mdc2)->x()>0.4 || (*iter_mdc2)->y()<-0.5 || (*iter_mdc2)->y()>0.1 || abs((*iter_mdc2)->z())>4.0 ) return StatusCode::SUCCESS;
00312 if( delta_phi<174.0 || delta_phi>183.0 ) return StatusCode::SUCCESS;
00313 if( e1 < 1.4 || e2 < 1.4 ) return StatusCode::SUCCESS;
00314 }
00315 else if( m_data == "psipp" ) {
00316 if( (*iter_mdc1)->x()<-0.2 || (*iter_mdc1)->x()>1.2 || (*iter_mdc1)->y()<-0.9 || (*iter_mdc1)->y()>0.5 || abs((*iter_mdc1)->z())>6.0 ) return StatusCode::SUCCESS;
00317 if( (*iter_mdc2)->x()<-0.2 || (*iter_mdc2)->x()>1.2 || (*iter_mdc2)->y()<-0.9 || (*iter_mdc2)->y()>0.5 || abs((*iter_mdc2)->z())>6.0 ) return StatusCode::SUCCESS;
00318 if( delta_phi<174.0 || delta_phi>186.0 ) return StatusCode::SUCCESS;
00319 if( e1 < 1.4 || e2 < 1.4 ) return StatusCode::SUCCESS;
00320 }
00321 if( ( etot - e1 - e2 ) > 0.3 ) return StatusCode::SUCCESS;
00322 }
00323 else if( m_calibData == "Dimu" ) {
00324 if( (*iter_kal1)->getStat(1,1)!=0 || (*iter_kal2)->getStat(1,1)!=0 ) return StatusCode::SUCCESS;
00325 if( e1 > 0.5 || e2 > 0.5 )return StatusCode::SUCCESS;
00326 }
00327
00328 }
00329
00330
00331 TofTrackVec* tofTrackVec = new TofTrackVec;
00332 RecExtTrackCol::iterator iter_track = extTrackCol->begin();
00333 for( ; iter_track < extTrackCol->end(); iter_track++ ) {
00334 RecMdcKalTrackCol::iterator iter_kal = mdcKalTrackCol->begin();
00335 for( ; iter_kal != mdcKalTrackCol->end(); iter_kal++ ) {
00336 if( (*iter_kal)->trackId() == (*iter_track)->trackId() ) break;
00337 }
00338 int kal[5] = {-1};
00339 if( iter_kal != mdcKalTrackCol->end() ) {
00340 for( unsigned int i=0; i<5; i++ ) {
00341 kal[i] = (*iter_kal)->getStat( 1, i );
00342 }
00343 }
00344 TofTrack* tof = new TofTrack;
00345 tof->setExtTrack( (*iter_track), kal );
00346 tofTrackVec->push_back( tof );
00347 }
00348
00349 if( m_printOutInfo ) {
00350 m_printOut->setTrack1Col( tofTrackVec );
00351 }
00352
00353
00354 TofDataMap tofDataMap = tofDigiSvc->tofDataMapTof( t0 );
00355 if( tofDataMap.empty() ) {
00356 log << MSG::WARNING << "No Tof Data Map in RawDataProviderSvc! Run=" << run << " Event=" << event << endreq;
00357 }
00358
00359 if( m_checkDigi && m_checkDigiRaw ) {
00360 SmartDataPtr<TofDigiCol> tofDigiCol(eventSvc(),"/Event/Digi/TofDigiCol");
00361 if( !tofDigiCol ) {
00362 log << MSG::ERROR << "TofRec could not find Tof digi! Event = " << event << endreq;
00363 }
00364 else { m_checkdigi_tuple->FillCol( *eventHeader, tofDigiCol, t0, t0Stat ); }
00365
00366 m_checkdigi_tuple->FillCol( *eventHeader, tofDataMap, t0, t0Stat );
00367 }
00368
00369 std::vector<int> deadId;
00370 if( m_forCalibration ) {
00371 for( unsigned int i=0; i<5; i++ ) {
00372 int identmp = tofCaliSvc->BrEast(i);
00373 if( identmp != 0x2fffffff ) {
00374 deadId.push_back( identmp );
00375 }
00376 identmp = tofCaliSvc->BrWest(i);
00377 if( identmp != 0x2fffffff ) {
00378 deadId.push_back( identmp );
00379 }
00380 identmp = tofCaliSvc->Endcap(i);
00381 if( identmp != 0x2fffffff ) {
00382 deadId.push_back( identmp );
00383 }
00384 }
00385 }
00386
00387 std::vector<TofTrack*>::iterator iter = tofTrackVec->begin();
00388 for( ; iter < tofTrackVec->end(); iter++ ) {
00389 if( (*iter)->isNoHit() ) continue;
00390 (*iter)->setTofData( tofDataMap );
00391 if( m_printOutInfo ) { m_printOut->setTrack2( (*iter) ); }
00392 if( (*iter)->isNoHit() ) continue;
00393 (*iter)->match( m_forCalibration, deadId );
00394 if( m_printOutInfo ) { m_printOut->setTrack3( (*iter) ); }
00395 }
00396
00397 iter = tofTrackVec->begin();
00398 for( ; iter < tofTrackVec->end(); iter++ ) {
00399
00400 (*iter)->setCalibration( t0, t0Stat );
00401
00402 if( m_checkDigi ) {
00403 if( m_checkTrigger ) {
00404
00405 SmartDataPtr<TrigData> trigData(eventSvc(), "/Event/Trig/TrigData");
00406 if (!trigData) {
00407 log << MSG::FATAL << "Could not find Trigger Data for physics analysis" << endreq;
00408 m_checkdigi_tuple->Fill_TofTrack( *eventHeader, *iter, t0, t0Stat );
00409 }
00410 else {
00411 m_checkdigi_tuple->Fill_TofTrack( *eventHeader, *iter, t0, t0Stat, trigData );
00412 }
00413 }
00414 else {
00415 if( ( run < 0 ) && m_checkMcTruth ) {
00416 SmartDataPtr<TofMcHitCol> tofMcCol(eventSvc(),"/Event/MC/TofMcHitCol");
00417 SmartDataPtr<McParticleCol> mcParticleCol(eventSvc(),"/Event/MC/McParticleCol");
00418 if ( !tofMcCol || !mcParticleCol ) {
00419 m_checkdigi_tuple->Fill_TofTrack( *eventHeader, *iter, t0, t0Stat, mdcKalTrackCol );
00420 }
00421 else {
00422 m_checkdigi_tuple->Fill_TofTrack( *eventHeader, *iter, t0, t0Stat, mdcKalTrackCol, tofMcCol, mcParticleCol, m_calibData );
00423 }
00424 }
00425 else {
00426 m_checkdigi_tuple->Fill_TofTrack( *eventHeader, *iter, t0, t0Stat, mdcKalTrackCol );
00427 }
00428 }
00429 }
00430 }
00431
00432 tds.RegisterTDS( eventHeader->runNumber(), eventHeader->eventNumber(), tofTrackVec, m_forCalibration, m_calibData );
00433
00434 clearTofTrackVec( tofTrackVec );
00435
00436
00437 SmartDataPtr<RecTofTrackCol> tofTrackCol(eventSvc(),"/Event/Recon/RecTofTrackCol");
00438 if (!tofTrackCol) {
00439 log << MSG::FATAL << "TofRec could not find RecTofTrackCol!" << endreq;
00440 return StatusCode::FAILURE;
00441 }
00442 else{
00443 if( m_saveRootFile ) {
00444 m_checkdata_tuple->FillCol( *eventHeader, tofTrackCol, mdcKalTrackCol );
00445 }
00446 }
00447
00448 if( m_forCalibration ) {
00449 SmartDataPtr<RecBTofCalHitCol> bhitCol(eventSvc(),"/Event/Recon/RecBTofCalHitCol");
00450 if (!bhitCol) {
00451 log << MSG::WARNING << "TofRec could not find RecBTofCalHitCol!" << endreq;
00452 }
00453 else {
00454 if( m_saveRootFile ) {
00455 m_checkdata_tuple->FillCol( *eventHeader, bhitCol );
00456 }
00457 }
00458
00459 SmartDataPtr<RecETofCalHitCol> ehitCol(eventSvc(),"/Event/Recon/RecETofCalHitCol");
00460 if (!ehitCol) {
00461 log << MSG::WARNING << "TofRec could not find RecETofCalHitCol!" << endreq;
00462 }
00463 else {
00464 if( m_saveRootFile ) {
00465 m_checkdata_tuple->FillCol( *eventHeader, ehitCol );
00466 }
00467 }
00468 }
00469
00470 }
00471 else {
00472 log << MSG::FATAL << "In TofRec: AcceleratorStatus is NOT correct! m_acceleratorStatus = " << m_acceleratorStatus << endreq;
00473 return StatusCode::FAILURE;
00474 }
00475
00476 return StatusCode::SUCCESS;
00477
00478 }