THistSvc.h
Go to the documentation of this file.
1 #ifndef GAUDISVC_THISTSVC_H
2 #define GAUDISVC_THISTSVC_H
3 
4 #include "GaudiKernel/Service.h"
5 #include "GaudiKernel/ITHistSvc.h"
6 #include "GaudiKernel/IFileMgr.h"
7 #include "GaudiKernel/IIncidentListener.h"
8 #include "GaudiKernel/IIoComponent.h"
9 #include "GaudiKernel/MsgStream.h"
10 
11 #include "TObject.h"
12 #include "TH1.h"
13 #include "TH2.h"
14 #include "TH3.h"
15 #include "TTree.h"
16 #include "TGraph.h"
17 #include "TList.h"
18 
19 
20 #include <vector>
21 #include <string>
22 #include <set>
23 #include <map>
24 
25 class IIncidentSvc;
26 class THistSvc: public extends3<Service, ITHistSvc, IIncidentListener,
27  IIoComponent> {
28 
29 public:
30 
31  StatusCode initialize() override;
32  StatusCode reinitialize() override;
33  StatusCode finalize() override;
34 
35  StatusCode regHist(const std::string& name) override;
36  StatusCode regHist(const std::string& name, TH1*) override;
37  StatusCode regHist(const std::string& name, TH2*) override;
38  StatusCode regHist(const std::string& name, TH3*) override;
39 
40  StatusCode getHist(const std::string& name, TH1*&) const override;
41  StatusCode getHist(const std::string& name, TH2*&) const override;
42  StatusCode getHist(const std::string& name, TH3*&) const override;
43 
44  StatusCode regTree(const std::string& name) override;
45  StatusCode regTree(const std::string& name, TTree*) override;
46  StatusCode getTree(const std::string& name, TTree*&) const override;
47 
48  StatusCode regGraph(const std::string& name) override;
49  StatusCode regGraph(const std::string& name, TGraph*) override;
50  StatusCode getGraph(const std::string& name, TGraph*&) const override;
51 
52  StatusCode deReg(TObject* obj) override;
53  StatusCode deReg(const std::string& name) override;
54 
55  std::vector<std::string> getHists() const override;
56  std::vector<std::string> getTrees() const override;
57  std::vector<std::string> getGraphs() const override;
58 
59  StatusCode getTHists(TDirectory *td, TList &,
60  bool recurse=false) const override;
61  StatusCode getTHists(const std::string& name, TList &,
62  bool recurse=false) const override;
63 
64  StatusCode getTHists(TDirectory *td, TList &tl,
65  bool recurse=false, bool reg=false) override;
66  StatusCode getTHists(const std::string& name, TList &tl,
67  bool recurse=false, bool reg=false) override;
68 
69  StatusCode getTTrees(TDirectory *td, TList &,
70  bool recurse=false) const override;
71  StatusCode getTTrees(const std::string& name, TList &,
72  bool recurse=false) const override;
73 
74  StatusCode getTTrees(TDirectory *td, TList & tl,
75  bool recurse=false, bool reg=false) override;
76  StatusCode getTTrees(const std::string& name, TList & tl,
77  bool recurse=false, bool reg=false) override;
78 
79  bool exists(const std::string& name) const override;
80 
81  THistSvc(const std::string& name, ISvcLocator *svc );
82 
83  void handle(const Incident&) override;
84 
85  // From IIoComponent
86  StatusCode io_reinit () override;
87 
88 
89 protected:
90 
91  ~THistSvc() override = default;
92 
93 private:
94 
96  public:
99  private:
100  TDirectory* m_gd;
101  TFile* m_gf;
102  int m_ge;
103  };
104 
105  enum Mode {
112  };
113 
114  struct THistID {
115  std::string id;
116  bool temp;
117  TObject* obj;
118  TFile* file;
120 
121  THistID():id(""),temp(true),obj(0),file(0),mode(INVALID) {}
122  THistID(const THistID& rhs):id(rhs.id), temp(rhs.temp),
123  obj(rhs.obj), file(rhs.file), mode(rhs.mode) {}
124  THistID(std::string& i, bool& t, TObject* o, TFile* f)
125  : id(i), temp(t), obj(o), file(f), mode(INVALID){
126  }
127  THistID(std::string& i, bool& t, TObject* o, TFile* f, Mode m)
128  : id(i), temp(t), obj(o), file(f), mode(m){
129  }
130 
131  bool operator < (THistID const &rhs) const {
132  return (obj < rhs.obj);
133  }
134  };
135 
136 
137  template <typename T>
138  StatusCode regHist_i(T* hist, const std::string& name);
139  template <typename T>
140  StatusCode getHist_i(const std::string& name, T*& hist, bool quiet=false) const;
141  template <typename T>
142  StatusCode readHist_i(const std::string& name, T*& hist) const;
143 
144 
145  StatusCode readHist(const std::string& name, TH1*&) const;
146  StatusCode readHist(const std::string& name, TH2*&) const;
147  StatusCode readHist(const std::string& name, TH3*&) const;
148  StatusCode readTree(const std::string& name, TTree*&) const;
149 
150  void updateFiles();
151  StatusCode write();
152  StatusCode connect(const std::string&);
153  TDirectory* changeDir(const THistSvc::THistID& hid) const;
154  std::string dirname(std::string& dir) const;
155  void removeDoubleSlash(std::string&) const;
156 
157  bool browseTDir(TDirectory* dir) const;
158 
159  bool findStream(const std::string& name, std::string& root,
160  std::string& rem, TFile*& file) const;
161  void parseString(const std::string& id, std::string& root, std::string& rem)
162  const;
163 
165  void setupInputFile( Property& inputfile );
166 
168  void setupOutputFile( Property& outputfile );
169 
170  void setupCompressionLevel( Property& cmp );
171 
172  void copyFileLayout(TDirectory*, TDirectory*);
173 
174  void MergeRootFile( TDirectory *target, TDirectory *source);
175 
177 
178  mutable MsgStream m_log;
179 
181  std::vector<std::string> m_Rstream, m_Wstream;
184 
187  std::set<std::string> m_alreadyConnectedInFiles;
188 
191  std::set<std::string> m_alreadyConnectedOutFiles;
192 
193 
194  typedef std::map<std::string, THistID> uidMap;
195  typedef std::multimap<std::string, THistID> idMap;
196  typedef std::map<TObject*, THistID> objMap;
197  typedef std::multimap<std::string, std::string> streamMap;
198 
199  uidMap m_uids;
200  idMap m_ids;
201  objMap m_tobjs;
202 
203  std::map<std::string, std::pair<TFile*,Mode> > m_files; // stream->file
204  streamMap m_fileStreams; // fileName->streams
205 
206  std::map<std::string, std::string > m_sharedFiles; // stream->filename of shared files
207 
208  bool signaledStop = false;
209  bool m_delayConnect = false, m_okToConnect = false;
210 
211  mutable std::string m_curstream;
212 
213  IIncidentSvc* p_incSvc = nullptr;
214  IFileMgr* p_fileMgr = nullptr;
215 
218 
219 };
220 
221 #ifndef GAUDISVC_THISTSVC_ICC
222  #include "THistSvc.icc"
223 #endif
224 
225 
226 #endif
#define FILEMGR_CALLBACK_ARGS
Definition: IFileMgr.h:308
bool m_delayConnect
Definition: THistSvc.h:209
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
std::vector< std::string > getTrees() const override
Definition: THistSvc.cpp:1095
StatusCode initialize() override
Definition: THistSvc.cpp:78
THistID(std::string &i, bool &t, TObject *o, TFile *f, Mode m)
Definition: THistSvc.h:127
The ISvcLocator is the interface implemented by the Service Factory in the Application Manager to loc...
Definition: ISvcLocator.h:25
THistID(const THistID &rhs)
Definition: THistSvc.h:122
std::string m_curstream
Definition: THistSvc.h:211
IntegerProperty m_autoFlush
Definition: THistSvc.h:182
IntegerProperty m_autoSave
Definition: THistSvc.h:182
IIncidentSvc * p_incSvc
Definition: THistSvc.h:213
bool findStream(const std::string &name, std::string &root, std::string &rem, TFile *&file) const
Definition: THistSvc.cpp:1161
bool browseTDir(TDirectory *dir) const
Definition: THistSvc.cpp:405
StatusCode getTTrees(TDirectory *td, TList &, bool recurse=false) const override
Definition: THistSvc.cpp:559
StatusCode getGraph(const std::string &name, TGraph *&) const override
Definition: THistSvc.cpp:1111
bool signaledStop
Definition: THistSvc.h:208
void setupCompressionLevel(Property &cmp)
Definition: THistSvc.cpp:1223
StatusCode rootOpenAction(FILEMGR_CALLBACK_ARGS)
Definition: THistSvc.cpp:2030
void copyFileLayout(TDirectory *, TDirectory *)
helper function to recursively copy the layout of a TFile into a new TFile
Definition: THistSvc.cpp:1872
TDirectory * changeDir(const THistSvc::THistID &hid) const
Definition: THistSvc.cpp:1655
objMap m_tobjs
Definition: THistSvc.h:201
std::multimap< std::string, THistID > idMap
Definition: THistSvc.h:195
StatusCode getTHists(TDirectory *td, TList &, bool recurse=false) const override
Definition: THistSvc.cpp:451
StatusCode write()
Definition: THistSvc.cpp:1399
std::vector< std::string > m_Wstream
Definition: THistSvc.h:181
StringArrayProperty m_inputfile
Definition: THistSvc.h:180
BooleanProperty m_print
Definition: THistSvc.h:183
StringArrayProperty m_outputfile
Definition: THistSvc.h:180
std::string id
Definition: THistSvc.h:115
~THistSvc() override=default
void setupOutputFile(Property &outputfile)
call-back method to handle output stream property
Definition: THistSvc.cpp:1275
std::string dirname(std::string &dir) const
Definition: THistSvc.cpp:1684
StatusCode readTree(const std::string &name, TTree *&) const
Definition: THistSvc.cpp:1154
StatusCode getTree(const std::string &name, TTree *&) const override
Definition: THistSvc.cpp:1088
std::vector< std::string > m_Rstream
Definition: THistSvc.h:181
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
std::map< std::string, std::pair< TFile *, Mode > > m_files
Definition: THistSvc.h:203
constexpr double m
Definition: SystemOfUnits.h:93
bool m_okToConnect
Definition: THistSvc.h:209
void handle(const Incident &) override
Definition: THistSvc.cpp:1816
IntegerProperty m_maxFileSize
Definition: THistSvc.h:182
std::vector< std::string > getHists() const override
Definition: THistSvc.cpp:1073
std::multimap< std::string, std::string > streamMap
Definition: THistSvc.h:197
StatusCode rootOpenErrAction(FILEMGR_CALLBACK_ARGS)
Definition: THistSvc.cpp:2062
void parseString(const std::string &id, std::string &root, std::string &rem) const
Definition: THistSvc.cpp:1205
list file
Definition: ana.py:160
StatusCode getHist_i(const std::string &name, T *&hist, bool quiet=false) const
Definition: THistSvc.icc:142
THistID(std::string &i, bool &t, TObject *o, TFile *f)
Definition: THistSvc.h:124
StatusCode finalize() override
Definition: THistSvc.cpp:241
IntegerProperty m_compressionLevel
Definition: THistSvc.h:182
bool operator<(THistID const &rhs) const
Definition: THistSvc.h:131
StatusCode regHist(const std::string &name) override
Definition: THistSvc.cpp:974
std::map< std::string, std::string > m_sharedFiles
Definition: THistSvc.h:206
TObject * obj
Definition: THistSvc.h:117
Property base class allowing Property* collections to be "homogeneous".
Definition: Property.h:38
StatusCode reinitialize() override
Definition: THistSvc.cpp:230
StatusCode regHist_i(T *hist, const std::string &name)
Definition: THistSvc.icc:17
Base class used to extend a class implementing other interfaces.
Definition: extends.h:10
uidMap m_uids
Definition: THistSvc.h:199
StatusCode readHist_i(const std::string &name, T *&hist) const
Definition: THistSvc.icc:242
Base class for all Incidents (computing events).
Definition: Incident.h:16
std::map< TObject *, THistID > objMap
Definition: THistSvc.h:196
StatusCode connect(const std::string &)
Definition: THistSvc.cpp:1431
StatusCode readHist(const std::string &name, TH1 *&) const
Definition: THistSvc.cpp:1133
idMap m_ids
Definition: THistSvc.h:200
IFileMgr * p_fileMgr
Definition: THistSvc.h:214
tuple root
Definition: IOTest.py:42
std::set< std::string > m_alreadyConnectedOutFiles
list of already connected files.
Definition: THistSvc.h:191
StatusCode deReg(TObject *obj) override
Definition: THistSvc.cpp:913
StatusCode regTree(const std::string &name) override
Definition: THistSvc.cpp:1004
bool exists(const std::string &name) const override
Definition: THistSvc.cpp:1806
std::map< std::string, THistID > uidMap
Definition: THistSvc.h:194
MsgStream m_log
Definition: THistSvc.h:178
std::set< std::string > m_alreadyConnectedInFiles
list of already connected files.
Definition: THistSvc.h:187
StatusCode regGraph(const std::string &name) override
Definition: THistSvc.cpp:1024
THistSvc(const std::string &name, ISvcLocator *svc)
Definition: THistSvc.cpp:62
void setupInputFile(Property &inputfile)
call-back method to handle input stream property
Definition: THistSvc.cpp:1236
list i
Definition: ana.py:128
StatusCode io_reinit() override
callback method to reinitialize the internal state of the component for I/O purposes (e...
Definition: THistSvc.cpp:1912
StatusCode getHist(const std::string &name, TH1 *&) const override
Definition: THistSvc.cpp:1052
The interface implemented by the IncidentSvc service.
Definition: IIncidentSvc.h:21
streamMap m_fileStreams
Definition: THistSvc.h:204
void MergeRootFile(TDirectory *target, TDirectory *source)
Definition: THistSvc.cpp:1730
void removeDoubleSlash(std::string &) const
Definition: THistSvc.cpp:1720
void updateFiles()
Definition: THistSvc.cpp:1305
std::vector< std::string > getGraphs() const override
Definition: THistSvc.cpp:1118