ATLAS Offline Software
Loading...
Searching...
No Matches
dqi::HanOutput Class Reference

#include <HanOutput.h>

Inheritance diagram for dqi::HanOutput:

Classes

class  RegionNameComp
class  Result

Public Types

enum  Version { V1 = 1 , V2 = 2 }
typedef std::map< std::string, TSeqCollection * > DQOutputMap_t

Public Member Functions

 HanOutput (const std::string &rootFileName, DQOutputMap_t *outputMap, TSeqCollection *outputList)
virtual ~HanOutput ()
virtual void addListener (const std::string &name, dqm_core::OutputListener *listener)
virtual void addListener (const dqm_core::Parameter &parameter, dqm_core::OutputListener *listener)
virtual void publishResult (const std::string &name, const dqm_core::Result &result)
virtual void flushResults ()
virtual void activate ()
virtual void deactivate ()
virtual void setConfig (HanConfig *config)
virtual void publishMissingDQPars ()
virtual void setInput (TDirectory *input)

Public Attributes

Version HanOutput_FileVersion = V2

Protected Types

typedef std::map< std::string, dqm_core::Region * > DQParMap_t
typedef std::multimap< dqm_core::Region *, std::string, RegionNameCompDQRegMap_t
typedef std::map< dqm_core::Region *, int, RegionNameCompDQRegCount_t
typedef std::map< std::string, dqm_core::Result * > DQResultMap_t
typedef std::set< std::string > DQParSet_t

Protected Attributes

std::string m_fileName
std::unique_ptr< TFile > m_file
bool m_retainUnpubData
DQParSet_t m_unpublishedDQPars
DQParMap_t m_dqPars
DQRegMap_t m_dqRegs
DQRegCount_t m_dqRegCounts
DQResultMap_t m_dqResults
DQOutputMap_tm_outputMap
TSeqCollection * m_outputList
HanConfigm_config
DQParSet_t m_regexlist
TDirectory * m_input

Private Member Functions

 HanOutput ()

Detailed Description

Definition at line 38 of file HanOutput.h.

Member Typedef Documentation

◆ DQOutputMap_t

typedef std::map<std::string, TSeqCollection*> dqi::HanOutput::DQOutputMap_t

Definition at line 45 of file HanOutput.h.

◆ DQParMap_t

typedef std::map<std::string, dqm_core::Region*> dqi::HanOutput::DQParMap_t
protected

Definition at line 93 of file HanOutput.h.

◆ DQParSet_t

typedef std::set<std::string> dqi::HanOutput::DQParSet_t
protected

Definition at line 97 of file HanOutput.h.

◆ DQRegCount_t

typedef std::map<dqm_core::Region*, int, RegionNameComp> dqi::HanOutput::DQRegCount_t
protected

Definition at line 95 of file HanOutput.h.

◆ DQRegMap_t

typedef std::multimap<dqm_core::Region*, std::string, RegionNameComp> dqi::HanOutput::DQRegMap_t
protected

Definition at line 94 of file HanOutput.h.

◆ DQResultMap_t

typedef std::map<std::string, dqm_core::Result*> dqi::HanOutput::DQResultMap_t
protected

Definition at line 96 of file HanOutput.h.

Member Enumeration Documentation

◆ Version

Enumerator
V1 
V2 

Definition at line 41 of file HanOutput.h.

41{ V1 = 1, V2 = 2 };

Constructor & Destructor Documentation

◆ HanOutput() [1/2]

dqi::HanOutput::HanOutput ( const std::string & rootFileName,
DQOutputMap_t * outputMap,
TSeqCollection * outputList )

Definition at line 95 of file HanOutput.cxx.

96 : m_fileName(rootFileName),
97 m_file(TFile::Open(rootFileName.c_str(), "RECREATE")),
98 m_retainUnpubData(false),
99 m_config(0),
100 m_input(0)
101 {
102 m_outputMap = outMap;
104 if (m_file.get() == 0)
105 {
106 std::cerr << "File not writable: " << rootFileName << "\n";
107 }
108 }
std::unique_ptr< TFile > m_file
Definition HanOutput.h:100
HanConfig * m_config
Definition HanOutput.h:111
TSeqCollection * m_outputList
Definition HanOutput.h:110
std::string m_fileName
Definition HanOutput.h:99
TDirectory * m_input
Definition HanOutput.h:113
bool m_retainUnpubData
Definition HanOutput.h:101
DQOutputMap_t * m_outputMap
Definition HanOutput.h:108

