00001
00002
00003
00004
00005 #include "GaudiKernel/MsgStream.h"
00006 #include "GaudiKernel/AlgFactory.h"
00007 #include "GaudiKernel/ISvcLocator.h"
00008 #include "GaudiKernel/SmartDataPtr.h"
00009 #include "GaudiKernel/SmartDataLocator.h"
00010 #include "GaudiKernel/IDataProviderSvc.h"
00011 #include "GaudiKernel/PropertyMgr.h"
00012 #include "EventModel/EventHeader.h"
00013 #include "EventModel/EventModel.h"
00014 #include "ReconEvent/ReconEvent.h"
00015 #include "McTruth/McParticle.h"
00016 #include "McTruth/TofMcHit.h"
00017 #include "McTruth/McParticle.h"
00018 #include "EvTimeEvent/RecEsTime.h"
00019 #include "ExtEvent/RecExtTrack.h"
00020 #include "DstEvent/TofHitStatus.h"
00021 #include "TofRecEvent/RecTofTrack.h"
00022 #include "TofRecEvent/RecBTofCalHit.h"
00023 #include "TofRecEvent/RecETofCalHit.h"
00024 #include "TofGeomSvc/ITofGeomSvc.h"
00025 #include "TofCaliSvc/ITofCaliSvc.h"
00026 #include "RawDataProviderSvc/IRawDataProviderSvc.h"
00027 #include "RawDataProviderSvc/TofData.h"
00028 #include "TofRec/TofRec.h"
00029 #include "TofRec/TofTrack.h"
00030 #include "TofRec/TofCheckDigi.h"
00031 #include "TofRec/TofCount.h"
00032 #include "TofRec/TofRecTDS.h"
00033 #include <iostream>
00034
00035 #include "MdcRecEvent/RecMdcTrack.h"
00036 #include "EmcRecEventModel/RecEmcShower.h"
00037
00038 using namespace std;
00039 using namespace Event;
00040
00042
00043 ITofGeomSvc* tofGeomSvc;
00044 ITofCaliSvc* tofCaliSvc;
00045
00046
00047 IRawDataProviderSvc* tofDigiSvc;
00048
00049 TofRec::TofRec(const std::string& name, ISvcLocator* pSvcLocator) :
00050 Algorithm(name, pSvcLocator)
00051 {
00052 declareProperty( "AcceleratorStatus", m_acceleratorStatus );
00053 declareProperty( "MagneticField", m_magneticField );
00054 declareProperty( "ForCalibration", m_forCalibration );
00055 declareProperty( "Data", m_data );
00056 declareProperty( "CalibData", m_calibData );
00057
00058 declareProperty( "FirstIteration", m_firstIteration );
00059 declareProperty( "CheckTrigger", m_checkTrigger );
00060 declareProperty( "SaveRootFile4Rec", m_saveRootFile );
00061 declareProperty( "PrintOutInfo", m_printOutInfo );
00062 declareProperty( "CheckDigi", m_checkDigi );
00063 declareProperty( "CheckDigiRaw", m_checkDigiRaw );
00064 declareProperty( "CheckDigiExt", m_checkDigiExt );
00065 declareProperty( "CheckMcTruth", m_checkMcTruth );
00066 }
00067
00068
00069
00070 StatusCode TofRec::initialize(){
00071
00072 MsgStream log(msgSvc(), name());
00073 log << MSG::INFO << "TofRec in initialize()" << endreq;
00074
00075
00076 StatusCode scg = service("TofGeomSvc", tofGeomSvc);
00077 if (scg== StatusCode::SUCCESS) {
00078 log << MSG::INFO << "TofRec Get Geometry Service Sucessfully!" << endreq;
00079 }else {
00080 log << MSG::ERROR << "TofRec Get Geometry Service Failed !" << endreq;
00081 return StatusCode::FAILURE;
00082 }
00083
00084
00085 StatusCode scc = service("TofCaliSvc", tofCaliSvc);
00086 if (scc == StatusCode::SUCCESS) {
00087 log << MSG::INFO << "TofRec Get Calibration Service Sucessfully!" << endreq;
00088 } else {
00089 log << MSG::ERROR << "TofRec Get Calibration Service Failed !" << endreq;
00090 return StatusCode::FAILURE;
00091 }
00092
00093
00094 StatusCode scd = service("RawDataProviderSvc", tofDigiSvc);
00095 if (scd == StatusCode::SUCCESS) {
00096 log << MSG::INFO << "TofRec Get Tof Raw Data Service Sucessfully!" << endreq;
00097 } else {
00098 log << MSG::ERROR << "TofRec Get Tof Raw Data Service Failed !" << endreq;
00099 return StatusCode::FAILURE;
00100 }
00101
00102 if( m_checkDigi ) {
00103 NTuplePtr nt11(ntupleSvc(),"FILE203/digi");
00104 NTuplePtr nt12(ntupleSvc(),"FILE203/barrel");
00105 NTuplePtr nt13(ntupleSvc(),"FILE203/endcap");
00106 NTuplePtr nt14(ntupleSvc(),"FILE203/mrpc");
00107 NTuplePtr nt15(ntupleSvc(),"FILE203/ext");
00108 NTuplePtr nt16(ntupleSvc(),"FILE203/tof");
00109 NTuplePtr nt17(ntupleSvc(),"FILE203/bb");
00110
00111 if( nt11 || nt12 || nt13 || nt14 || nt15 || nt16 || nt17) {
00112 m_tuple_digi = nt11;
00113 m_tuple_barrel = nt12;
00114 m_tuple_endcap = nt13;
00115 m_tuple_endcap = nt14;
00116 m_tuple_ext = nt15;
00117 m_tuple_tof = nt16;
00118 m_tuple_bb = nt17;
00119 }
00120 else {
00121 m_tuple_digi = ntupleSvc()->book("FILE203/digi",CLID_ColumnWiseTuple,"TofRec");
00122 m_tuple_barrel = ntupleSvc()->book("FILE203/barrel",CLID_ColumnWiseTuple,"TofRec");
00123 m_tuple_endcap = ntupleSvc()->book("FILE203/endcap",CLID_ColumnWiseTuple,"TofRec");
00124 m_tuple_mrpc = ntupleSvc()->book("FILE203/mrpc",CLID_ColumnWiseTuple,"TofRec");
00125 m_tuple_ext = ntupleSvc()->book("FILE203/ext",CLID_ColumnWiseTuple,"TofRec");
00126 m_tuple_tof = ntupleSvc()->book("FILE203/tof",CLID_ColumnWiseTuple,"TofRec");
00127 m_tuple_bb = ntupleSvc()->book("FILE203/bb",CLID_ColumnWiseTuple,"TofRec");
00128
00129 if( m_tuple_digi || m_tuple_barrel || m_tuple_endcap || m_tuple_mrpc || m_tuple_ext || m_tuple_tof || m_tuple_bb ) {
00130 m_checkdigi_tuple = new TofCheckDigi( m_tuple_digi, m_tuple_barrel, m_tuple_endcap, m_tuple_mrpc, m_tuple_ext, m_tuple_tof, m_tuple_bb );
00131 }
00132 else {
00133 log << MSG::ERROR <<"Cannot book N-tuple:" << long(m_tuple_digi) <<endmsg;
00134 log << MSG::ERROR <<"Cannot book N-tuple:" << long(m_tuple_barrel) <<endmsg;
00135 log << MSG::ERROR <<"Cannot book N-tuple:" << long(m_tuple_endcap) <<endmsg;
00136 log << MSG::ERROR <<"Cannot book N-tuple:" << long(m_tuple_mrpc) <<endmsg;
00137 log << MSG::ERROR <<"Cannot book N-tuple:" << long(m_tuple_ext) <<endmsg;
00138 log << MSG::ERROR <<"Cannot book N-tuple:" << long(m_tuple_tof) <<endmsg;
00139 log << MSG::ERROR <<"Cannot book N-tuple:" << long(m_tuple_bb) <<endmsg;
00140 return StatusCode::FAILURE;
00141 }
00142 }
00143 }
00144
00145 if( m_saveRootFile ) {
00146 NTuplePtr nt21(ntupleSvc(),"FILE201/trk");
00147 NTuplePtr nt22(ntupleSvc(),"FILE201/cbtrk");
00148 NTuplePtr nt23(ntupleSvc(),"FILE201/cetrk");
00149 NTuplePtr nt24(ntupleSvc(),"FILE201/cetftrk");
00150
00151 if( nt21 || nt22 || nt23 || nt24 ) {
00152 m_tuple_trk = nt21;
00153 m_tuple_cbtrk = nt22;
00154 m_tuple_cetrk = nt23;
00155 m_tuple_cetftrk = nt24;
00156 }
00157 else {
00158 m_tuple_trk = ntupleSvc()->book("FILE201/trk",CLID_ColumnWiseTuple,"TofRec");
00159 m_tuple_cbtrk = ntupleSvc()->book("FILE201/cbtrk",CLID_ColumnWiseTuple,"TofRec");
00160 m_tuple_cetrk = ntupleSvc()->book("FILE201/cetrk",CLID_ColumnWiseTuple,"TofRec");
00161 m_tuple_cetftrk = ntupleSvc()->book("FILE201/cetftrk",CLID_ColumnWiseTuple,"TofRec");
00162 if( m_tuple_trk || m_tuple_cbtrk || m_tuple_cetrk || m_tuple_cetftrk) {
00163 m_checkdata_tuple = new TofCheckData( m_tuple_trk, m_tuple_cbtrk, m_tuple_cetrk, m_tuple_cetftrk );
00164 }
00165 else {
00166 log << MSG::ERROR <<"Cannot book N-tuple:" << long(m_tuple_trk) <<endmsg;
00167 log << MSG::ERROR <<"Cannot book N-tuple:" << long(m_tuple_cbtrk) <<endmsg;
00168 log << MSG::ERROR <<"Cannot book N-tuple:" << long(m_tuple_cetrk) <<endmsg;
00169 log << MSG::ERROR <<"Cannot book N-tuple:" << long(m_tuple_cetftrk) <<endmsg;
00170 return StatusCode::FAILURE;
00171 }
00172 }
00173 }
00174
00175 if( m_printOutInfo ) { m_printOut = new TofCount; }
00176
00177 return StatusCode::SUCCESS;
00178 }
00179
00180 StatusCode TofRec::beginRun(){
00181 MsgStream log(msgSvc(), name());
00182 log << MSG::INFO <<"TofRec begin_run!"<< endreq;
00183 return StatusCode::SUCCESS;
00184 }
00185
00186
00187
00188 StatusCode TofRec::execute() {
00189
00190 MsgStream log(msgSvc(), name());
00191 log << MSG::INFO << "TofRec in execute()!" << endreq;
00192
00193 SmartDataPtr<Event::EventHeader> eventHeader(eventSvc(),"/Event/EventHeader");
00194 if( !eventHeader ) {
00195 log << MSG::FATAL << "TofRec could not find Event Header!" << endreq;
00196 return StatusCode::FAILURE;
00197 }
00198 int run = eventHeader->runNumber();
00199 int event = eventHeader->eventNumber();
00200 if( ( event % 1000 == 0 ) && m_printOutInfo ) {
00201 std::cout << "run:" << run << " event: " << event << std::endl;
00202 }
00203 log << MSG::INFO << "run= " << run << " event= " << event << endreq;
00204
00205 TofRecTDS tds;
00206 tds.RegisterNullRecTofTrackCol();
00207
00208
00209 if( m_acceleratorStatus == "Colliding" ) {
00210
00211 SmartDataPtr<RecEsTimeCol> estimeCol(eventSvc(),"/Event/Recon/RecEsTimeCol");
00212 if( !estimeCol || ( estimeCol->size() == 0 ) ) {
00213 log << MSG::WARNING << "TofRec Could not find RecEsTimeCol! Run = " << run << " Event = " << event << endreq;
00214 return StatusCode::SUCCESS;
00215 }
00216 RecEsTimeCol::iterator iter_ESTime=estimeCol->begin();
00217 double t0 = (*iter_ESTime)->getTest();
00218 int t0Stat = (*iter_ESTime)->getStat();
00219 log << MSG::INFO << "t0= " << t0 << " t0Stat= " << t0Stat << endreq;
00220
00221
00222 SmartDataPtr<RecMdcKalTrackCol> mdcKalTrackCol(eventSvc(),"/Event/Recon/RecMdcKalTrackCol");
00223 if( !mdcKalTrackCol ) {
00224 log << MSG::WARNING << "No MdcKalTrackCol in TDS! Run = " << run << " Event = " << event << endreq;
00225 return StatusCode::SUCCESS;
00226 }
00227 SmartDataPtr<RecMdcTrackCol> mdcTrackCol(eventSvc(),"/Event/Recon/RecMdcTrackCol");
00228 if( !mdcTrackCol ) {
00229 log << MSG::FATAL << "Could NOT find RecMdcTrackCol in TDS! Run = " << run << " Event = " << event << endreq;
00230 return StatusCode::SUCCESS;
00231 }
00232
00233
00234 SmartDataPtr<RecExtTrackCol> extTrackCol(eventSvc(),"/Event/Recon/RecExtTrackCol");
00235 if( !extTrackCol ) {
00236 log << MSG::WARNING << "No ExtTrackCol in TDS! Run = " << run << " Event = " << event << endreq;
00237 return StatusCode::SUCCESS;
00238 }
00239 else {
00240 if( m_printOutInfo ) { m_printOut->setExtTrackNum( extTrackCol->size() ); }
00241 if( m_checkDigi && m_checkDigiExt ) { m_checkdigi_tuple->FillCol( *eventHeader, mdcTrackCol, mdcKalTrackCol, extTrackCol ); }
00242 }
00243
00244
00245 if( m_forCalibration ) {
00246 if( m_printOutInfo ) { m_printOut->addNumber(0); }
00247
00248 if( t0Stat%10 != 1 ) return StatusCode::SUCCESS;
00249 if( m_printOutInfo ) { m_printOut->addNumber(1); }
00250
00251 if( extTrackCol->size() != 2 ) return StatusCode::SUCCESS;
00252 if( m_printOutInfo ) { m_printOut->addNumber(2); }
00253
00254 if( mdcTrackCol->size() != 2 ) return StatusCode::SUCCESS;
00255 if( m_printOutInfo ) { m_printOut->addNumber(3); }
00256
00257 SmartDataPtr<RecEmcShowerCol> emcShowerCol(eventSvc(),"/Event/Recon/RecEmcShowerCol");
00258 if( !emcShowerCol ) {
00259 log << MSG::FATAL << "Could NOT find EmcRecShowerCol in TDS! Run = " << run << " Event = " << event << endreq;
00260 return StatusCode::SUCCESS;
00261 }
00262 if( m_printOutInfo ) { m_printOut->addNumber(4); }
00263
00264 if( emcShowerCol->size() < 2 ) return StatusCode::SUCCESS;
00265 if( m_printOutInfo ) { m_printOut->addNumber(5); }
00266
00267 RecMdcTrackCol::iterator iter_mdc1 = mdcTrackCol->begin();
00268 RecMdcTrackCol::iterator iter_mdc2 = mdcTrackCol->begin() + 1;
00269
00270 RecMdcKalTrackCol::iterator iter_kal1 = mdcKalTrackCol->begin();
00271 RecMdcKalTrackCol::iterator iter_kal2 = mdcKalTrackCol->begin() + 1;
00272
00273 RecExtTrackCol::iterator iter_ext1 = extTrackCol->begin();
00274 RecExtTrackCol::iterator iter_ext2 = extTrackCol->begin() + 1;
00275 Hep3Vector extPos1 = (*iter_ext1)->emcPosition();
00276 Hep3Vector extPos2 = (*iter_ext2)->emcPosition();
00277
00278 RecEmcShowerCol::iterator iter_emc1 = emcShowerCol->begin();
00279 RecEmcShowerCol::iterator iter_emc2 = emcShowerCol->begin() + 1;
00280 Hep3Vector emcPos1((*iter_emc1)->x(),(*iter_emc1)->y(),(*iter_emc1)->z());
00281 Hep3Vector emcPos2((*iter_emc2)->x(),(*iter_emc2)->y(),(*iter_emc2)->z());
00282
00283 Hep3Vector pep = (*iter_mdc1)->p3();
00284 Hep3Vector pem = (*iter_mdc2)->p3();
00285 double delta_angle = 180.0 - pep.angle( pem.unit() )*180.0/pi;
00286 double delta_phi = abs( (*iter_mdc1)->phi() - (*iter_mdc2)->phi() )*180.0/pi;
00287
00288 Hep3Vector distant1 = extPos1 - emcPos1;
00289 Hep3Vector distant2 = extPos2 - emcPos1;
00290 if( distant1.r() > distant2.r() ) {
00291 RecEmcShowerCol::iterator iter_tmp = iter_emc1;
00292 iter_emc1 = iter_emc2;
00293 iter_emc2 = iter_tmp;
00294 Hep3Vector emc_tmp = emcPos1;
00295 emcPos1 = emcPos2;
00296 emcPos2 = emc_tmp;
00297 }
00298 distant1 = extPos1 - emcPos1;
00299 distant2 = extPos2 - emcPos2;
00300
00301 double p1 = (*iter_mdc1)->p();
00302 double p2 = (*iter_mdc2)->p();
00303 double e1 = (*iter_emc1)->energy();
00304 double e2 = (*iter_emc2)->energy();
00305 double etot = 0.0;
00306 RecEmcShowerCol::iterator iter_emc = emcShowerCol->begin();
00307 for( ; iter_emc != emcShowerCol->end(); iter_emc++ ) {
00308 etot += (*iter_emc)->energy();
00309 }
00310
00311 if( m_checkDigi ) { m_checkdigi_tuple->FillCol( *eventHeader, extTrackCol, mdcTrackCol, emcShowerCol, mdcKalTrackCol ); }
00312
00313 if( ( (*iter_mdc1)->charge() + (*iter_mdc2)->charge() )!= 0 ) return StatusCode::SUCCESS;
00314 if( m_printOutInfo ) { m_printOut->addNumber(6); }
00315
00316 if( delta_angle > 10.0 ) return StatusCode::SUCCESS;
00317 if( m_printOutInfo ) { m_printOut->addNumber(7); }
00318
00319 if( (*iter_kal1)->getStat(1,0)!=0 || (*iter_kal2)->getStat(1,0)!=0 ) return StatusCode::SUCCESS;
00320 if( m_printOutInfo ) { m_printOut->addNumber(8); }
00321
00322 if( distant1.r()>6.0 || distant2.r()>6.0 ) return StatusCode::SUCCESS;
00323 if( m_printOutInfo ) { m_printOut->addNumber(9); }
00324
00325
00326 if( m_data == "jpsi09" ) {
00327 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;
00328 if( m_printOutInfo ) { m_printOut->addNumber(10); }
00329 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;
00330 if( m_printOutInfo ) { m_printOut->addNumber(11); }
00331 if( delta_phi<174.0 || delta_phi>186.0 ) return StatusCode::SUCCESS;
00332 if( m_printOutInfo ) { m_printOut->addNumber(12); }
00333 if( m_calibData == "Bhabha" ) {
00334 if( e1 < 1.1 || e2 < 1.1 ) return StatusCode::SUCCESS;
00335 if( m_printOutInfo ) { m_printOut->addNumber(13); }
00336 }
00337 }
00338
00339 else if( m_data == "psip09" ) {
00340 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;
00341 if( m_printOutInfo ) { m_printOut->addNumber(10); }
00342 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;
00343 if( m_printOutInfo ) { m_printOut->addNumber(11); }
00344 if( delta_phi<174.0 || delta_phi>183.0 ) return StatusCode::SUCCESS;
00345 if( m_printOutInfo ) { m_printOut->addNumber(12); }
00346 if( m_calibData == "Bhabha" ) {
00347 if( e1 < 1.4 || e2 < 1.4 ) return StatusCode::SUCCESS;
00348 if( m_printOutInfo ) { m_printOut->addNumber(13); }
00349 }
00350 }
00351
00352 else if( m_data == "psipp10" ) {
00353 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;
00354 if( m_printOutInfo ) { m_printOut->addNumber(10); }
00355 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;
00356 if( m_printOutInfo ) { m_printOut->addNumber(11); }
00357 if( delta_phi<174.0 || delta_phi>186.0 ) return StatusCode::SUCCESS;
00358 if( m_printOutInfo ) { m_printOut->addNumber(12); }
00359 if( m_calibData == "Bhabha" ) {
00360 if( e1 < 1.4 || e2 < 1.4 ) return StatusCode::SUCCESS;
00361 if( m_printOutInfo ) { m_printOut->addNumber(13); }
00362 }
00363 }
00364
00365 else if( m_data == "psipp11" ) {
00366 if( (*iter_mdc1)->x()<-0.15 || (*iter_mdc1)->x()>0.3 || (*iter_mdc1)->y()<-0.3 || (*iter_mdc1)->y()>0.15 || abs((*iter_mdc1)->z())>6.0 ) return StatusCode::SUCCESS;
00367 if( m_printOutInfo ) { m_printOut->addNumber(10); }
00368 if( (*iter_mdc2)->x()<-0.15 || (*iter_mdc2)->x()>0.3 || (*iter_mdc2)->y()<-0.3 || (*iter_mdc2)->y()>0.15 || abs((*iter_mdc2)->z())>6.0 ) return StatusCode::SUCCESS;
00369 if( m_printOutInfo ) { m_printOut->addNumber(11); }
00370 if( delta_phi<174.0 || delta_phi>184.0 ) return StatusCode::SUCCESS;
00371 if( m_printOutInfo ) { m_printOut->addNumber(12); }
00372 if( m_calibData == "Bhabha" ) {
00373 if( e1 < 1.4 || e2 < 1.4 ) return StatusCode::SUCCESS;
00374 if( m_printOutInfo ) { m_printOut->addNumber(13); }
00375 }
00376 }
00377
00378 else if( m_data == "psip12" ) {
00379 if( (*iter_mdc1)->x()<-0.25 || (*iter_mdc1)->x()>0.3 || (*iter_mdc1)->y()<-0.3 || (*iter_mdc1)->y()>0.15 || abs((*iter_mdc1)->z())>6.0 ) return StatusCode::SUCCESS;
00380 if( m_printOutInfo ) { m_printOut->addNumber(10); }
00381 if( (*iter_mdc2)->x()<-0.25 || (*iter_mdc2)->x()>0.3 || (*iter_mdc2)->y()<-0.3 || (*iter_mdc2)->y()>0.15 || abs((*iter_mdc2)->z())>6.0 ) return StatusCode::SUCCESS;
00382 if( m_printOutInfo ) { m_printOut->addNumber(11); }
00383 if( delta_phi<172.0 || delta_phi>188.0 ) return StatusCode::SUCCESS;
00384 if( m_printOutInfo ) { m_printOut->addNumber(12); }
00385 if( m_calibData == "Bhabha" ) {
00386 if( e1 < 1.4 || e2 < 1.4 ) return StatusCode::SUCCESS;
00387 if( m_printOutInfo ) { m_printOut->addNumber(13); }
00388 }
00389 }
00390
00391 else if( m_data == "jpsi12" ) {
00392 if( (*iter_mdc1)->x()<-0.2 || (*iter_mdc1)->x()>0.4 || (*iter_mdc1)->y()<-0.4 || (*iter_mdc1)->y()>0.2 || abs((*iter_mdc1)->z())>4.0 ) return StatusCode::SUCCESS;
00393 if( m_printOutInfo ) { m_printOut->addNumber(10); }
00394 if( (*iter_mdc2)->x()<-0.2 || (*iter_mdc2)->x()>0.4 || (*iter_mdc2)->y()<-0.4 || (*iter_mdc2)->y()>0.2 || abs((*iter_mdc2)->z())>4.0 ) return StatusCode::SUCCESS;
00395 if( m_printOutInfo ) { m_printOut->addNumber(11); }
00396 if( delta_phi<172.0 || delta_phi>188.0 ) return StatusCode::SUCCESS;
00397 if( m_printOutInfo ) { m_printOut->addNumber(12); }
00398 if( m_calibData == "Bhabha" ) {
00399 if( e1 < 1.1 || e2 < 1.1 ) return StatusCode::SUCCESS;
00400 if( m_printOutInfo ) { m_printOut->addNumber(13); }
00401 }
00402 }
00403
00404 else if( m_data == "psi13" ) {
00405 if( (*iter_mdc1)->x()<-0.15 || (*iter_mdc1)->x()>0.35 || (*iter_mdc1)->y()<-0.35 || (*iter_mdc1)->y()>0.15 || abs((*iter_mdc1)->z())>4.0 ) return StatusCode::SUCCESS;
00406 if( m_printOutInfo ) { m_printOut->addNumber(10); }
00407 if( (*iter_mdc2)->x()<-0.15 || (*iter_mdc2)->x()>0.35 || (*iter_mdc2)->y()<-0.35 || (*iter_mdc2)->y()>0.15 || abs((*iter_mdc2)->z())>4.0 ) return StatusCode::SUCCESS;
00408 if( m_printOutInfo ) { m_printOut->addNumber(11); }
00409 if( delta_phi<172.0 || delta_phi>188.0 ) return StatusCode::SUCCESS;
00410 if( m_printOutInfo ) { m_printOut->addNumber(12); }
00411 if( m_calibData == "Bhabha" ) {
00412 if( e1 < 1.5 || e2 < 1.5 ) return StatusCode::SUCCESS;
00413 if( m_printOutInfo ) { m_printOut->addNumber(13); }
00414 }
00415 }
00416 else if( m_data == "rxyz14" ) {
00417 if( (*iter_mdc1)->x()<-0.15 || (*iter_mdc1)->x()>0.35 || (*iter_mdc1)->y()<-0.35 || (*iter_mdc1)->y()>0.15 || abs((*iter_mdc1)->z())>4.0 ) return StatusCode::SUCCESS;
00418 if( m_printOutInfo ) { m_printOut->addNumber(10); }
00419 if( (*iter_mdc2)->x()<-0.15 || (*iter_mdc2)->x()>0.35 || (*iter_mdc2)->y()<-0.35 || (*iter_mdc2)->y()>0.15 || abs((*iter_mdc2)->z())>4.0 ) return StatusCode::SUCCESS;
00420 if( m_printOutInfo ) { m_printOut->addNumber(11); }
00421 if( delta_phi<175.0 || delta_phi>185.0 ) return StatusCode::SUCCESS;
00422 if( m_printOutInfo ) { m_printOut->addNumber(12); }
00423 if( m_calibData == "Bhabha" ) {
00424 if( e1/p1 < 0.75 || e2/p2 < 0.75 ) return StatusCode::SUCCESS;
00425 if( m_printOutInfo ) { m_printOut->addNumber(13); }
00426 }
00427 }
00428 else if( m_data == "r15" ) {
00429 if( (*iter_mdc1)->x()<-0.15 || (*iter_mdc1)->x()>0.35 || (*iter_mdc1)->y()<-0.35 || (*iter_mdc1)->y()>0.15 || abs((*iter_mdc1)->z())>4.0 ) return StatusCode::SUCCESS;
00430 if( m_printOutInfo ) { m_printOut->addNumber(10); }
00431 if( (*iter_mdc2)->x()<-0.15 || (*iter_mdc2)->x()>0.35 || (*iter_mdc2)->y()<-0.35 || (*iter_mdc2)->y()>0.15 || abs((*iter_mdc2)->z())>4.0 ) return StatusCode::SUCCESS;
00432 if( m_printOutInfo ) { m_printOut->addNumber(11); }
00433 if( delta_phi<175.0 || delta_phi>185.0 ) return StatusCode::SUCCESS;
00434 if( m_printOutInfo ) { m_printOut->addNumber(12); }
00435 if( m_calibData == "Bhabha" ) {
00436 if( e1/p1 < 0.75 || e2/p2 < 0.75 ) return StatusCode::SUCCESS;
00437 if( m_printOutInfo ) { m_printOut->addNumber(13); }
00438 }
00439 }
00440 else if( m_data == "data16" ) {
00441 if( (*iter_mdc1)->x()<-0.15 || (*iter_mdc1)->x()>0.35 || (*iter_mdc1)->y()<-0.35 || (*iter_mdc1)->y()>0.2 || abs((*iter_mdc1)->z())>4.0 ) return StatusCode::SUCCESS;
00442 if( m_printOutInfo ) { m_printOut->addNumber(10); }
00443 if( (*iter_mdc2)->x()<-0.15 || (*iter_mdc2)->x()>0.35 || (*iter_mdc2)->y()<-0.35 || (*iter_mdc2)->y()>0.2 || abs((*iter_mdc2)->z())>4.0 ) return StatusCode::SUCCESS;
00444 if( m_printOutInfo ) { m_printOut->addNumber(11); }
00445 if( delta_phi<170.0 || delta_phi>190.0 ) return StatusCode::SUCCESS;
00446 if( m_printOutInfo ) { m_printOut->addNumber(12); }
00447 if( m_calibData == "Bhabha" ) {
00448 if( e1/p1 < 0.75 || e2/p2 < 0.75 ) return StatusCode::SUCCESS;
00449 if( m_printOutInfo ) { m_printOut->addNumber(13); }
00450 }
00451 }
00452
00453 if( m_calibData == "Bhabha" ) {
00454 if( ( etot - e1 - e2 ) > 0.3 ) return StatusCode::SUCCESS;
00455 if( m_printOutInfo ) { m_printOut->addNumber(14); }
00456 }
00457 else if( m_calibData == "Dimu" ) {
00458 if( e1 > 0.5 || e2 > 0.5 )return StatusCode::SUCCESS;
00459 if( m_printOutInfo ) { m_printOut->addNumber(13); }
00460 }
00461 }
00462
00463
00464 TofTrackVec* tofTrackVec = new TofTrackVec;
00465 RecExtTrackCol::iterator iter_track = extTrackCol->begin();
00466 for( ; iter_track < extTrackCol->end(); iter_track++ ) {
00467 RecMdcTrackCol::iterator iter_mdc = mdcTrackCol->begin();
00468 for( ; iter_mdc != mdcTrackCol->end(); iter_mdc++ ) {
00469 if( (*iter_mdc)->trackId() == (*iter_track)->trackId() ) break;
00470 }
00471 double costheta = cos( (*iter_mdc)->theta() );
00472 RecMdcKalTrackCol::iterator iter_kal = mdcKalTrackCol->begin();
00473 for( ; iter_kal != mdcKalTrackCol->end(); iter_kal++ ) {
00474 if( (*iter_kal)->trackId() == (*iter_track)->trackId() ) break;
00475 }
00476 double p[5] = {-1.0};
00477 int kal[5] = {-1};
00478 if( iter_kal != mdcKalTrackCol->end() ) {
00479 for( unsigned int i=0; i<5; i++ ) {
00480 if( i==0 ) { (*iter_kal)->setPidType(RecMdcKalTrack::electron); }
00481 else if( i==1 ) { (*iter_kal)->setPidType(RecMdcKalTrack::muon); }
00482 else if( i==2 ) { (*iter_kal)->setPidType(RecMdcKalTrack::pion); }
00483 else if( i==3 ) { (*iter_kal)->setPidType(RecMdcKalTrack::kaon); }
00484 else if( i==4 ) { (*iter_kal)->setPidType(RecMdcKalTrack::proton); }
00485 p[i] = (*iter_kal)->p3().mag();
00486 kal[i] = (*iter_kal)->getStat(0,i);
00487 }
00488 }
00489 TofTrack* tof = new TofTrack( run, event );
00490 tof->setExtTrack( (*iter_track), costheta, p, kal, t0, t0Stat );
00491
00492 if( tofTrackVec->size()>0 ) {
00493 std::vector<TofTrack*>::iterator iterExt = tofTrackVec->begin();
00494 for( ; iterExt < tofTrackVec->end(); iterExt++ ) {
00495 if( (*iterExt)->isNoHit() ) continue;
00496 tof->getMultiHit( *iterExt );
00497 }
00498 }
00499
00500 tofTrackVec->push_back( tof );
00501 }
00502
00503 if( m_printOutInfo ) {
00504 m_printOut->setTrack1Col( tofTrackVec );
00505 }
00506
00507
00508 TofDataMap tofDataMap = tofDigiSvc->tofDataMapTof( t0 );
00509 if( tofDataMap.empty() ) {
00510 log << MSG::WARNING << "No Tof Data Map in RawDataProviderSvc! Run=" << run << " Event=" << event << endreq;
00511 }
00512
00513 if( m_checkDigi && m_checkDigiRaw ) {
00514 SmartDataPtr<TofDigiCol> tofDigiCol(eventSvc(),"/Event/Digi/TofDigiCol");
00515 if( !tofDigiCol ) {
00516 log << MSG::ERROR << "TofRec could not find Tof digi! Event = " << event << endreq;
00517 }
00518 else { m_checkdigi_tuple->FillCol( *eventHeader, tofDigiCol, t0, t0Stat ); }
00519
00520 m_checkdigi_tuple->FillCol( *eventHeader, tofDataMap, t0, t0Stat );
00521 }
00522
00523 std::vector<int> deadId;
00524 if( m_forCalibration ) {
00525 for( unsigned int i=0; i<5; i++ ) {
00526 int identmp = tofCaliSvc->BrEast(i);
00527 if( identmp != 0x2fffffff ) {
00528 deadId.push_back( identmp );
00529 }
00530 identmp = tofCaliSvc->BrWest(i);
00531 if( identmp != 0x2fffffff ) {
00532 deadId.push_back( identmp );
00533 }
00534 identmp = tofCaliSvc->Endcap(i);
00535 if( identmp != 0x2fffffff ) {
00536 deadId.push_back( identmp );
00537 }
00538 }
00539 }
00540
00541 std::vector<TofTrack*>::iterator iter = tofTrackVec->begin();
00542 for( ; iter < tofTrackVec->end(); iter++ ) {
00543 if( (*iter)->isNoHit() ) continue;
00544 (*iter)->setTofData( tofDataMap );
00545 if( m_printOutInfo ) { m_printOut->setTrack2( (*iter) ); }
00546 if( (*iter)->isNoHit() ) continue;
00547 (*iter)->match( m_forCalibration, deadId, tofTrackVec );
00548 if( m_printOutInfo ) { m_printOut->setTrack3( (*iter) ); }
00549 }
00550
00551 iter = tofTrackVec->begin();
00552 for( ; iter < tofTrackVec->end(); iter++ ) {
00553
00554 (*iter)->setCalibration();
00555
00556 if( m_checkDigi ) {
00557 if( m_checkTrigger ) {
00558
00559 SmartDataPtr<TrigData> trigData(eventSvc(), "/Event/Trig/TrigData");
00560 if (!trigData) {
00561 log << MSG::FATAL << "Could not find Trigger Data for physics analysis" << endreq;
00562 m_checkdigi_tuple->Fill_TofTrack( *eventHeader, *iter, t0, t0Stat );
00563 }
00564 else {
00565 m_checkdigi_tuple->Fill_TofTrack( *eventHeader, *iter, t0, t0Stat, trigData );
00566 }
00567 }
00568 else {
00569 if( ( run < 0 ) && m_checkMcTruth ) {
00570 SmartDataPtr<TofMcHitCol> tofMcCol(eventSvc(),"/Event/MC/TofMcHitCol");
00571 SmartDataPtr<McParticleCol> mcParticleCol(eventSvc(),"/Event/MC/McParticleCol");
00572 if ( !tofMcCol || !mcParticleCol ) {
00573 m_checkdigi_tuple->Fill_TofTrack( *eventHeader, *iter, t0, t0Stat, mdcKalTrackCol );
00574 }
00575 else {
00576 m_checkdigi_tuple->Fill_TofTrack( *eventHeader, *iter, t0, t0Stat, mdcKalTrackCol, tofMcCol, mcParticleCol, m_calibData );
00577 }
00578 }
00579 else {
00580 m_checkdigi_tuple->Fill_TofTrack( *eventHeader, *iter, t0, t0Stat, mdcKalTrackCol );
00581 }
00582 }
00583 }
00584 }
00585
00586 tds.RegisterTDS( eventHeader->runNumber(), eventHeader->eventNumber(), tofTrackVec, m_forCalibration, m_calibData );
00587
00588 clearTofTrackVec( tofTrackVec );
00589
00590
00591 SmartDataPtr<RecTofTrackCol> tofTrackCol(eventSvc(),"/Event/Recon/RecTofTrackCol");
00592 if (!tofTrackCol) {
00593 log << MSG::FATAL << "TofRec could not find RecTofTrackCol!" << endreq;
00594 return StatusCode::FAILURE;
00595 }
00596 else{
00597 if( m_saveRootFile ) {
00598 m_checkdata_tuple->FillCol( *eventHeader, tofTrackCol, mdcKalTrackCol );
00599 }
00600 }
00601
00602 if( m_forCalibration ) {
00603 SmartDataPtr<RecBTofCalHitCol> bhitCol(eventSvc(),"/Event/Recon/RecBTofCalHitCol");
00604 if (!bhitCol) {
00605 log << MSG::WARNING << "TofRec could not find RecBTofCalHitCol!" << endreq;
00606 }
00607 else {
00608 if( m_saveRootFile ) {
00609 m_checkdata_tuple->FillCol( *eventHeader, bhitCol );
00610 }
00611 }
00612
00613 SmartDataPtr<RecETofCalHitCol> ehitCol(eventSvc(),"/Event/Recon/RecETofCalHitCol");
00614 if (!ehitCol) {
00615 log << MSG::WARNING << "TofRec could not find RecETofCalHitCol!" << endreq;
00616 }
00617 else {
00618 if( m_saveRootFile ) {
00619 m_checkdata_tuple->FillCol( *eventHeader, ehitCol );
00620 }
00621 }
00622 }
00623
00624 }
00625 else {
00626 log << MSG::FATAL << "In TofRec: AcceleratorStatus is NOT correct! m_acceleratorStatus = " << m_acceleratorStatus << endreq;
00627 return StatusCode::FAILURE;
00628 }
00629
00630 return StatusCode::SUCCESS;
00631
00632 }
00633
00634
00635
00636 StatusCode TofRec::finalize() {
00637 if( m_printOutInfo ) {
00638 if( m_forCalibration ) {
00639 m_printOut->finalBhabha( m_calibData );
00640 }
00641 m_printOut->final();
00642 delete m_printOut;
00643 }
00644 if( m_checkDigi ) delete m_checkdigi_tuple;
00645 if( m_saveRootFile ) delete m_checkdata_tuple;
00646 return StatusCode::SUCCESS;
00647 }
00648
00649
00650
00651
00652 void TofRec::clearTofTrackVec( std::vector<TofTrack*>*& tofTrackVec) {
00653 if( tofTrackVec ) {
00654 std::vector<TofTrack*>::iterator iter = tofTrackVec->begin();
00655 for( ; iter < tofTrackVec->end(); iter++ ) {
00656 delete (*iter);
00657 }
00658 tofTrackVec->clear();
00659 delete tofTrackVec;
00660 }
00661 return;
00662 }