Rivet  1.8.0
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);
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 
396  BinEdges logBinEdges(size_t nbins, double lower, double upper);
397 
402  AIDA::IHistogram1D* bookHistogram1D(const std::string& name,
403  size_t nbins, double lower, double upper,
404  const std::string& title="",
405  const std::string& xtitle="", const std::string& ytitle="");
406 
411  AIDA::IHistogram1D* bookHistogram1D(const std::string& name,
412  const std::vector<double>& binedges, const std::string& title="",
413  const std::string& xtitle="", const std::string& ytitle="");
414 
422  AIDA::IHistogram2D*
423  bookHistogram2D(const std::string& name,
424  size_t nxbins, double xlower, double xupper,
425  size_t nybins, double ylower, double yupper,
426  const std::string& title="", const std::string& xtitle="",
427  const std::string& ytitle="", const std::string& ztitle="");
428 
435  AIDA::IHistogram2D*
436  bookHistogram2D(const std::string& name,
437  const std::vector<double>& xbinedges,
438  const std::vector<double>& ybinedges,
439  const std::string& title="", const std::string& xtitle="",
440  const std::string& ytitle="", const std::string& ztitle="");
441 
445  AIDA::IHistogram1D* bookHistogram1D(const std::string& name, const std::string& title="",
446  const std::string& xtitle="", const std::string& ytitle="");
447 
451  AIDA::IHistogram1D* bookHistogram1D(size_t datasetId, size_t xAxisId, size_t yAxisId,
452  const std::string& title="",
453  const std::string& xtitle="", const std::string& ytitle="");
454 
456 
457 
459 
460 
465  AIDA::IProfile1D* bookProfile1D(const std::string& name,
466  size_t nbins, double lower, double upper,
467  const std::string& title="",
468  const std::string& xtitle="", const std::string& ytitle="");
469 
474  AIDA::IProfile1D* bookProfile1D(const std::string& name,
475  const std::vector<double>& binedges,
476  const std::string& title="",
477  const std::string& xtitle="", const std::string& ytitle="");
478 
482  AIDA::IProfile1D* bookProfile1D(const std::string& name, const std::string& title="",
483  const std::string& xtitle="", const std::string& ytitle="");
484 
488  AIDA::IProfile1D* bookProfile1D(size_t datasetId, size_t xAxisId, size_t yAxisId,
489  const std::string& title="",
490  const std::string& xtitle="", const std::string& ytitle="");
492 
493 
495 
496 
501  AIDA::IDataPointSet* bookDataPointSet(const std::string& name, const std::string& title="",
502  const std::string& xtitle="", const std::string& ytitle="");
503 
504 
509  AIDA::IDataPointSet* bookDataPointSet(const std::string& name,
510  size_t npts, double lower, double upper,
511  const std::string& title="",
512  const std::string& xtitle="", const std::string& ytitle="");
513 
518  //AIDA::IDataPointSet* bookDataPointSet(const std::string& name, const std::string& title);
519 
523  AIDA::IDataPointSet* bookDataPointSet(size_t datasetId, size_t xAxisId, size_t yAxisId,
524  const std::string& title="",
525  const std::string& xtitle="", const std::string& ytitle="");
526 
528 
529 
530  private:
531 
533 
534 
536  void _makeHistoDir();
537 
539  void _cacheBinEdges() const;
540 
542  void _cacheXAxisData() const;
543 
545 
546 
547  protected:
548 
550  string _defaultname;
551 
553  shared_ptr<AnalysisInfo> _info;
554 
555 
556  private:
557 
559 
560  double _crossSection;
561  bool _gotCrossSection;
563 
565  AnalysisHandler* _analysishandler;
566 
568  mutable bool _madeHistoDir;
569 
573  mutable map<string, vector<DPSXPoint> > _dpsData;
574 
578  mutable map<string, BinEdges> _histBinEdges;
579 
580 
581  private:
582 
585  Analysis& operator=(const Analysis&);
586 
587  };
588 
589 
590 }
591 
592 
593 // Include definition of analysis plugin system so that analyses automatically see it when including Analysis.hh
594 #include "Rivet/AnalysisBuilder.hh"
595 
596 
597 #endif