Rivet Analyses Reference

MC_XS

MC analysis for process total cross section
Experiment: ()
Status: VALIDATED
Authors:
  • Marek Schoenherr
  • Christian Gutschow
No references listed
Beams: * *
Beam energies: ANY
Run details:
  • Suitable for any process.

Analysis for bookkeeping of the total cross section, number of generated events and the ratio of events with positive and negative weights. This analysis will not produce sensible distributions in case of correlated NLO sub-events.

Source code: MC_XS.cc
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/AnalysisHandler.hh"

#ifndef RIVET_ENABLE_HEPMC_3
#include "HepMC/HepMCDefs.h"
#endif

namespace Rivet {


  /// Analysis of the generated cross-section
  class MC_XS : public Analysis {
  public:

    RIVET_DEFAULT_ANALYSIS_CTOR(MC_XS);


    /// @name Analysis methods
    /// @{

    /// Book histograms and initialise projections before the run
    void init() {
      /// @todo Convert to Scatter1D or Counter
      book(_h_XS, "XS", {-0.5, 0.5});
      book(_h_N, "N", 1, 0.0, 1.0);
      book(_h_pmXS, "pmXS", 2, -1.0, 1.0);
      book(_h_pmN, "pmN", 2, -1.0, 1.0);
    }


    /// Perform the per-event analysis
    void analyze(const Event& event) {

      const size_t numWeights = event.weights().size();
      const vector<pair<double,double>> xsecs = event.crossSections();
      for (size_t m = 0; m < numWeights; ++m) {
        #if defined RIVET_ENABLE_HEPMC_3 || defined HEPMC_HAS_CROSS_SECTION
        size_t idx = (xsecs.size() == numWeights)? m : 0;
        const double xs    = xsecs[idx].first;
        const double xserr = xsecs[idx].second;
        _h_XS.get()->_getPersistent(m)->point(0).setY(xs, xserr);
        # endif
        const double weight = event.weights()[m];
        _h_pmXS.get()->_getPersistent(m)->fill(0.5*(weight > 0 ? 1. : -1), abs(weight));
        _h_pmN.get()->_getPersistent(m)->fill(0.5*(weight > 0 ? 1. : -1), 1.);
        _h_N.get()->_getPersistent(m)->fill(0.5, 1.0);
      }

    }


    /// Normalise histograms etc., after the run
    void finalize() {
      scale(_h_pmXS, crossSection()/sumOfWeights());
      #if !defined RIVET_ENABLE_HEPMC_3 && !defined HEPMC_HAS_CROSS_SECTION
      _h_XS->point(0).setY(crossSection(), 0.);
      #endif
    }

    /// @}


    /// @name Histograms
    /// @{
    Scatter2DPtr _h_XS;
    Histo1DPtr _h_pmXS, _h_pmN, _h_N;
    /// @}

  };



  RIVET_DECLARE_PLUGIN(MC_XS);

}