Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

digiRootReaderAlg.cxx

Go to the documentation of this file.
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 // switch to new root Digi package
00015 #include "digiRootData/AcdTile.h"
00016 #include "digiRootData/CalLog.h"
00017 #include "digiRootData/StripId.h"
00018 #include "digiRootData/TkrLayer.h"
00019 //#include "digiRootData/Tagger.h"
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 //#include "GlastEvent/Digi/AcdDigi.h"
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     // Use the Job options service to set the Algorithm's parameters
00055     setProperties();
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     // Setup the input raw root file for reading
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     // There is no proper Event object in the TDS - since
00152     // we are not using the EventSelector.  Instead a generic
00153     // Data Object is the root of the TDS.  In this case, we
00154     // create our own Event object and store it in the TDS.
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         // For the testbeam ROOT classes.. TkrLayer::X was defined 
00253         // as a layer ORIENTED in the X direction
00254         // This has been fixed... TkrLayer::X now means MEASURES X
00255         // So we replace the following line:
00256         // int XY = (rLayer->getXY() == TkrLayer::X ? 1 : 0);
00257         // with this new line:
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; // the 0 for the ADC's
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         // The layer numbers in the Raw Root file adhere to the
00291         // Ritz convention - layer num == 0 is the front most layer
00292         // closest to the TKR.  Here, iplane is numbered from the bottom (0)
00293         // and is [0,3] and where iview is used to denote the orientation 
00294         // of the layer
00295         int iplane = (MAXLAYERNUM - rLogID->getLayer()) / 2;
00296         // HMK:  The columns ids in the Raw Root file now conform to the standard numbering scheme
00297         // I believe, that CalRecon also adheres to the standard in the respect
00298         // So there is no need to modify the column number obtained from the raw root file
00299         int icolumn = rLogID->getColumn();
00300         // Here, the Raw Root file provides getXY == 0 to mean a log oriented along the 
00301         // X-axis, so it measures Y.  HMK believes that iview should be 1 in this case
00302         // and 0 for logs oriented along the Y-axis.
00303         int iview = 1-(rLogID->getXY());
00304 
00305         // Old Code that will no longer work
00306         /*
00307         int ADCID   = rLogID->getId();
00308         int iplane = ADCID/2;
00309         iplane = NLAYERS - (iplane%4);
00310         int icolumn = ADCID/8;
00311         int iview   = 1-ADCID%2;  
00312         */
00313 
00314         // We have fixed the digi Root classes so that the 
00315         // columns now conform to the Steve Ritz numbering standard
00316         // No need to change the orientation.
00317         //if (iview == 0) icolumn = 9 - icolumn; 
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 }

Generated at Wed Nov 21 12:22:36 2001 by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000