ATLAS Offline Software
Public Member Functions | Private Attributes | List of all members
EL::Detail::OutputStreamData Class Referencefinal

all data needed to manage a given output stream More...

#include <OutputStreamData.h>

Collaboration diagram for EL::Detail::OutputStreamData:

Public Member Functions

void testInvariant () const
 test the invariant of this object More...
 
 OutputStreamData (const std::string &val_fileName, const std::string &mode)
 open the given file and create an output stream for it More...
 
 OutputStreamData (std::unique_ptr< TFile > val_file)
 create this output stream for a pre-opened file More...
 
 OutputStreamData (std::unique_ptr< SH::DiskWriter > val_writer)
 create this output stream for a custom writer More...
 
TFile * file () const noexcept
 the file we are writing to More...
 
void saveOutput ()
 write the list of output objects to disk and clear it More...
 
void close ()
 close this file More...
 
std::string finalFileName () const
 the final path of the file created More...
 
void addOutput (std::unique_ptr< TObject > outputObject)
 add the given output object to this stream More...
 
void addClone (const TObject &prototypeObject)
 add a clone of the given object to the output More...
 
TDirectory * makeDirectoryFor (std::string &name)
 make the directory for the object of the given name More...
 
TObject * getOutputHist (const std::string &name) const noexcept
 get the output histogram with the given name, or nullptr if there is no histogam with such a name More...
 
TTree * getOutputTree (const std::string &name) const noexcept
 get the output tree with the given name, or nullptr if there is no tree with such a name More...
 

Private Attributes

std::unique_ptr< SH::DiskWriterm_writer
 the writer we use More...
 
std::vector< std::unique_ptr< TObject > > m_output
 the list of objects to write out at the end of job More...
 
std::unordered_map< std::string, TObject * > m_outputHistMap
 the output histogram map More...
 
std::unordered_map< std::string, TTree * > m_outputTreeMap
 the output tree map More...
 

Detailed Description

all data needed to manage a given output stream

Definition at line 29 of file OutputStreamData.h.

Constructor & Destructor Documentation

◆ OutputStreamData() [1/3]

EL::Detail::OutputStreamData::OutputStreamData ( const std::string &  val_fileName,
const std::string &  mode 
)
explicit

open the given file and create an output stream for it

Guarantee
strong
Failures
out of memory II

Definition at line 114 of file OutputStreamData.cxx.

116  : OutputStreamData (checkedOpenFile (val_fileName, mode))
117  {
118  // no invariant used
119  }

◆ OutputStreamData() [2/3]

EL::Detail::OutputStreamData::OutputStreamData ( std::unique_ptr< TFile >  val_file)
explicit

create this output stream for a pre-opened file

Guarantee
strong
Failures
out of memory II

Definition at line 123 of file OutputStreamData.cxx.

125  : OutputStreamData (std::make_unique<MyWriter> (std::move (file)))
126  {
127  // no invariant used
128  }

◆ OutputStreamData() [3/3]

EL::Detail::OutputStreamData::OutputStreamData ( std::unique_ptr< SH::DiskWriter val_writer)
explicit

create this output stream for a custom writer

Guarantee
strong
Failures
out of memory II

Definition at line 132 of file OutputStreamData.cxx.

134  : m_writer (std::move (val_writer))
135  {
136  RCU_NEW_INVARIANT (this);
137  }

Member Function Documentation

◆ addClone()

void EL::Detail::OutputStreamData::addClone ( const TObject &  prototypeObject)

add a clone of the given object to the output

Guarantee
basic
Failures
cloning failures
out of memory II

Definition at line 240 of file OutputStreamData.cxx.

242  {
243  // no invariant used
244 
245  // Do not change the user's "current directory" during any of the
246  // following...
247  DirectoryReset dirReset;
248 
249  // Make a clone of the object, and make sure we are already in
250  // the right directory if needed
251  std::string name = prototypeObject.GetName();
252  TDirectory *dir = makeDirectoryFor (name);
253  dir->cd();
254 
255  std::unique_ptr<TObject> clone {prototypeObject.Clone()};
256 
257  // Hold on to the pointer of the tree in our internal cache.
258  addOutput (std::move (clone));
259  }

◆ addOutput()

void EL::Detail::OutputStreamData::addOutput ( std::unique_ptr< TObject >  outputObject)

add the given output object to this stream

While the caller transfers ownership to this object, he may retain a reference to the object until saveOutput or close is called.

Guarantee
basic
Failures
out of memory II

Definition at line 203 of file OutputStreamData.cxx.

