Rivet analyses


title: ALICE_2018_I1672792

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 ($|\eta_e| < 0.8$) in pp collisions at $\sqrt{s}=$7 TeV with ALICE at the LHC is presented. The dielectron production is studied as a function of the invariant mass ($m_{ee} < 3.3$ GeV/$c^2$), the pair transverse momentum ($p_${\text{T},ee}$ < 8$ GeV/$c$), and the pair transverse impact parameter (DCA${ee}$), 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 $< m{ee} <$ 1.1 GeV/$c^2$), prompt and non-prompt $e^+e^-$ sources can be separated via the DCA${ee}$. In the intermediate-mass region (1.1 $< m{ee} <$ 2.7 GeV/$c^2$), a double-differential fit to the data in $m_{ee}$ and $p_{\text{T},ee$ and a fit of the DCA${ee}$ distribution allow the total $c\bar{c}$ and $b\bar{b}$ cross sections to be extracted. Two different event generators, PYTHIA and POWHEG, can reproduce the shape of the two-dimensional $m{ee}$ and $p_{\text{T},ee}$ spectra, as well as the shape of the DCA${ee}$ distribution, reasonably well. However, differences in the $c\bar{c}$ and $b\bar{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++ // -- 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); } ```