ATLAS Offline Software
Loading...
Searching...
No Matches
AddReference.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3*/
4
8
11#include <TH1.h>
12#include <TClass.h>
13#include <TObjArray.h>
14#include <dqm_core/AlgorithmManager.h>
15
16namespace {
17 static dqm_algorithms::AddReference AllBins_Filled("All_Bins_Filled");
18 static dqm_algorithms::AddReference BinsDiffFromAvg("Bins_Diff_FromAvg");
19 static dqm_algorithms::AddReference b1("Bins_GreaterThan_Threshold");
20 static dqm_algorithms::AddReference b2("Bins_GreaterThanEqual_Threshold");
21 static dqm_algorithms::AddReference b3("Bins_LessThan_Threshold");
22 static dqm_algorithms::AddReference b4("Bins_LessThanEqual_Threshold");
23 static dqm_algorithms::AddReference b5("Bins_Equal_Threshold");
24 static dqm_algorithms::AddReference b6("Bins_NotEqual_Threshold");
25 static dqm_algorithms::AddReference b7("BinContentComp");
26}
27
28dqm_algorithms::AddReference::AddReference(const std::string& name ) : m_name(name)
29{
30 dqm_core::AlgorithmManager::instance().registerAlgorithm("AddReference_"+name,this);
31}
32
38
39dqm_core::Result*
40dqm_algorithms::AddReference::execute(const std::string& name, const TObject& object, const dqm_core::AlgorithmConfig& config)
41{
42 TH1 * histogram;
43
44 if( object.IsA()->InheritsFrom( "TH1" ) ) {
45 histogram = (TH1*)(object.Clone());
46 } else {
47 throw dqm_core::BadConfig( ERS_HERE, name, "does not inherit from TH1" );
48 }
49
50 const double minstat = dqm_algorithms::tools::GetFirstFromMap( "MinStat", config.getParameters(), -1);
51
52 if (histogram->GetEffectiveEntries() < minstat ) {
53 dqm_core::Result *result = new dqm_core::Result(dqm_core::Result::Undefined);
54 result->tags_["InsufficientEffectiveEntries"] = histogram->GetEffectiveEntries();
55 delete histogram;
56 return result;
57 }
58
59 double coeff = dqm_algorithms::tools::GetFirstFromMap("Coeff",config.getParameters(), 1);
60
61 TObject* ro = config.getReference();
62 const TObject* firstReference = 0;
63 TObject* secondReference= 0;
64 try {
65 dqm_algorithms::tools::handleReference( *ro , firstReference , secondReference );
66 }
67 catch ( dqm_core::Exception& ex ) {
68 throw dqm_core::BadRefHist(ERS_HERE,name," Could not retreive reference");
69 }
70
71 const TH1* refhist = dynamic_cast<const TH1*>(firstReference);
72 if ( refhist == 0 )
73 {
74 throw dqm_core::BadRefHist(ERS_HERE,name," Could not retreive reference");
75 }
76
77if ((histogram->GetDimension() != refhist->GetDimension()) ||
78 (histogram->GetNbinsX() != refhist->GetNbinsX()) ||
79 (histogram->GetNbinsY() != refhist->GetNbinsY()) ||
80 refhist->GetNbinsZ() != histogram->GetNbinsZ() ) {
81 throw dqm_core::BadRefHist( ERS_HERE, "number of bins", name );
82 }
83 ERS_DEBUG(2,"Doing: histogram + ("<<coeff<<")*reference");
84 histogram->Add( refhist , coeff );
85
86 //Now prepare to run the real algorithm...
87 ERS_DEBUG(2,"Running algorithm: "<<m_name);
88 dqm_core::Algorithm* subalgorithm;
89 try {
90 subalgorithm = dqm_core::AlgorithmManager::instance().getAlgorithm( m_name );
91 }
92 catch ( dqm_core::AlgorithmNotFound& ex )
93 {
94 ERS_DEBUG(2,"Cannot find algorithm:"+m_name);
95 throw dqm_core::BadConfig(ERS_HERE,name,"Cannot Find sub-algorithm:"+m_name);
96 }
97 dqm_core::Result* result = subalgorithm->execute( name , *histogram , config);
98 ERS_DEBUG(2,"Sub algorithm returns:"<<*result);
99 //Add modified histogram to result
100 TObject* robject = result->getObject();
101 if ( !robject ) //No object defined, add this
102 {
103 ERS_DEBUG(2,"Adding modified histogram in result");
104 result->object_.reset(histogram);
105 }
106 else //Transform the object_ in TObjArray (if needed) and add this result
107 {
108 ERS_DEBUG(2,"Result already have an associated TObject, appending modified histogram");
109 if ( robject->IsA()->InheritsFrom("TObjArray") ) //It is already an array add it...
110 {
111 static_cast<TObjArray*>(robject)->Add( histogram );
112 //Check in again
113 result->object_.reset( robject );
114 }
115 else
116 {
117 TObjArray* array = new TObjArray( 2 );
118 array->AddAt( robject , 0 );
119 array->AddAt( histogram , 1 );
120 //Check in again
121 result->object_.reset( array );
122 }
123 ERS_DEBUG(2,"Result now have a TObjArray of size:"<<static_cast<TObjArray*>(result->getObject())->GetEntries());
124 }
125 return result;
126}
127
128
130 out<<"AddReference_"+m_name+" : Performst the "+m_name+" algorithm after adding to the input histogram the reference. I.e. performing: histogram += c*Reference. Adds to the output TObject list the modified input histogram."<<std::endl;
131 out<<"Optional Parameter : MinStat : Minimum histogram statistics needed to perform Algorithm"<<std::endl;
132 out<<"Optional Parameter : Coeff : The multiplication coefficient c, for reference. Default c=+1"<<std::endl;
133
134}
file declares the dqm_algorithms::AddReference class.
std::string histogram
Definition chains.cxx:52
double GetFirstFromMap(const std::string &paramName, const std::map< std::string, double > &params)
void handleReference(const TObject &inputReference, const TObject *&firstReference, TObject *&secondReference)
Helper function used to handle complex reference histograms This function gets as input a reference o...
dqm_core::Result * execute(const std::string &, const TObject &, const dqm_core::AlgorithmConfig &)
void printDescription(std::ostream &out)
AddReference(const std::string &name)
#define IsA
Declare the TObject style functions.