## main507

Back to index.

    // main507.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:
    //            Nishita Desai

    // Keywords:
    //            Jet finding
    //            Fastjet
    //            BSM
    //            Dark matter

    // This is a simple test program to study jets in Dark Matter production.

    #include "Pythia8/Pythia.h"
    #include "fastjet/PseudoJet.hh"
    #include "fastjet/ClusterSequence.hh"

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

    using namespace Pythia8;

    int main() {

      // Generator. Process selection.
      Pythia pythia;
      pythia.readFile("main507.cmnd");

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

      // Event (process) shorthand.
      Event& process = pythia.process;

      // Fastjet analysis - select algorithm and parameters.
      double Rparam = 0.4;
      fastjet::Strategy               strategy = fastjet::Best;
      fastjet::RecombinationScheme    recombScheme = fastjet::E_scheme;
      fastjet::JetDefinition          jetDef =
        fastjet::JetDefinition( fastjet::kt_algorithm, Rparam,
          recombScheme, strategy);

      // Fastjet input.
      std::vector <fastjet::PseudoJet> fjInputs;

      // Histograms. Error counter.
      Hist pTj("dN/dpTj", 100, 0., 100.);
      Hist mRec("mRec", 100, 0., 1000.);
      int iErr = 0;

      // Begin event loop. Generate event. Skip if error.
      for (int iEvent = 0; iEvent < 1000; ++iEvent) {
        if (!pythia.next()) {
          if (++iErr < 100) continue;
          else {
            cout << "Too many errors" << endl;
            break;
          }
        }

        // Invariant mass of DM system.
        Vec4 mRes = process[5].p() + process[6].p();
        mRec.fill(mRes.mCalc());

        // Keep track of missing ET.
        Vec4 missingETvec;
        fjInputs.clear();

        // Loop over event record to decide what to pass to FastJet.
        for (int i = 0; i < pythia.event.size(); ++i) {
          // Final state only.
          if (!pythia.event[i].isFinal()) continue;

          // No neutrinos or DM.
          if ( pythia.event[i].idAbs() == 12 || pythia.event[i].idAbs() == 14
            || pythia.event[i].idAbs() == 16 || pythia.event[i].idAbs() == 52)
            continue;

          // Only |eta| < 3.6.
          if (abs(pythia.event[i].eta()) > 3.6) continue;

          // Missing ET.
          missingETvec += pythia.event[i].p();

          // Store as input to Fastjet.
          fjInputs.push_back( fastjet::PseudoJet( pythia.event[i].px(),
            pythia.event[i].py(), pythia.event[i].pz(), pythia.event[i].e() ) );
        }

        // Check that event contains analyzable particles.
        if (fjInputs.size() == 0) {
          cout << "Error: event with no final state particles" << endl;
          continue;
        }

        // Run Fastjet algorithm.
        vector <fastjet::PseudoJet> inclusiveJets, sortedJets;
        fastjet::ClusterSequence clustSeq(fjInputs, jetDef);

        // Extract inclusive jets sorted by pT (note minimum pT of 20.0 GeV).
        inclusiveJets = clustSeq.inclusive_jets(20.0);
        sortedJets    = sorted_by_pt(inclusiveJets);

        if(sortedJets.size() < 1) {
          // cout << " No jets found in event " << iEvent << endl;
          continue;
        }
        pTj.fill( sortedJets[0].pt() );

      // End of event loop. Statistics. Histogram.
      }
      pythia.stat();
      cout << pTj;

      // Done.
      return 0;
    }