00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "RawDataCnv/RawDataInputSvc.h"
00010 #include "RawFile/RawFileReader.h"
00011 #ifndef OnlineMode
00012 #include "NetDataReader/NetDataReader.h"
00013 #include "DistBossUtil/GetPropertyValue.h"
00014 #endif
00015 #include "RawDataCnv/EventManagement/RawEvent.h"
00016 #include "IRawFile/RawFileExceptions.h"
00017
00018 #include "GaudiKernel/MsgStream.h"
00019 #include "GaudiKernel/Bootstrap.h"
00020 #include "GaudiKernel/PropertyMgr.h"
00021 #include "GaudiKernel/IJobOptionsSvc.h"
00022
00023
00024 RawDataInputSvc::RawDataInputSvc(const std::string& name, ISvcLocator* svcloc)
00025 :
00026 Service(name,svcloc),
00027 m_re(0),
00028 m_reader(0),
00029 m_sds(0),
00030 m_robs(0)
00031 {
00032
00033 IJobOptionsSvc* jobSvc;
00034 Gaudi::svcLocator()->service("JobOptionsSvc", jobSvc);
00035
00036 PropertyMgr m_propMgr;
00037
00038 m_propMgr.declareProperty("RunMode", m_mode = 2);
00039 m_propMgr.declareProperty("KeepRandomTrigEvt", m_keepRdm = true);
00040 m_propMgr.declareProperty("InputFiles", m_inputFiles);
00041
00042 jobSvc->setMyProperties("RawDataInputSvc", &m_propMgr);
00043 }
00044
00045
00046 RawDataInputSvc::~RawDataInputSvc()
00047 {
00048
00049
00050 }
00051
00052
00053 StatusCode RawDataInputSvc::initialize()
00054 {
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064 #ifndef OnlineMode
00065 if ( m_mode > 1 ) {
00066 try {
00067 if ( m_mode == 2 ) {
00068 if ( m_inputFiles.empty() ) return StatusCode::SUCCESS;
00069 m_reader = new RawFileReader(m_inputFiles);
00070 }
00071 else if ( m_mode == 3 ) {
00072 DistBoss::GetPropertyValue<std::string>("DistBoss", "ServerName", m_evtServer);
00073 m_reader = new NetDataReader(m_evtServer+"/RawEvtSvc");
00074 }
00075 else {
00076 throw RawExMessage("RawDataInputSvc: Invalid RunMode!");
00077 }
00078 }
00079 catch (RawFileException& ex) {
00080 ex.print();
00081 return StatusCode::FAILURE;
00082 }
00083
00084 m_re = new RAWEVENT;
00085
00086 m_sds = new const uint32_t*[64];
00087 m_robs = new const uint32_t*[256];
00088 }
00089 #endif
00090
00091 return StatusCode::SUCCESS;
00092 }
00093
00094 StatusCode RawDataInputSvc::finalize() {
00095
00096 if ( m_re ) {
00097 delete m_re;
00098 m_re = 0;
00099 }
00100
00101 if ( m_reader ) {
00102 delete m_reader;
00103 m_reader = 0;
00104 }
00105
00106 if ( m_sds ) delete m_sds;
00107 if ( m_robs ) delete m_robs;
00108
00109 return StatusCode::SUCCESS;
00110 }
00111
00112
00113 RAWEVENT* RawDataInputSvc::nextEvent() {
00114
00115
00116 #ifndef OnlineMode
00117
00118 m_re->reset();
00119
00120 try {
00121 RawEvent f;
00122 const uint32_t* ef = 0;
00123 do {
00124 f.assign( m_reader->nextEvent());
00125 if (!f.check()) {
00126 std::cerr << "Found invalid event (traceback):" << std::endl;
00127 std::exit(1);
00128 }
00129
00130
00131
00132
00133
00134
00135
00136 f.event_filter_info(ef);
00137 if ( !ef ) {
00138
00139 exit(1);
00140 }
00141 else {
00142
00143
00144 if ( ! m_keepRdm && ((*ef)>>31) != 0 ) {
00145 continue;
00146 }
00147 }
00148 break;
00149 } while (true);
00150
00151 m_re->setRunNo(f.run_no());
00152 m_re->setEventNo(f.global_id());
00153 m_re->setTime(f.time());
00154 m_re->addReHltRaw((uint32_t*)ef, 4);
00155
00156
00157 uint32_t hv_status = 0;
00158 int nrobs = 0;
00159 int nsds = f.children(m_sds, 64);
00160 for ( int sdi = 0; sdi < nsds; ++sdi ) {
00161 eformat::SubDetectorFragment<const uint32_t*> sd(m_sds[sdi]);
00162
00163 if ( sd.nspecific() != 0 ) {
00164 const uint32_t* specific_header;
00165 sd.specific_header(specific_header);
00166 uint32_t source_id_number = sd.source_id();
00167 source_id_number <<= 8;
00168 source_id_number >>= 24;
00169 switch( source_id_number ) {
00170 case 161:
00171 hv_status |= ((8 | ((*specific_header)&0x7)) << 8);
00172 break;
00173 case 162:
00174 hv_status |= ((8 | ((*specific_header)&0x7)) << 4);
00175 break;
00176 case 164:
00177 hv_status |= (8 | ((*specific_header)&0x7));
00178 break;
00179 default:
00180 break;
00181 }
00182 }
00183
00184 nrobs += eformat::get_robs(m_sds[sdi], m_robs+nrobs, 256-nrobs);
00185 }
00186
00187 m_re->setFlag1( hv_status );
00188
00189
00190 for (int robi = 0; robi < nrobs; robi++) {
00191 eformat::ROBFragment<uint32_t*> rob((uint32_t*)m_robs[robi]);
00192
00193 if ((rob.rod_detev_type() & 0x2) != 0) continue;
00194 uint32_t* dataptr = NULL;
00195 rob.rod_data(dataptr);
00196
00197
00198 uint32_t source_id_number = rob.rod_source_id();
00199
00200 source_id_number <<= 8;
00201 source_id_number >>= 24;
00202
00203
00204 switch(source_id_number) {
00205 case 161:
00206 m_re->addReMdcDigi(dataptr, rob.rod_ndata());
00207 break;
00208 case 163:
00209 m_re->addReEmcDigi(dataptr, rob.rod_ndata());
00210 break;
00211 case 162:
00212 m_re->addReTofDigi(dataptr, rob.rod_ndata());
00213 break;
00214 case 167:
00215 m_re->addReEtfDigi(dataptr, rob.rod_ndata());
00216 break;
00217 case 164:
00218 m_re->addReMucDigi(dataptr, rob.rod_ndata());
00219 break;
00220 case 165:
00221
00222
00223
00224
00225 m_re->addReTrigGTD(dataptr, rob.rod_ndata());
00226 break;
00227 case 166:
00228 m_re->addReZddDigi(dataptr, rob.rod_ndata());
00229 break;
00230 case 124:
00231 m_re->addReHltRaw(dataptr, rob.rod_ndata());
00232 break;
00233 case 241:
00234 m_re->addMcParticle(dataptr, rob.rod_ndata());
00235 break;
00236 default:
00237
00238 break;
00239 }
00240 }
00241 }
00242 catch (RawFileException& ex) {
00243 ex.print();
00244 if ( m_reader->stat()&4 ) {
00245 std::cerr << std::endl << "reading ifstream error !!!" << std::endl;
00246 exit(1);
00247 }
00248 delete m_re;
00249 m_re = NULL;
00250 }
00251 catch (eformat::Issue& ex) {
00252 std::cerr << std::endl << "Uncaught eformat issue: " << ex.what() << std::endl;
00253 }
00254 catch (ers::Issue& ex) {
00255 std::cerr << std::endl << "Uncaught ERS issue: " << ex.what() << std::endl;
00256 }
00257 catch (std::exception& ex) {
00258 std::cerr << std::endl << "Uncaught std exception: " << ex.what() << std::endl;
00259 }
00260 catch (...) {
00261 std::cerr << std::endl << "Uncaught unknown exception" << std::endl;
00262 }
00263 #endif
00264
00265 return m_re;
00266 }
00267
00268
00271 RAWEVENT* RawDataInputSvc::currentEvent()
00272 {
00273
00274
00275
00276 return m_re;
00277 }
00278
00279 bool RawDataInputSvc::setCurrentEvent(RAWEVENT* m_onlinere)
00280 {
00281
00282 return (m_re = m_onlinere);
00283 }