## main441

Back to index.

    // main441.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:
    //            Christian Bierlich

    // Keywords:
    //            Hadronization
    //            Colour reconnection
    //            String shoving

    // This program provides a demonstration of the string shoving model supplied
    // in the Rope Hadronization framework. It produces four histograms
    // showing the emergence of a "ridge" in two-particle correlations at high
    // event multiplicity.
    // No kind of background subtraction, event mixing, triggering or similar
    // is done is this simple demonstration analysis. It should therefore not be
    // taken as anything but a proof of concept.

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

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

    int main() {

      // Generator. Process selection.
      Pythia pythia;
      pythia.readString("Beams:eCM = 7000.");
      pythia.readString("SoftQCD:nonDiffractive = on");
      pythia.readString("Next:numberShowEvent = 0");

      // Enabling string shoving, setting model parameters.
      // The model is still untuned. These parameter values
      // are chosen for illustrative purposes.
      pythia.readString("Ropewalk:RopeHadronization = on");
      pythia.readString("Ropewalk:doShoving = on");
      pythia.readString("Ropewalk:doFlavour = off");
      pythia.readString("Ropewalk:rCutOff = 10.0");
      pythia.readString("Ropewalk:limitMom = on");
      pythia.readString("Ropewalk:pTcut = 2.0");
      pythia.readString("Ropewalk:r0 = 0.41");
      pythia.readString("Ropewalk:m0 = 0.2");
      pythia.readString("Ropewalk:gAmplitude = 10.0");
      pythia.readString("Ropewalk:gExponent = 1.0");
      pythia.readString("Ropewalk:deltat = 0.1");
      pythia.readString("Ropewalk:tShove = 1.");
      pythia.readString("Ropewalk:deltay = 0.1");
      pythia.readString("Ropewalk:tInit = 1.5");

      // Enabling setting of vertex information.
      pythia.readString("PartonVertex:setVertex = on");
      pythia.readString("PartonVertex:protonRadius = 0.7");
      pythia.readString("PartonVertex:emissionWidth = 0.1");

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

      // Histograms.
      Hist deltaPhi1("dPhi, 0 < Nch < 20", 16, -M_PI/2., 3.);
      Hist deltaPhi2("dPhi, 20 < Nch < 40", 16, -M_PI/2., 3.);
      Hist deltaPhi3("dPhi, 40 < Nch < 60", 16, -M_PI/2., 3.);
      Hist deltaPhi4("dPhi, 60 < Nch < 120", 16, -M_PI/2., 3.);

      // Note: High statistics is needed to fill the high multiplicity
      // histogram.
      const int nEvent = 10000;

      // Begin event loop. Generate event. Skip if error. List first one.
      for (int iEvent = 0; iEvent < nEvent; ++iEvent) {
        if (!pythia.next()) continue;
        // Event short notation.
        Event& event = pythia.event;

        // First we find the particles we need for the analysis,
        // as well as event multiplicity.
        vector<Particle*> parts;
        int mult = 0;
        for (int i = 0; i < event.size(); ++i){
            // Particle short notation
            Particle& p = event[i];
            // Apply simple, particle level, cuts.
            if(p.isFinal() && p.isCharged() && abs(p.eta()) < 2.5 &&
              p.pT() > 0.5){
                    ++mult;
                    if(p.pT() > 1.0 && p.pT() < 3.0)
                      parts.push_back(&p);

            }
        }

        // We discard events outside multiplicity bounds.
        int np = parts.size();
        if(mult < 2) continue;

        // We loop over all particle pairs.
        for (int i = 0; i < np; ++i)
          for(int j = 0; j < np; ++j) {
            // Skip if same particle.
            if( i == j) continue;
            // The distance in eta between the pair.
            double dEta = abs(parts[i]->eta() - parts[j]->eta());
            if(dEta < 4 && dEta > 2){
              // Calculate the phase difference.
              double dPhi = parts[i]->phi() - parts[j]->phi();
              while (dPhi < -M_PI/2) dPhi += 2*M_PI;
              while (dPhi > 3*M_PI/2) dPhi -= 2*M_PI;
              if(mult <= 20)
                deltaPhi1.fill(dPhi);
              else if(mult <= 40)
                deltaPhi2.fill(dPhi);
              else if(mult <= 60)
                deltaPhi3.fill(dPhi);
              else
                deltaPhi4.fill(dPhi);
            }
          }

      // End of event loop. Statistics. Histogram. Done.
      }
      pythia.stat();
      cout << deltaPhi1 << deltaPhi2 << deltaPhi3 << deltaPhi4;
      return 0;
    }