Rivet  1.8.3
Analysis.hh
1 // -*- C++ -*-
2 #ifndef RIVET_Analysis_HH
3 #define RIVET_Analysis_HH
4 
5 #include "Rivet/Rivet.hh"
6 #include "Rivet/Analysis.fhh"
7 #include "Rivet/AnalysisInfo.hh"
8 #include "Rivet/Event.hh"
9 #include "Rivet/Projection.hh"
10 #include "Rivet/ProjectionApplier.hh"
11 #include "Rivet/ProjectionHandler.hh"
12 #include "Rivet/Constraints.hh"
13 #include "Rivet/AnalysisHandler.fhh"
14 #include "Rivet/AnalysisLoader.hh"
15 #include "Rivet/Tools/Logging.fhh"
16 #include "Rivet/RivetAIDA.fhh"
17 
18 
21 #define vetoEvent \
22  do { MSG_DEBUG("Vetoing event on line " << __LINE__ << " of " << __FILE__); return; } while(0)
23 
26 #define DECLARE_RIVET_PLUGIN(clsname) Rivet::AnalysisBuilder<clsname> plugin_ ## clsname
27 
28 
29 
30 namespace Rivet {
31 
32 
51  class Analysis : public ProjectionApplier {
52 
54  friend class AnalysisHandler;
55 
56 
57  public:
58 
60 
61 
62  // /// The default constructor.
63  // Analysis();
64 
66  Analysis(const std::string& name);
67 
69  virtual ~Analysis() {}
70 
72 
73 
74  public:
75 
77 
78 
82  virtual void init() { }
83 
88  virtual void analyze(const Event& event) = 0;
89 
95  virtual void finalize() { }
96 
98 
99 
100  public:
101 
105 
106 
108  const AnalysisInfo& info() const {
109  assert(_info.get() != 0 && "No AnalysisInfo object :O");
110  return *_info;
111  }
112 
118  virtual std::string name() const {
119  return (info().name().empty()) ? _defaultname : info().name();
120  }
121 
123  virtual std::string inspireId() const {
124  return info().inspireId();
125  }
126 
128  virtual std::string spiresId() const {
129  return info().spiresId();
130  }
131 
136  virtual std::vector<std::string> authors() const {
137  return info().authors();
138  }
139 
145  virtual std::string summary() const {
146  return info().summary();
147  }
148 
155  virtual std::string description() const {
156  return info().description();
157  }
158 
164  virtual std::string runInfo() const {
165  return info().runInfo();
166  }
167 
169  virtual std::string experiment() const {
170  return info().experiment();
171  }
172 
174  virtual std::string collider() const {
175  return info().collider();
176  }
177 
179  virtual std::string year() const {
180  return info().year();
181  }
182 
184  virtual std::vector<std::string> references() const {
185  return info().references();
186  }
187 
189  virtual std::string bibKey() const {
190  return info().bibKey();
191  }
192 
194  virtual std::string bibTeX() const {
195  return info().bibTeX();
196  }
197 
199  virtual std::string status() const {
200  return (info().status().empty()) ? "UNVALIDATED" : info().status();
201  }
202 
204  virtual std::vector<std::string> todos() const {
205  return info().todos();
206  }
207 
208 
210  virtual const std::vector<PdgIdPair>& requiredBeams() const {
211  return info().beams();
212  }
214  virtual Analysis& setRequiredBeams(const std::vector<PdgIdPair>& requiredBeams) {
215  info().setBeams(requiredBeams);
216  return *this;
217  }
218 
219 
221  virtual const std::vector<std::pair<double, double> >& requiredEnergies() const {
222  return info().energies();
223  }
225  virtual Analysis& setRequiredEnergies(const std::vector<std::pair<double, double> >& requiredEnergies) {
227  return *this;
228  }
229 
230 
232  bool needsCrossSection() const {
233  return info().needsCrossSection();
234  }
236  Analysis& setNeedsCrossSection(bool needed=true) {
237  info().setNeedsCrossSection(needed);
238  return *this;
239  }
240 
242 
243 
245 
246 
249  assert(_info.get() != 0 && "No AnalysisInfo object :O");
250  return *_info;
251  }
252 
255  virtual Analysis& setBeams(PdgId beam1, PdgId beam2) {
257  return setRequiredBeams(std::vector<PdgIdPair>(1, make_pair(beam1, beam2)));
258  }
259 
261 
262 
264 
265 
267  const ParticlePair& beams() const;
268 
270  const PdgIdPair beamIds() const;
271 
273  double sqrtS() const;
274 
276 
277 
279 
280 
282  bool isCompatible(const ParticlePair& beams) const;
283 
285  bool isCompatible(PdgId beam1, PdgId beam2, double e1, double e2) const;
286 
288  bool isCompatible(const PdgIdPair& beams, const std::pair<double,double>& energies) const;
289 
291 
292 
293  public:
294 
296  AnalysisHandler& handler() const { return *_analysishandler; }
297 
305  void normalize(AIDA::IHistogram1D*& histo, double norm=1.0, bool includeoverflows=true);
306 
312  void scale(AIDA::IHistogram1D*& histo, double scale);
313 
321  void normalize(AIDA::IHistogram2D*& histo, double norm=1.0);
322 
328  void scale(AIDA::IHistogram2D*& histo, double scale);
329 
331  Analysis& setCrossSection(double xs);
332 
333 
334  protected:
335 
337  Log& getLog() const;
338 
340  double crossSection() const;
341 
344  double crossSectionPerEvent() const;
345 
348  size_t numEvents() const;
349 
352  double sumOfWeights() const;
353 
354 
355  protected:
356 
358 
359 
360  AIDA::IAnalysisFactory& analysisFactory();
361 
363  AIDA::ITree& tree();
364 
366  AIDA::IHistogramFactory& histogramFactory();
367 
369  AIDA::IDataPointSetFactory& datapointsetFactory();
370 
372  const std::string histoDir() const;
373 
375  const std::string histoPath(const std::string& hname) const;
376 
378  const std::string histoPath(size_t datasetId, size_t xAxisId, size_t yAxisId) const;
379 
381  const std::string makeAxisCode(size_t datasetId, size_t xAxisId, size_t yAxisId) const;
382 
384 
385 
387 
388 
390  const BinEdges& binEdges(const std::string& hname) const;
391 
393  const BinEdges& binEdges(size_t datasetId, size_t xAxisId, size_t yAxisId) const;
394 
398  BinEdges logBinEdges(size_t nbins, double lower, double upper);
399 
404  AIDA::IHistogram1D* bookHistogram1D(const std::string& name,
405  size_t nbins, double lower, double upper,
406  const std::string& title="",
407  const std::string& xtitle="", const std::string& ytitle="");
408 
413  AIDA::IHistogram1D* bookHistogram1D(const std::string& name,
414  const std::vector<double>& binedges, const std::string& title="",
415  const std::string& xtitle="", const std::string& ytitle="");
416 
424  AIDA::IHistogram2D*
425  bookHistogram2D(const std::string& name,
426  size_t nxbins, double xlower, double xupper,
427  size_t nybins, double ylower, double yupper,
428  const std::string& title="", const std::string& xtitle="",
429  const std::string& ytitle="", const std::string& ztitle="");
430 
437  AIDA::IHistogram2D*
438  bookHistogram2D(const std::string& name,
439  const std::vector<double>& xbinedges,
440  const std::vector<double>& ybinedges,
441  const std::string& title="", const std::string& xtitle="",
442  const std::string& ytitle="", const std::string& ztitle="");
443 
447  AIDA::IHistogram1D* bookHistogram1D(const std::string& name, const std::string& title="",
448  const std::string& xtitle="", const std::string& ytitle="");
449 
453  AIDA::IHistogram1D* bookHistogram1D(size_t datasetId, size_t xAxisId, size_t yAxisId,
454  const std::string& title="",
455  const std::string& xtitle="", const std::string& ytitle="");
456 
458 
459 
461 
462 
467  AIDA::IProfile1D* bookProfile1D(const std::string& name,
468  size_t nbins, double lower, double upper,
469  const std::string& title="",
470  const std::string& xtitle="", const std::string& ytitle="");
471 
476  AIDA::IProfile1D* bookProfile1D(const std::string& name,
477  const std::vector<double>& binedges,
478  const std::string& title="",
479  const std::string& xtitle="", const std::string& ytitle="");
480 
484  AIDA::IProfile1D* bookProfile1D(const std::string& name, const std::string& title="",
485  const std::string& xtitle="", const std::string& ytitle="");
486 
490  AIDA::IProfile1D* bookProfile1D(size_t datasetId, size_t xAxisId, size_t yAxisId,
491  const std::string& title="",
492  const std::string& xtitle="", const std::string& ytitle="");
494 
495 
497 
498 
503  AIDA::IDataPointSet* bookDataPointSet(const std::string& name, const std::string& title="",
504  const std::string& xtitle="", const std::string& ytitle="");
505 
506 
511  AIDA::IDataPointSet* bookDataPointSet(const std::string& name,
512  size_t npts, double lower, double upper,
513  const std::string& title="",
514  const std::string& xtitle="", const std::string& ytitle="");
515 
520  //AIDA::IDataPointSet* bookDataPointSet(const std::string& name, const std::string& title);
521 
525  AIDA::IDataPointSet* bookDataPointSet(size_t datasetId, size_t xAxisId, size_t yAxisId,
526  const std::string& title="",
527  const std::string& xtitle="", const std::string& ytitle="");
528 
530 
531 
532  private:
533 
535 
536 
538  void _makeHistoDir();
539 
541  void _cacheBinEdges() const;
542 
544  void _cacheXAxisData() const;
545 
547 
548 
549  protected:
550 
552  string _defaultname;
553 
555  shared_ptr<AnalysisInfo> _info;
556 
557 
558  private:
559 
561 
562  double _crossSection;
563  bool _gotCrossSection;
565 
567  AnalysisHandler* _analysishandler;
568 
570  mutable bool _madeHistoDir;
571 
575  mutable map<string, vector<DPSXPoint> > _dpsData;
576 
580  mutable map<string, BinEdges> _histBinEdges;
581 
582 
583  private:
584 
587  Analysis& operator=(const Analysis&);
588 
589  };
590 
591 
592 }
593 
594 
595 // Include definition of analysis plugin system so that analyses automatically see it when including Analysis.hh
596 #include "Rivet/AnalysisBuilder.hh"
597 
598 
599 #endif