Rivet  1.8.0
Analysis.hh
00001 // -*- C++ -*-
00002 #ifndef RIVET_Analysis_HH
00003 #define RIVET_Analysis_HH
00004 
00005 #include "Rivet/Rivet.hh"
00006 #include "Rivet/Analysis.fhh"
00007 #include "Rivet/AnalysisInfo.hh"
00008 #include "Rivet/Event.hh"
00009 #include "Rivet/Projection.hh"
00010 #include "Rivet/ProjectionApplier.hh"
00011 #include "Rivet/ProjectionHandler.hh"
00012 #include "Rivet/Constraints.hh"
00013 #include "Rivet/AnalysisHandler.fhh"
00014 #include "Rivet/AnalysisLoader.hh"
00015 #include "Rivet/Tools/Logging.fhh"
00016 #include "Rivet/RivetAIDA.fhh"
00017 
00018 
00021 #define vetoEvent \
00022   do { MSG_DEBUG("Vetoing event on line " << __LINE__ << " of " << __FILE__); return; } while(0)
00023 
00026 #define DECLARE_RIVET_PLUGIN(clsname) Rivet::AnalysisBuilder<clsname> plugin_ ## clsname
00027 
00028 
00029 
00030 namespace Rivet {
00031 
00032 
00051   class Analysis : public ProjectionApplier {
00052 
00054     friend class AnalysisHandler;
00055 
00056 
00057   public:
00058 
00060 
00061 
00062     // /// The default constructor.
00063     // Analysis();
00064 
00066     Analysis(const std::string& name);
00067 
00069     virtual ~Analysis() {}
00070 
00072 
00073 
00074   public:
00075 
00077 
00078 
00082     virtual void init() { }
00083 
00088     virtual void analyze(const Event& event) = 0;
00089 
00095     virtual void finalize() { }
00096 
00098 
00099 
00100   public:
00101 
00105 
00106 
00108     const AnalysisInfo& info() const {
00109       assert(_info.get() != 0 && "No AnalysisInfo object :O");
00110       return *_info;
00111     }
00112 
00118     virtual std::string name() const {
00119       return (info().name().empty()) ? _defaultname : info().name();
00120     }
00121 
00123     virtual std::string inspireId() const {
00124       return info().inspireId();
00125     }
00126 
00128     virtual std::string spiresId() const {
00129       return info().spiresId();
00130     }
00131 
00136     virtual std::vector<std::string> authors() const {
00137       return info().authors();
00138     }
00139 
00145     virtual std::string summary() const {
00146       return info().summary();
00147     }
00148 
00155     virtual std::string description() const {
00156       return info().description();
00157     }
00158 
00164     virtual std::string runInfo() const {
00165       return info().runInfo();
00166     }
00167 
00169     virtual std::string experiment() const {
00170       return info().experiment();
00171     }
00172 
00174     virtual std::string collider() const {
00175       return info().collider();
00176     }
00177 
00179     virtual std::string year() const {
00180       return info().year();
00181     }
00182 
00184     virtual std::vector<std::string> references() const {
00185       return info().references();
00186     }
00187 
00189     virtual std::string bibKey() const {
00190       return info().bibKey();
00191     }
00192 
00194     virtual std::string bibTeX() const {
00195       return info().bibTeX();
00196     }
00197 
00199     virtual std::string status() const {
00200       return (info().status().empty()) ? "UNVALIDATED" : info().status();
00201     }
00202 
00204     virtual std::vector<std::string> todos() const {
00205       return info().todos();
00206     }
00207 
00208 
00210     virtual const std::vector<PdgIdPair>& requiredBeams() const {
00211       return info().beams();
00212     }
00214     virtual Analysis& setRequiredBeams(const std::vector<PdgIdPair>& requiredBeams) {
00215       info().setBeams(requiredBeams);
00216       return *this;
00217     }
00218 
00219 
00221     virtual const std::vector<std::pair<double, double> >& requiredEnergies() const {
00222       return info().energies();
00223     }
00225     virtual Analysis& setRequiredEnergies(const std::vector<std::pair<double, double> >& requiredEnergies) {
00226       info().setEnergies(requiredEnergies);
00227       return *this;
00228     }
00229 
00230 
00232     bool needsCrossSection() const {
00233       return info().needsCrossSection();
00234     }
00236     Analysis& setNeedsCrossSection(bool needed=true) {
00237       info().setNeedsCrossSection(needed);
00238       return *this;
00239     }
00240 
00242 
00243 
00245 
00246 
00248     AnalysisInfo& info() {
00249       assert(_info.get() != 0 && "No AnalysisInfo object :O");
00250       return *_info;
00251     }
00252 
00255     virtual Analysis& setBeams(PdgId beam1, PdgId beam2) {
00257       return setRequiredBeams(std::vector<PdgIdPair>(1, make_pair(beam1, beam2)));
00258     }
00259 
00261 
00262 
00264 
00265 
00267     const ParticlePair& beams() const;
00268 
00270     const PdgIdPair beamIds() const;
00271 
00273     double sqrtS() const;
00274 
00276 
00277 
00279 
00280 
00282     bool isCompatible(const ParticlePair& beams) const;
00283 
00285     bool isCompatible(PdgId beam1, PdgId beam2, double e1, double e2) const;
00286 
00288     bool isCompatible(const PdgIdPair& beams, const std::pair<double,double>& energies) const;
00289 
00291 
00292 
00293   public:
00294 
00296     AnalysisHandler& handler() const { return *_analysishandler; }
00297 
00305     void normalize(AIDA::IHistogram1D*& histo, double norm=1.0);
00306 
00312     void scale(AIDA::IHistogram1D*& histo, double scale);
00313 
00321     void normalize(AIDA::IHistogram2D*& histo, double norm=1.0);
00322 
00328     void scale(AIDA::IHistogram2D*& histo, double scale);
00329 
00331     Analysis& setCrossSection(double xs);
00332 
00333 
00334   protected:
00335 
00337     Log& getLog() const;
00338 
00340     double crossSection() const;
00341 
00344     double crossSectionPerEvent() const;
00345 
00348     size_t numEvents() const;
00349 
00352     double sumOfWeights() const;
00353 
00354 
00355   protected:
00356 
00358 
00359 
00360     AIDA::IAnalysisFactory& analysisFactory();
00361 
00363     AIDA::ITree& tree();
00364 
00366     AIDA::IHistogramFactory& histogramFactory();
00367 
00369     AIDA::IDataPointSetFactory& datapointsetFactory();
00370 
00372     const std::string histoDir() const;
00373 
00375     const std::string histoPath(const std::string& hname) const;
00376 
00378     const std::string histoPath(size_t datasetId, size_t xAxisId, size_t yAxisId) const;
00379 
00381     const std::string makeAxisCode(size_t datasetId, size_t xAxisId, size_t yAxisId) const;
00382 
00384 
00385 
00387 
00388 
00390     const BinEdges& binEdges(const std::string& hname) const;
00391 
00393     const BinEdges& binEdges(size_t datasetId, size_t xAxisId, size_t yAxisId) const;
00394 
00396     BinEdges logBinEdges(size_t nbins, double lower, double upper);
00397 
00402     AIDA::IHistogram1D* bookHistogram1D(const std::string& name,
00403                                         size_t nbins, double lower, double upper,
00404                                         const std::string& title="",
00405                                         const std::string& xtitle="", const std::string& ytitle="");
00406 
00411     AIDA::IHistogram1D* bookHistogram1D(const std::string& name,
00412                                         const std::vector<double>& binedges, const std::string& title="",
00413                                         const std::string& xtitle="", const std::string& ytitle="");
00414 
00422     AIDA::IHistogram2D*
00423     bookHistogram2D(const std::string& name,
00424                     size_t nxbins, double xlower, double xupper,
00425                     size_t nybins, double ylower, double yupper,
00426                     const std::string& title="", const std::string& xtitle="",
00427                     const std::string& ytitle="", const std::string& ztitle="");
00428 
00435     AIDA::IHistogram2D*
00436     bookHistogram2D(const std::string& name,
00437                     const std::vector<double>& xbinedges,
00438                     const std::vector<double>& ybinedges,
00439                     const std::string& title="", const std::string& xtitle="",
00440                     const std::string& ytitle="", const std::string& ztitle="");
00441 
00445     AIDA::IHistogram1D* bookHistogram1D(const std::string& name, const std::string& title="",
00446                                         const std::string& xtitle="", const std::string& ytitle="");
00447 
00451     AIDA::IHistogram1D* bookHistogram1D(size_t datasetId, size_t xAxisId, size_t yAxisId,
00452                                         const std::string& title="",
00453                                         const std::string& xtitle="", const std::string& ytitle="");
00454 
00456 
00457 
00459 
00460 
00465     AIDA::IProfile1D* bookProfile1D(const std::string& name,
00466                                     size_t nbins, double lower, double upper,
00467                                     const std::string& title="",
00468                                     const std::string& xtitle="", const std::string& ytitle="");
00469 
00474     AIDA::IProfile1D* bookProfile1D(const std::string& name,
00475                                     const std::vector<double>& binedges,
00476                                     const std::string& title="",
00477                                     const std::string& xtitle="", const std::string& ytitle="");
00478 
00482     AIDA::IProfile1D* bookProfile1D(const std::string& name, const std::string& title="",
00483                                     const std::string& xtitle="", const std::string& ytitle="");
00484 
00488     AIDA::IProfile1D* bookProfile1D(size_t datasetId, size_t xAxisId, size_t yAxisId,
00489                                     const std::string& title="",
00490                                     const std::string& xtitle="", const std::string& ytitle="");
00492 
00493 
00495 
00496 
00501     AIDA::IDataPointSet* bookDataPointSet(const std::string& name, const std::string& title="",
00502                                           const std::string& xtitle="", const std::string& ytitle="");
00503 
00504 
00509     AIDA::IDataPointSet* bookDataPointSet(const std::string& name,
00510                                           size_t npts, double lower, double upper,
00511                                           const std::string& title="",
00512                                           const std::string& xtitle="", const std::string& ytitle="");
00513 
00518     //AIDA::IDataPointSet* bookDataPointSet(const std::string& name, const std::string& title);
00519 
00523     AIDA::IDataPointSet* bookDataPointSet(size_t datasetId, size_t xAxisId, size_t yAxisId,
00524                                           const std::string& title="",
00525                                           const std::string& xtitle="", const std::string& ytitle="");
00526 
00528 
00529 
00530   private:
00531 
00533 
00534 
00536     void _makeHistoDir();
00537 
00539     void _cacheBinEdges() const;
00540 
00542     void _cacheXAxisData() const;
00543 
00545 
00546 
00547   protected:
00548 
00550     string _defaultname;
00551 
00553     shared_ptr<AnalysisInfo> _info;
00554 
00555 
00556   private:
00557 
00559 
00560     double _crossSection;
00561     bool _gotCrossSection;
00563 
00565     AnalysisHandler* _analysishandler;
00566 
00568     mutable bool _madeHistoDir;
00569 
00573     mutable map<string, vector<DPSXPoint> > _dpsData;
00574 
00578     mutable map<string, BinEdges> _histBinEdges;
00579 
00580 
00581   private:
00582 
00585     Analysis& operator=(const Analysis&);
00586 
00587   };
00588 
00589 
00590 }
00591 
00592 
00593 // Include definition of analysis plugin system so that analyses automatically see it when including Analysis.hh
00594 #include "Rivet/AnalysisBuilder.hh"
00595 
00596 
00597 #endif