◆ ~HanOutput()

dqi::HanOutput::~HanOutput ( )
virtual

Definition at line 110 of file HanOutput.cxx.

111 {
112 DQResultMap_t::const_iterator rend = m_dqResults.end();
113 for (DQResultMap_t::const_iterator i = m_dqResults.begin(); i != rend; ++i)
114 {
115 dqm_core::Result* result = i->second;
116 delete result;
117 }
118 m_file->Close();
119 }
DQResultMap_t m_dqResults
Definition HanOutput.h:107

◆ HanOutput() [2/2]

dqi::HanOutput::HanOutput ( )
private

Definition at line 682 of file HanOutput.cxx.

Member Function Documentation

◆ activate()

void dqi::HanOutput::activate ( )
virtual

Definition at line 389 of file HanOutput.cxx.

389{ gROOT->cd(); }

◆ addListener() [1/2]

void dqi::HanOutput::addListener ( const dqm_core::Parameter & parameter,
dqm_core::OutputListener * listener )
virtual

Definition at line 148 of file HanOutput.cxx.

149 {
150 addListener(parameter.getName(), listener);
151 }
virtual void addListener(const std::string &name, dqm_core::OutputListener *listener)

◆ addListener() [2/2]

void dqi::HanOutput::addListener ( const std::string & name,
dqm_core::OutputListener * listener )
virtual

Definition at line 121 of file HanOutput.cxx.

122 {
123 dqm_core::Region* region = dynamic_cast<dqm_core::Region*>(listener);
124 if (region == 0) return;
125
126 DQParMap_t::const_iterator i = m_dqPars.find(name);
127 if (i != m_dqPars.end())
128 {
129 if (i->second != region)
130 {
131 std::cerr << "Attempt to add " << name << " twice; ignoring" << std::endl;
132 }
133 else
134 {
135 return;
136 }
137 }
138
139 DQParMap_t::value_type dqParVal(name, region);
140 m_dqPars.insert(std::move(dqParVal));
141
142 DQRegMap_t::value_type dqRegVal(region, name);
143 m_dqRegs.insert(std::move(dqRegVal));
144
145 m_unpublishedDQPars.insert(name);
146 }
DQParSet_t m_unpublishedDQPars
Definition HanOutput.h:103
DQParMap_t m_dqPars
Definition HanOutput.h:104
DQRegMap_t m_dqRegs
Definition HanOutput.h:105

◆ deactivate()

void dqi::HanOutput::deactivate ( )
virtual

Definition at line 577 of file HanOutput.cxx.

578 {
579 flushResults();
580 m_file->SetBit(TFile::kDevNull);
581
583 m_file.get(), dynamic_cast<TSeqCollection*>(m_outputList->First()), m_file.get(), 4, HanOutput_FileVersion);
584
585 if (HanOutput_FileVersion == 2)
586 {
587 m_file->cd("HanMetadata_");
588 TDirectory* version_dir = gDirectory->mkdir("File");
589 version_dir->cd();
590 TDirectory* version_subdir = gDirectory->mkdir("Version_name");
591 version_subdir->cd();
592 TObjString file_version;
593 file_version.Write("V.2.3");
594 }
595 m_file->Write();
596 m_file->Flush();
597 }
Version HanOutput_FileVersion
Definition HanOutput.h:43
virtual void flushResults()
static void WriteListToDirectory(TDirectory *dir, TSeqCollection *list, TFile *file, int level, int HanOutput_FileVersion)

◆ flushResults()

void dqi::HanOutput::flushResults ( )
virtual

Definition at line 177 of file HanOutput.cxx.

