Rivet analyses

Dijet angular distributions in photoproduction of charm

Experiment: ZEUS (HERA)

Inspire ID: 613625

Status: VALIDATED

Authors: - Vithyaban Anjelo Narendra

References: - Phys.Lett.B 565 (2003) 87-101 - arxiv:hep-ex/0302025

Beams: p+ e+, e+ p+, p+ e-, e- p+

Beam energies: (920.0, 27.5); (27.5, 920.0); (920.0, 27.5); (27.5, 920.0); (820.0, 27.5); (27.5, 820.0); (820.0, 27.5); (27.5, 820.0)GeV

Run details: - e±p deep inelastic scattering with p at 920~GeV, e± at 27.5 GeV $\sqrt{s} = 318~\GeV$

Dijet angular distributions of photoproduction events in which a D meson is produced in association with one of two energetic jets have been measured with the ZEUS detector at HERA, using an integrated luminosity of 120 pb−1. Differential cross sections as a function of the angle between the charm-jet and the proton-beam direction in the dijet rest frame have been measured for samples enriched in direct or resolved photon events. The results are compared with predictions from leading-order parton-shower Monte Carlo models and with next-to-leading-order QCD calculations. The angular distributions show clear evidence for the existence of charm originating from the photon.

Source code:ZEUS_2003_I613625.cc

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

namespace Rivet {


  /// @brief Dijet angular distributions in photoproduction of charm
  class ZEUS_2003_I613625 : public Analysis {
  public:

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(ZEUS_2003_I613625);


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

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

      // Projections
      const DISFinalState dfs(DISFrame::LAB);
      declare(dfs, "dfs");

      declare(FastJets(dfs, JetAlg::KT, 1.0), "Jets");

      declare(UnstableParticles(Cuts::abspid == 413), "DStars");

      // Table 1 T1, F2
      book(_h["X_Obs_Gamma"], 1, 1, 1);

      // Table 2 T2, F3
      book(_h["X_Obs_Proton"], 2, 1, 1);

      // Table 3 T3, F4
      book(_h["abs_cos_theta_res"], 3, 1, 1);
      book(_h["abs_cos_theta_dir"], 3, 1, 2);

      // Table 4
      book(_h["cos_theta_res"], 4, 1, 1);
      book(_h["cos_theta_dir"], 4, 1, 2);

    }


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

       // DIS Kinematics & Warnings
      const DISKinematics& kin = apply<DISFinalState>(event, "dfs").kinematics();
      if ( kin.failed() )  vetoEvent;

      const double Q2 = kin.Q2();
      const double W  = sqrt(kin.W2());
      const double y = kin.y();

      // Kinematic cuts on virtuality and inelasticity.
      if ( Q2 >= 1*GeV2 )  vetoEvent;
      if ( !inRange(W, 130*GeV, 280*GeV) )  vetoEvent;
      if ( !inRange(y, 0.19, 0.87) ) vetoEvent; // from the HZTOOL

      const int orientation = kin.orientation();

      // Jets
      const Jets jets = apply<FastJets>(event, "Jets").jetsByPt(Cuts::abseta < 2.4 && Cuts::pT > 5*GeV);
      if (jets.size() < 2)  vetoEvent;

      // Vector of DStars
      const Particles dstars = apply<ParticleFinder>(event, "DStars").particles(Cuts::pT > 3*GeV && Cuts::abseta < 1.5);

      // Veto if no DStars
      if (dstars.empty())  vetoEvent;

      // Define leading jets
      const double dr1 = deltaR(jets[0], dstars[0]);
      const double dr2 = deltaR(jets[1], dstars[0]);
      if (dr1 >= 1.0 && dr2 >= 1.0)  vetoEvent;
      const Jet& j1 = jets[dr1<dr2? 0 : 1];
      const Jet& j2 = jets[dr1<dr2? 1 : 0];

      // Define jet eta (with orientations)
      const double eta1 = orientation*j1.eta(), eta2 = orientation*j2.eta();
      const double phi1 = orientation*j1.phi(), phi2 = orientation*j2.phi();

      // Same definitions issue as the 2000 ZEUS paper, where the definition
      // is actually a sum over all jet energies and pseudorapities, rather than 2
      const double x_gamma = (j1.Et() * exp(-eta1) + j2.Et() * exp(-eta2)) / (2*kin.y()*kin.beamLepton().E());

      const double x_proton = (j1.Et() * exp(eta1) + j2.Et() * exp(eta2)) / (2*kin.beamHadron().E());

      // Define cos_theta_star
      const double cos_theta = tanh(0.5*(eta1 - eta2));

      // Define Mjj (using Et mean here as I am not certain what Et jet is supposed to be) check!!
      //const double mjj = 2.0 * j1.Et() * j2.Et() / sqrt( 1.0 - sqr(cos_theta) );
      const double mjj = sqrt(2.0 * j1.Et() * j2.Et() * (cosh(eta1-eta2) - cos(phi1-phi2)) );

      //cut with Mjj
      if (mjj < 18*GeV) vetoEvent;

      // Define eta_bar
      const double eta_bar = 0.5*(eta1 + eta2);

      // eta_bar cut
      if (abs(eta_bar) > 0.7) vetoEvent;

      _h["X_Obs_Gamma"]->fill(x_gamma);
      _h["X_Obs_Proton"]->fill(x_proton);
      if (x_gamma < 0.75) {
        _h["abs_cos_theta_res"]->fill(abs(cos_theta));
        _h["cos_theta_res"]->fill(cos_theta);
      }
      else {
        _h["abs_cos_theta_dir"]->fill(abs(cos_theta));
        _h["cos_theta_dir"]->fill(cos_theta);
      }
    }



    /// Normalise histograms etc., after the run
    void finalize() {
      scale(_h, crossSection()/nanobarn/sumW());
    }

    /// @}


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

  };


  RIVET_DECLARE_PLUGIN(ZEUS_2003_I613625);

}