Rivet Analyses Reference

MC_DILEPTON

Charged dilepton kinematic distributions sensitive to boson polarisation
Experiment: ()
Status: VALIDATED
Authors:
  • Andy Buckley
No references listed
Beams: * *
Beam energies: ANY
Run details:
  • Any event type that produces prompt charged lepton pairs.

Finds two charged leptons ($e$ or $\mu$) and plots their basic kinematics in the lab frame and in their centre-of-mass frame. Observables of the lepton momentum components parallel and perpendicular to the CoM boost direction are particularly sensitive to the polarisation state of a decaying vector boson.

Source code: MC_DILEPTON.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
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/PromptFinalState.hh"

namespace Rivet {


  /// @brief Study of prompt dilepton kinematics sensitive to boson polarizations
  class MC_DILEPTON : public Analysis {
  public:

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(MC_DILEPTON);


    /// @name Analysis methods
    //@{

    /// Book histograms and initialise projections before the run
    void init() {

      // Initialise and register projections
      declare(PromptFinalState((Cuts::abspid == PID::ELECTRON || Cuts::abspid == PID::MUON)
                               && Cuts::abseta < 5 && Cuts::pT > 10*GeV), "Leptons");

      // Book histograms
      book(_h_pt_l1, "lep1_pt", logspace(40, 10, 400));
      book(_h_costheta_l1, "lep1_costheta", linspace(25, -1, 1));
      book(_h_ppara_l1, "lep1_ppara", linspace(40, -50, 350));
      book(_h_pperp_l1, "lep1_pperp", linspace(25, 0, 100));
      //
      book(_h_pt_l2, "lep2_pt", logspace(40, 10, 400));
      book(_h_costheta_l2, "lep2_costheta", linspace(25, -1, 1));
      book(_h_ppara_l2, "lep2_ppara", linspace(40, -50, 350));
      book(_h_pperp_l2, "lep2_pperp", linspace(25, 0, 100));
      //
      book(_h_costheta_com_l1, "com_costheta_l1", linspace(25, -1, 1));
      book(_h_costheta_com_l2, "com_costheta_l2", linspace(25, -1, 1));
      book(_h_ppara_com_l1, "com_ppara_l1", linspace(25, -50, 50));
      book(_h_ppara_com_l2, "com_ppara_l2", linspace(25, -50, 50));
      //
      book(_h_costheta_com, "com_costheta", linspace(25, -1, 1));
      book(_h_ppara_com, "com_ppara", linspace(25, -50, 50));
      book(_h_pperp_com, "com_pperp", linspace(25, 0, 100));

    }


    /// Perform the per-event analysis
    void analyze(const Event& event) {
      const Particles& leptons = apply<FinalState>(event, "Leptons").particlesByPt();
      if (leptons.size() != 2) vetoEvent;
      const Particle& l1 = leptons[0];
      const Particle& l2 = leptons[1];
      _h_pt_l1->fill(l1.pT()/GeV);
      _h_pt_l2->fill(l2.pT()/GeV);

      const FourMomentum pcom = l1.mom() + l2.mom();
      const Vector3 betacom = pcom.betaVec();
      const Vector3 unitboostvec = betacom.unit();
      const LorentzTransform comboost = LorentzTransform::mkFrameTransformFromBeta(betacom);

      const double l1_costheta = cos(l1.p3().angle(unitboostvec));
      const double l1_ppara = l2.p3().dot(unitboostvec);
      const double l1_pperp = l2.p3().cross(unitboostvec).mod();
      _h_costheta_l1->fill(l1_costheta);
      _h_ppara_l1->fill(l1_ppara);
      _h_pperp_l1->fill(l1_pperp);

      const double l2_costheta = cos(l2.p3().angle(unitboostvec));
      const double l2_ppara = l2.p3().dot(unitboostvec);
      const double l2_pperp = l2.p3().cross(unitboostvec).mod();
      _h_costheta_l2->fill(l2_costheta);
      _h_ppara_l2->fill(l2_ppara);
      _h_pperp_l2->fill(l2_pperp);

      const FourMomentum p1com = comboost.transform(l1.mom());
      const FourMomentum p2com = comboost.transform(l2.mom());
      const double com_costheta1 = cos(p1com.p3().angle(unitboostvec));
      const double com_costheta2 = cos(p2com.p3().angle(unitboostvec));
      MSG_DEBUG("CoM cos(th)s: " << com_costheta1 << ", " << com_costheta2);
      // assert(com_costheta1 == com_costheta2 && "CoM cos(th)s differ");
      const double com_ppara1 = p1com.p3().dot(unitboostvec);
      const double com_ppara2 = p2com.p3().dot(unitboostvec);
      MSG_DEBUG("CoM p_paras: " << com_ppara1 << ", " << com_ppara2);
      // assert(com_ppara1 == com_ppara2 && "CoM p_paras differ");
      const double com_pperp1 = p1com.p3().cross(unitboostvec).mod();
      const double com_pperp2 = p2com.p3().cross(unitboostvec).mod();
      MSG_DEBUG("CoM p_pperps: " << com_pperp1 << ", " << com_pperp2);
      // assert(com_pperp1 == com_pperp2 && "CoM p_perps differ");
      _h_costheta_com_l1->fill(com_costheta1);
      _h_costheta_com_l2->fill(com_costheta2);
      _h_costheta_com->fill(com_costheta1, 0.5);
      _h_costheta_com->fill(com_costheta2, 0.5);
      _h_ppara_com_l1->fill(com_ppara1);
      _h_ppara_com_l2->fill(com_ppara2);
      _h_ppara_com->fill(com_ppara1, 0.5);
      _h_ppara_com->fill(com_ppara2, 0.5);
      _h_pperp_com->fill(com_pperp1);
    }


    /// Normalise histograms etc., after the run
    void finalize() {
      normalize(_h_pt_l1); normalize(_h_pt_l2); normalize(_h_ppara_com); 
      normalize(_h_pperp_com); normalize(_h_costheta_com); normalize(_h_ppara_com_l1); 
      normalize(_h_ppara_com_l2); normalize(_h_costheta_com_l1); normalize(_h_costheta_com_l2);
      normalize(_h_ppara_l1); normalize(_h_pperp_l1); normalize(_h_costheta_l1);
      normalize(_h_ppara_l2); normalize(_h_pperp_l2); normalize(_h_costheta_l2);
    }

    //@}


    /// @name Histograms
    //@{
    Histo1DPtr _h_pt_l1, _h_pt_l2;
    Histo1DPtr _h_ppara_com, _h_pperp_com, _h_costheta_com;
    Histo1DPtr _h_ppara_com_l1, _h_ppara_com_l2, _h_costheta_com_l1, _h_costheta_com_l2;
    Histo1DPtr _h_ppara_l1, _h_pperp_l1, _h_costheta_l1;
    Histo1DPtr _h_ppara_l2, _h_pperp_l2, _h_costheta_l2;
    //@}


  };


  // The hook for the plugin system
  RIVET_DECLARE_PLUGIN(MC_DILEPTON);


}