Rivet analyses

Dielectron production in proton–proton collisions at 7 TeV

Experiment: ALICE (LHC)

Inspire ID: 1672792

Status: VALIDATED

Authors: - Alexander Puck Neuwirth

References: - JHEP 09 (2018) 064 - arXiv: 1805.04391 - Expt page: ALICE-4288

Beams: p+ p+

Beam energies: (3500.0, 3500.0)GeV

Run details: - Inclusive dielectron production in pp at $\sqrt{s}=7$~TeV.

The first measurement of e+e pair production at mid-rapidity (|ηe| < 0.8) in pp collisions at $=7TeVwithALICEattheLHCispresented.Thedielectronproductionisstudiedasafunctionoftheinvariantmass(m_{ee} < 3.3$ GeV/c2), the pair transverse momentum ($p_${,ee}$ < 8$ GeV/c), and the pair transverse impact parameter (DCAee), i.e., the average distance of closest approach of the reconstructed electron and positron tracks to the collision vertex, normalised to its resolution. The results are compared with the expectations from a cocktail of known hadronic sources and are well described when PYTHIA is used to generate the heavy-flavour contributions. In the low-mass region (0.14  < mee< 1.1 GeV/c2), prompt and non-prompt e+e sources can be separated via the DCAee. In the intermediate-mass region (1.1  < mee< 2.7 GeV/c2), a double-differential fit to the data in mee and $p_{\text{T},ee$ and a fit of the DCAee distribution allow the total c and b cross sections to be extracted. Two different event generators, PYTHIA and POWHEG, can reproduce the shape of the two-dimensional mee and pT, ee spectra, as well as the shape of the DCAee distribution, reasonably well. However, differences in the c and b cross sections are observed when using the generators to extrapolate to full phase space. Finally, the ratio of inclusive to decay photons is studied via the measurement of virtual direct photons in the transverse-momentum range 1 $< $p_{\text{T}<$ 8 GeV/c. This is found to be unity within the statistical and systematic uncertainties and consistent with expectations from next-to-leading order perturbative quantum chromodynamic calculations.

Source code:ALICE_2018_I1672792.cc

// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/FinalState.hh"

namespace Rivet {

  /// @brief Measurement of dielectron production in pp at 7 TeV
  class ALICE_2018_I1672792 : public Analysis {
  public:

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(ALICE_2018_I1672792);

    /// @name Analysis methods
    //@{

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

      _photon = getOption<int>("PHOTON_Z", 0);
      _bottom = getOption<int>("BOTTOM", 0);
      _charm = getOption<int>("CHARM", 0);
      _open = getOption<int>("OPEN", 0);
      _apid = getOption<int>("APID", 0);

      Cut cuts = (Cuts::pT > 0.2 * GeV) && (Cuts::abseta < 0.8);

      FinalState fs1 = FinalState(Cuts::pid == PID::ELECTRON && cuts);
      declare(fs1, "Elecs");

      FinalState fs2 = FinalState(Cuts::pid == -PID::ELECTRON && cuts);
      declare(fs2, "Posis");


      // Book histograms
      book(_h["m_ee_pp"], 1, 1, 1); // Fig 9
      book(_h["pT_ee_VLMR_pp"], 2, 1, 1); // Fig 10 left
      book(_h["pT_ee_LMR_1_pp"], 4, 1, 1); // Fig 11 left
      book(_h["pT_ee_LMR_2_pp"], 5, 1, 1); // Fig 11 right
      book(_h["pT_ee_IMR_pp"], 7, 1, 1); // FIg 13 left and right (same data)
      book(_h["pT_ee_HMR_pp"], 9, 1, 1); // Fig 16 left
      //Fig 17? why not on hepdata...
    }

    bool valid(const Particle& pa) const {
      // If we are only iterested in open heavy-flavour we reject electrons coming from quarkonia
      if (_open && pa.hasParentWith([&](const Particle& p){
          return PID::isQuarkonium(p.pid());
        })) {
          return false;
      }

      if (_photon && pa.isDirect()) {
        return true;
      }

      if (_bottom && pa.fromBottom()) {
        return true;
      }

      if (_charm && pa.fromCharm()) {
        return true;
      }

      if (!_charm && !_bottom && !_photon) {
        return true;
      }
      return false;
    }

    void bin_em(const Particle& l1, const Particle& l2, double weight= 1.0) {
      // Get the true dilepton pair
      const FourMomentum pll = l1.mom() + l2.mom();

      if (pll.pt() < 8 * GeV) {
        _h["m_ee_pp"]->fill(pll.mass() / GeV,weight);
      }
      if (pll.mass() < 0.14) {
        _h["pT_ee_VLMR_pp"]->fill(pll.pt() / GeV, weight);
      }
      if (0.14 < pll.mass() && pll.mass() < 0.7) {
        _h["pT_ee_LMR_1_pp"]->fill(pll.pt() / GeV, weight);
      }
      if (0.7 < pll.mass() && pll.mass() < 1.1) {
        _h["pT_ee_LMR_2_pp"]->fill(pll.pt() / GeV, weight);
      }
      if (1.1 < pll.mass() && pll.mass() < 2.7) {
        _h["pT_ee_IMR_pp"]->fill(pll.pt() / GeV, weight);
      }
      if (2.7 < pll.mass() && pll.mass() < 3.3) {
        _h["pT_ee_HMR_pp"]->fill(pll.pt() / GeV, weight);
      }
    }
    /**
     * Check if both leptons are valid and not the same
    */
    bool both_valid(const Particle &l1, const Particle &l2) const {
      if (!l1.isSame(l2) && valid(l1) && valid(l2)) {
        // APID filter, can not be moved to valid() since it applies to either one or the other lepton
        if (!_apid || (
            (l1.hasAncestorWith(Cuts::abspid == _apid)) ||
            (l2.hasAncestorWith(Cuts::abspid == _apid)))) {
            return true;
        }
      }
      return false;
    }

    /// Perform the per-event analysis
    void analyze(const Event &event) {
      Particles elecs, posis;
      elecs = apply<ParticleFinder>(event, "Elecs").particlesByPt();
      posis = apply<ParticleFinder>(event, "Posis").particlesByPt();

      Particle l1;
      Particle l2;

      // Unlike sign contributions
      for (const Particle &l1 : elecs) {
        for (const Particle &l2 : posis) {
          if ( both_valid(l1,l2) ) {
            bin_em(l1,l2);
          }
        }
      }
      // Like sign contributions are subtracted through the negative weight
      for (const Particle &l1 : posis) {
        for (const Particle &l2 : posis) {
          if ( both_valid(l1,l2) ) {
            bin_em(l1,l2,-0.5); // only subbtract half since loop double counts
          }
        }
      }
      for (const Particle &l1 : elecs) {
        for (const Particle &l2 : elecs) {
          if ( both_valid(l1,l2) ) {
             bin_em(l1,l2,-0.5); // only subbtract half since loop double counts
          }
        }
      }
    }

    /// Normalise histograms etc., after the run
    void finalize() {
      scale(_h, crossSectionPerEvent() / (millibarn));
    }

    //@}

    /// @name Histograms
    //@{
    map<string, Histo1DPtr> _h;

    int _photon = 0;
    int _bottom = 0;
    int _charm = 0;
    int _open = 0;
    int _apid = 0;

    //@}
  };

  // The hook for the plugin system
  RIVET_DECLARE_PLUGIN(ALICE_2018_I1672792);
}