## main345

Back to index.

    // main345.cc is a part of the PYTHIA event generator.
    // Copyright (C) 2026 Torbjorn Sjostrand.
    // PYTHIA is licenced under the GNU GPL v2 or later, see COPYING for details.
    // Please respect the MCnet Guidelines, see GUIDELINES for details.

    // Authors:
    //            Ilkka Helenius

    // Keywords:
    //            Photon beam
    //            UPC
    //            Photoproduction
    //            Exclusive

    // Main program to demonstrate how to generate different types of
    // photon-initiated dilepton events in proton-proton collisions.

    #include "Pythia8/Pythia.h"

    using namespace Pythia8;

    //==========================================================================

    // The main program.

    int main() {

      // Generator.
      Pythia pythia;

      // Decrease the output.
      pythia.readString("Init:showChangedSettings = off");
      pythia.readString("Init:showChangedParticleData = off");
      pythia.readString("Next:numberCount = 1000");
      pythia.readString("Next:numberShowInfo = 0");
      pythia.readString("Next:numberShowProcess = 1");
      pythia.readString("Next:numberShowEvent = 1");

      // Beam parameters.
      pythia.readString("Beams:frameType = 1");
      pythia.readString("Beams:eCM = 13000");
      pythia.readString("Beams:idA = 2212");
      pythia.readString("Beams:idB = 2212");

      // Four possible contributions: double-dissociative = 1;
      // single-dissociative on side A (B) = 2 (3); elastic-elastic = 4.
      int processType = 4;

      // Enable elastic photon beams according to processType above.
      // For dissociative beams photons from PDFs (NNPDF2.3 by default) are used.
      if ( processType == 4 || processType == 3 )
        pythia.readString("PDF:beamA2gamma = on");
      if ( processType == 4 || processType == 2 )
        pythia.readString("PDF:beamB2gamma = on");

      // Need to use virtuality dependent photon flux to obtain realistic
      // acoplanarity distribution also for elastic-elastic case.
      pythia.readString("PDF:Proton2gammaSet = 2");

      // Set outgoing lepton-pair id and switch on relevant process.
      int idLep = 13;
      if      (idLep == 11) pythia.readString("PhotonCollision:gmgm2ee = on");
      else if (idLep == 13) pythia.readString("PhotonCollision:gmgm2mumu = on");

      // Need to prepare for MPIs only for double-dissociative production.
      if ( processType != 1 ) pythia.readString("PartonLevel:MPI = off");

      // Use dipole shower as appropriate for the case where no colour connection
      // between remnants.
      pythia.readString("SpaceShower:dipoleRecoil = on");
      pythia.readString("SpaceShower:pTmaxMatch = 2");
      pythia.readString("SpaceShower:pTdampMatch = 1");

      // Kinematical cuts.
      pythia.readString("PhaseSpace:mHatMin = 10.0");

      // Initialize the histogram for acoplanarity.
      Hist acoHist("Acoplanarity of the lepton pair", 30, 0.0, 0.06);

      // If Pythia fails to initialize, exit with error.
      if (!pythia.init()) return 1;

      // Number of events.
      int nEvent = 10000;

      // Begin event loop. Skip if fails.
      for (int iEvent = 0; iEvent < nEvent; ++iEvent) {

        // Generate next event.
        if (!pythia.next()) continue;

        // Event weight.
        double weight = pythia.info.weight();

        // Find the final muons (last ones in the event record).
        int iPosPlus = 0, iPosMinus = 0;
        for (int i = 0; i < pythia.event.size();++i) {
          if (pythia.event[i].id() == idLep) iPosPlus = i;
          if (pythia.event[i].id() == -idLep) iPosMinus = i;
        }

        // Derive 4-momenta of leptons.
        Vec4 p1 = pythia.event[iPosPlus].p();
        Vec4 p2 = pythia.event[iPosMinus].p();

        // Calculate acoplanarity (linear in Delta phi).
        double aco = 1. - abs( p1.phi() - p2.phi() ) / M_PI;

        // Fill histrogram with possible weights.
        acoHist.fill(aco, weight);

      } // End of event loop.

      // Show statistics.
      pythia.stat();

      // Normalize to cross section [fb].
      double sigmaNorm = pythia.info.sigmaGen() / pythia.info.weightSum() * 1.e12;
      acoHist *= sigmaNorm;

      // Print histogram.
      cout << acoHist;

      // Done.
      return 0;
    }