## main325

Back to index.

    // main325.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:
    //            Christine O Rasmussen

    // Keywords:
    //            Diffraction
    //            Z production

    // The y, pT, x_Pomeron and t distributions for forward Z bosons at the LHC,
    // within the hard diffraction framework for an inclusive event sample.
    // Tests the impact of successive requirements.

    #include "Pythia8/Pythia.h"

    using namespace Pythia8;

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

    int main() {

      // Create Pythia instance. Shorthand for event and info.
      Pythia pythia;
      Event& event = pythia.event;
      const Info& info = pythia.info;

      // Set it up to generate Z's at 8 TeV.
      pythia.readString("Beams:eCM = 8000.");
      pythia.readString("WeakSingleBoson:ffbar2gmZ = on");
      pythia.readString("23:mMin = 70.");
      pythia.readString("23:mMax = 110.");

      // Setup of diffractive framework.
      pythia.readString("Diffraction:doHard = on");
      pythia.readString("Diffraction:sampleType = 1");
      pythia.readString("SigmaDiffractive:PomFlux = 5");
      pythia.readString("PDF:PomSet = 6");

      // Simplify printout.
      pythia.readString("Init:showChangedSettings = off");
      pythia.readString("Init:showChangedParticleData = off");
      pythia.readString("Init:showMultipartonInteractions = off");
      pythia.readString("Next:numberShowInfo = 0");
      pythia.readString("Next:numberShowProcess = 0");
      pythia.readString("Next:numberShowEvent = 0");
      pythia.readString("Next:showScaleAndVertex = off");

      // Switch off hadronization, since not used here.
      pythia.readString("HadronLevel:all = off");

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

      // Collect information on the number of diffractive events
      int maxEvent      = 5000;
      int nDiffA        = 0;
      int nDiffB        = 0;
      int nReducedDiffA = 0;
      int nReducedDiffB = 0;

      // Histograms.
      Hist y0("dN/dy inclusive",               100, -5.,   5.);
      Hist y1("dN/dy after PDF selection",     100, -5.,   5.);
      Hist y2("dN/dy after MPI selection",     100, -5.,   5.);
      Hist pT0("dN/dpTZ inclusive",            100,  0., 100.);
      Hist pT1("dN/dpTZ after PDF selection",  100,  0., 100.);
      Hist pT2("dN/dpTZ after MPI selection",  100,  0., 100.);
      Hist xP1("dN/dxPom after PDF selection", 100,  0.,   1.);
      Hist xP2("dN/dxPom after MPI selection", 100,  0.,   1.);
      Hist tP1("dN/dt after PDF selection",    100, -2.,   0.);
      Hist tP2("dN/dt after MPI selection",    100, -2.,   0.);

      // Begin event loop. Generate event; skip if generation failed.
      for (int iEvent = 0; iEvent < maxEvent; ++iEvent) {
        if (!pythia.next()) continue;

        // Locate the Z0 and find its y and pT.
        int iZ = 0;
        for (int i = 0; i < event.size(); ++i) if (event[i].id() == 23) iZ = i;
        double yZ  = event[iZ].y();
        double pTZ = event[iZ].pT();
        y0.fill( yZ );
        pT0.fill( pTZ );

        // Find diffractive events. Histogram y and pT.
        if ( info.isHardDiffractiveA() == 1 || info.isHardDiffractiveB() == 1) {
          y1.fill( yZ );
          pT1.fill( pTZ );
          if (info.nMPI() == 1) {
            y2.fill( yZ );
            pT2.fill( pTZ );
          }

          // Statistics and histogram on x_Pomeron and t.
          if ( info.isHardDiffractiveA() == 1) {
            ++nDiffA;
            xP1.fill( info.xPomeronB() );
            tP1.fill( info.tPomeronB() );
            if (info.nMPI() == 1) {
              ++nReducedDiffA;
              xP2.fill( info.xPomeronB() );
              tP2.fill( info.tPomeronB() );
            }
          }
          else if ( info.isHardDiffractiveB() == 1) {
            ++nDiffB;
            xP1.fill( info.xPomeronA() );
            tP1.fill( info.tPomeronA() );
            if (info.nMPI() == 1) {
              ++nReducedDiffB;
              xP2.fill( info.xPomeronA() );
              tP2.fill( info.tPomeronA() );
            }
          }
        }

      // End of event loop. Statistics on event generation.
      }
      pythia.stat();

      // Statistics on diffraction.
      cout << "Side A is MPI-unchecked diffractive : " << nDiffA << endl;
      cout << "Side A is MPI-checked diffractive   : " << nReducedDiffA << endl;
      cout << "Side B is MPI-unchecked diffractive : " << nDiffB << endl;
      cout << "Side B is MPI-checked diffractive   : " << nReducedDiffB << endl;
      cout << "Total MPI-unchecked diffractive events : " << fixed
           << setprecision(2) << (nDiffA + nDiffB) / double(maxEvent) * 100.
           << "%" << endl;
      cout << "Total MPI-checked diffractive events : "
           << (nReducedDiffA + nReducedDiffB) / double(maxEvent) * 100.
           << "%" << endl;

      // Histograms.
      cout << y0 << y1 << y2 << pT0 << pT1 << pT2 << xP1 << xP2 << tP1 << tP2;

      return 0;
    }