Analysis.hh
Go to the documentation of this file.
00001 // -*- C++ -*- 00002 #ifndef RIVET_Analysis_HH 00003 #define RIVET_Analysis_HH 00004 00005 #include "Rivet/Config/RivetCommon.hh" 00006 #include "Rivet/AnalysisInfo.hh" 00007 #include "Rivet/Event.hh" 00008 #include "Rivet/Projection.hh" 00009 #include "Rivet/ProjectionApplier.hh" 00010 #include "Rivet/ProjectionHandler.hh" 00011 #include "Rivet/AnalysisLoader.hh" 00012 #include "Rivet/Tools/RivetYODA.hh" 00013 #include "Rivet/Tools/Logging.hh" 00014 #include "Rivet/Tools/ParticleUtils.hh" 00015 00016 00017 /// @def vetoEvent 00018 /// Preprocessor define for vetoing events, including the log message and return. 00019 #define vetoEvent \ 00020 do { MSG_DEBUG("Vetoing event on line " << __LINE__ << " of " << __FILE__); return; } while(0) 00021 00022 00023 namespace Rivet { 00024 00025 00026 // Forward declaration 00027 class AnalysisHandler; 00028 00029 /// @brief This is the base class of all analysis classes in Rivet. 00030 /// 00031 /// There are 00032 /// three virtual functions which should be implemented in base classes: 00033 /// 00034 /// void init() is called by Rivet before a run is started. Here the 00035 /// analysis class should book necessary histograms. The needed 00036 /// projections should probably rather be constructed in the 00037 /// constructor. 00038 /// 00039 /// void analyze(const Event&) is called once for each event. Here the 00040 /// analysis class should apply the necessary Projections and fill the 00041 /// histograms. 00042 /// 00043 /// void finalize() is called after a run is finished. Here the analysis 00044 /// class should do whatever manipulations are necessary on the 00045 /// histograms. Writing the histograms to a file is, however, done by 00046 /// the Rivet class. 00047 class Analysis : public ProjectionApplier { 00048 00049 /// The AnalysisHandler is a friend. 00050 friend class AnalysisHandler; 00051 00052 00053 public: 00054 00055 /// @name Standard constructors and destructors. 00056 //@{ 00057 00058 // /// The default constructor. 00059 // Analysis(); 00060 00061 /// Constructor 00062 Analysis(const std::string& name); 00063 00064 /// The destructor. 00065 virtual ~Analysis() {} 00066 00067 //@} 00068 00069 00070 public: 00071 00072 /// @name Main analysis methods 00073 //@{ 00074 00075 /// Initialize this analysis object. A concrete class should here 00076 /// book all necessary histograms. An overridden function must make 00077 /// sure it first calls the base class function. 00078 virtual void init() { } 00079 00080 /// Analyze one event. A concrete class should here apply the 00081 /// necessary projections on the \a event and fill the relevant 00082 /// histograms. An overridden function must make sure it first calls 00083 /// the base class function. 00084 virtual void analyze(const Event& event) = 0; 00085 00086 /// Finalize this analysis object. A concrete class should here make 00087 /// all necessary operations on the histograms. Writing the 00088 /// histograms to a file is, however, done by the Rivet class. An 00089 /// overridden function must make sure it first calls the base class 00090 /// function. 00091 virtual void finalize() { } 00092 00093 //@} 00094 00095 00096 public: 00097 00098 /// @name Metadata 00099 /// Metadata is used for querying from the command line and also for 00100 /// building web pages and the analysis pages in the Rivet manual. 00101 //@{ 00102 00103 /// Get the actual AnalysisInfo object in which all this metadata is stored. 00104 const AnalysisInfo& info() const { 00105 assert(_info.get() != 0 && "No AnalysisInfo object :O"); 00106 return *_info; 00107 } 00108 00109 /// @brief Get the name of the analysis. 00110 /// 00111 /// By default this is computed by combining the results of the experiment, 00112 /// year and Spires ID metadata methods and you should only override it if 00113 /// there's a good reason why those won't work. 00114 virtual std::string name() const { 00115 return (info().name().empty()) ? _defaultname : info().name(); 00116 } 00117 00118 /// Get the Inspire ID code for this analysis. 00119 virtual std::string inspireId() const { 00120 return info().inspireId(); 00121 } 00122 00123 /// Get the SPIRES ID code for this analysis (~deprecated). 00124 virtual std::string spiresId() const { 00125 return info().spiresId(); 00126 } 00127 00128 /// @brief Names & emails of paper/analysis authors. 00129 /// 00130 /// Names and email of authors in 'NAME <EMAIL>' format. The first 00131 /// name in the list should be the primary contact person. 00132 virtual std::vector<std::string> authors() const { 00133 return info().authors(); 00134 } 00135 00136 /// @brief Get a short description of the analysis. 00137 /// 00138 /// Short (one sentence) description used as an index entry. 00139 /// Use @a description() to provide full descriptive paragraphs 00140 /// of analysis details. 00141 virtual std::string summary() const { 00142 return info().summary(); 00143 } 00144 00145 /// @brief Get a full description of the analysis. 00146 /// 00147 /// Full textual description of this analysis, what it is useful for, 00148 /// what experimental techniques are applied, etc. Should be treated 00149 /// as a chunk of restructuredText (http://docutils.sourceforge.net/rst.html), 00150 /// with equations to be rendered as LaTeX with amsmath operators. 00151 virtual std::string description() const { 00152 return info().description(); 00153 } 00154 00155 /// @brief Information about the events needed as input for this analysis. 00156 /// 00157 /// Event types, energies, kinematic cuts, particles to be considered 00158 /// stable, etc. etc. Should be treated as a restructuredText bullet list 00159 /// (http://docutils.sourceforge.net/rst.html) 00160 virtual std::string runInfo() const { 00161 return info().runInfo(); 00162 } 00163 00164 /// Experiment which performed and published this analysis. 00165 virtual std::string experiment() const { 00166 return info().experiment(); 00167 } 00168 00169 /// Collider on which the experiment ran. 00170 virtual std::string collider() const { 00171 return info().collider(); 00172 } 00173 00174 /// When the original experimental analysis was published. 00175 virtual std::string year() const { 00176 return info().year(); 00177 } 00178 00179 /// Journal, and preprint references. 00180 virtual std::vector<std::string> references() const { 00181 return info().references(); 00182 } 00183 00184 /// BibTeX citation key for this article. 00185 virtual std::string bibKey() const { 00186 return info().bibKey(); 00187 } 00188 00189 /// BibTeX citation entry for this article. 00190 virtual std::string bibTeX() const { 00191 return info().bibTeX(); 00192 } 00193 00194 /// Whether this analysis is trusted (in any way!) 00195 virtual std::string status() const { 00196 return (info().status().empty()) ? "UNVALIDATED" : info().status(); 00197 } 00198 00199 /// Any work to be done on this analysis. 00200 virtual std::vector<std::string> todos() const { 00201 return info().todos(); 00202 } 00203 00204 00205 /// Return the allowed pairs of incoming beams required by this analysis. 00206 virtual const std::vector<PdgIdPair>& requiredBeams() const { 00207 return info().beams(); 00208 } 00209 /// Declare the allowed pairs of incoming beams required by this analysis. 00210 virtual Analysis& setRequiredBeams(const std::vector<PdgIdPair>& requiredBeams) { 00211 info().setBeams(requiredBeams); 00212 return *this; 00213 } 00214 00215 00216 /// Sets of valid beam energy pairs, in GeV 00217 virtual const std::vector<std::pair<double, double> >& requiredEnergies() const { 00218 return info().energies(); 00219 } 00220 /// Declare the list of valid beam energy pairs, in GeV 00221 virtual Analysis& setRequiredEnergies(const std::vector<std::pair<double, double> >& requiredEnergies) { 00222 info().setEnergies(requiredEnergies); 00223 return *this; 00224 } 00225 00226 00227 /// Return true if this analysis needs to know the process cross-section. 00228 /// @todo Remove this and require HepMC >= 2.06 00229 bool needsCrossSection() const { 00230 return info().needsCrossSection(); 00231 } 00232 /// Declare whether this analysis needs to know the process cross-section from the generator. 00233 /// @todo Remove this and require HepMC >= 2.06 00234 Analysis& setNeedsCrossSection(bool needed=true) { 00235 info().setNeedsCrossSection(needed); 00236 return *this; 00237 } 00238 00239 //@} 00240 00241 00242 /// @name Internal metadata modifying methods 00243 //@{ 00244 00245 /// Get the actual AnalysisInfo object in which all this metadata is stored (non-const). 00246 AnalysisInfo& info() { 00247 assert(_info.get() != 0 && "No AnalysisInfo object :O"); 00248 return *_info; 00249 } 00250 00251 //@} 00252 00253 00254 /// @name Run conditions 00255 //@{ 00256 00257 /// Incoming beams for this run 00258 const ParticlePair& beams() const; 00259 00260 /// Incoming beam IDs for this run 00261 const PdgIdPair beamIds() const; 00262 00263 /// Centre of mass energy for this run 00264 double sqrtS() const; 00265 00266 //@} 00267 00268 00269 /// @name Analysis / beam compatibility testing 00270 //@{ 00271 00272 /// Check if analysis is compatible with the provided beam particle IDs and energies 00273 bool isCompatible(const ParticlePair& beams) const; 00274 00275 /// Check if analysis is compatible with the provided beam particle IDs and energies 00276 bool isCompatible(PdgId beam1, PdgId beam2, double e1, double e2) const; 00277 00278 /// Check if analysis is compatible with the provided beam particle IDs and energies 00279 bool isCompatible(const PdgIdPair& beams, const std::pair<double,double>& energies) const; 00280 00281 //@} 00282 00283 00284 /// Set the cross section from the generator 00285 Analysis& setCrossSection(double xs); 00286 00287 /// Access the controlling AnalysisHandler object. 00288 AnalysisHandler& handler() const { return *_analysishandler; } 00289 00290 00291 protected: 00292 00293 /// Get a Log object based on the name() property of the calling analysis object. 00294 Log& getLog() const; 00295 00296 /// Get the process cross-section in pb. Throws if this hasn't been set. 00297 double crossSection() const; 00298 00299 /// Get the process cross-section per generated event in pb. Throws if this 00300 /// hasn't been set. 00301 double crossSectionPerEvent() const; 00302 00303 /// Get the number of events seen (via the analysis handler). Use in the 00304 /// finalize phase only. 00305 size_t numEvents() const; 00306 00307 /// Get the sum of event weights seen (via the analysis handler). Use in the 00308 /// finalize phase only. 00309 double sumOfWeights() const; 00310 00311 00312 protected: 00313 00314 /// @name Histogram paths 00315 //@{ 00316 00317 /// Get the canonical histogram "directory" path for this analysis. 00318 const std::string histoDir() const; 00319 00320 /// Get the canonical histogram path for the named histogram in this analysis. 00321 const std::string histoPath(const std::string& hname) const; 00322 00323 /// Get the canonical histogram path for the numbered histogram in this analysis. 00324 const std::string histoPath(unsigned int datasetId, unsigned int xAxisId, unsigned int yAxisId) const; 00325 00326 /// Get the internal histogram name for given d, x and y (cf. HepData) 00327 const std::string makeAxisCode(unsigned int datasetId, unsigned int xAxisId, unsigned int yAxisId) const; 00328 00329 //@} 00330 00331 00332 /// @name Histogram reference data 00333 //@{ 00334 00335 /// Get reference data for a named histo 00336 const YODA::Scatter2D& refData(const string& hname) const; 00337 00338 /// Get reference data for a numbered histo 00339 const YODA::Scatter2D& refData(unsigned int datasetId, unsigned int xAxisId, unsigned int yAxisId) const; 00340 00341 /// @todo Provide 3D versions as well? (How to distinguish the signatures? Template magic or explicit name?) 00342 //@} 00343 00344 00345 /// @name 1D histogram booking 00346 //@{ 00347 00348 /// Book a 1D histogram with @a nbins uniformly distributed across the range @a lower - @a upper . 00349 Histo1DPtr bookHisto1D(const std::string& name, 00350 size_t nbins, double lower, double upper, 00351 const std::string& title="", 00352 const std::string& xtitle="", 00353 const std::string& ytitle=""); 00354 00355 /// Book a 1D histogram with non-uniform bins defined by the vector of bin edges @a binedges . 00356 Histo1DPtr bookHisto1D(const std::string& name, 00357 const std::vector<double>& binedges, 00358 const std::string& title="", 00359 const std::string& xtitle="", 00360 const std::string& ytitle=""); 00361 00362 /// Book a 1D histogram with binning from a reference scatter. 00363 Histo1DPtr bookHisto1D(const std::string& name, 00364 const Scatter2D& refscatter, 00365 const std::string& title="", 00366 const std::string& xtitle="", 00367 const std::string& ytitle=""); 00368 00369 /// Book a 1D histogram, using the binnings in the reference data histogram. 00370 Histo1DPtr bookHisto1D(const std::string& name, 00371 const std::string& title="", 00372 const std::string& xtitle="", 00373 const std::string& ytitle=""); 00374 00375 /// Book a 1D histogram, using the binnings in the reference data histogram. 00376 /// 00377 /// The paper, dataset and x/y-axis IDs will be used to build the histo name in the HepData standard way. 00378 Histo1DPtr bookHisto1D(unsigned int datasetId, unsigned int xAxisId, unsigned int yAxisId, 00379 const std::string& title="", 00380 const std::string& xtitle="", 00381 const std::string& ytitle=""); 00382 00383 //@} 00384 00385 00386 /// @name 2D histogram booking 00387 //@{ 00388 00389 /// Book a 2D histogram with @a nxbins and @a nybins uniformly 00390 /// distributed across the ranges @a xlower - @a xupper and @a 00391 /// ylower - @a yupper respectively along the x- and y-axis. 00392 Histo2DPtr bookHisto2D(const std::string& name, 00393 size_t nxbins, double xlower, double xupper, 00394 size_t nybins, double ylower, double yupper, 00395 const std::string& title="", 00396 const std::string& xtitle="", 00397 const std::string& ytitle="", 00398 const std::string& ztitle=""); 00399 00400 /// Book a 2D histogram with non-uniform bins defined by the 00401 /// vectorx of bin edges @a xbinedges and @a ybinedges. 00402 Histo2DPtr bookHisto2D(const std::string& name, 00403 const std::vector<double>& xbinedges, 00404 const std::vector<double>& ybinedges, 00405 const std::string& title="", 00406 const std::string& xtitle="", 00407 const std::string& ytitle="", 00408 const std::string& ztitle=""); 00409 00410 // /// Book a 2D histogram with binning from a reference scatter. 00411 // Histo2DPtr bookHisto2D(const std::string& name, 00412 // const Scatter3D& refscatter, 00413 // const std::string& title="", 00414 // const std::string& xtitle="", 00415 // const std::string& ytitle="", 00416 // const std::string& ztitle=""); 00417 00418 // /// Book a 2D histogram, using the binnings in the reference data histogram. 00419 // Histo2DPtr bookHisto2D(const std::string& name, 00420 // const std::string& title="", 00421 // const std::string& xtitle="", 00422 // const std::string& ytitle="", 00423 // const std::string& ztitle=""); 00424 00425 // /// Book a 2D histogram, using the binnings in the reference data histogram. 00426 // /// 00427 // /// The paper, dataset and x/y-axis IDs will be used to build the histo name in the HepData standard way. 00428 // Histo2DPtr bookHisto2D(unsigned int datasetId, unsigned int xAxisId, unsigned int yAxisId, 00429 // const std::string& title="", 00430 // const std::string& xtitle="", 00431 // const std::string& ytitle="", 00432 // const std::string& ztitle=""); 00433 00434 //@} 00435 00436 00437 /// @name 1D profile histogram booking 00438 //@{ 00439 00440 /// Book a 1D profile histogram with @a nbins uniformly distributed across the range @a lower - @a upper . 00441 Profile1DPtr bookProfile1D(const std::string& name, 00442 size_t nbins, double lower, double upper, 00443 const std::string& title="", 00444 const std::string& xtitle="", 00445 const std::string& ytitle=""); 00446 00447 /// Book a 1D profile histogram with non-uniform bins defined by the vector of bin edges @a binedges . 00448 Profile1DPtr bookProfile1D(const std::string& name, 00449 const std::vector<double>& binedges, 00450 const std::string& title="", 00451 const std::string& xtitle="", 00452 const std::string& ytitle=""); 00453 00454 /// Book a 1D profile histogram with binning from a reference scatter. 00455 Profile1DPtr bookProfile1D(const std::string& name, 00456 const Scatter2D& refscatter, 00457 const std::string& title="", 00458 const std::string& xtitle="", 00459 const std::string& ytitle=""); 00460 00461 /// Book a 1D profile histogram, using the binnings in the reference data histogram. 00462 Profile1DPtr bookProfile1D(const std::string& name, 00463 const std::string& title="", 00464 const std::string& xtitle="", 00465 const std::string& ytitle=""); 00466 00467 /// Book a 1D profile histogram, using the binnings in the reference data histogram. 00468 /// 00469 /// The paper, dataset and x/y-axis IDs will be used to build the histo name in the HepData standard way. 00470 Profile1DPtr bookProfile1D(unsigned int datasetId, unsigned int xAxisId, unsigned int yAxisId, 00471 const std::string& title="", 00472 const std::string& xtitle="", 00473 const std::string& ytitle=""); 00474 00475 //@} 00476 00477 00478 /// @name 2D profile histogram booking 00479 //@{ 00480 00481 /// Book a 2D profile histogram with @a nxbins and @a nybins uniformly 00482 /// distributed across the ranges @a xlower - @a xupper and @a ylower - @a 00483 /// yupper respectively along the x- and y-axis. 00484 Profile2DPtr bookProfile2D(const std::string& name, 00485 size_t nxbins, double xlower, double xupper, 00486 size_t nybins, double ylower, double yupper, 00487 const std::string& title="", 00488 const std::string& xtitle="", 00489 const std::string& ytitle="", 00490 const std::string& ztitle=""); 00491 00492 /// Book a 2D profile histogram with non-uniform bins defined by the vectorx 00493 /// of bin edges @a xbinedges and @a ybinedges. 00494 Profile2DPtr bookProfile2D(const std::string& name, 00495 const std::vector<double>& xbinedges, 00496 const std::vector<double>& ybinedges, 00497 const std::string& title="", 00498 const std::string& xtitle="", 00499 const std::string& ytitle="", 00500 const std::string& ztitle=""); 00501 00502 /// Book a 2D profile histogram with binning from a reference scatter. 00503 // Profile2DPtr bookProfile2D(const std::string& name, 00504 // const Scatter3D& refscatter, 00505 // const std::string& title="", 00506 // const std::string& xtitle="", 00507 // const std::string& ytitle="", 00508 // const std::string& ztitle=""); 00509 00510 // /// Book a 2D profile histogram, using the binnings in the reference data histogram. 00511 // Profile2DPtr bookProfile2D(const std::string& name, 00512 // const std::string& title="", 00513 // const std::string& xtitle="", 00514 // const std::string& ytitle="", 00515 // const std::string& ztitle=""); 00516 00517 // /// Book a 2D profile histogram, using the binnings in the reference data histogram. 00518 // /// 00519 // /// The paper, dataset and x/y-axis IDs will be used to build the histo name in the HepData standard way. 00520 // Profile2DPtr bookProfile2D(unsigned int datasetId, unsigned int xAxisId, unsigned int yAxisId, 00521 // const std::string& title="", 00522 // const std::string& xtitle="", 00523 // const std::string& ytitle="", 00524 // const std::string& ztitle=""); 00525 00526 //@} 00527 00528 00529 /// @name 2D scatter booking 00530 //@{ 00531 00532 /// @brief Book a 2-dimensional data point set with the given name. 00533 /// 00534 /// @note Unlike histogram booking, scatter booking by default makes no 00535 /// attempt to use reference data to pre-fill the data object. If you want 00536 /// this, which is sometimes useful e.g. when the x-position is not really 00537 /// meaningful and can't be extracted from the data, then set the @a 00538 /// copy_pts parameter to true. This creates points to match the reference 00539 /// data's x values and errors, but with the y values and errors zeroed... 00540 /// assuming that there is a reference histo with the same name: if there 00541 /// isn't, an exception will be thrown. 00542 Scatter2DPtr bookScatter2D(const std::string& name, 00543 bool copy_pts=false, 00544 const std::string& title="", 00545 const std::string& xtitle="", 00546 const std::string& ytitle=""); 00547 00548 /// @brief Book a 2-dimensional data point set, using the binnings in the reference data histogram. 00549 /// 00550 /// The paper, dataset and x/y-axis IDs will be used to build the histo name in the HepData standard way. 00551 /// 00552 /// @note Unlike histogram booking, scatter booking by default makes no 00553 /// attempt to use reference data to pre-fill the data object. If you want 00554 /// this, which is sometimes useful e.g. when the x-position is not really 00555 /// meaningful and can't be extracted from the data, then set the @a 00556 /// copy_pts parameter to true. This creates points to match the reference 00557 /// data's x values and errors, but with the y values and errors zeroed. 00558 Scatter2DPtr bookScatter2D(unsigned int datasetId, unsigned int xAxisId, unsigned int yAxisId, 00559 bool copy_pts=false, 00560 const std::string& title="", 00561 const std::string& xtitle="", 00562 const std::string& ytitle=""); 00563 00564 /// @brief Book a 2-dimensional data point set with equally spaced x-points in a range. 00565 /// 00566 /// The y values and errors will be set to 0. 00567 Scatter2DPtr bookScatter2D(const std::string& name, 00568 size_t npts, double lower, double upper, 00569 const std::string& title="", 00570 const std::string& xtitle="", 00571 const std::string& ytitle=""); 00572 00573 /// @brief Book a 2-dimensional data point set based on provided contiguous "bin edges". 00574 /// 00575 /// The y values and errors will be set to 0. 00576 Scatter2DPtr bookScatter2D(const std::string& hname, 00577 const std::vector<double>& binedges, 00578 const std::string& title, 00579 const std::string& xtitle, 00580 const std::string& ytitle); 00581 00582 //@} 00583 00584 00585 /// @todo What follows should really be protected: only public to keep BinnedHistogram happy for now... 00586 public: 00587 00588 /// @name Histogram manipulation 00589 //@{ 00590 00591 /// Normalize the given histogram, @a histo, to area = @a norm. 00592 /// 00593 /// @note The histogram is no longer invalidated by this procedure. 00594 void normalize(Histo1DPtr histo, double norm=1.0, bool includeoverflows=true); 00595 00596 /// Multiplicatively scale the given histogram, @a histo, by factor @s scale. 00597 /// 00598 /// @note The histogram is no longer invalidated by this procedure. 00599 void scale(Histo1DPtr histo, double scale); 00600 00601 /// Normalize the given histogram, @a histo, to area = @a norm. 00602 /// 00603 /// @note The histogram is no longer invalidated by this procedure. 00604 void normalize(Histo2DPtr histo, double norm=1.0, bool includeoverflows=true); 00605 00606 /// Multiplicatively scale the given histogram, @a histo, by factor @s scale. 00607 /// 00608 /// @note The histogram is no longer invalidated by this procedure. 00609 void scale(Histo2DPtr histo, double scale); 00610 00611 00612 /// Helper for histogram division. 00613 /// 00614 /// @note Assigns to the (already registered) output scatter, @a s. Preserves the path information of the target. 00615 void divide(Histo1DPtr h1, Histo1DPtr h2, Scatter2DPtr s) const; 00616 00617 /// Helper for histogram division with raw YODA objects. 00618 /// 00619 /// @note Assigns to the (already registered) output scatter, @a s. Preserves the path information of the target. 00620 void divide(const YODA::Histo1D& h1, 00621 const YODA::Histo1D& h2, Scatter2DPtr s) const; 00622 00623 00624 /// Helper for profile histogram division. 00625 /// 00626 /// @note Assigns to the (already registered) output scatter, @a s. Preserves the path information of the target. 00627 void divide(Profile1DPtr p1, Profile1DPtr p2, Scatter2DPtr s) const; 00628 00629 /// Helper for profile histogram division with raw YODA objects. 00630 /// 00631 /// @note Assigns to the (already registered) output scatter, @a s. Preserves the path information of the target. 00632 void divide(const YODA::Profile1D& p1, const YODA::Profile1D& p2, Scatter2DPtr s) const; 00633 00634 00635 /// Helper for 2D histogram division. 00636 /// 00637 /// @note Assigns to the (already registered) output scatter, @a s. Preserves the path information of the target. 00638 void divide(Histo2DPtr h1, Histo2DPtr h2, Scatter3DPtr s) const; 00639 00640 /// Helper for 2D histogram division with raw YODA objects. 00641 /// 00642 /// @note Assigns to the (already registered) output scatter, @a s. Preserves the path information of the target. 00643 void divide(const YODA::Histo2D& h1, const YODA::Histo2D& h2, Scatter3DPtr s) const; 00644 00645 00646 /// Helper for 2D profile histogram division. 00647 /// 00648 /// @note Assigns to the (already registered) output scatter, @a s. Preserves the path information of the target. 00649 void divide(Profile2DPtr p1, Profile2DPtr p2, Scatter3DPtr s) const; 00650 00651 /// Helper for 2D profile histogram division with raw YODA objects 00652 /// 00653 /// @note Assigns to the (already registered) output scatter, @a s. Preserves the path information of the target. 00654 void divide(const YODA::Profile2D& p1, const YODA::Profile2D& p2, Scatter3DPtr s) const; 00655 00656 00657 /// Helper for histogram efficiency calculation. 00658 /// 00659 /// @note Assigns to the (already registered) output scatter, @a s. Preserves the path information of the target. 00660 void efficiency(Histo1DPtr h1, Histo1DPtr h2, Scatter2DPtr s) const; 00661 00662 /// Helper for histogram efficiency calculation. 00663 /// 00664 /// @note Assigns to the (already registered) output scatter, @a s. Preserves the path information of the target. 00665 void efficiency(const YODA::Histo1D& h1, const YODA::Histo1D& h2, Scatter2DPtr s) const; 00666 00667 00668 /// Helper for histogram asymmetry calculation. 00669 /// 00670 /// @note Assigns to the (already registered) output scatter, @a s. Preserves the path information of the target. 00671 void asymm(Histo1DPtr h1, Histo1DPtr h2, Scatter2DPtr s) const; 00672 00673 /// Helper for histogram asymmetry calculation. 00674 /// 00675 /// @note Assigns to the (already registered) output scatter, @a s. Preserves the path information of the target. 00676 void asymm(const YODA::Histo1D& h1, const YODA::Histo1D& h2, Scatter2DPtr s) const; 00677 00678 00679 /// Helper for converting a differential histo to an integral one. 00680 /// 00681 /// @note Assigns to the (already registered) output scatter, @a s. Preserves the path information of the target. 00682 void integrate(Histo1DPtr h, Scatter2DPtr s) const; 00683 00684 /// Helper for converting a differential histo to an integral one. 00685 /// 00686 /// @note Assigns to the (already registered) output scatter, @a s. Preserves the path information of the target. 00687 void integrate(const Histo1D& h, Scatter2DPtr s) const; 00688 00689 //@} 00690 00691 00692 public: 00693 00694 /// List of registered analysis data objects 00695 const vector<AnalysisObjectPtr>& analysisObjects() const { 00696 return _analysisobjects; 00697 } 00698 00699 00700 protected: 00701 00702 /// @name Data object registration, retrieval, and removal 00703 //@{ 00704 00705 /// Register a data object in the histogram system 00706 void addAnalysisObject(AnalysisObjectPtr ao); 00707 00708 /// Get a data object from the histogram system 00709 /// @todo Use this default function template arg in C++11 00710 // template <typename AO=AnalysisObjectPtr> 00711 template <typename AO> 00712 const shared_ptr<AO> getAnalysisObject(const std::string& name) const { 00713 foreach (const AnalysisObjectPtr& ao, analysisObjects()) { 00714 if (ao->path() == histoPath(name)) return dynamic_pointer_cast<AO>(ao); 00715 } 00716 throw Exception("Data object " + histoPath(name) + " not found"); 00717 } 00718 00719 /// Get a data object from the histogram system (non-const) 00720 /// @todo Use this default function template arg in C++11 00721 // template <typename AO=AnalysisObjectPtr> 00722 template <typename AO> 00723 shared_ptr<AO> getAnalysisObject(const std::string& name) { 00724 foreach (const AnalysisObjectPtr& ao, analysisObjects()) { 00725 if (ao->path() == histoPath(name)) return dynamic_pointer_cast<AO>(ao); 00726 } 00727 throw Exception("Data object " + histoPath(name) + " not found"); 00728 } 00729 00730 /// Unregister a data object from the histogram system (by name) 00731 void removeAnalysisObject(const std::string& path); 00732 00733 /// Unregister a data object from the histogram system (by pointer) 00734 void removeAnalysisObject(AnalysisObjectPtr ao); 00735 00736 00737 /// Get a named Histo1D object from the histogram system 00738 const Histo1DPtr getHisto1D(const std::string& name) const { 00739 return getAnalysisObject<Histo1D>(name); 00740 } 00741 00742 /// Get a named Histo1D object from the histogram system (non-const) 00743 Histo1DPtr getHisto1D(const std::string& name) { 00744 return getAnalysisObject<Histo1D>(name); 00745 } 00746 00747 /// Get a Histo1D object from the histogram system by axis ID codes (non-const) 00748 const Histo1DPtr getHisto1D(unsigned int datasetId, unsigned int xAxisId, unsigned int yAxisId) const { 00749 return getAnalysisObject<Histo1D>(makeAxisCode(datasetId, xAxisId, yAxisId)); 00750 } 00751 00752 /// Get a Histo1D object from the histogram system by axis ID codes (non-const) 00753 Histo1DPtr getHisto1D(unsigned int datasetId, unsigned int xAxisId, unsigned int yAxisId) { 00754 return getAnalysisObject<Histo1D>(makeAxisCode(datasetId, xAxisId, yAxisId)); 00755 } 00756 00757 00758 // /// Get a named Histo2D object from the histogram system 00759 // const Histo2DPtr getHisto2D(const std::string& name) const { 00760 // return getAnalysisObject<Histo2D>(name); 00761 // } 00762 00763 // /// Get a named Histo2D object from the histogram system (non-const) 00764 // Histo2DPtr getHisto2D(const std::string& name) { 00765 // return getAnalysisObject<Histo2D>(name); 00766 // } 00767 00768 // /// Get a Histo2D object from the histogram system by axis ID codes (non-const) 00769 // const Histo2DPtr getHisto2D(unsigned int datasetId, unsigned int xAxisId, unsigned int yAxisId) const { 00770 // return getAnalysisObject<Histo2D>(makeAxisCode(datasetId, xAxisId, yAxisId)); 00771 // } 00772 00773 // /// Get a Histo2D object from the histogram system by axis ID codes (non-const) 00774 // Histo2DPtr getHisto2D(unsigned int datasetId, unsigned int xAxisId, unsigned int yAxisId) { 00775 // return getAnalysisObject<Histo2D>(makeAxisCode(datasetId, xAxisId, yAxisId)); 00776 // } 00777 00778 00779 /// Get a named Profile1D object from the histogram system 00780 const Profile1DPtr getProfile1D(const std::string& name) const { 00781 return getAnalysisObject<Profile1D>(name); 00782 } 00783 00784 /// Get a named Profile1D object from the histogram system (non-const) 00785 Profile1DPtr getProfile1D(const std::string& name) { 00786 return getAnalysisObject<Profile1D>(name); 00787 } 00788 00789 /// Get a Profile1D object from the histogram system by axis ID codes (non-const) 00790 const Profile1DPtr getProfile1D(unsigned int datasetId, unsigned int xAxisId, unsigned int yAxisId) const { 00791 return getAnalysisObject<Profile1D>(makeAxisCode(datasetId, xAxisId, yAxisId)); 00792 } 00793 00794 /// Get a Profile1D object from the histogram system by axis ID codes (non-const) 00795 Profile1DPtr getProfile1D(unsigned int datasetId, unsigned int xAxisId, unsigned int yAxisId) { 00796 return getAnalysisObject<Profile1D>(makeAxisCode(datasetId, xAxisId, yAxisId)); 00797 } 00798 00799 00800 // /// Get a named Profile2D object from the histogram system 00801 // const Profile2DPtr getProfile2D(const std::string& name) const { 00802 // return getAnalysisObject<Profile2D>(name); 00803 // } 00804 00805 // /// Get a named Profile2D object from the histogram system (non-const) 00806 // Profile2DPtr getProfile2D(const std::string& name) { 00807 // return getAnalysisObject<Profile2D>(name); 00808 // } 00809 00810 // /// Get a Profile2D object from the histogram system by axis ID codes (non-const) 00811 // const Profile2DPtr getProfile2D(unsigned int datasetId, unsigned int xAxisId, unsigned int yAxisId) const { 00812 // return getAnalysisObject<Profile2D>(makeAxisCode(datasetId, xAxisId, yAxisId)); 00813 // } 00814 00815 // /// Get a Profile2D object from the histogram system by axis ID codes (non-const) 00816 // Profile2DPtr getProfile2D(unsigned int datasetId, unsigned int xAxisId, unsigned int yAxisId) { 00817 // return getAnalysisObject<Profile2D>(makeAxisCode(datasetId, xAxisId, yAxisId)); 00818 // } 00819 00820 00821 /// Get a named Scatter2D object from the histogram system 00822 const Scatter2DPtr getScatter2D(const std::string& name) const { 00823 return getAnalysisObject<Scatter2D>(name); 00824 } 00825 00826 /// Get a named Scatter2D object from the histogram system (non-const) 00827 Scatter2DPtr getScatter2D(const std::string& name) { 00828 return getAnalysisObject<Scatter2D>(name); 00829 } 00830 00831 /// Get a Scatter2D object from the histogram system by axis ID codes (non-const) 00832 const Scatter2DPtr getScatter2D(unsigned int datasetId, unsigned int xAxisId, unsigned int yAxisId) const { 00833 return getAnalysisObject<Scatter2D>(makeAxisCode(datasetId, xAxisId, yAxisId)); 00834 } 00835 00836 /// Get a Scatter2D object from the histogram system by axis ID codes (non-const) 00837 Scatter2DPtr getScatter2D(unsigned int datasetId, unsigned int xAxisId, unsigned int yAxisId) { 00838 return getAnalysisObject<Scatter2D>(makeAxisCode(datasetId, xAxisId, yAxisId)); 00839 } 00840 00841 //@} 00842 00843 00844 private: 00845 00846 /// Name passed to constructor (used to find .info analysis data file, and as a fallback) 00847 string _defaultname; 00848 00849 /// Pointer to analysis metadata object 00850 shared_ptr<AnalysisInfo> _info; 00851 00852 /// Storage of all plot objects 00853 /// @todo Make this a map for fast lookup by path? 00854 vector<AnalysisObjectPtr> _analysisobjects; 00855 00856 /// @name Cross-section variables 00857 //@{ 00858 double _crossSection; 00859 bool _gotCrossSection; 00860 //@} 00861 00862 /// The controlling AnalysisHandler object. 00863 AnalysisHandler* _analysishandler; 00864 00865 /// Collection of cached refdata to speed up many autobookings: the 00866 /// reference data file should only be read once. 00867 mutable std::map<std::string, Scatter2DPtr> _refdata; 00868 00869 00870 private: 00871 00872 /// @name Utility functions 00873 //@{ 00874 00875 /// Get the reference data for this paper and cache it. 00876 void _cacheRefData() const; 00877 00878 //@} 00879 00880 00881 /// The assignment operator is private and must never be called. 00882 /// In fact, it should not even be implemented. 00883 Analysis& operator=(const Analysis&); 00884 00885 }; 00886 00887 00888 } 00889 00890 00891 // Include definition of analysis plugin system so that analyses automatically see it when including Analysis.hh 00892 #include "Rivet/AnalysisBuilder.hh" 00893 00894 /// @def DECLARE_RIVET_PLUGIN 00895 /// Preprocessor define to prettify the global-object plugin hook mechanism. 00896 #define DECLARE_RIVET_PLUGIN(clsname) Rivet::AnalysisBuilder<clsname> plugin_ ## clsname 00897 00898 /// @def DEFAULT_RIVET_ANA_CONSTRUCTOR 00899 /// Preprocessor define to prettify the manky constructor with name string argument 00900 #define DEFAULT_RIVET_ANA_CONSTRUCTOR(clsname) clsname() : Analysis(# clsname) {} 00901 00902 00903 #endif Generated on Tue Sep 30 2014 19:45:41 for The Rivet MC analysis system by ![]() |