178 {
179 // store regex lists
180 DQOutputMap_t tmpRegex;
181 DQParSet_t::const_iterator regexEnd = m_regexlist.end();
182 for (DQParSet_t::const_iterator regex = m_regexlist.begin(); regex != regexEnd; ++regex)
183 {
184 TSeqCollection* resultList = (*m_outputMap)[*regex];
185 if (resultList == 0)
186 {
187 std::cerr << "Can't find original list for regex???" << std::endl;
188 }
189 else
190 {
191 tmpRegex.insert(DQOutputMap_t::value_type(*regex, resultList));
192 (*m_outputMap).erase(*regex);
193 DQParMap_t::const_iterator i = m_dqPars.find(*regex);
194 if (i != m_dqPars.end())
195 {
196 dqm_core::Region* parent = i->second;
197
198 std::string parentName = parent->getName();
199 // just remove, don't delete
200 static_cast<TSeqCollection*>((*m_outputMap)[parentName])->Remove(resultList);
201 }
202 }
203 }
204
205 // replay results
206 DQResultMap_t::const_iterator rEnd = m_dqResults.end();
207 for (DQResultMap_t::const_iterator r = m_dqResults.begin(); r != rEnd; ++r)
208 {
209 const std::string name(r->first);
210 const dqm_core::Result& result(*(r->second));
211
212 std::string parentName("top_level");
213 DQParMap_t::const_iterator i = m_dqPars.find(name);
214
215 if (i != m_dqPars.end())
216 {
217 dqm_core::Region* parent = i->second;
218 parentName = parent->getName();
219 }
220 // copy-paste ENDS here
221
222 TSeqCollection* resultList = (*m_outputMap)[name];
223 std::string parname(name);
224 std::string storename(name);
225
226 if (resultList == NULL)
227 {
228 // is regex?
229 bool isRegex = false;
230 std::string extra;
231 for (DQParSet_t::const_iterator regex = m_regexlist.begin(); regex != regexEnd; ++regex)
232 {
233 std::string::size_type regexlen = regex->length();
234 if (*regex + "_" == name.substr(0, regexlen + 1))
235 {
236 isRegex = true;
237 parname = *regex;
238 std::string::size_type atsign = regex->rfind('@');
239 if (atsign != std::string::npos)
240 {
241 extra = regex->substr(atsign, std::string::npos);
242 }
243 storename = name.substr(regexlen + 1, std::string::npos);
244 break;
245 }
246 }
247 if (isRegex)
248 {
249 if (m_input == NULL)
250 {
251 std::cerr << "WARNING: setInput() has not been set; cannot publish regex results" << std::endl;
252 continue;
253 }
254 resultList = static_cast<TSeqCollection*>(tmpRegex[parname]->Clone());
255 (*m_outputMap)[storename + extra] = resultList;
256 DQParMap_t::const_iterator i = m_dqPars.find(parname);
257 if (i == m_dqPars.end()) {
258 std::cerr << "WARNING: Can't find parname in m_dqPars" << std::endl;
259 continue;
260 }
261 parentName = i->second->getName();
262 bool use_full_name = false;
263 if (m_config)
264 {
265 std::unique_ptr<const HanConfigAssessor> a(m_config->GetAssessor(parentName, parname));
266 if (a.get())
267 {
268 std::string store_using_path;
269 const HanConfigParMap* hcpm = a->GetAnnotation("store_using_path");
270 if (hcpm)
271 {
272 store_using_path.assign(hcpm->GetValue());
273 }
274 boost::algorithm::to_lower(store_using_path);
275 if (store_using_path == "1" || store_using_path == "yes" || store_using_path == "true")
276 {
277 use_full_name = true;
278 }
279 }
280 }
281 if (use_full_name)
282 {
283 resultList->SetName((boost::algorithm::replace_all_copy(storename, "/", "_") + extra + "_").c_str());
284 }
285 else
286 {
287 resultList->SetName((storename + extra + "_").c_str());
288 }
289 dynamic_cast<TSeqCollection*>((*m_outputMap)[parentName])->Add(resultList);
290 TKey* key = getObjKey(m_input, storename);
291 if (key != 0)
292 {
293 const char* className = key->GetClassName();
294 if ((strncmp(className, "TH", 2) == 0) || (strncmp(className, "TGraph", 6) == 0) ||
295 (strncmp(className, "TProfile", 8) == 0) || (strncmp(className, "TEfficiency", 11) == 0))
296 {
297 TNamed* transobj = dynamic_cast<TNamed*>(key->ReadObj());
298 if (transobj != NULL)
299 {
300 HanHistogramLink* hhl = new HanHistogramLink(m_input, storename);
301 if (use_full_name)
302 {
303 hhl->SetName((boost::algorithm::replace_all_copy(storename, "/", "_") + extra).c_str());
304 }
305 else
306 {
307 hhl->SetName((std::string(transobj->GetName()) + extra).c_str());
308 }
309 // transobj->SetName((std::string(transobj->GetName()) + extra).c_str());
310 // resultList->Add(transobj);
311 resultList->Add(hhl);
312 }
313 else
314 {
315 std::cerr << "TNamed* cast failed for " << storename << std::endl;
316 }
317 }
318 }
319 else
320 {
321 std::cout << "key is NULL" << std::endl;
322 }
323 }
324 else
325 {
326 std::cerr << "WARNING: Unable to find mapping for " << name << std::endl;
327 continue;
328 }
329 }
330
331
332 if (resultList)//ensure resultList is not null before dereference
333 {
334 resultList = dynamic_cast<TSeqCollection*>(resultList->FindObject("Results"));
335 }
336 //check dynamic cast
337 if (resultList == nullptr)
338 {
339 std::cerr << "Warning: no result list found associated with '" << name << "'\n";
340 continue;
341 }
342
343
344 resultList->Add(newTObjArray("Status", new TObjString(StatusToStr(result.status_).c_str()), 1));
345
346 // iterate through the tags
347 std::map<std::string, double>::const_iterator iter = result.tags_.begin();
348 for (; iter != result.tags_.end(); ++iter)
349 {
350 std::ostringstream tagval;
351 tagval << std::setprecision(4) << iter->second;
352 resultList->Add(newTObjArray(iter->first.c_str(), new TObjString(tagval.str().c_str()), 1));
353 }
354
355 // if there's an output object from the algorithm, include a clone
356 TObject* resultobj = result.getObject();
357 if (resultobj != 0)
358 {
359 TObject* resultobjclone = resultobj->Clone();
360 if (setNameGeneral(resultobj, "ResultObject"))
361 {
362 resultList->Add(resultobjclone);
363 }
364 else
365 {
366 std::cerr << "Discarding result object " << result.getObject()->GetName() << std::endl;
367 delete resultobjclone;
368 }
369 }
370
371 if (m_config != 0)
372 {
373 TObject* ref = m_config->GetReference(parentName, parname);
374 if (ref)
375 {
376 if (setNameGeneral(ref, "Reference"))
377 {
378 resultList->Add(ref);
379 }
380 else
381 {
382 std::cerr << "Discarding reference object " << ref->GetName() << std::endl;
383 }
384 }
385 }
386 }
387 }
const boost::regex ref(r_ef)
static Double_t a
std::map< std::string, TSeqCollection * > DQOutputMap_t
Definition HanOutput.h:45
DQParSet_t m_regexlist
Definition HanOutput.h:112
int r
Definition globals.cxx:22
TSeqCollection * newTObjArray(const char *name, TObject *obj=0, Int_t size=TCollection::kInitCapacity)
Definition HanUtils.cxx:27
bool setNameGeneral(TObject *obj, const std::string &name)
Definition HanOutput.cxx:44
TKey * getObjKey(TDirectory *dir, const std::string &path)
Definition HanUtils.cxx:36

