main373

Back to index.

// main373.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:
//            Torbjörn Sjöstrand

// Keywords:
//            Top
//            Toponium

// Energy dependence of the total cross section in the threshold region
// of e+e- -> gamma*/Z0 -> t tbar.

// Special case for comparison with Fig. 1 of Hoang et al. review,
// A. H. Hoang et al., "Top - anti-top pair production close to threshold:
// Synopsis of recent NNLO results," Eur. Phys. J. direct 2 (2000), no. 1, 3,
// hep-ph/0001286,
// but note that the definition of top mass is ambiguous.

// Study five variations of the basic cross section calculations.
// 0 = Born, 1 = Coulomb, 2 = narrow Green, 3 = narrow top, 4 = both wide.

#include "Pythia8/Pythia.h"
using namespace Pythia8;


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

int main() {

  // Include initial-state QED radiation or not.
  bool doQEDISR = true;

  // Only allow gamma* exchange to be able to define classic R ratio.
  bool gammaOnly = false;

  // Special comparison with Hoang et al. (overrides two switches above).
  bool compareHoang = false;

  // Number of events per model and energy point.
  // (More statistics needed for smooth behaviour, so this is start only.)
  int nEvent = 1000;

  // Scenarios. Common base parameters.
  constexpr int nca = 5;
  int topModelSel[nca] = { 0, 1, 3, 3, 2};
  double gammatGr[nca] = { 0.001, 0.001, 0.02, 1.32, 1.34};
  double mt              = 172.5;
  double gammat          = 1.34;
  double thresholdRegion = 10.;
  int    alphasOrder     = 2;
  double alphasValue     = 0.118;

   // Histogram and its range.
  Hist sigmaE[nca], ratioE[nca];
  int nEcm    = 100;
  double eMin = 340.;
  double eMax = 350.;

  // Overwrite as relevant for comparison with Hoang et al.
  if (compareHoang) {
    doQEDISR    = false;
    gammaOnly   = true;
    mt          = 175.05;
    gammat      = 1.43;
    gammatGr[3] = 1.41;
    gammatGr[4] = 1.43;
    nEcm        = 80;
    eMin        = 344.;
    eMax        = 352.;
  }

  // Loop over various mass smearing options.
  for (int ica = 0; ica < nca; ++ica) {
    int    topModel    = topModelSel[ica];
    double gammatGreen = gammatGr[ica];

    // Book histograms.
    sigmaE[ica].book( "sigma(energy)", nEcm, eMin, eMax);
    ratioE[ica].book( "R(energy)", nEcm, eMin, eMax);

    // Loop over collision energies.
    for (int iEcm = 0; iEcm < nEcm; ++iEcm) {
      double eCM = eMin + (iEcm + 0.5) * (eMax - eMin) / nEcm;

      // Create generator without showing header.
      Pythia pythia("../share/Pythia8/xmldoc", false);

      // Process and kinematics setup.
      pythia.readString("Top:ffbar2ttbar(s:gmZ) = on");
      if (gammaOnly) pythia.readString("WeakZ0:gmZmode = 1");
      pythia.readString("Beams:idA = -11");
      pythia.readString("Beams:idB = 11");
      pythia.settings.parm("Beams:eCM", eCM);
      pythia.readString("PhaseSpace:mHatMin = 300.");

      // Feed in desired values.
      pythia.settings.mode("TopThreshold:model", topModel);
      pythia.particleData.m0(6, mt);
      pythia.readString("6:doForceWidth = true");
      pythia.particleData.mWidth( 6, gammat);
      pythia.settings.parm("TopThreshold:tWidthGreen", gammatGreen);
      pythia.settings.parm("TopThreshold:thrRegion", thresholdRegion);
      pythia.settings.mode("TopThreshold:alphasOrder", alphasOrder);
      pythia.settings.parm("TopThreshold:alphasValue", alphasValue);

      // Switch off (most) code parts not relevant here.
      pythia.readString("PartonLevel:ISR = off");
      pythia.readString("PartonLevel:FSR = off");
      pythia.readString("PartonLevel:MPI = off");
      pythia.readString("HadronLevel:all = off");
      if (!doQEDISR) pythia.readString("PDF:lepton = off");

      // Reduce printout.
      pythia.readString("Init:showProcesses = off");
      pythia.readString("Init:showChangedSettings = off");
      pythia.readString("Init:showChangedParticleData = off");
      pythia.readString("Next:numberCount = 1000000");
      pythia.readString("Next:numberShowInfo = 0");
      pythia.readString("Next:numberShowProcess = 0");
      pythia.readString("Next:numberShowEvent = 0");

      // Loop to next energy if Pythia fails to initialize.
      if (!pythia.init()) continue;

      // Event loop. Generate events.
      for (int iEvent = 0; iEvent < nEvent; ++iEvent)
        if (!pythia.next()) continue;

      // Histogram cross section at given energy.
      double sigmaGen = 1e9 * pythia.info.sigmaGen();
      sigmaE[ica].fill( eCM, sigmaGen);

      // Normalize to the pointlike QED cross section.
      // Note: the sigma and R curves seem almost identical, but have
      // different dimensions: by coincidence the point cross section
      // times the squared top charge is surprisingly close to 1 pb.
      double sigmaPoint = GEVSQINV2MB * 4. * M_PI * pow2(pythia.info.alphaEM())
        / (3. * pow2(eCM));
      double sigmaNorm = pythia.info.sigmaGen() / sigmaPoint;
      ratioE[ica].fill( eCM, sigmaNorm);

    // End of energy and options loops.
    }
  }

  // Plot histograms.
  string linest[nca] = {
    "-,blue", "--,red", "-,black", "--,magenta", "-.,olive"};
  string captst[nca] = {
    "Born", "Coulomb", "narrow Green", "narrow top", "both broad"};
  HistPlot hpl("plot373");
  hpl.frame("fig373", "", "$E_{\\mathrm{CM}}$ (GeV)",
    "$\\sigma(E_{\\mathrm{CM}})$ (pb)", 6.4, 4.8);
  for (int ica = 0; ica < nca; ++ica)
    hpl.add( sigmaE[ica], linest[ica], captst[ica]);
  hpl.plot();
  hpl.frame("", "", "$E_{\\mathrm{CM}}$ (GeV)",
    "$R(E_{\\mathrm{CM}})$", 6.4, 4.8);
  for (int ica = 0; ica < nca; ++ica)
    hpl.add( ratioE[ica], linest[ica], captst[ica]);
  hpl.plot();

  // Done.
  return 0;
}