205  {
206  RCU_CHANGE_INVARIANT (this);
207 
208  TTree *const tree = dynamic_cast<TTree*> (outputObject.get());
209  if (tree)
210  {
211  std::string name = tree->GetName();
212  std::string treeName = tree->GetName();
213 
214  TDirectory *dir = makeDirectoryFor (treeName);
215 
216  // if we are in a sub-directory we need to rename the tree
217  if (name != treeName)
218  tree->SetName (treeName.c_str());
219 
220  // pass ownership of the tree to the directory
221  tree->SetDirectory (dir);
222  outputObject.release();
223 
225 
226 
227  } else
228  {
229  TH1 *const hist = dynamic_cast<TH1*> (outputObject.get());
230 
231  m_outputHistMap[outputObject->GetName()] = outputObject.get();
232  m_output.emplace_back (std::move (outputObject));
233  if (hist)
234  hist->SetDirectory (nullptr);
235  }
236  }

◆ close()

void EL::Detail::OutputStreamData::close ( )

close this file

Guarantee
basic
Failures
i/o errors

Definition at line 152 of file OutputStreamData.cxx.

154  {
155  RCU_CHANGE_INVARIANT (this);
156  saveOutput ();
157  m_writer->close ();
158  }

◆ file()

TFile * EL::Detail::OutputStreamData::file ( ) const
noexcept

the file we are writing to

Guarantee
no-fail
Postcondition
result != nullptr

Definition at line 141 of file OutputStreamData.cxx.

143  {
144  RCU_READ_INVARIANT (this);
145  TFile *result = m_writer->file();
146  RCU_PROVIDE (result != nullptr);
147  return result;
148  }

◆ finalFileName()

std::string EL::Detail::OutputStreamData::finalFileName ( ) const

the final path of the file created

Guarantee
strong
Failures
out of memory II

Definition at line 162 of file OutputStreamData.cxx.

164  {
165  RCU_READ_INVARIANT (this);
166  return m_writer->path ();
167  }

◆ getOutputHist()

TObject * EL::Detail::OutputStreamData::getOutputHist ( const std::string &  name) const
noexcept

get the output histogram with the given name, or nullptr if there is no histogam with such a name

Guarantee
no-fail

Definition at line 292 of file OutputStreamData.cxx.

294  {
295  RCU_READ_INVARIANT (this);
296 
297  auto iter = m_outputHistMap.find (name);
298  return iter != m_outputHistMap.end() ? iter->second : nullptr;
299  }

◆ getOutputTree()

TTree * EL::Detail::OutputStreamData::getOutputTree ( const std::string &  name) const
noexcept

get the output tree with the given name, or nullptr if there is no tree with such a name

Guarantee
no-fail

Definition at line 303 of file OutputStreamData.cxx.

305  {
306  RCU_READ_INVARIANT (this);
307 
308  auto iter = m_outputTreeMap.find (name);
309  return iter != m_outputTreeMap.end() ? iter->second : nullptr;
310  }

◆ makeDirectoryFor()

TDirectory * EL::Detail::OutputStreamData::makeDirectoryFor ( std::string &  name)

make the directory for the object of the given name

This will make sure that we pick the proper sub-directory if needed.

Guarantee
basic
Failures
directory creation failures

Definition at line 263 of file OutputStreamData.cxx.

265  {
266  RCU_CHANGE_INVARIANT (this);
267 
268  TDirectory *result = file();
269  std::string::size_type split = name.rfind ("/");
270  if (split == std::string::npos)
271  {
272  return result;
273  } else
274  {
275  const std::string dirname = name.substr (0, split);
276  name = name.substr (split + 1);
277  TDirectory *subdir = dynamic_cast<TDirectory*>(result->Get (dirname.c_str()));
278  if (!subdir)
279  {
280  result->mkdir (dirname.c_str());
281  subdir = dynamic_cast<TDirectory*>(result->Get (dirname.c_str()));
282  RCU_ASSERT (subdir != nullptr);
283  }
284  result = subdir;
285  RCU_ASSERT (result != nullptr);
286  return result;
287  }
288  }

◆ saveOutput()

void EL::Detail::OutputStreamData::saveOutput ( )

write the list of output objects to disk and clear it

Guarantee
basic
Failures
i/o errors

Definition at line 171 of file OutputStreamData.cxx.

173  {
174  RCU_CHANGE_INVARIANT (this);
175  TFile *const file {m_writer->file()};
176  RCU_ASSERT (file != nullptr);
177  for (std::unique_ptr<TObject>& object : m_output)
178  {
179  std::string name = object->GetName();
180  TDirectory *dir = makeDirectoryFor (name);
181  if (dir != file)
182  {
183  TNamed *named = dynamic_cast<TNamed*>(object.get());
184  if (named)
185  named->SetName (name.c_str());
186  }
187 
188  if (!RCU::SetDirectory (object.get(), dir))
189  {
190  dir->WriteObject (object.get(), name.c_str());
191  }
192  //release object which was consumed by SetDirectory or WriteObject
193  //placate cppcheck using std::ignore
194  std::ignore = object.release();
195  }
196  m_outputHistMap.clear ();
197  m_outputTreeMap.clear ();
198  m_output.clear ();
199  }