◆ publishMissingDQPars()

void dqi::HanOutput::publishMissingDQPars ( )
virtual

Definition at line 605 of file HanOutput.cxx.

606 {
607 m_retainUnpubData = true;
608
609 DQRegMap_t::const_iterator dqRegIter = m_dqRegs.begin();
610 DQRegMap_t::const_iterator dqRegEnd = m_dqRegs.end();
611 for (; dqRegIter != dqRegEnd; ++dqRegIter)
612 {
613 std::string regname = dqRegIter->first->getName();
614 m_unpublishedDQPars.erase(regname);
615 }
616
617 DQParSet_t::const_iterator regexItr = m_regexlist.begin();
618 DQParSet_t::const_iterator regexEnd = m_regexlist.end();
619 for (; regexItr != regexEnd; ++regexItr)
620 {
621 m_unpublishedDQPars.erase(*regexItr);
622 }
623
624 dqm_core::Result::Status status(dqm_core::Result::Undefined);
625 dqm_core::Result result(status);
626
627 DQParSet_t::const_iterator unpubIter = m_unpublishedDQPars.begin();
628 DQParSet_t::const_iterator unpubEnd = m_unpublishedDQPars.end();
629 for (; unpubIter != unpubEnd; ++unpubIter)
630 {
631 const std::string& name = *unpubIter;
632 // reduce verbosity
633 // std::cout << "--> Publishing missing object: \"" << name << "\"\n";
634 publishResult(name, result);
635 }
636
637 m_retainUnpubData = false;
638 }
virtual void publishResult(const std::string &name, const dqm_core::Result &result)
status
Definition merge.py:16

