Rivet
1.8.0
|
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