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 687 of file HanOutput.cxx.

Member Function Documentation

◆ activate()

void dqi::HanOutput::activate ( )
virtual

Definition at line 394 of file HanOutput.cxx.

394{ 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 582 of file HanOutput.cxx.

583 {
584 flushResults();
585 m_file->SetBit(TFile::kDevNull);
586
588 m_file.get(), dynamic_cast<TSeqCollection*>(m_outputList->First()), m_file.get(), 4, HanOutput_FileVersion);
589
590 if (HanOutput_FileVersion == 2)
591 {
592 m_file->cd("HanMetadata_");
593 TDirectory* version_dir = gDirectory->mkdir("File");
594 version_dir->cd();
595 TDirectory* version_subdir = gDirectory->mkdir("Version_name");
596 version_subdir->cd();
597 TObjString file_version;
598 file_version.Write("V.2.3");
599 }
600 m_file->Write();
601 m_file->Flush();
602 }
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 if (auto seqcoll = dynamic_cast<TSeqCollection*>((*m_outputMap)[parentName])) {
290 seqcoll->Add(resultList);
291 }
292 else {
293 std::cerr << "dynamic_cast to TSeqCollection* fails\n";
294 }
295 TKey* key = getObjKey(m_input, storename);
296 if (key != 0)
297 {
298 const char* className = key->GetClassName();
299 if ((strncmp(className, "TH", 2) == 0) || (strncmp(className, "TGraph", 6) == 0) ||
300 (strncmp(className, "TProfile", 8) == 0) || (strncmp(className, "TEfficiency", 11) == 0))
301 {
302 TNamed* transobj = dynamic_cast<TNamed*>(key->ReadObj());
303 if (transobj != NULL)
304 {
305 HanHistogramLink* hhl = new HanHistogramLink(m_input, storename);
306 if (use_full_name)
307 {
308 hhl->SetName((boost::algorithm::replace_all_copy(storename, "/", "_") + extra).c_str());
309 }
310 else
311 {
312 hhl->SetName((std::string(transobj->GetName()) + extra).c_str());
313 }
314 // transobj->SetName((std::string(transobj->GetName()) + extra).c_str());
315 // resultList->Add(transobj);
316 resultList->Add(hhl);
317 }
318 else
319 {
320 std::cerr << "TNamed* cast failed for " << storename << std::endl;
321 }
322 }
323 }
324 else
325 {
326 std::cout << "key is NULL" << std::endl;
327 }
328 }
329 else
330 {
331 std::cerr << "WARNING: Unable to find mapping for " << name << std::endl;
332 continue;
333 }
334 }
335
336
337 if (resultList)//ensure resultList is not null before dereference
338 {
339 resultList = dynamic_cast<TSeqCollection*>(resultList->FindObject("Results"));
340 }
341 //check dynamic cast
342 if (resultList == nullptr)
343 {
344 std::cerr << "Warning: no result list found associated with '" << name << "'\n";
345 continue;
346 }
347
348
349 resultList->Add(newTObjArray("Status", new TObjString(StatusToStr(result.status_).c_str()), 1));
350
351 // iterate through the tags
352 std::map<std::string, double>::const_iterator iter = result.tags_.begin();
353 for (; iter != result.tags_.end(); ++iter)
354 {
355 std::ostringstream tagval;
356 tagval << std::setprecision(4) << iter->second;
357 resultList->Add(newTObjArray(iter->first.c_str(), new TObjString(tagval.str().c_str()), 1));
358 }
359
360 // if there's an output object from the algorithm, include a clone
361 TObject* resultobj = result.getObject();
362 if (resultobj != 0)
363 {
364 TObject* resultobjclone = resultobj->Clone();
365 if (setNameGeneral(resultobj, "ResultObject"))
366 {
367 resultList->Add(resultobjclone);
368 }
369 else
370 {
371 std::cerr << "Discarding result object " << result.getObject()->GetName() << std::endl;
372 delete resultobjclone;
373 }
374 }
375
376 if (m_config != 0)
377 {
378 TObject* ref = m_config->GetReference(parentName, parname);
379 if (ref)
380 {
381 if (setNameGeneral(ref, "Reference"))
382 {
383 resultList->Add(ref);
384 }
385 else
386 {
387 std::cerr << "Discarding reference object " << ref->GetName() << std::endl;
388 }
389 }
390 }
391 }
392 }
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 610 of file HanOutput.cxx.

611 {
612 m_retainUnpubData = true;
613
614 DQRegMap_t::const_iterator dqRegIter = m_dqRegs.begin();
615 DQRegMap_t::const_iterator dqRegEnd = m_dqRegs.end();
616 for (; dqRegIter != dqRegEnd; ++dqRegIter)
617 {
618 std::string regname = dqRegIter->first->getName();
619 m_unpublishedDQPars.erase(regname);
620 }
621
622 DQParSet_t::const_iterator regexItr = m_regexlist.begin();
623 DQParSet_t::const_iterator regexEnd = m_regexlist.end();
624 for (; regexItr != regexEnd; ++regexItr)
625 {
626 m_unpublishedDQPars.erase(*regexItr);
627 }
628
629 dqm_core::Result::Status status(dqm_core::Result::Undefined);
630 dqm_core::Result result(status);
631
632 DQParSet_t::const_iterator unpubIter = m_unpublishedDQPars.begin();
633 DQParSet_t::const_iterator unpubEnd = m_unpublishedDQPars.end();
634 for (; unpubIter != unpubEnd; ++unpubIter)
635 {
636 const std::string& name = *unpubIter;
637 // reduce verbosity
638 // std::cout << "--> Publishing missing object: \"" << name << "\"\n";
639 publishResult(name, result);
640 }
641
642 m_retainUnpubData = false;
643 }
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 604 of file HanOutput.cxx.

605 {
607 config->GetRegexList(m_regexlist);
608 }

◆ setInput()

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

Definition at line 396 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: