00001 #include "GaudiKernel/MsgStream.h"
00002 #include "GaudiKernel/ISvcLocator.h"
00003 #include "GaudiKernel/IDataProviderSvc.h"
00004 #include "GaudiKernel/Bootstrap.h"
00005 #include "GaudiKernel/IMessageSvc.h"
00006 #include "GaudiKernel/StatusCode.h"
00007 #include "GaudiKernel/SmartDataPtr.h"
00008 #include "ReconEvent/ReconEvent.h"
00009 #include "TofRecEvent/RecTofTrack.h"
00010 #include "TofRecEvent/RecBTofCalHit.h"
00011 #include "TofRecEvent/RecETofCalHit.h"
00012 #include "TofRec/TofTrack.h"
00013 #include "TofRec/TofRecTDS.h"
00014
00015 StatusCode TofRecTDS::InitializeTDS() {
00016 if( RegisterReconEvent() == StatusCode::FAILURE ) return StatusCode::FAILURE;
00017 if( RegisterNullRecTofTrackCol() == StatusCode::FAILURE ) return StatusCode::FAILURE;
00018 return StatusCode::SUCCESS;
00019 }
00020
00021
00022 StatusCode TofRecTDS::RegisterNullRecTofTrackCol() {
00023 IMessageSvc* msgSvc;
00024 Gaudi::svcLocator()->service("MessageSvc", msgSvc);
00025 MsgStream log(msgSvc, "TofRecTDS");
00026 log << MSG::INFO << "Initialize: TofRecTDS::RegisterNullRecTofTrack()" << endreq;
00027
00028 IDataProviderSvc* eventSvc;
00029 Gaudi::svcLocator()->service("EventDataSvc", eventSvc);
00030
00031 RecTofTrackCol* recTofTrackCol = new RecTofTrackCol;
00032
00033
00034 StatusCode sc;
00035 DataObject *aRecTofTrackCol;
00036 eventSvc->findObject( "/Event/Recon/RecTofTrackCol", aRecTofTrackCol );
00037 if( aRecTofTrackCol != NULL ) {
00038 sc = eventSvc->unregisterObject( "/Event/Recon/RecTofTrackCol" );
00039 if( sc != StatusCode::SUCCESS ) {
00040 log << MSG::FATAL << "Initialize: Could not unregister RecTofTrack collection!" << endreq;
00041 delete recTofTrackCol;
00042 return StatusCode::FAILURE;
00043 }
00044 }
00045 delete aRecTofTrackCol;
00046
00047 sc = eventSvc->registerObject("/Event/Recon/RecTofTrackCol", recTofTrackCol);
00048 if( sc != StatusCode::SUCCESS ) {
00049 log << MSG::FATAL << "Initialize: TofRec could not register Null Rec TOF track collection!" << endreq;
00050 delete recTofTrackCol;
00051 return StatusCode::FAILURE;
00052 }
00053
00054 return StatusCode::SUCCESS;
00055 }
00056
00057
00058 StatusCode TofRecTDS::RegisterTDS( int runNumber, int eventNumber, std::vector<TofTrack*>*& tofTrackVec, bool forCalibration, std::string calibData ) {
00059
00060 if( RegisterRecTofTrackCol( tofTrackVec ) == StatusCode::FAILURE ) return StatusCode::FAILURE;
00061 if( forCalibration ) {
00062 if( RegisterRecBTofCalHitCol( runNumber, eventNumber, tofTrackVec, calibData ) == StatusCode::FAILURE ) return StatusCode::FAILURE;
00063 if( RegisterRecETofCalHitCol( runNumber, eventNumber, tofTrackVec, calibData ) == StatusCode::FAILURE ) return StatusCode::FAILURE;
00064 }
00065 return StatusCode::SUCCESS;
00066 }
00067
00068
00069 StatusCode TofRecTDS::RegisterReconEvent() {
00070 IMessageSvc* msgSvc;
00071 Gaudi::svcLocator()->service("MessageSvc", msgSvc);
00072 MsgStream log(msgSvc, "TofRecTDS");
00073
00074 IDataProviderSvc* eventSvc;
00075 Gaudi::svcLocator()->service("EventDataSvc", eventSvc);
00076
00077
00078 DataObject *aReconEvent ;
00079 eventSvc->findObject("/Event/Recon",aReconEvent);
00080 if(aReconEvent==NULL) {
00081 log << MSG::INFO << "TofRecTDS::RegisterReconEvent()" << endreq;
00082 aReconEvent = new ReconEvent();
00083 StatusCode sc = eventSvc->registerObject("/Event/Recon",aReconEvent);
00084 if(sc!=StatusCode::SUCCESS) {
00085 log << MSG::FATAL << "TofRec could not register ReconEvent!" <<endreq;
00086 return StatusCode::FAILURE;
00087 }
00088 }
00089 return StatusCode::SUCCESS;
00090 }
00091
00092
00093 StatusCode TofRecTDS::RegisterRecTofTrackCol( std::vector<TofTrack*>*& tofTrackVec ) {
00094 IMessageSvc* msgSvc;
00095 Gaudi::svcLocator()->service("MessageSvc", msgSvc);
00096 MsgStream log(msgSvc, "TofRecTDS");
00097 log << MSG::INFO << "TofRecTDS::RegisterRecTofTrack()" << endreq;
00098
00099 IDataProviderSvc* eventSvc;
00100 Gaudi::svcLocator()->service("EventDataSvc", eventSvc);
00101
00102 RecTofTrackCol* recTofTrackCol = new RecTofTrackCol;
00103
00104 std::vector<TofTrack*>::iterator iter = tofTrackVec->begin();
00105 for( ; iter < tofTrackVec->end(); iter++ ) {
00106 (*iter)->convert2RecTofTrackCol( recTofTrackCol );
00107 }
00108
00109
00110 StatusCode sc;
00111 DataObject *aRecTofTrackCol;
00112 eventSvc->findObject( "/Event/Recon/RecTofTrackCol", aRecTofTrackCol );
00113 if( aRecTofTrackCol != NULL ) {
00114
00115 sc = eventSvc->unregisterObject( "/Event/Recon/RecTofTrackCol" );
00116
00117 delete aRecTofTrackCol;
00118
00119 if( sc != StatusCode::SUCCESS ) {
00120 log << MSG::FATAL << "Could not unregister RecTofTrack collection!" << endreq;
00121
00122 RecTofTrackCol::iterator iter_tof = recTofTrackCol->begin();
00123 for( ; iter_tof!=recTofTrackCol->end(); iter_tof++ ) {
00124 delete (*iter_tof);
00125 }
00126 recTofTrackCol->clear();
00127 delete recTofTrackCol;
00128
00129 std::vector<TofTrack*>::iterator iter_data = tofTrackVec->begin();
00130 for( ; iter_data!=tofTrackVec->end(); iter_data++ ) {
00131 delete (*iter_data);
00132 }
00133 tofTrackVec->clear();
00134 delete tofTrackVec;
00135
00136 return StatusCode::FAILURE;
00137 }
00138 }
00139
00140 sc = eventSvc->registerObject("/Event/Recon/RecTofTrackCol", recTofTrackCol);
00141 if( sc != StatusCode::SUCCESS ) {
00142 log << MSG::FATAL << "TofRec could not register Rec TOF track collection!" << endreq;
00143 RecTofTrackCol::iterator iter_tof = recTofTrackCol->begin();
00144 for( ; iter_tof!=recTofTrackCol->end(); iter_tof++ ) {
00145 delete (*iter_tof);
00146 }
00147 recTofTrackCol->clear();
00148 delete recTofTrackCol;
00149 return StatusCode::FAILURE;
00150 }
00151
00152 return StatusCode::SUCCESS;
00153 }
00154
00155
00156 StatusCode TofRecTDS::RegisterRecBTofCalHitCol( int runNumber, int eventNumber, std::vector<TofTrack*>*& tofTrackVec, std::string m_calibData ) {
00157 IMessageSvc* msgSvc;
00158 Gaudi::svcLocator()->service("MessageSvc", msgSvc);
00159 MsgStream log(msgSvc, "TofRecTDS");
00160 log << MSG::INFO << "TofRecTDS::RegisterRecBTofCalHitCol()" << endreq;
00161
00162 IDataProviderSvc* eventSvc;
00163 Gaudi::svcLocator()->service("EventDataSvc", eventSvc);
00164
00165 RecBTofCalHitCol* recBTofCalHitCol = new RecBTofCalHitCol;
00166
00167 std::vector<TofTrack*>::iterator iter = tofTrackVec->begin();
00168 for( ; iter < tofTrackVec->end(); iter++ ) {
00169 ExtTrackCase hitcase = (*iter)->hitCase();
00170
00171 if( ( hitcase == InnerLayer ) || ( hitcase == DoubleLayer ) ) {
00172 (*iter)->convert2RecBTofCalHitColBarrel( runNumber, eventNumber, recBTofCalHitCol, m_calibData );
00173 }
00174 if( ( hitcase == EastEndcapMRPC ) || ( hitcase == WestEndcapMRPC ) ) {
00175 (*iter)->convert2RecBTofCalHitColETF( runNumber, eventNumber, recBTofCalHitCol, m_calibData );
00176 }
00177 }
00178
00179
00180 StatusCode scb;
00181 DataObject *aRecBTofCalHitCol;
00182 eventSvc->findObject( "/Event/Recon/RecBTofCalhitCol", aRecBTofCalHitCol );
00183 if( aRecBTofCalHitCol != NULL ) {
00184 scb = eventSvc->unregisterObject( "/Event/Recon/RecBTofCalHitCol" );
00185 if( scb != StatusCode::SUCCESS ) {
00186 log << MSG::FATAL << "Could not unregister RecBTofCalHit collection!" << endreq;
00187
00188 RecBTofCalHitCol::iterator iter_btof = recBTofCalHitCol->begin();
00189 for( ; iter_btof!=recBTofCalHitCol->end(); iter_btof++ ) {
00190 delete (*iter_btof);
00191 }
00192 recBTofCalHitCol->clear();
00193 delete recBTofCalHitCol;
00194
00195 std::vector<TofTrack*>::iterator iter_data = tofTrackVec->begin();
00196 for( ; iter_data!=tofTrackVec->end(); iter_data++ ) {
00197 delete (*iter_data);
00198 }
00199 tofTrackVec->clear();
00200 delete tofTrackVec;
00201
00202 return StatusCode::FAILURE;
00203 }
00204 }
00205
00206 StatusCode sh1 = eventSvc->registerObject("/Event/Recon/RecBTofCalHitCol", recBTofCalHitCol);
00207 if(sh1!=StatusCode::SUCCESS) {
00208 log << MSG::FATAL << "TofRec could not register BTOF CalHit collection!!" << endreq;
00209 RecBTofCalHitCol::iterator iter_btof = recBTofCalHitCol->begin();
00210 for( ; iter_btof!=recBTofCalHitCol->end(); iter_btof++ ) {
00211 delete (*iter_btof);
00212 }
00213 recBTofCalHitCol->clear();
00214 delete recBTofCalHitCol;
00215 return StatusCode::FAILURE;
00216 }
00217
00218 return StatusCode::SUCCESS;
00219 }
00220
00221
00222 StatusCode TofRecTDS::RegisterRecETofCalHitCol( int runNumber, int eventNumber, std::vector<TofTrack*>*& tofTrackVec, std::string m_calibData ) {
00223 IMessageSvc* msgSvc;
00224 Gaudi::svcLocator()->service("MessageSvc", msgSvc);
00225 MsgStream log(msgSvc, "TofRecTDS");
00226 log << MSG::INFO << "TofRecTDS::RegisterRecETofCalHitCol()" << endreq;
00227
00228 IDataProviderSvc* eventSvc;
00229 Gaudi::svcLocator()->service("EventDataSvc", eventSvc);
00230
00231
00232
00233 if( tofTrackVec->size() != 2 ) return StatusCode::SUCCESS;
00234 std::vector<TofTrack*>::iterator iter1 = tofTrackVec->begin();
00235 std::vector<TofTrack*>::iterator iter2 = iter1+1;
00236 if( (*iter1)->tdc1() < 0.0 || (*iter2)->tdc1() < 0.0 ) return StatusCode::SUCCESS;
00237 if( abs( (*iter1)->tdc1() - (*iter2)->tdc1() ) > 2.0 ) return StatusCode::SUCCESS;
00238
00239
00240
00241 RecETofCalHitCol* recETofCalHitCol = new RecETofCalHitCol;
00242
00243 std::vector<TofTrack*>::iterator iter = tofTrackVec->begin();
00244 for( ; iter < tofTrackVec->end(); iter++ ) {
00245 ExtTrackCase hitcase = (*iter)->hitCase();
00246 if( ( hitcase == EastEndcap ) || ( hitcase == WestEndcap ) ) {
00247 (*iter)->convert2RecETofCalHitCol( runNumber, eventNumber, recETofCalHitCol, m_calibData );
00248 }
00249 }
00250
00251
00252 StatusCode sce;
00253
00254 DataObject *aRecETofCalHitCol;
00255 eventSvc->findObject( "/Event/Recon/RecETofCalhitCol", aRecETofCalHitCol );
00256 if( aRecETofCalHitCol != NULL ) {
00257 sce = eventSvc->unregisterObject( "/Event/Recon/RecETofCalHitCol" );
00258 if( sce != StatusCode::SUCCESS ) {
00259 log << MSG::FATAL << "Could not unregister RecETofCalHit collection!" << endreq;
00260
00261 RecETofCalHitCol::iterator iter_etof = recETofCalHitCol->begin();
00262 for( ; iter_etof!=recETofCalHitCol->end(); iter_etof++ ) {
00263 delete (*iter_etof);
00264 }
00265 recETofCalHitCol->clear();
00266 delete recETofCalHitCol;
00267
00268 std::vector<TofTrack*>::iterator iter_data = tofTrackVec->begin();
00269 for( ; iter_data!=tofTrackVec->end(); iter_data++ ) {
00270 delete (*iter_data);
00271 }
00272 tofTrackVec->clear();
00273 delete tofTrackVec;
00274
00275 return StatusCode::FAILURE;
00276 }
00277 }
00278
00279 StatusCode sh2 = eventSvc->registerObject("/Event/Recon/RecETofCalHitCol",recETofCalHitCol);
00280 if(sh2!=StatusCode::SUCCESS) {
00281 log << MSG::FATAL << "TofRec could not register ETOF CalHit collection!!" << endreq;
00282 RecETofCalHitCol::iterator iter_etof = recETofCalHitCol->begin();
00283 for( ; iter_etof!=recETofCalHitCol->end(); iter_etof++ ) {
00284 delete (*iter_etof);
00285 }
00286 recETofCalHitCol->clear();
00287 delete recETofCalHitCol;
00288 return StatusCode::FAILURE;
00289 }
00290
00291 return StatusCode::SUCCESS;
00292 }