◆ publishResult()

void dqi::HanOutput::publishResult ( const std::string & name,
const dqm_core::Result & result )
virtual

Definition at line 153 of file HanOutput.cxx.

154 {
155 // std::cout << "Publish " << name << std::endl;
156 delete m_dqResults[name];
157 m_dqResults[name] = result.clone();
158
159 DQParSet_t::iterator dqpari = m_unpublishedDQPars.find(name);
160 if (dqpari != m_unpublishedDQPars.end() && !m_retainUnpubData)
161 {
162 m_unpublishedDQPars.erase(dqpari);
163 }
164
166 {
167 DQParMap_t::const_iterator i = m_dqPars.find(name);
168 if (i != m_dqPars.end())
169 {
170 dqm_core::Region* parent = i->second;
171 dqm_core::OutputListener* plistener = parent;
172 plistener->handleResult(name, result);
173 }
174 }
175 }

◆ setConfig()

void dqi::HanOutput::setConfig ( HanConfig * config)
virtual

Definition at line 599 of file HanOutput.cxx.

600 {
602 config->GetRegexList(m_regexlist);
603 }

◆ setInput()

void dqi::HanOutput::setInput ( TDirectory * input)
virtual

Definition at line 391 of file HanOutput.cxx.

Member Data Documentation

◆ HanOutput_FileVersion

Version dqi::HanOutput::HanOutput_FileVersion = V2

Definition at line 43 of file HanOutput.h.

◆ m_config

HanConfig* dqi::HanOutput::m_config
protected

Definition at line 111 of file HanOutput.h.

◆ m_dqPars

DQParMap_t dqi::HanOutput::m_dqPars
protected

Definition at line 104 of file HanOutput.h.

◆ m_dqRegCounts

DQRegCount_t dqi::HanOutput::m_dqRegCounts
protected

Definition at line 106 of file HanOutput.h.

◆ m_dqRegs

DQRegMap_t dqi::HanOutput::m_dqRegs
protected

Definition at line 105 of file HanOutput.h.

◆ m_dqResults

DQResultMap_t dqi::HanOutput::m_dqResults
protected

Definition at line 107 of file HanOutput.h.

◆ m_file

std::unique_ptr<TFile> dqi::HanOutput::m_file
protected

Definition at line 100 of file HanOutput.h.

◆ m_fileName

std::string dqi::HanOutput::m_fileName
protected

Definition at line 99 of file HanOutput.h.

◆ m_input

TDirectory* dqi::HanOutput::m_input
protected

Definition at line 113 of file HanOutput.h.

◆ m_outputList

TSeqCollection* dqi::HanOutput::m_outputList
protected

Definition at line 110 of file HanOutput.h.

◆ m_outputMap

DQOutputMap_t* dqi::HanOutput::m_outputMap
protected

Definition at line 108 of file HanOutput.h.

◆ m_regexlist

DQParSet_t dqi::HanOutput::m_regexlist
protected

Definition at line 112 of file HanOutput.h.

◆ m_retainUnpubData

bool dqi::HanOutput::m_retainUnpubData
protected

Definition at line 101 of file HanOutput.h.

◆ m_unpublishedDQPars

DQParSet_t dqi::HanOutput::m_unpublishedDQPars
protected

Definition at line 103 of file HanOutput.h.


The documentation for this class was generated from the following files: