Jpp 20.0.0-rc.6
the software that should make you happy
Loading...
Searching...
No Matches
JNuisance.hh
Go to the documentation of this file.
1#ifndef __JASTRONOMY__JNUISANCE__
2#define __JASTRONOMY__JNUISANCE__
3
4#include <string>
5#include <istream>
6#include <ostream>
7#include <iomanip>
8#include <memory>
9#include <map>
10
11#include "TRandom3.h"
12#include "TROOT.h"
13#include "TFile.h"
14#include "TH1D.h"
15#include "TF1.h"
16#include "TString.h"
17
18#include "JLang/JException.hh"
19
20
21/**
22 * \file
23 *
24 * Nuisance parameter.
25 * \author mdejong
26 */
27namespace JASTRONOMY {}
28namespace JPP { using namespace JASTRONOMY; }
29
30namespace JASTRONOMY {
31
35
36
37 /**
38 * Interface for nuisance parameter.
39 */
40 struct JNuisance
41 {
42 /**
43 * Central value.
44 */
45 static constexpr double FACTOR = 1.0;
46
47 /**
48 * Virtual destructor.
49 */
50 virtual ~JNuisance()
51 {}
52
53
54 /**
55 * Read nuisance from input stream.
56 *
57 * \param in input stream
58 * \return input stream
59 */
60 virtual std::istream& read(std::istream& in) = 0;
61
62
63 /**
64 * Write nuisance to output stream.
65 *
66 * \param out output stream
67 * \return output stream
68 */
69 virtual std::ostream& write(std::ostream& out) const = 0;
70
71
72 /**
73 * Get value.
74 *
75 * \return value
76 */
77 virtual double get() const = 0;
78
79
80 /**
81 * Read nuisance from input stream.
82 *
83 * \param in input stream
84 * \param nuisance nuisance
85 * \return input stream
86 */
87 friend inline std::istream& operator>>(std::istream& in, JNuisance& nuisance)
88 {
89 return nuisance.read(in);
90 }
91
92
93 /**
94 * Write nuisance to output stream.
95 *
96 * \param out output stream
97 * \param nuisance nuisance
98 * \return output stream
99 */
100 friend inline std::ostream& operator<<(std::ostream& out, const JNuisance& nuisance)
101 {
102 return nuisance.write(out);
103 }
104 };
105
106
107 /**
108 * Implementation of fixed nuisance.
109 */
111 public JNuisance
112 {
113 /**
114 * Read nuisance from input stream.
115 *
116 * \param in input stream
117 * \return input stream
118 */
119 virtual std::istream& read(std::istream& in) override
120 {
121 return in;
122 }
123
124
125 /**
126 * Write nuisance to output stream.
127 *
128 * \param out output stream
129 * \return output stream
130 */
131 virtual std::ostream& write(std::ostream& out) const override
132 {
133 return out;
134 }
135
136
137 /**
138 * Get value.
139 *
140 * \return value
141 */
142 double get() const override
143 {
144 return FACTOR;
145 }
146 };
147
148
149 /**
150 * Implementation of Gaussian nuisance.
151 */
153 public JNuisance
154 {
155 /**
156 * Read nuisance from input stream.
157 *
158 * \param in input stream
159 * \return input stream
160 */
161 virtual std::istream& read(std::istream& in) override
162 {
163 return in >> this->sigma;
164 }
165
166
167 /**
168 * Write nuisance to output stream.
169 *
170 * \param out output stream
171 * \return output stream
172 */
173 virtual std::ostream& write(std::ostream& out) const override
174 {
175 return out << this->sigma;
176 }
177
178
179 /**
180 * Get value.
181 *
182 * \return value
183 */
184 double get() const override
185 {
186 return gRandom->Gaus(FACTOR, sigma);
187 }
188
189
190 double sigma;
191 };
192
193
194 /**
195 * Implementation of nuisance based on a formula.
196 */
198 public JNuisance
199 {
200 /**
201 * Read nuisance from input stream.
202 *
203 * \param in input stream
204 * \return input stream
205 */
206 virtual std::istream& read(std::istream& in) override
207 {
208 TString buffer;
209
210 if (buffer.ReadLine(in)) {
211
212 f1.reset(new TF1("f1", buffer));
213
214 if (!f1->IsValid()) {
215 THROW(JParseError, "Invalid function " << buffer);
216 }
217 }
218
219 return in;
220 }
221
222
223 /**
224 * Write nuisance to output stream.
225 *
226 * \param out output stream
227 * \return output stream
228 */
229 virtual std::ostream& write(std::ostream& out) const override
230 {
231 if (f1)
232 return out << f1->GetExpFormula();
233 else
234 return out;
235 }
236
237
238 /**
239 * Get value.
240 *
241 * \return value
242 */
243 double get() const override
244 {
245 return f1->GetRandom(gRandom);
246 }
247
248
249 std::shared_ptr<TF1> f1;
250 };
251
252
253 /**
254 * Implementation of nuisance based on histogram.
255 */
257 public JNuisance
258 {
259 /**
260 * Virtual destructor.
261 */
263 {
264 if (in != NULL) {
265 in->Close();
266 }
267 }
268
269
270 /**
271 * Read nuisance from input stream.
272 *
273 * \param in input stream
274 * \return input stream
275 */
276 virtual std::istream& read(std::istream& in) override
277 {
278 in >> this->filename
279 >> this->histname;
280
281 load();
282
283 return in;
284 }
285
286
287 /**
288 * Write nuisance to output stream.
289 *
290 * \param out output stream
291 * \return output stream
292 */
293 virtual std::ostream& write(std::ostream& out) const override
294 {
295 return out << this->filename << ' '
296 << this->histname;
297 }
298
299
300 /**
301 * Get value.
302 *
303 * \return value
304 */
305 double get() const override
306 {
307 return h1->GetRandom(gRandom);
308 }
309
310
311 std::string filename;
312 std::string histname;
313
314 protected:
315 /**
316 * Load histogram from file.
317 */
318 void load()
319 {
320 in = TFile::Open(filename.c_str(), "exist");
321
322 if (in == NULL || !in->IsOpen()) {
323 THROW(JFileOpenException, "File: " << filename << " not opened.");
324 }
325
326 h1 = dynamic_cast<TH1D*>(in->Get(histname.c_str()));
327
328 if (h1 == NULL) {
329 THROW(JValueOutOfRange, "Histogram: " << histname << " not found.");
330 }
331 }
332
333 mutable TFile* in = NULL;
334 mutable TH1D* h1 = NULL;
335 };
336
337
338 /**
339 * Type definition of generic nuisance.
340 */
341 typedef std::shared_ptr<JNuisance> nuisance_type;
342
343
344 /**
345 * Helper for nuisance I/O.
346 */
347 struct JNuisance_t :
348 public nuisance_type
349 {
351
352 /**
353 * Default constructor.
354 */
356 nuisance_type(std::make_shared<JNuisanceFixed>()),
357 key("fixed")
358 {
359 dictionary[key] = static_cast<nuisance_type&>(*this);
360
361 dictionary["Gauss"] .reset(new JNuisanceGauss());
362 dictionary["Formula"] .reset(new JNuisanceTF1());
363 dictionary["Histogram"].reset(new JNuisanceTH1());
364 }
365
366
367 /**
368 * Get dictionary.
369 *
370 * \return dictionary
371 */
373 {
374 return dictionary;
375 }
376
377
378 /**
379 * Read nuisance from input stream.
380 *
381 * \param in input stream
382 * \param object nuisance
383 * \return input stream
384 */
385 friend inline std::istream& operator>>(std::istream& in, JNuisance_t& object)
386 {
387 using namespace std;
388
389 string key;
390
391 if (in >> key) {
392
393 if (object.dictionary.count(key)) {
394
395 static_cast<nuisance_type&>(object) = object.dictionary[key];
396
397 object.key = key;
398
399 object->read(in);
400
401 } else {
402
403 THROW(JParseError, "Invalid key " << key);
404 }
405 }
406
407 return in;
408 }
409
410
411 /**
412 * Write nuisance to output stream.
413 *
414 * \param out output stream
415 * \param object nuisance
416 * \return output stream
417 */
418 friend inline std::ostream& operator<<(std::ostream& out, const JNuisance_t& object)
419 {
420 out << object.key << ' ';
421
422 if (static_cast<const nuisance_type&>(object)) {
423 object->write(out);
424 }
425
426 return out;
427 }
428
429 protected:
430 std::string key;
432 };
433}
434
435#endif
Exceptions.
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message.
Exception for opening of file.
Exception for parsing value.
Exception for accessing a value in a collection that is outside of its range.
std::shared_ptr< JNuisance > nuisance_type
Type definition of generic nuisance.
Definition JNuisance.hh:341
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Implementation of fixed nuisance.
Definition JNuisance.hh:112
double get() const override
Get value.
Definition JNuisance.hh:142
virtual std::istream & read(std::istream &in) override
Read nuisance from input stream.
Definition JNuisance.hh:119
virtual std::ostream & write(std::ostream &out) const override
Write nuisance to output stream.
Definition JNuisance.hh:131
Implementation of Gaussian nuisance.
Definition JNuisance.hh:154
virtual std::istream & read(std::istream &in) override
Read nuisance from input stream.
Definition JNuisance.hh:161
double get() const override
Get value.
Definition JNuisance.hh:184
virtual std::ostream & write(std::ostream &out) const override
Write nuisance to output stream.
Definition JNuisance.hh:173
Implementation of nuisance based on a formula.
Definition JNuisance.hh:199
double get() const override
Get value.
Definition JNuisance.hh:243
std::shared_ptr< TF1 > f1
Definition JNuisance.hh:249
virtual std::ostream & write(std::ostream &out) const override
Write nuisance to output stream.
Definition JNuisance.hh:229
virtual std::istream & read(std::istream &in) override
Read nuisance from input stream.
Definition JNuisance.hh:206
Implementation of nuisance based on histogram.
Definition JNuisance.hh:258
virtual std::istream & read(std::istream &in) override
Read nuisance from input stream.
Definition JNuisance.hh:276
virtual ~JNuisanceTH1()
Virtual destructor.
Definition JNuisance.hh:262
virtual std::ostream & write(std::ostream &out) const override
Write nuisance to output stream.
Definition JNuisance.hh:293
void load()
Load histogram from file.
Definition JNuisance.hh:318
double get() const override
Get value.
Definition JNuisance.hh:305
Helper for nuisance I/O.
Definition JNuisance.hh:349
JNuisance_t()
Default constructor.
Definition JNuisance.hh:355
dictionary_type dictionary
Definition JNuisance.hh:431
std::map< std::string, nuisance_type > dictionary_type
Definition JNuisance.hh:350
friend std::ostream & operator<<(std::ostream &out, const JNuisance_t &object)
Write nuisance to output stream.
Definition JNuisance.hh:418
friend std::istream & operator>>(std::istream &in, JNuisance_t &object)
Read nuisance from input stream.
Definition JNuisance.hh:385
dictionary_type & getDictionary()
Get dictionary.
Definition JNuisance.hh:372
Interface for nuisance parameter.
Definition JNuisance.hh:41
friend std::istream & operator>>(std::istream &in, JNuisance &nuisance)
Read nuisance from input stream.
Definition JNuisance.hh:87
virtual double get() const =0
Get value.
virtual std::istream & read(std::istream &in)=0
Read nuisance from input stream.
virtual ~JNuisance()
Virtual destructor.
Definition JNuisance.hh:50
virtual std::ostream & write(std::ostream &out) const =0
Write nuisance to output stream.
friend std::ostream & operator<<(std::ostream &out, const JNuisance &nuisance)
Write nuisance to output stream.
Definition JNuisance.hh:100
static constexpr double FACTOR
Central value.
Definition JNuisance.hh:45