## main248

Back to index.

    // main248.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:
    //            Steve Mrenna

    // Keywords:
    //            Command file
    //            User hook

    // This is a simple test program.
    // It illustrates how to filter resonance decay products to obtain a certain
    // final state.
    //     ./main248 -c main248.cmnd
    // If no command-file is provided, a default is used.

    #include "Pythia8/Pythia.h"
    #include "Pythia8Plugins/InputParser.h"
    #include "Pythia8Plugins/ResonanceDecayFilterHook.h"

    using namespace Pythia8;

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

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

      // Set up command line options.
      InputParser ip("Filters a resonance decay.",
        {"./main248", "./main248 -c main248.cmnd"});
      ip.add("c", "main248.cmnd", "Use this user-written command file.",
        {"-cmnd"});

      // Initialize the parser and exit if necessary.
      InputParser::Status status = ip.init(argc, argv);
      if (status != InputParser::Valid) return status;

      // Generator. Shorthand for the event.
      Pythia pythia;

      // Set user hook. Hook properties set in the .cmnd file.
      auto myUserHooks = make_shared<ResonanceDecayFilterHook>(pythia.settings);
      pythia.setUserHooksPtr( myUserHooks);
      pythia.readFile(ip.get<string>("c"));

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

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

      int iAbort = 0;
      for (int iEvent = 0; iEvent < nEvent; ++iEvent) {

        // Generate events. Quit if too many failures.
        if (!pythia.next()) {
          if (++iAbort < nAbort) continue;
          cout << " Event generation aborted prematurely, owing to error!\n";
          break;
        }

      // End of event loop.
      }

      // Final statistics.
      pythia.stat();
      double filterEfficiency = (double) pythia.info.getCounter(4)
        / (double) myUserHooks->returnCounter();

      // Expected filter rate.
      ParticleDataEntryPtr particlePtr =
        pythia.particleData.particleDataEntryPtr(24);
      double br_lepton(0.0);
      br_lepton += particlePtr->channel(6).bRatio();
      br_lepton += particlePtr->channel(7).bRatio();
      br_lepton += particlePtr->channel(8).bRatio();
      double exactFilter = 2.0*br_lepton*(1.0-br_lepton);

      // Compare filter rates.
      cout << "\n ResonanceDecayFilterHook efficiency = " << filterEfficiency
           << endl;
      cout << " on-shell theoretical efficiency     = " << exactFilter << endl;

      // Done.
      return 0;
    }