## main42

Back to index.

    // main42.cc is a part of the PYTHIA event generator.
    // Copyright (C) 2024 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:
    //            Mikhail Kirsanov

    // Keywords:
    //            Basic usage
    //            Command file
    //            Command line option
    //            Hepmc
    //            LHE file

    // This program illustrates how a file with HepMC events
    // can be generated by Pythia8.
    // Input and output files are specified on the command line, e.g. like
    // ./main42.exe main42.cmnd hepmcout42.dat > out
    // The main program contains no analysis; this is intended to happen later.
    // It therefore "never" has to be recompiled to handle different tasks.

    // WARNING: typically one needs 25 MB/100 events at the LHC.
    // Therefore large event samples may be impractical.

    #include "Pythia8/Pythia.h"
    #ifndef HEPMC2
    #include "Pythia8Plugins/HepMC3.h"
    #else
    #include "Pythia8Plugins/HepMC2.h"
    #endif

    using namespace Pythia8;

    int main(int argc, char* argv[]) {

      // Check that correct number of command-line arguments
      if (argc != 3) {
        cerr << " Unexpected number of command-line arguments. \n You are"
             << " expected to provide one input and one output file name. \n"
             << " Program stopped! " << endl;
        return 1;
      }

      // Check that the provided input name corresponds to an existing file.
      ifstream is(argv[1]);
      if (!is) {
        cerr << " Command-line file " << argv[1] << " was not found. \n"
             << " Program stopped! " << endl;
        return 1;
      }

      // Confirm that external files will be used for input and output.
      cout << "\n >>> PYTHIA settings will be read from file " << argv[1]
           << " <<< \n >>> HepMC events will be written to file "
           << argv[2] << " <<< \n" << endl;

      // Interface for conversion from Pythia8::Event to HepMC event.
      // Specify file where HepMC events will be stored.
      Pythia8ToHepMC toHepMC(argv[2]);

      // Generator.
      Pythia pythia;

      // Read in commands from external file.
      pythia.readFile(argv[1]);

      // Extract settings to be used in the main program.
      int    nEvent    = pythia.mode("Main:numberOfEvents");
      int    nAbort    = pythia.mode("Main:timesAllowErrors");

      // Initialization.
      pythia.init();

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

        // Generate event.
        if (!pythia.next()) {

          // If failure because reached end of file then exit event loop.
          if (pythia.info.atEndOfFile()) {
            cout << " Aborted since reached end of Les Houches Event File\n";
            break;
          }

          // First few failures write off as "acceptable" errors, then quit.
          if (++iAbort < nAbort) continue;
          cout << " Event generation aborted prematurely, owing to error!\n";
          break;
        }

        // Construct new empty HepMC event, fill it and write it out.
        toHepMC.writeNextEvent( pythia );

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

      // Done.
      return 0;
    }