ATLAS Offline Software
Loading...
Searching...
No Matches
dqm_algorithms::MDTTDCSpectrum Class Reference

#include <MDTTDCSpectrum.h>

Inheritance diagram for dqm_algorithms::MDTTDCSpectrum:
Collaboration diagram for dqm_algorithms::MDTTDCSpectrum:

Public Member Functions

 MDTTDCSpectrum ()
virtual ~MDTTDCSpectrum ()
virtual dqm_core::Algorithm * clone ()
virtual dqm_core::Result * execute (const std::string &name, const TObject &object, const dqm_core::AlgorithmConfig &config)
virtual void printDescription (std::ostream &out)

Private Attributes

std::string m_name

Detailed Description

Definition at line 19 of file MDTTDCSpectrum.h.

Constructor & Destructor Documentation

◆ MDTTDCSpectrum()

dqm_algorithms::MDTTDCSpectrum::MDTTDCSpectrum ( )

Definition at line 38 of file MDTTDCSpectrum.cxx.

39 : m_name("MDTTDCspectrum")
40{
41 dqm_core::AlgorithmManager::instance().registerAlgorithm( m_name, this );
42}

◆ ~MDTTDCSpectrum()

dqm_algorithms::MDTTDCSpectrum::~MDTTDCSpectrum ( )
virtual

Definition at line 45 of file MDTTDCSpectrum.cxx.

46{
47}

Member Function Documentation

◆ clone()

dqm_core::Algorithm * dqm_algorithms::MDTTDCSpectrum::clone ( )
virtual

Definition at line 51 of file MDTTDCSpectrum.cxx.

52{
53 return new MDTTDCSpectrum(*this);
54}

◆ execute()

dqm_core::Result * dqm_algorithms::MDTTDCSpectrum::execute ( const std::string & name,
const TObject & object,
const dqm_core::AlgorithmConfig & config )
virtual

Definition at line 58 of file MDTTDCSpectrum.cxx.

