00001 #include "GaudiKernel/MsgStream.h"
00002 #include "GaudiKernel/AlgFactory.h"
00003 #include "GaudiKernel/IDataProviderSvc.h"
00004 #include "GaudiKernel/SmartDataPtr.h"
00005 #include "GaudiKernel/Property.h"
00006 #include "GlastSvc/GlastDetSvc/IGlastDetSvc.h"
00007
00008 #include "GaudiKernel/DataObject.h"
00009 #include "GaudiKernel/DataSvc.h"
00010 #include "GaudiKernel/ObjectVector.h"
00011
00012
00013 #include "digiRootReaderAlg.h"
00014
00015 #include "digiRootData/AcdTile.h"
00016 #include "digiRootData/CalLog.h"
00017 #include "digiRootData/StripId.h"
00018 #include "digiRootData/TkrLayer.h"
00019
00020
00021 #include "TROOT.h"
00022 #include "TFile.h"
00023 #include "TTree.h"
00024 #include "TDirectory.h"
00025
00026 #include "digiRootData/DigiEvent.h"
00027
00028 #include "GlastEvent/Hits/SiLayers.h"
00029 #include "GlastEvent/TopLevel/Event.h"
00030 #include "CalRecon/CalADCLogs.h"
00031
00032
00033
00034 static const AlgFactory<digiRootReaderAlg> Factory;
00035 const IAlgFactory& digiRootReaderAlgFactory = Factory;
00036
00037
00038 digiRootReaderAlg::digiRootReaderAlg(const std::string& name, ISvcLocator* pSvcLocator) :
00039 Algorithm(name, pSvcLocator)
00040 {
00041 declareProperty("rawRootFile",m_fileName);
00042 m_numEvents = 0;
00043 m_currentEvent = 0;
00044 m_eventId = 0;
00045 m_runId = 0;
00046 }
00047
00048
00049 StatusCode digiRootReaderAlg::initialize()
00050 {
00051 StatusCode sc = StatusCode::SUCCESS;
00052 MsgStream log(msgSvc(), name());
00053
00055
00056
00057 IProperty* glastPropMgr=0;
00058 sc = serviceLocator()->getService("EventSelector", IID_IProperty,
00059 reinterpret_cast<IInterface*&>( glastPropMgr ));
00060 if( sc.isFailure() ) return sc;
00061
00062 IntegerProperty evtMax("EvtMax",0);
00063 sc = glastPropMgr->getProperty( &evtMax );
00064 if (sc.isFailure()) return sc;
00065
00066 m_maxEvent = evtMax.value();
00067
00068
00069 if(0 == gROOT)
00070 {
00071 static TROOT root("root","Root I/O");
00072 log << MSG::INFO << "Initializing ROOT" << endreq;
00073 } else {
00074 log << MSG::INFO << "Root already initialized(not an error)" <<endreq;
00075 }
00076
00077
00078 TDirectory *saveDir = gDirectory;
00079 m_rawFile = new TFile(m_fileName.c_str(), "READ");
00080 if (!(m_rawFile->IsOpen())) return StatusCode::FAILURE;
00081
00082 m_rawTree = (TTree*) m_rawFile->Get("T");
00083 if (!m_rawTree) return StatusCode::FAILURE;
00084
00085 m_numEvents = m_rawTree->GetEntries();
00086
00087 m_event = new DigiEvent();
00088 m_event->Clean();
00089
00090 m_rawTree->SetBranchAddress("DigiEvent", &m_event);
00091
00092
00093 saveDir->cd();
00094 return sc;
00095 }
00096
00097 StatusCode digiRootReaderAlg::execute()
00098 {
00099 StatusCode sc = StatusCode::SUCCESS;
00100 MsgStream log( msgSvc(), name() );
00101
00102 if (m_currentEvent >= m_numEvents) {
00103 log << MSG::INFO << "reached end of raw root file " << endreq;
00104 return StatusCode::FAILURE;
00105 }
00106
00107 if (m_currentEvent >= m_maxEvent) {
00108 log << MSG::INFO << "Finished processing the requested number of evnets " << endreq;
00109 return StatusCode::FAILURE;
00110 }
00111
00113 readEvent();
00114
00116 sc = retrieve();
00118 load(m_SiLayers);
00119 load(m_CalADCLogs);
00120 load(m_AcdDigiList);
00121
00122 sc = storeHeader();
00123
00124 ++m_currentEvent;
00125
00126 return sc;
00127 }
00128
00129 void digiRootReaderAlg::readEvent() {
00130
00131 TDirectory *saveDir = gDirectory;
00132 m_event->Clean();
00133 m_rawFile->cd();
00134
00135 Int_t nb = 0,nbytes = 0;
00136 nb = m_rawTree->GetEvent((Int_t) m_currentEvent);
00137 nbytes += nb;
00138
00139 m_eventId = m_event->getEventId();
00140 m_runId = m_event->getRunId();
00141
00142 saveDir->cd();
00143
00144 return;
00145 }
00146
00147 StatusCode digiRootReaderAlg::storeHeader() {
00148 MsgStream log(msgSvc(), name());
00149 StatusCode sc;
00150
00151
00152
00153
00154
00155 Event *eventHeader = new Event();
00156
00157 eventHeader->setEvent(m_eventId);
00158 eventHeader->setRun(m_runId);
00159
00160 sc = eventSvc()->registerObject("/Event/Header", eventHeader);
00161
00162 return sc;
00163 }
00164
00165 StatusCode digiRootReaderAlg::finalize()
00166 {
00167 close();
00168
00169 StatusCode sc = StatusCode::SUCCESS;
00170 return sc;
00171 }
00172
00173 void digiRootReaderAlg::close()
00174 {
00175 TDirectory *saveDir = gDirectory;
00176 m_rawFile->cd();
00177 m_rawFile->Close();
00178 saveDir->cd();
00179 }
00180
00181 StatusCode digiRootReaderAlg::retrieve()
00182 {
00183 MsgStream log(msgSvc(), name());
00184 StatusCode sc = StatusCode::SUCCESS;
00185
00186 m_SiLayers = 0;
00187 m_SiLayers = new SiLayers();
00188 m_SiLayers->clear();
00189
00190
00191 m_CalADCLogs = 0;
00192 m_CalADCLogs = new CalADCLogs();
00193
00194 m_AcdDigiList = new AcdDigiVector;
00195
00196
00197 DataObject* pnode=0;
00198
00199 sc = eventSvc()->retrieveObject( "/Event/TkrRecon", pnode );
00200
00201 if( sc.isFailure() ) {
00202 sc = eventSvc()->registerObject("/Event/TkrRecon",new DataObject);
00203 if( sc.isFailure() ) {
00204
00205 log << MSG::ERROR << "Could not create TkrRecon directory" << endreq;
00206 return sc;
00207 }
00208 }
00209
00210
00211 StatusCode sc_tkr = eventSvc()->registerObject("/Event/TkrRecon/SiLayers",m_SiLayers);
00212
00213 sc = eventSvc()->retrieveObject( "/Event/CalRecon", pnode );
00214
00215 if( sc.isFailure() ) {
00216 sc = eventSvc()->registerObject("/Event/CalRecon",new DataObject);
00217 if( sc.isFailure() ) {
00218
00219 log << MSG::ERROR << "Could not create CalRecon directory" << endreq;
00220 return sc;
00221 }
00222 }
00223
00224 StatusCode sc_cal = eventSvc()->registerObject("/Event/CalRecon/CalADCLogs",m_CalADCLogs);
00225
00226 sc = eventSvc()->retrieveObject("/Event/Digi", pnode);
00227 if (sc.isFailure()) {
00228 sc = eventSvc()->registerObject("/Event/Digi", new DataObject);
00229 if (sc.isFailure()) {
00230 log << MSG::ERROR << "Could not create Digi directory" << endreq;
00231 return sc;
00232 }
00233 }
00234
00235
00236 sc = eventSvc()->registerObject("/Event/Digi/AcdDigis", m_AcdDigiList);
00237 if (sc.isFailure()) {
00238 log << MSG::ERROR << "could not load AcdDigs" << endreq;
00239 }
00240
00241 if (sc_cal.isFailure() || sc_tkr.isFailure()) sc = StatusCode::FAILURE;
00242
00243 return sc;
00244 }
00245
00246 void digiRootReaderAlg::load(SiLayers* siLayers)
00247 {
00248 int nTKR = m_event->getTkrDigi()->GetEntries();
00249 for (int i = 0; i < nTKR; i++) {
00250
00251 TkrLayer* rLayer = (TkrLayer*) m_event->getTkrDigi()->At(i);
00252
00253
00254
00255
00256
00257
00258 int XY = rLayer->getXY();
00259
00260 double tot = rLayer->getToT(0);
00261
00262 int nStrips = rLayer->getStrips()->GetEntries();
00263 if (nStrips >0 ) {
00264 SiLayer* siLayer = new SiLayer(rLayer->getPlaneNum(), XY, tot);
00265 StripId* rStrip;
00266 for (int iStrip=0; iStrip < nStrips; iStrip++) {
00267 rStrip = (StripId*) rLayer->getStrips()->At(iStrip);
00268 int iaddress = rStrip->getId();
00269 siLayer->addStrip((int) iaddress);
00270 }
00271 siLayers->add(siLayer);
00272 }
00273 }
00274 }
00275
00276
00277
00278 void digiRootReaderAlg::load(CalADCLogs* calLogs)
00279 {
00280 int iread = 0;
00281 double BASE = 4095;
00282 int NLAYERS = 3;
00283 const MAXLAYERNUM = 7;
00284
00285 int nCAL = m_event->getCalDigi()->GetEntries();
00286 for (int i = 0; i < nCAL; i++) {
00287 CalLog* rLog = (CalLog*) m_event->getCalDigi()->At(i);
00288 LogId* rLogID= rLog->getLogId();
00289
00290
00291
00292
00293
00294
00295 int iplane = (MAXLAYERNUM - rLogID->getLayer()) / 2;
00296
00297
00298
00299 int icolumn = rLogID->getColumn();
00300
00301
00302
00303 int iview = 1-(rLogID->getXY());
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319 CalADCLog* log = calLogs->getLogID(CalLogID::ID(iplane,CalDetGeo::makeAxis(iview),icolumn));
00320
00321 log->setNegADC(CalBase::LEX,BASE-rLog->getAdc(CalLog::NEG,CalLog::LowEnX4));
00322 log->setNegADC(CalBase::LE, BASE-rLog->getAdc(CalLog::NEG,CalLog::LowEnX1));
00323 log->setNegADC(CalBase::HEX,BASE-rLog->getAdc(CalLog::NEG,CalLog::HiEnX8));
00324 log->setNegADC(CalBase::HE, BASE-rLog->getAdc(CalLog::NEG,CalLog::HiEnX1));
00325
00326 log->setPosADC(CalBase::LEX,BASE-rLog->getAdc(CalLog::POS,CalLog::LowEnX4));
00327 log->setPosADC(CalBase::LE, BASE-rLog->getAdc(CalLog::POS,CalLog::LowEnX1));
00328 log->setPosADC(CalBase::HEX,BASE-rLog->getAdc(CalLog::POS,CalLog::HiEnX8));
00329 log->setPosADC(CalBase::HE, BASE-rLog->getAdc(CalLog::POS,CalLog::HiEnX1));
00330 }
00331 }
00332
00333
00334 void digiRootReaderAlg::load(AcdDigiVector *acdDigiVec) {
00335
00336 int numACDTiles = m_event->getAcdDigi()->GetEntries();
00337 for (int i = 0; i < numACDTiles; i++) {
00338 AcdTile* tile = (AcdTile*) m_event->getAcdDigi()->At(i);
00339 AcdId* id= tile->getId();
00340
00341 acdDigiVec->push_back(new AcdDigi(idents::AcdId(id->getId(2)), tile->getPulseHeight(),
00342 tile->getVeto(), false, false) );
00343 }
00344
00345 }