◆ testInvariant()

void EL::Detail::OutputStreamData::testInvariant ( ) const

test the invariant of this object

Definition at line 105 of file OutputStreamData.cxx.

107  {
108  RCU_INVARIANT (this != nullptr);
109  RCU_INVARIANT (m_writer != nullptr);
110  }

Member Data Documentation

◆ m_output

std::vector<std::unique_ptr<TObject> > EL::Detail::OutputStreamData::m_output
private

the list of objects to write out at the end of job

Definition at line 170 of file OutputStreamData.h.

◆ m_outputHistMap

std::unordered_map<std::string,TObject*> EL::Detail::OutputStreamData::m_outputHistMap
private

the output histogram map

Definition at line 174 of file OutputStreamData.h.

◆ m_outputTreeMap

std::unordered_map<std::string,TTree*> EL::Detail::OutputStreamData::m_outputTreeMap
private

the output tree map

Definition at line 178 of file OutputStreamData.h.

◆ m_writer

std::unique_ptr<SH::DiskWriter> EL::Detail::OutputStreamData::m_writer
private

the writer we use

Definition at line 166 of file OutputStreamData.h.


The documentation for this class was generated from the following files:
EL::Detail::OutputStreamData::addOutput
void addOutput(std::unique_ptr< TObject > outputObject)
add the given output object to this stream
Definition: OutputStreamData.cxx:204
EL::Detail::OutputStreamData::file
TFile * file() const noexcept
the file we are writing to
Definition: OutputStreamData.cxx:142
EL::Detail::OutputStreamData::m_output
std::vector< std::unique_ptr< TObject > > m_output
the list of objects to write out at the end of job
Definition: OutputStreamData.h:170
get_generator_info.result
result
Definition: get_generator_info.py:21
plotmaker.hist
hist
Definition: plotmaker.py:148
tree
TChain * tree
Definition: tile_monitor.h:30
dirname
std::string dirname(std::string name)
Definition: utils.cxx:200
EL::Detail::OutputStreamData::m_writer
std::unique_ptr< SH::DiskWriter > m_writer
the writer we use
Definition: OutputStreamData.h:166
python.Utilities.clone
clone
Definition: Utilities.py:134
DiTauMassTools::ignore
void ignore(T &&)
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:54
RCU_PROVIDE
#define RCU_PROVIDE(x)
Definition: Assert.h:215
EL::Detail::OutputStreamData::m_outputTreeMap
std::unordered_map< std::string, TTree * > m_outputTreeMap
the output tree map
Definition: OutputStreamData.h:178
dumpFileToPlots.treeName
string treeName
Definition: dumpFileToPlots.py:20
Preparation.mode
mode
Definition: Preparation.py:95
RCU_INVARIANT
#define RCU_INVARIANT(x)
Definition: Assert.h:201
beamspotman.dir
string dir
Definition: beamspotman.py:623
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
RCU::SetDirectory
bool SetDirectory(TObject *object, TDirectory *directory)
effects: set the directory this object is associated with returns: whether the object type actively k...
Definition: RootUtils.cxx:28
EL::Detail::OutputStreamData::makeDirectoryFor
TDirectory * makeDirectoryFor(std::string &name)
make the directory for the object of the given name
Definition: OutputStreamData.cxx:264
TH1
Definition: rootspy.cxx:268
EL::Detail::OutputStreamData::m_outputHistMap
std::unordered_map< std::string, TObject * > m_outputHistMap
the output histogram map
Definition: OutputStreamData.h:174
get
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition: hcg.cxx:127
RCU_CHANGE_INVARIANT
#define RCU_CHANGE_INVARIANT(x)
Definition: Assert.h:231
EL::Detail::OutputStreamData::saveOutput
void saveOutput()
write the list of output objects to disk and clear it
Definition: OutputStreamData.cxx:172
python.LumiCalcRecover.subdir
subdir
Definition: LumiCalcRecover.py:25
RCU_ASSERT
#define RCU_ASSERT(x)
Definition: Assert.h:222
RCU_READ_INVARIANT
#define RCU_READ_INVARIANT(x)
Definition: Assert.h:229
Trk::split
@ split
Definition: LayerMaterialProperties.h:38
EL::Detail::OutputStreamData::OutputStreamData
OutputStreamData(const std::string &val_fileName, const std::string &mode)
open the given file and create an output stream for it
Definition: OutputStreamData.cxx:115
RCU_NEW_INVARIANT
#define RCU_NEW_INVARIANT(x)
Definition: Assert.h:233