59{
60 const TH1 * hist;
61 const TH1 * ref;
62
63 if( object.IsA()->InheritsFrom( "TH1" ) ) {
64 hist = static_cast<const TH1*>(&object);
65 if (hist->GetDimension() >= 2 ){
66 throw dqm_core::BadConfig( ERS_HERE, name, "dimension >= 2 " );
67 }
68 } else {
69 throw dqm_core::BadConfig( ERS_HERE, name, "does not inherit from TH1" );
70 }
71
72 //Get Parameters and Thresholds
73 double minstat;
74 double chi2;
75 double greenTh;
76 double redTh;
77 double max_shift;
78 try {
79 minstat = dqm_algorithms::tools::GetFirstFromMap("MinStat", config.getParameters(), -1);
80 chi2 = dqm_algorithms::tools::GetFirstFromMap("chi2", config.getParameters(), -1);
81 max_shift = dqm_algorithms::tools::GetFirstFromMap("max_shift", config.getParameters(), 999999);
82 redTh = dqm_algorithms::tools::GetFromMap( "Limits", config.getRedThresholds());
83 greenTh = dqm_algorithms::tools::GetFromMap( "Limits", config.getGreenThresholds() );
84 }
85 catch ( dqm_core::Exception & ex ) {
86 throw dqm_core::BadConfig( ERS_HERE, name, ex.what(), ex );
87 }
88
89 //Get Reference Histo
90
91 try {
92 ref = static_cast<const TH1*>( config.getReference() );
93 }
94 catch ( dqm_core::Exception & ex ) {
95 throw dqm_core::BadRefHist(ERS_HERE,name," Could not retreive reference");
96 }
97 if (hist->GetDimension() != ref->GetDimension() ) {
98 throw dqm_core::BadRefHist( ERS_HERE, name, "Reference VS histo: Different dimension!" );
99 }
100
101 //Check of statistics
102 if (hist->GetEntries() < minstat ) {
103 ERS_INFO("Histogram does not satisfy MinStat requirement " <<hist->GetName());
104 dqm_core::Result *result = new dqm_core::Result(dqm_core::Result::Undefined);
105 result->tags_["InsufficientEntries"] = hist->GetEntries();
106 return result;
107 }
108 ERS_DEBUG(1,"Statistics: "<< hist->GetEntries()<< " entries ");
109
110
111 //Algo
112 Double_t chi2_per_NDF=999999999;
113
114 TF1* fit_ref = (TF1*) ref->GetFunction("TimeSpectrum");
115 TF1* fit_hist= (TF1*) hist->GetFunction("TimeSpectrum");
116
117 if(fit_ref == 0){
118 ERS_INFO("Missing reference fit for "<<hist->GetName());
119 dqm_core::Result* result = new dqm_core::Result();
120 result->tags_["Fit_parameter_NOT_found"] = -999.;
121 result->status_ = dqm_core::Result::Undefined;
122 return result;
123 };
124 if(fit_hist == 0){
125 ERS_INFO("Missing fit for "<<hist->GetName());
126 dqm_core::Result* result = new dqm_core::Result();
127 result->tags_["Fit_parameter_NOT_found"] = -999.;
128 result->status_ = dqm_core::Result::Undefined;
129 return result;
130 };
131
132 if(fit_hist->GetNDF() !=0) chi2_per_NDF = (fit_hist->GetChisquare())/(fit_hist->GetNDF());
133
134 //Check of chi2
135 if (chi2_per_NDF > chi2 && chi2>0) {
136 ERS_INFO("Histogram does not satisfy chi_square/NDF requirement: " <<hist->GetName());
137 dqm_core::Result* result = new dqm_core::Result();
138 result->tags_["Chi2_over_threshold"] = chi2_per_NDF;
139 result->status_ = dqm_core::Result::Undefined;
140 return result;
141 }
142
143 if(fit_hist->GetNDF() == 0){
144 ERS_INFO("NDF not available for histogram " <<hist->GetName());
145 dqm_core::Result* result = new dqm_core::Result();
146 result->tags_["Fit_parameter_NDF"] = 0;
147 result->status_ = dqm_core::Result::Undefined;
148 return result;
149 };
150
151 Double_t t0_ref=0;
152 Double_t t0_err_ref=0;
153 Double_t tmax_ref=0;
154 Double_t tmax_err_ref=0;
155
156 if(fit_ref !=0) t0_ref = ((fit_ref->GetParameter(4))*0.78125);
157 if(fit_ref !=0) t0_err_ref = ((fit_ref->GetParError(4))*0.78125);
158 if(fit_ref !=0) tmax_ref = ((fit_ref->GetParameter(5))*0.78125);
159 if(fit_ref !=0) tmax_err_ref = ((fit_ref->GetParError(5))*0.78125);
160 //Lower limit for t0_err_ref and tmax_err_ref
161 if (t0_err_ref<1.) {
162 t0_err_ref =1.;
163 }
164 if (tmax_err_ref<2.) {
165 tmax_err_ref =2.;
166 }
167
168 Double_t t0=-99999.;
169 Double_t t0_err=0;
170 Double_t tmax=0;
171 Double_t tmax_err=0;
172
173 if(fit_hist !=0) t0 = ((fit_hist->GetParameter(4))*0.78125);
174 if(fit_hist !=0) t0_err = ((fit_hist->GetParError(4))*0.78125);
175 if(fit_hist !=0) tmax = ((fit_hist->GetParameter(5))*0.78125);
176 if(fit_hist !=0) tmax_err = ((fit_hist->GetParError(5))*0.78125);
177 //Lower limit for t0_err and tmax_err
178 if (t0_err<1.) {
179 t0_err =1.;
180 }
181 if (tmax_err<2.) {
182 tmax_err =2.;
183 }
184
185 Double_t Dt0=std::abs(t0-t0_ref);
186 Double_t Dtd=std::abs(tmax-t0-tmax_ref+t0_ref);
187
188 Double_t sigma_Dt0=sqrt(t0_err*t0_err+t0_err_ref*t0_err_ref);
189 Double_t sigma_Dtmax=sqrt(tmax_err*tmax_err+tmax_err_ref*tmax_err_ref);
190 Double_t sigma_Dtd= sqrt(tmax_err*tmax_err+t0_err*t0_err+tmax_err_ref*tmax_err_ref+t0_err_ref*t0_err_ref);
191
192 if( sigma_Dt0 ==0 || sigma_Dtmax==0 ){
193 ERS_DEBUG(1,"ERROR: fit parameter errors not found!");
194 dqm_core::Result* result = new dqm_core::Result();
195 result->tags_["Fit_parameter_NOT_found"] = -999.;
196 result->status_ = dqm_core::Result::Undefined;
197 return result;
198 };
199
200
201 //Result
202
203 dqm_core::Result* result = new dqm_core::Result();
204 result->tags_["01-t0(ns)"] = t0;
205
206 result->tags_["02-sigma_t0(ns)"] = t0_err;
207 result->tags_["03-t_drift(ns)"] = (tmax-t0);
208 result->tags_["04-sigma_t_drift(ns)"] = sqrt(tmax_err*tmax_err+t0_err*t0_err);
209
210 int flag_count=0;
211
212 if( Dtd*0.78125>max_shift ){
213 flag_count+=1000;
214 result->tags_["05-ERROR_(td-td_Ref)"] = Dtd;
215 };
216
217 if(Dt0>redTh*sigma_Dt0){
218 flag_count+=3;
219 result->tags_["07-ERROR_(t0-t0_Ref)"] = Dt0;
220 result->tags_["08-ERROR_sigma(t0-t0_Ref)"] = sigma_Dt0;
221 }else if(Dt0>greenTh*sigma_Dt0){
222 flag_count+=1;
223 result->tags_["07-ERROR_(t0-t0_Ref)"] = Dt0;
224 result->tags_["08-ERROR_sigma(t0-t0_Ref)"] = sigma_Dt0;
225 };
226
227
228 if(Dtd>redTh*sigma_Dtd){
229 flag_count+=3;
230 result->tags_["05-ERROR_(td-td_Ref)"] = Dtd;
231 result->tags_["06-ERROR_sigma(td-td_Ref)"] = sigma_Dtd;
232 } else if(Dtd>greenTh*sigma_Dtd){
233 flag_count+=1;
234 result->tags_["05-ERROR_(td-td_Ref)"] = Dtd;
235 result->tags_["06-ERROR_sigma(td-td_Ref)"] = sigma_Dtd;
236 };
237
238
239 if (flag_count>2) {
240 result->status_ = dqm_core::Result::Red;
241 ERS_DEBUG(1,"Red");
242 } else if (flag_count>=1 && flag_count<=2) {
243 result->status_ = dqm_core::Result::Yellow;
244 ERS_DEBUG(1,"Yellow");
245 } else if (flag_count<1) {
246 result->status_ = dqm_core::Result::Green;
247 ERS_DEBUG(1,"Green");
248 }
249 return result;
250}
const boost::regex ref(r_ef)
static Double_t t0
double chi2(TH1 *h0, TH1 *h1)
double GetFirstFromMap(const std::string &paramName, const std::map< std::string, double > &params)
const T & GetFromMap(const std::string &pname, const std::map< std::string, T > &params)
#define IsA
Declare the TObject style functions.

◆ printDescription()

void dqm_algorithms::MDTTDCSpectrum::printDescription ( std::ostream & out)
virtual

Definition at line 254 of file MDTTDCSpectrum.cxx.

255{
256 std::string message;
257 message += "\n";
258 message += "Algorithm: \"" + m_name + "\"\n";
259 message += "Description: Check if the histogram t0 tmax and t_drift are compatible with the reference\n";
260 message += "Mandatory Parameters: Green/Red Threshold: Limits: warning: number of standard deviation from mean\n";
261 message += " error\n";
262 message += "Optional Parameters: MinStat = Minimum histogram statistics needed to perform Algorithm\n";
263 message += " chi2 = chi square limit for histogram fit\n";
264 message += " max_shift = maximum difference between t_drif of the histograns and reference\n";
265 message += "\n";
266
267 out << message;
268}

Member Data Documentation

◆ m_name

std::string dqm_algorithms::MDTTDCSpectrum::m_name
private

Definition at line 32 of file MDTTDCSpectrum.h.


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