1#include "GaudiKernel/AlgFactory.h"
2#include "GaudiKernel/Algorithm.h"
3#include "GaudiKernel/IDataProviderSvc.h"
4#include "GaudiKernel/MsgStream.h"
5#include "GaudiKernel/SmartDataPtr.h"
7#include "EventModel/Event.h"
8#include "EventModel/EventModel.h"
9#include "MDCRawEvent/MdcDigi.h"
10#include "RawEvent/DigiEvent.h"
12#include "RootCnvSvc/Util.h"
14#include "TDirectory.h"
19#include "DigiRootData/DigiEvent.h"
21#include "RootCnvSvc/commonData.h"
23#include "RootIO/IRootIoSvc.h"
46 StatusCode writeDigiEvent();
50 StatusCode writeMdcDigi();
64 std::string m_fileName;
66 std::string m_treeName;
72 int m_compressionLevel;
84 : Algorithm( name, pSvcLocator ) {
86 declareProperty(
"digiRootFile", m_fileName =
"digi.root" );
87 declareProperty(
"splitMode", m_splitMode = 1 );
88 declareProperty(
"bufferSize", m_bufSize = 64000 );
89 declareProperty(
"compressionLevel", m_compressionLevel = 1 );
91 declareProperty(
"treeName", m_treeName =
"Rec" );
92 declareProperty(
"autoSave", m_autoSaveEvents = 1000 );
99 StatusCode sc = StatusCode::SUCCESS;
100 MsgStream log(
msgSvc(), name() );
106 if ( service(
"RootIoSvc", m_rootIoSvc,
true ).isFailure() )
108 log << MSG::INFO <<
"Couldn't find the RootIoSvc!" << endmsg;
109 log << MSG::INFO <<
"No Auto Saving" << endmsg;
116 TDirectory* saveDir = gDirectory;
118 m_digiFile =
new TFile( m_fileName.c_str(),
"RECREATE" );
119 if ( !m_digiFile->IsOpen() )
121 log << MSG::ERROR <<
"ROOT file " << m_fileName <<
" could not be opened for writing."
123 return StatusCode::FAILURE;
126 m_digiFile->SetCompressionLevel( m_compressionLevel );
127 m_digiTree =
new TTree( m_treeName.c_str(),
"Bes Digitization Data" );
129 m_common.m_digiEvt = m_digiEvt;
130 m_digiTree->Branch(
"DigiEvent",
"DigiEvent", &m_digiEvt, m_bufSize, m_splitMode );
140 MsgStream log(
msgSvc(), name() );
142 StatusCode sc = StatusCode::SUCCESS;
144 if ( !m_digiFile->IsOpen() )
146 log << MSG::ERROR <<
"ROOT file " << m_fileName <<
" could not be opened for writing."
148 return StatusCode::FAILURE;
153 sc = writeDigiEvent();
154 if ( sc.isFailure() )
156 log << MSG::ERROR <<
"Failed to write DigiEvent" << endmsg;
161 if ( sc.isFailure() )
163 log << MSG::ERROR <<
"Failed to write Tkr Digi Collection" << endmsg;
171StatusCode digiRootWriterAlg::writeDigiEvent() {
175 MsgStream log(
msgSvc(), name() );
176 StatusCode sc = StatusCode::SUCCESS;
179 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(),
"/Event" );
180 if ( !eventHeader )
return sc;
182 Short_t runId = eventHeader->runNumber();
183 Short_t evtId = eventHeader->eventNumber();
184 Bool_t fromMc =
true;
186 m_digiEvt->
initialize( evtId, runId, fromMc );
192StatusCode digiRootWriterAlg::writeMdcDigi() {
196 MsgStream log(
msgSvc(), name() );
197 StatusCode sc = StatusCode::SUCCESS;
200 if ( !mdcDigiColTds )
return sc;
201 MdcDigiCol::const_iterator mdcDigiTds;
203 for ( mdcDigiTds = mdcDigiColTds->begin(); mdcDigiTds != mdcDigiColTds->end(); mdcDigiTds++ )
205 UInt_t overflow = ( *mdcDigiTds )->getOverflow();
206 UInt_t
time = ( *mdcDigiTds )->getTimeChannel();
207 UInt_t charge = ( *mdcDigiTds )->getChargeChannel();
208 UInt_t
id = ( *mdcDigiTds )->getIntId();
209 TMdcDigi* mdcDigiRoot =
new TMdcDigi();
210 m_common.m_mdcDigiMap[( *mdcDigiTds )] = mdcDigiRoot;
214 m_digiEvt->addMdcDigi( mdcDigiRoot );
221void digiRootWriterAlg::writeEvent() {
224 static int eventCounter = 0;
225 TDirectory* saveDir = gDirectory;
226 m_digiTree->GetCurrentFile()->cd();
233 if ( eventCounter % m_rootIoSvc->getAutoSaveInterval() == 0 ) m_digiTree->AutoSave();
238void digiRootWriterAlg::close() {
246 TDirectory* saveDir = gDirectory;
247 TFile*
f = m_digiTree->GetCurrentFile();
250 m_digiTree->BuildIndex(
"m_runId",
"m_eventId" );
251 f->Write( 0, TObject::kWriteDelete );
260 StatusCode sc = StatusCode::SUCCESS;
TFile f("ana_bhabha660a_dqa_mcPat_zy_old.root")
void initialize(bool fromMc)
void setOverflow(const UInt_t overflow)
void initialize(UInt_t id, UInt_t time=0, UInt_t charge=0)
StatusCode initialize()
Handles setup by opening ROOT file in write mode and creating a new TTree.
StatusCode execute()
Orchastrates reading from TDS and writing to ROOT for each event.
digiRootWriterAlg(const std::string &name, ISvcLocator *pSvcLocator)
StatusCode finalize()
Closes the ROOT file and cleans up.
static int expandEnvVar(std::string *toExpand, const std::string &openDel=std::string("$("), const std::string &closeDel=std::string(")"))
const IAlgFactory & digiRootWriterAlgFactory
_EXTERN_ std::string MdcDigiCol