Rivet analyses

Study of quark and gluon jet substructure in Z+jet and dijet events from pp collisions at 13 TeV

Experiment: CMS (LHC)

Inspire ID: 1920187

Status: VALIDATED

Authors: - cms-pag-conveners-smp@cern.ch - Andreas Hinzmann

References: - Expt page: CMS-SMP-20-010 - arXiv: 2109.03340

Beams: p+ p+

Beam energies: (6500.0, 6500.0)GeV

Run details: - QCD with pt>15 or Z -> mu mu

Measurements of jet substructure describing the composition of quark- and gluon-initiated jets are presented. Proton-proton (pp) collision data at sqrt(s)=13 TeV collected with the CMS detector are used, corresponding to an integrated luminosity of 35.9/fb. Generalized angularities are measured that characterize the jet substructure and distinguish quark- and gluon-initiated jets. These observables are sensitive to the distributions of transverse momenta and angular distances within a jet. The analysis is performed using a data sample of dijet events enriched in gluon-initiated jets, and, for the first time, a Z+jet event sample enriched in quark-initiated jets. The observables are measured in bins of jet transverse momentum, and as a function of the jet radius parameter. Each measurement is repeated applying a “soft drop” grooming procedure that removes soft and large angle radiation from the jet.

Source code:CMS_2021_I1920187.cc

// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/DileptonFinder.hh"
#include "Rivet/Projections/FastJets.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/IdentifiedFinalState.hh"
#include "Rivet/Projections/VetoedFinalState.hh"
#include "fastjet/ClusterSequence.hh"
#include "fastjet/JetDefinition.hh"
#include "fastjet/contrib/SoftDrop.hh"
#include "fastjet/tools/Recluster.hh"
#include <algorithm>

namespace Rivet {

  // This analysis uses all the FJ stuff...
  using namespace fastjet;


  /// Routine for QG substructure analysis
  class CMS_2021_I1920187 : public Analysis {
  public:


    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(CMS_2021_I1920187);


    /// Book histograms and initialise projections before the run
    void init() {

      _mode = 0;
      if (getOption("MODE") == "DIJET")
        _mode = 1;
      else if (getOption("MODE") == "ZJET")
        _mode = 2;
      else {
        MSG_WARNING("Mode not specified in CMS_2021_I1920187, using DIJET");
        _mode = 1;
      }

      // Initialise and register projections
      FinalState fs(Cuts::abseta < 5);
      // Z-jet
      if (_mode == 2) {
        // for the muons
        double mu_pt = 26.;
        double mz_min = (90 - 20);
        double mz_max = (90 + 20);
        double eta_max = 2.4;
        DileptonFinder zfinder(fs, 91.2 * GeV, 0.1,
                               Cuts::pT > mu_pt * GeV && Cuts::abseta < eta_max && Cuts::abspid == PID::MUON,
                               Cuts::massIn(mz_min * GeV, mz_max * GeV));
        declare(zfinder, "DileptonFinder");

        eta_max = 2.4;
        FinalState fs_muons(Cuts::abseta < eta_max);
        IdentifiedFinalState muons_noCut(fs_muons, {PID::MUON, PID::ANTIMUON});
        declare(muons_noCut, "MUONS_NOCUT");
        // Particles for the jets
        VetoedFinalState jet_input(fs);
        jet_input.vetoNeutrinos();
        jet_input.addVetoOnThisFinalState(getProjection<DileptonFinder>("DileptonFinder"));
        declare(jet_input, "JET_INPUT");
        _ptBinsGen = {50, 65, 88, 120, 150, 186, 254, 326, 408, 1500};
      }
      // dijet
      else {
        // Particles for the jets
        VetoedFinalState jet_input(fs);
        jet_input.vetoNeutrinos();
        declare(jet_input, "JET_INPUT");
        _ptBinsGen = {50, 65, 88, 120, 150, 186, 254, 326, 408, 481, 614, 800, 1000, 4000};
      }
      // Book histograms
      // resize vectors appropriately
      size_t nHistsRadii = _jetRadii.size();
      size_t nHistsLambda = _lambdaVars.size();
      size_t nHistsPt = _ptBinsGen.size() - 1;

      // Z jet
      if (_mode == 2) {
        _h_zpj.resize(nHistsRadii, vector<vector<Histo1DPtr>>(nHistsLambda, vector<Histo1DPtr>(nHistsPt)));
        _h_zpj_groomed.resize(nHistsRadii,
                              vector<vector<Histo1DPtr>>(nHistsLambda, vector<Histo1DPtr>(nHistsPt)));

        // Now book histos
        // remember 1-indexed

        // yoda plot naming scheme
        // --------------------------------------------------------------------------
        // channel (ak4/8 radii [000, 100] + zjet / dijet cen / fwd [00, 10, 20] + groomed versions [0, 1])
        // lambda variable; neutral+charged & charged-only are treated separately [0000,..,4000]
        // pT bin [00000,..,120000]
        for (size_t radiusInd = 0; radiusInd < _jetRadii.size(); radiusInd++) {
          for (size_t lambdaInd = 0; lambdaInd < _lambdaVars.size(); lambdaInd++) {
            for (size_t ptInd = 0; ptInd < _ptBinsGen.size() - 1; ptInd++) {
              book(_h_zpj[radiusInd][lambdaInd][ptInd],
                   _hepdata_index.at(0 + 100 * radiusInd + 1000 * lambdaInd + 10000 * ptInd), 1, 1);
              book(_h_zpj_groomed[radiusInd][lambdaInd][ptInd],
                   _hepdata_index.at(10 + 100 * radiusInd + 1000 * lambdaInd + 10000 * ptInd), 1, 1);
            }
          }
        }
      }
      // di jet
      else {
        _h_dijet_cen.resize(nHistsRadii,
                            vector<vector<Histo1DPtr>>(nHistsLambda, vector<Histo1DPtr>(nHistsPt)));
        _h_dijet_cen_groomed.resize(nHistsRadii,
                                    vector<vector<Histo1DPtr>>(nHistsLambda, vector<Histo1DPtr>(nHistsPt)));
        _h_dijet_fwd.resize(nHistsRadii,
                            vector<vector<Histo1DPtr>>(nHistsLambda, vector<Histo1DPtr>(nHistsPt)));
        _h_dijet_fwd_groomed.resize(nHistsRadii,
                                    vector<vector<Histo1DPtr>>(nHistsLambda, vector<Histo1DPtr>(nHistsPt)));

        // Now book histos
        // remember 1-indexed

        // yoda plot naming scheme
        // --------------------------------------------------------------------------
        // channel (ak4/8 radii [000, 100] + zjet / dijet cen / fwd [00, 10, 20] + groomed versions [0, 1])
        // lambda variable; neutral+charged & charged-only are treated separately [0000,..,4000]
        // pT bin [00000,..,120000]
        for (size_t radiusInd = 0; radiusInd < _jetRadii.size(); radiusInd++) {
          for (size_t lambdaInd = 0; lambdaInd < _lambdaVars.size(); lambdaInd++) {
            for (size_t ptInd = 0; ptInd < _ptBinsGen.size() - 1; ptInd++) {
              book(_h_dijet_cen[radiusInd][lambdaInd][ptInd],
                   _hepdata_index.at(1 + 100 * radiusInd + 1000 * lambdaInd + 10000 * ptInd), 1, 1);
              book(_h_dijet_cen_groomed[radiusInd][lambdaInd][ptInd],
                   _hepdata_index.at(11 + 100 * radiusInd + 1000 * lambdaInd + 10000 * ptInd), 1, 1);
              book(_h_dijet_fwd[radiusInd][lambdaInd][ptInd],
                   _hepdata_index.at(2 + 100 * radiusInd + 1000 * lambdaInd + 10000 * ptInd), 1, 1);
              book(_h_dijet_fwd_groomed[radiusInd][lambdaInd][ptInd],
                   _hepdata_index.at(12 + 100 * radiusInd + 1000 * lambdaInd + 10000 * ptInd), 1, 1);
            }
          }
        }
      }
    }

    // Get index of largest bin smaller than value in vector
    // e.g. what you'd need when binning a continuous variable
    size_t getBinIndex(float value, const vector<float>& bins) {
      auto itr = std::lower_bound(bins.begin(), bins.end(), value);
      return itr - bins.begin() - 1;
    }

    /// Perform the per-event analysis
    void analyze(const Event& event) {
      // Convert Particles into PseudoJets for clustering
      const VetoedFinalState& fs = apply<VetoedFinalState>(event, "JET_INPUT");
      const Particles& fsParticles = fs.particles();
      vector<PseudoJet> particles;
      particles.reserve(fsParticles.size());
      for (size_t iFS = 0; iFS < fsParticles.size(); iFS++) {
        PseudoJet p = fsParticles[iFS].pseudojet();
        p.set_user_index(fsParticles[iFS].isCharged()); // for later reference to charge
        particles.push_back(p);
      }

      // z jet
      if (_mode == 2) {
        for (size_t radiusInd = 0; radiusInd < _jetRadii.size(); radiusInd++) {
          float jetRadius = _jetRadii.at(radiusInd);

          JetDefinition jet_def(antikt_algorithm, jetRadius);
          vector<PseudoJet> jets = (SelectorPtMin(15))(jet_def(particles));

          const FinalState& muons = apply<IdentifiedFinalState>(event, "MUONS_NOCUT");
          if (muons.size() >= 2) {
            Particle muon1 = muons.particlesByPt()[0];
            Particle muon2 = muons.particlesByPt()[1];
            FourMomentum z = muon1.momentum() + muon2.momentum();
            if (jets.size() > 0) {
              PseudoJet jet1 = jets[0];
            }
          }

          // Reconstruct Z
          const DileptonFinder& zfinder = apply<DileptonFinder>(event, "DileptonFinder");
          if (zfinder.bosons().size() < 1) continue;

          const Particle& z = zfinder.bosons()[0];
          double zpt = z.pt();

          // Now do selection criteria
          bool passZpJ = false;
          if (jets.size() < 1) continue;
          PseudoJet jet1 = jets[0];
          float jet1pt = jet1.pt();
          float asym = fabs((jet1pt - zpt) / (jet1pt + zpt));
          float dphi = Rivet::deltaPhi(jet1.phi(), z.phi());
          passZpJ = ((fabs(jet1.rapidity()) < 1.7) && (zpt > 30) && (asym < 0.3) && (dphi > 2.0));

          if (!passZpJ) continue;

          // Now calculate lambda variables and fill hists

          // Simplify life - ignore this jet if it is below 1st hist pt range
          // Note that we don't apply it to the original jet pt cut - since
          // we have phase space where one jet is > 50, and one < 50
          if (jet1pt < _ptBinsGen[0]) continue;
          // ignore jet if beyond the last bin
          if (jet1pt > _ptBinsGen.back()) continue;

          // Need to use original, ungroomed jet pT to bin
          size_t ptBinInd = getBinIndex(jet1pt, _ptBinsGen);

          // UNGROOMED VERSION
          // -------------------------------------------------------------------
          vector<PseudoJet> chargedParticles;
          for (size_t iC = 0; iC < jet1.constituents().size(); iC++)
            if (jet1.constituents()[iC].user_index()) chargedParticles.push_back(jet1.constituents()[iC]);
          vector<PseudoJet> chargedJets = jet_def(chargedParticles);

          // Fill hists for each lambda variable
          for (size_t lambdaInd = 0; lambdaInd < _lambdaVars.size(); lambdaInd++) {
            const LambdaVar& thisLambdaVar = _lambdaVars[lambdaInd];
            Angularity angularity(thisLambdaVar.beta, jetRadius, thisLambdaVar.kappa,
                                  thisLambdaVar.constitCut);
            float val = -1;
            if (thisLambdaVar.isCharged)
              val = (chargedJets.size() > 0) ? angularity(chargedJets[0]) : -1;
            else
              val = angularity(jet1);
            if (val < 0) continue;
            _h_zpj[radiusInd][lambdaInd][ptBinInd]->fill(val);
          }

          // GROOMED VERSION
          // -------------------------------------------------------------------
          // Get groomed jet
          fastjet::contrib::SoftDrop sd(0, 0.1, jetRadius);
          PseudoJet groomedJet = sd(jet1);
          PseudoJet groomedJetCharged;
          if (chargedJets.size() > 0) groomedJetCharged = sd(chargedJets[0]);

          // Fill hists for each lambda variable
          for (size_t lambdaInd = 0; lambdaInd < _lambdaVars.size(); lambdaInd++) {
            const LambdaVar& thisLambdaVar = _lambdaVars[lambdaInd];
            Angularity angularity(thisLambdaVar.beta, jetRadius, thisLambdaVar.kappa,
                                  thisLambdaVar.constitCut);
            float val = -1;
            if (thisLambdaVar.isCharged)
              val = (chargedJets.size() > 0) ? angularity(groomedJetCharged) : -1;
            else
              val = angularity(groomedJet);
            if (val < 0) continue;
            _h_zpj_groomed[radiusInd][lambdaInd][ptBinInd]->fill(val);
          }
        } // end loop over jet radii
      }
      // di jet
      else {
        for (size_t radiusInd = 0; radiusInd < _jetRadii.size(); radiusInd++) {
          float jetRadius = _jetRadii.at(radiusInd);

          JetDefinition jet_def(antikt_algorithm, jetRadius);
          vector<PseudoJet> jets = (SelectorNHardest(2) * SelectorPtMin(15))(jet_def(particles));

          bool passDijet = false;
          if (jets.size() < 2) continue;
          const auto& jet1 = jets.at(0);
          const auto& jet2 = jets.at(1);
          float jet1pt = jet1.pt();
          float jet2pt = jet2.pt();
          float asym = (jet1pt - jet2pt) / (jet1pt + jet2pt);
          float dphi = Rivet::deltaPhi(jet1.phi(), jet2.phi());
          passDijet = ((fabs(jet1.rapidity()) < 1.7) && (fabs(jet2.rapidity()) < 1.7) && (asym < 0.3)
                       && (dphi > 2.0));

          if (!passDijet) continue;

          // Sort by increasing absolute rapidity
          vector<PseudoJet> dijets = {jet1, jet2};
          std::sort(dijets.begin(), dijets.end(), [](const PseudoJet& A, const PseudoJet& B) {
            return fabs(A.rapidity()) < fabs(B.rapidity());
          });

          for (size_t iJ = 0; iJ < dijets.size(); iJ++) {
            bool isCentral = (iJ == 0);
            PseudoJet& jetItr = dijets[iJ];

            // Simplify life - ignore this jet if it is below 1st hist pt range
            // Note that we don't apply it to the original jet pt cut - since
            // we have phase space where one jet is > 50, and one < 50
            if (jetItr.pt() < _ptBinsGen[0]) continue;
            // ignore jet if beyond the last bin
            if (jetItr.pt() > _ptBinsGen.back()) continue;

            // Need to use original, ungroomed jet pT to bin
            size_t ptBinInd = getBinIndex(jetItr.pt(), _ptBinsGen);

            // UNGROOMED VERSION
            // -------------------------------------------------------------------
            vector<PseudoJet> chargedParticles;
            for (size_t iC = 0; iC < jetItr.constituents().size(); iC++)
              if (jetItr.constituents()[iC].user_index())
                chargedParticles.push_back(jetItr.constituents()[iC]);
            vector<PseudoJet> chargedJets = jet_def(chargedParticles);

            // Fill hists for each lambda variable
            for (size_t lambdaInd = 0; lambdaInd < _lambdaVars.size(); lambdaInd++) {
              const LambdaVar& thisLambdaVar = _lambdaVars[lambdaInd];
              Angularity angularity(thisLambdaVar.beta, jetRadius, thisLambdaVar.kappa,
                                    thisLambdaVar.constitCut);
              float val = -1;
              if (thisLambdaVar.isCharged)
                val = (chargedJets.size() > 0) ? angularity(chargedJets[0]) : -1;
              else
                val = angularity(jetItr);
              if (val < 0) continue;

              if (isCentral) {
                _h_dijet_cen[radiusInd][lambdaInd][ptBinInd]->fill(val);
              }
              else {
                _h_dijet_fwd[radiusInd][lambdaInd][ptBinInd]->fill(val);
              }
            }

            // GROOMED VERSION
            // -------------------------------------------------------------------
            // Get groomed jet
            fastjet::contrib::SoftDrop sd(0, 0.1, jetRadius);
            PseudoJet groomedJet = sd(jetItr);
            PseudoJet groomedJetCharged;
            if (chargedJets.size() > 0) groomedJetCharged = sd(chargedJets[0]);

            // Fill hists for each lambda variable
            for (size_t lambdaInd = 0; lambdaInd < _lambdaVars.size(); lambdaInd++) {
              const LambdaVar& thisLambdaVar = _lambdaVars[lambdaInd];
              Angularity angularity(thisLambdaVar.beta, jetRadius, thisLambdaVar.kappa,
                                    thisLambdaVar.constitCut);
              float val = -1;
              if (thisLambdaVar.isCharged)
                val = (chargedJets.size() > 0) ? angularity(groomedJetCharged) : -1;
              else
                val = angularity(groomedJet);
              if (val < 0) continue;

              if (isCentral) {
                _h_dijet_cen_groomed[radiusInd][lambdaInd][ptBinInd]->fill(val);
              }
              else {
                _h_dijet_fwd_groomed[radiusInd][lambdaInd][ptBinInd]->fill(val);
              }
            }

          } // end loop over dijets
        } // end loop over jet radii
      }
    } // end analyze() function

    void finalize() {
      for (auto& hvec3 :
           {_h_dijet_cen, _h_dijet_cen_groomed, _h_dijet_fwd, _h_dijet_fwd_groomed, _h_zpj, _h_zpj_groomed}) {
        for (auto& hvec2 : hvec3) {
          for (auto& hvec : hvec2) {
            normalize(hvec, 1.0, false);
          }
        }
      }
    }

    /// @class Angularity
    /// Definition of angularity
    ///
    class Angularity : public fastjet::FunctionOfPseudoJet<double> {
    public:

      /// ctor
      Angularity(double alpha, double jet_radius, double kappa = 1.0, Selector constitCut = SelectorPtMin(0.))
          : _alpha(alpha), _radius(jet_radius), _kappa(kappa), _constitCut(constitCut) { }

      /// computation of the angularity itself
      double result(const PseudoJet& jet) const {
        // get the jet constituents
        vector<PseudoJet> constits = jet.constituents();

        // get the reference axis
        PseudoJet reference_axis = _get_reference_axis(jet);

        // do the actual coputation
        double numerator = 0.0, denominator = 0.0;
        for (const auto& c : constits) {
          if (!_constitCut.pass(c)) continue;
          double pt = c.pt();
          // Note: better compute (dist^2)^(alpha/2) to avoid an extra square root
          numerator += pow(pt, _kappa) * pow(c.squared_distance(reference_axis), 0.5 * _alpha);
          denominator += pt;
        }
        if (denominator == 0) return -1;
        // the formula is only correct for the typical angularities which satisfy either kappa==1 or alpha==0.
        else
          return numerator / (pow(denominator, _kappa) * pow(_radius, _alpha));
      }

    protected:

      PseudoJet _get_reference_axis(const PseudoJet& jet) const {
        if (_alpha > 1) return jet;

        Recluster recluster(JetDefinition(antikt_algorithm, JetDefinition::max_allowable_R, WTA_pt_scheme));
        return recluster(jet);
      }

      double _alpha, _radius, _kappa;
      Selector _constitCut;
    };


    /// Lightweight class to hold info about Lambda variable
    class LambdaVar {
    public:

      LambdaVar(const std::string& name_, float kappa_, float beta_, bool isCharged_, Selector constitCut_)
          : name(name_), kappa(kappa_), beta(beta_), isCharged(isCharged_), constitCut(constitCut_) { }

      string name;
      float kappa;
      float beta;
      bool isCharged;
      Selector constitCut;
    };


    // Order matters here
    const vector<float> _jetRadii = {0.4, 0.8};

    // This order is important! index in vector used to create YODA plot name
    // Must match that in extracRivetPlotsDijet.py
    const vector<LambdaVar> _lambdaVars = {
        LambdaVar("jet_multiplicity", 0, 0, false, SelectorPtMin(1.)),
        LambdaVar("jet_pTD", 2, 0, false, SelectorPtMin(0.)),
        LambdaVar("jet_LHA", 1, 0.5, false, SelectorPtMin(0.)),
        LambdaVar("jet_width", 1, 1, false, SelectorPtMin(0.)),
        LambdaVar("jet_thrust", 1, 2, false, SelectorPtMin(0.)),
        LambdaVar("jet_multiplicity_charged", 0, 0, true, SelectorPtMin(1.)),
        LambdaVar("jet_pTD_charged", 2, 0, true, SelectorPtMin(0.)),
        LambdaVar("jet_LHA_charged", 1, 0.5, true, SelectorPtMin(0.)),
        LambdaVar("jet_width_charged", 1, 1, true, SelectorPtMin(0.)),
        LambdaVar("jet_thrust_charged", 1, 2, true, SelectorPtMin(0.)),
    };

    vector<float> _ptBinsGen;

    const map<size_t, size_t> _hepdata_index{
        {30000, 1},     {30001, 2},     {31000, 3},     {31001, 4},     {34000, 5},     {34001, 6},
        {33000, 7},     {33001, 8},     {32000, 9},     {32001, 10},    {82000, 11},    {122001, 12},
        {32100, 13},    {32101, 14},    {37000, 15},    {37001, 16},    {32010, 17},    {32011, 18},
        {2000, 139},    {12000, 140},   {22000, 141},   {42000, 142},   {52000, 143},   {62000, 144},
        {72000, 145},   {2001, 155},    {12001, 156},   {22001, 157},   {42001, 158},   {52001, 159},
        {62001, 160},   {72001, 161},   {82001, 162},   {92001, 163},   {102001, 164},  {112001, 165},
        {2002, 179},    {12002, 180},   {22002, 181},   {32002, 182},   {42002, 183},   {52002, 184},
        {62002, 185},   {72002, 186},   {82002, 187},   {92002, 188},   {102002, 189},  {112002, 190},
        {122002, 191},  {7000, 192},    {17000, 193},   {27000, 194},   {47000, 195},   {57000, 196},
        {67000, 197},   {77000, 198},   {87000, 199},   {7001, 209},    {17001, 210},   {27001, 211},
        {47001, 212},   {57001, 213},   {67001, 214},   {77001, 215},   {87001, 216},   {97001, 217},
        {107001, 218},  {117001, 219},  {127001, 220},  {7002, 234},    {17002, 235},   {27002, 236},
        {37002, 237},   {47002, 238},   {57002, 239},   {67002, 240},   {77002, 241},   {87002, 242},
        {97002, 243},   {107002, 244},  {117002, 245},  {127002, 246},  {5000, 247},    {15000, 248},
        {25000, 249},   {35000, 250},   {45000, 251},   {55000, 252},   {65000, 253},   {75000, 254},
        {85000, 255},   {5001, 265},    {15001, 266},   {25001, 267},   {35001, 268},   {45001, 269},
        {55001, 270},   {65001, 271},   {75001, 272},   {85001, 273},   {95001, 274},   {105001, 275},
        {115001, 276},  {125001, 277},  {5002, 291},    {15002, 292},   {25002, 293},   {35002, 294},
        {45002, 295},   {55002, 296},   {65002, 297},   {75002, 298},   {85002, 299},   {95002, 300},
        {105002, 301},  {115002, 302},  {125002, 303},  {6000, 304},    {16000, 305},   {26000, 306},
        {36000, 307},   {46000, 308},   {56000, 309},   {66000, 310},   {76000, 311},   {86000, 312},
        {6001, 322},    {16001, 323},   {26001, 324},   {36001, 325},   {46001, 326},   {56001, 327},
        {66001, 328},   {76001, 329},   {86001, 330},   {96001, 331},   {106001, 332},  {116001, 333},
        {126001, 334},  {6002, 348},    {16002, 349},   {26002, 350},   {36002, 351},   {46002, 352},
        {56002, 353},   {66002, 354},   {76002, 355},   {86002, 356},   {96002, 357},   {106002, 358},
        {116002, 359},  {126002, 360},  {9000, 361},    {19000, 362},   {29000, 363},   {39000, 364},
        {49000, 365},   {59000, 366},   {69000, 367},   {79000, 368},   {89000, 369},   {9001, 379},
        {19001, 380},   {29001, 381},   {39001, 382},   {49001, 383},   {59001, 384},   {69001, 385},
        {79001, 386},   {89001, 387},   {99001, 388},   {109001, 389},  {119001, 390},  {129001, 391},
        {9002, 405},    {19002, 406},   {29002, 407},   {39002, 408},   {49002, 409},   {59002, 410},
        {69002, 411},   {79002, 412},   {89002, 413},   {99002, 414},   {109002, 415},  {119002, 416},
        {129002, 417},  {8000, 418},    {18000, 419},   {28000, 420},   {38000, 421},   {48000, 422},
        {58000, 423},   {68000, 424},   {78000, 425},   {88000, 426},   {8001, 436},    {18001, 437},
        {28001, 438},   {38001, 439},   {48001, 440},   {58001, 441},   {68001, 442},   {78001, 443},
        {88001, 444},   {98001, 445},   {108001, 446},  {118001, 447},  {128001, 448},  {8002, 462},
        {18002, 463},   {28002, 464},   {38002, 465},   {48002, 466},   {58002, 467},   {68002, 468},
        {78002, 469},   {88002, 470},   {98002, 471},   {108002, 472},  {118002, 473},  {128002, 474},
        {0, 475},       {10000, 476},   {20000, 477},   {40000, 478},   {50000, 479},   {60000, 480},
        {70000, 481},   {80000, 482},   {1, 492},       {10001, 493},   {20001, 494},   {40001, 495},
        {50001, 496},   {60001, 497},   {70001, 498},   {80001, 499},   {90001, 500},   {100001, 501},
        {110001, 502},  {120001, 503},  {2, 517},       {10002, 518},   {20002, 519},   {30002, 520},
        {40002, 521},   {50002, 522},   {60002, 523},   {70002, 524},   {80002, 525},   {90002, 526},
        {100002, 527},  {110002, 528},  {120002, 529},  {1000, 530},    {11000, 531},   {21000, 532},
        {41000, 533},   {51000, 534},   {61000, 535},   {71000, 536},   {81000, 537},   {1001, 547},
        {11001, 548},   {21001, 549},   {41001, 550},   {51001, 551},   {61001, 552},   {71001, 553},
        {81001, 554},   {91001, 555},   {101001, 556},  {111001, 557},  {121001, 558},  {1002, 572},
        {11002, 573},   {21002, 574},   {31002, 575},   {41002, 576},   {51002, 577},   {61002, 578},
        {71002, 579},   {81002, 580},   {91002, 581},   {101002, 582},  {111002, 583},  {121002, 584},
        {4000, 585},    {14000, 586},   {24000, 587},   {44000, 588},   {54000, 589},   {64000, 590},
        {74000, 591},   {84000, 592},   {4001, 602},    {14001, 603},   {24001, 604},   {44001, 605},
        {54001, 606},   {64001, 607},   {74001, 608},   {84001, 609},   {94001, 610},   {104001, 611},
        {114001, 612},  {124001, 613},  {4002, 627},    {14002, 628},   {24002, 629},   {34002, 630},
        {44002, 631},   {54002, 632},   {64002, 633},   {74002, 634},   {84002, 635},   {94002, 636},
        {104002, 637},  {114002, 638},  {124002, 639},  {3000, 640},    {13000, 641},   {23000, 642},
        {43000, 643},   {53000, 644},   {63000, 645},   {73000, 646},   {83000, 647},   {3001, 657},
        {13001, 658},   {23001, 659},   {43001, 660},   {53001, 661},   {63001, 662},   {73001, 663},
        {83001, 664},   {93001, 665},   {103001, 666},  {113001, 667},  {123001, 668},  {3002, 682},
        {13002, 683},   {23002, 684},   {33002, 685},   {43002, 686},   {53002, 687},   {63002, 688},
        {73002, 689},   {83002, 690},   {93002, 691},   {103002, 692},  {113002, 693},  {123002, 694},
        {2010, 695},    {12010, 696},   {22010, 697},   {42010, 698},   {52010, 699},   {62010, 700},
        {72010, 701},   {82010, 702},   {2011, 712},    {12011, 713},   {22011, 714},   {42011, 715},
        {52011, 716},   {62011, 717},   {72011, 718},   {82011, 719},   {92011, 720},   {102011, 721},
        {112011, 722},  {122011, 723},  {2012, 737},    {12012, 738},   {22012, 739},   {32012, 740},
        {42012, 741},   {52012, 742},   {62012, 743},   {72012, 744},   {82012, 745},   {92012, 746},
        {102012, 747},  {112012, 748},  {122012, 749},  {7010, 750},    {17010, 751},   {27010, 752},
        {37010, 753},   {47010, 754},   {57010, 755},   {67010, 756},   {77010, 757},   {87010, 758},
        {7011, 768},    {17011, 769},   {27011, 770},   {37011, 771},   {47011, 772},   {57011, 773},
        {67011, 774},   {77011, 775},   {87011, 776},   {97011, 777},   {107011, 778},  {117011, 779},
        {127011, 780},  {7012, 794},    {17012, 795},   {27012, 796},   {37012, 797},   {47012, 798},
        {57012, 799},   {67012, 800},   {77012, 801},   {87012, 802},   {97012, 803},   {107012, 804},
        {117012, 805},  {127012, 806},  {5010, 807},    {15010, 808},   {25010, 809},   {35010, 810},
        {45010, 811},   {55010, 812},   {65010, 813},   {75010, 814},   {85010, 815},   {5011, 825},
        {15011, 826},   {25011, 827},   {35011, 828},   {45011, 829},   {55011, 830},   {65011, 831},
        {75011, 832},   {85011, 833},   {95011, 834},   {105011, 835},  {115011, 836},  {125011, 837},
        {5012, 851},    {15012, 852},   {25012, 853},   {35012, 854},   {45012, 855},   {55012, 856},
        {65012, 857},   {75012, 858},   {85012, 859},   {95012, 860},   {105012, 861},  {115012, 862},
        {125012, 863},  {6010, 864},    {16010, 865},   {26010, 866},   {36010, 867},   {46010, 868},
        {56010, 869},   {66010, 870},   {76010, 871},   {86010, 872},   {6011, 882},    {16011, 883},
        {26011, 884},   {36011, 885},   {46011, 886},   {56011, 887},   {66011, 888},   {76011, 889},
        {86011, 890},   {96011, 891},   {106011, 892},  {116011, 893},  {126011, 894},  {6012, 908},
        {16012, 909},   {26012, 910},   {36012, 911},   {46012, 912},   {56012, 913},   {66012, 914},
        {76012, 915},   {86012, 916},   {96012, 917},   {106012, 918},  {116012, 919},  {126012, 920},
        {9010, 921},    {19010, 922},   {29010, 923},   {39010, 924},   {49010, 925},   {59010, 926},
        {69010, 927},   {79010, 928},   {89010, 929},   {9011, 939},    {19011, 940},   {29011, 941},
        {39011, 942},   {49011, 943},   {59011, 944},   {69011, 945},   {79011, 946},   {89011, 947},
        {99011, 948},   {109011, 949},  {119011, 950},  {129011, 951},  {9012, 965},    {19012, 966},
        {29012, 967},   {39012, 968},   {49012, 969},   {59012, 970},   {69012, 971},   {79012, 972},
        {89012, 973},   {99012, 974},   {109012, 975},  {119012, 976},  {129012, 977},  {8010, 978},
        {18010, 979},   {28010, 980},   {38010, 981},   {48010, 982},   {58010, 983},   {68010, 984},
        {78010, 985},   {88010, 986},   {8011, 996},    {18011, 997},   {28011, 998},   {38011, 999},
        {48011, 1000},  {58011, 1001},  {68011, 1002},  {78011, 1003},  {88011, 1004},  {98011, 1005},
        {108011, 1006}, {118011, 1007}, {128011, 1008}, {8012, 1022},   {18012, 1023},  {28012, 1024},
        {38012, 1025},  {48012, 1026},  {58012, 1027},  {68012, 1028},  {78012, 1029},  {88012, 1030},
        {98012, 1031},  {108012, 1032}, {118012, 1033}, {128012, 1034}, {10, 1035},     {10010, 1036},
        {20010, 1037},  {30010, 1038},  {40010, 1039},  {50010, 1040},  {60010, 1041},  {70010, 1042},
        {80010, 1043},  {11, 1053},     {10011, 1054},  {20011, 1055},  {30011, 1056},  {40011, 1057},
        {50011, 1058},  {60011, 1059},  {70011, 1060},  {80011, 1061},  {90011, 1062},  {100011, 1063},
        {110011, 1064}, {120011, 1065}, {12, 1079},     {10012, 1080},  {20012, 1081},  {30012, 1082},
        {40012, 1083},  {50012, 1084},  {60012, 1085},  {70012, 1086},  {80012, 1087},  {90012, 1088},
        {100012, 1089}, {110012, 1090}, {120012, 1091}, {1010, 1092},   {11010, 1093},  {21010, 1094},
        {31010, 1095},  {41010, 1096},  {51010, 1097},  {61010, 1098},  {71010, 1099},  {81010, 1100},
        {1011, 1110},   {11011, 1111},  {21011, 1112},  {31011, 1113},  {41011, 1114},  {51011, 1115},
        {61011, 1116},  {71011, 1117},  {81011, 1118},  {91011, 1119},  {101011, 1120}, {111011, 1121},
        {121011, 1122}, {1012, 1136},   {11012, 1137},  {21012, 1138},  {31012, 1139},  {41012, 1140},
        {51012, 1141},  {61012, 1142},  {71012, 1143},  {81012, 1144},  {91012, 1145},  {101012, 1146},
        {111012, 1147}, {121012, 1148}, {4010, 1149},   {14010, 1150},  {24010, 1151},  {34010, 1152},
        {44010, 1153},  {54010, 1154},  {64010, 1155},  {74010, 1156},  {84010, 1157},  {4011, 1167},
        {14011, 1168},  {24011, 1169},  {34011, 1170},  {44011, 1171},  {54011, 1172},  {64011, 1173},
        {74011, 1174},  {84011, 1175},  {94011, 1176},  {104011, 1177}, {114011, 1178}, {124011, 1179},
        {4012, 1193},   {14012, 1194},  {24012, 1195},  {34012, 1196},  {44012, 1197},  {54012, 1198},
        {64012, 1199},  {74012, 1200},  {84012, 1201},  {94012, 1202},  {104012, 1203}, {114012, 1204},
        {124012, 1205}, {3010, 1206},   {13010, 1207},  {23010, 1208},  {33010, 1209},  {43010, 1210},
        {53010, 1211},  {63010, 1212},  {73010, 1213},  {83010, 1214},  {3011, 1224},   {13011, 1225},
        {23011, 1226},  {33011, 1227},  {43011, 1228},  {53011, 1229},  {63011, 1230},  {73011, 1231},
        {83011, 1232},  {93011, 1233},  {103011, 1234}, {113011, 1235}, {123011, 1236}, {3012, 1250},
        {13012, 1251},  {23012, 1252},  {33012, 1253},  {43012, 1254},  {53012, 1255},  {63012, 1256},
        {73012, 1257},  {83012, 1258},  {93012, 1259},  {103012, 1260}, {113012, 1261}, {123012, 1262},
        {2100, 1263},   {12100, 1264},  {22100, 1265},  {42100, 1266},  {52100, 1267},  {62100, 1268},
        {72100, 1269},  {82100, 1270},  {2101, 1271},   {12101, 1272},  {22101, 1273},  {42101, 1274},
        {52101, 1275},  {62101, 1276},  {72101, 1277},  {82101, 1278},  {92101, 1279},  {102101, 1280},
        {112101, 1281}, {122101, 1282}, {2102, 1283},   {12102, 1284},  {22102, 1285},  {32102, 1286},
        {42102, 1287},  {52102, 1288},  {62102, 1289},  {72102, 1290},  {82102, 1291},  {92102, 1292},
        {102102, 1293}, {112102, 1294}, {122102, 1295}, {7100, 1296},   {17100, 1297},  {27100, 1298},
        {37100, 1299},  {47100, 1300},  {57100, 1301},  {67100, 1302},  {77100, 1303},  {87100, 1304},
        {7101, 1314},   {17101, 1315},  {27101, 1316},  {37101, 1317},  {47101, 1318},  {57101, 1319},
        {67101, 1320},  {77101, 1321},  {87101, 1322},  {97101, 1323},  {107101, 1324}, {117101, 1325},
        {127101, 1326}, {7102, 1327},   {17102, 1328},  {27102, 1329},  {37102, 1330},  {47102, 1331},
        {57102, 1332},  {67102, 1333},  {77102, 1334},  {87102, 1335},  {97102, 1336},  {107102, 1337},
        {117102, 1338}, {127102, 1339}, {5100, 1340},   {15100, 1341},  {25100, 1342},  {35100, 1343},
        {45100, 1344},  {55100, 1345},  {65100, 1346},  {75100, 1347},  {85100, 1348},  {5101, 1358},
        {15101, 1359},  {25101, 1360},  {35101, 1361},  {45101, 1362},  {55101, 1363},  {65101, 1364},
        {75101, 1365},  {85101, 1366},  {95101, 1367},  {105101, 1368}, {115101, 1369}, {125101, 1370},
        {5102, 1371},   {15102, 1372},  {25102, 1373},  {35102, 1374},  {45102, 1375},  {55102, 1376},
        {65102, 1377},  {75102, 1378},  {85102, 1379},  {95102, 1380},  {105102, 1381}, {115102, 1382},
        {125102, 1383}, {6100, 1384},   {16100, 1385},  {26100, 1386},  {36100, 1387},  {46100, 1388},
        {56100, 1389},  {66100, 1390},  {76100, 1391},  {86100, 1392},  {6101, 1402},   {16101, 1403},
        {26101, 1404},  {36101, 1405},  {46101, 1406},  {56101, 1407},  {66101, 1408},  {76101, 1409},
        {86101, 1410},  {96101, 1411},  {106101, 1412}, {116101, 1413}, {126101, 1414}, {6102, 1415},
        {16102, 1416},  {26102, 1417},  {36102, 1418},  {46102, 1419},  {56102, 1420},  {66102, 1421},
        {76102, 1422},  {86102, 1423},  {96102, 1424},  {106102, 1425}, {116102, 1426}, {126102, 1427},
        {9100, 1428},   {19100, 1429},  {29100, 1430},  {39100, 1431},  {49100, 1432},  {59100, 1433},
        {69100, 1434},  {79100, 1435},  {89100, 1436},  {9101, 1446},   {19101, 1447},  {29101, 1448},
        {39101, 1449},  {49101, 1450},  {59101, 1451},  {69101, 1452},  {79101, 1453},  {89101, 1454},
        {99101, 1455},  {109101, 1456}, {119101, 1457}, {129101, 1458}, {9102, 1459},   {19102, 1460},
        {29102, 1461},  {39102, 1462},  {49102, 1463},  {59102, 1464},  {69102, 1465},  {79102, 1466},
        {89102, 1467},  {99102, 1468},  {109102, 1469}, {119102, 1470}, {129102, 1471}, {8100, 1472},
        {18100, 1473},  {28100, 1474},  {38100, 1475},  {48100, 1476},  {58100, 1477},  {68100, 1478},
        {78100, 1479},  {88100, 1480},  {8101, 1490},   {18101, 1491},  {28101, 1492},  {38101, 1493},
        {48101, 1494},  {58101, 1495},  {68101, 1496},  {78101, 1497},  {88101, 1498},  {98101, 1499},
        {108101, 1500}, {118101, 1501}, {128101, 1502}, {8102, 1503},   {18102, 1504},  {28102, 1505},
        {38102, 1506},  {48102, 1507},  {58102, 1508},  {68102, 1509},  {78102, 1510},  {88102, 1511},
        {98102, 1512},  {108102, 1513}, {118102, 1514}, {128102, 1515}, {100, 1516},    {10100, 1517},
        {20100, 1518},  {30100, 1519},  {40100, 1520},  {50100, 1521},  {60100, 1522},  {70100, 1523},
        {80100, 1524},  {101, 1525},    {10101, 1526},  {20101, 1527},  {30101, 1528},  {40101, 1529},
        {50101, 1530},  {60101, 1531},  {70101, 1532},  {80101, 1533},  {90101, 1534},  {100101, 1535},
        {110101, 1536}, {120101, 1537}, {102, 1538},    {10102, 1539},  {20102, 1540},  {30102, 1541},
        {40102, 1542},  {50102, 1543},  {60102, 1544},  {70102, 1545},  {80102, 1546},  {90102, 1547},
        {100102, 1548}, {110102, 1549}, {120102, 1550}, {1100, 1551},   {11100, 1552},  {21100, 1553},
        {31100, 1554},  {41100, 1555},  {51100, 1556},  {61100, 1557},  {71100, 1558},  {81100, 1559},
        {1101, 1560},   {11101, 1561},  {21101, 1562},  {31101, 1563},  {41101, 1564},  {51101, 1565},
        {61101, 1566},  {71101, 1567},  {81101, 1568},  {91101, 1569},  {101101, 1570}, {111101, 1571},
        {121101, 1572}, {1102, 1573},   {11102, 1574},  {21102, 1575},  {31102, 1576},  {41102, 1577},
        {51102, 1578},  {61102, 1579},  {71102, 1580},  {81102, 1581},  {91102, 1582},  {101102, 1583},
        {111102, 1584}, {121102, 1585}, {4100, 1586},   {14100, 1587},  {24100, 1588},  {34100, 1589},
        {44100, 1590},  {54100, 1591},  {64100, 1592},  {74100, 1593},  {84100, 1594},  {4101, 1595},
        {14101, 1596},  {24101, 1597},  {34101, 1598},  {44101, 1599},  {54101, 1600},  {64101, 1601},
        {74101, 1602},  {84101, 1603},  {94101, 1604},  {104101, 1605}, {114101, 1606}, {124101, 1607},
        {4102, 1608},   {14102, 1609},  {24102, 1610},  {34102, 1611},  {44102, 1612},  {54102, 1613},
        {64102, 1614},  {74102, 1615},  {84102, 1616},  {94102, 1617},  {104102, 1618}, {114102, 1619},
        {124102, 1620}, {3100, 1621},   {13100, 1622},  {23100, 1623},  {33100, 1624},  {43100, 1625},
        {53100, 1626},  {63100, 1627},  {73100, 1628},  {83100, 1629},  {3101, 1630},   {13101, 1631},
        {23101, 1632},  {33101, 1633},  {43101, 1634},  {53101, 1635},  {63101, 1636},  {73101, 1637},
        {83101, 1638},  {93101, 1639},  {103101, 1640}, {113101, 1641}, {123101, 1642}, {3102, 1643},
        {13102, 1644},  {23102, 1645},  {33102, 1646},  {43102, 1647},  {53102, 1648},  {63102, 1649},
        {73102, 1650},  {83102, 1651},  {93102, 1652},  {103102, 1653}, {113102, 1654}, {123102, 1655},
        {2110, 1656},   {12110, 1657},  {22110, 1658},  {32110, 1659},  {42110, 1660},  {52110, 1661},
        {62110, 1662},  {72110, 1663},  {82110, 1664},  {2111, 1674},   {12111, 1675},  {22111, 1676},
        {32111, 1677},  {42111, 1678},  {52111, 1679},  {62111, 1680},  {72111, 1681},  {82111, 1682},
        {92111, 1683},  {102111, 1684}, {112111, 1685}, {122111, 1686}, {2112, 1687},   {12112, 1688},
        {22112, 1689},  {32112, 1690},  {42112, 1691},  {52112, 1692},  {62112, 1693},  {72112, 1694},
        {82112, 1695},  {92112, 1696},  {102112, 1697}, {112112, 1698}, {122112, 1699}, {7110, 1700},
        {17110, 1701},  {27110, 1702},  {37110, 1703},  {47110, 1704},  {57110, 1705},  {67110, 1706},
        {77110, 1707},  {87110, 1708},  {7111, 1718},   {17111, 1719},  {27111, 1720},  {37111, 1721},
        {47111, 1722},  {57111, 1723},  {67111, 1724},  {77111, 1725},  {87111, 1726},  {97111, 1727},
        {107111, 1728}, {117111, 1729}, {127111, 1730}, {7112, 1731},   {17112, 1732},  {27112, 1733},
        {37112, 1734},  {47112, 1735},  {57112, 1736},  {67112, 1737},  {77112, 1738},  {87112, 1739},
        {97112, 1740},  {107112, 1741}, {117112, 1742}, {127112, 1743}, {5110, 1744},   {15110, 1745},
        {25110, 1746},  {35110, 1747},  {45110, 1748},  {55110, 1749},  {65110, 1750},  {75110, 1751},
        {85110, 1752},  {5111, 1762},   {15111, 1763},  {25111, 1764},  {35111, 1765},  {45111, 1766},
        {55111, 1767},  {65111, 1768},  {75111, 1769},  {85111, 1770},  {95111, 1771},  {105111, 1772},
        {115111, 1773}, {125111, 1774}, {5112, 1775},   {15112, 1776},  {25112, 1777},  {35112, 1778},
        {45112, 1779},  {55112, 1780},  {65112, 1781},  {75112, 1782},  {85112, 1783},  {95112, 1784},
        {105112, 1785}, {115112, 1786}, {125112, 1787}, {6110, 1788},   {16110, 1789},  {26110, 1790},
        {36110, 1791},  {46110, 1792},  {56110, 1793},  {66110, 1794},  {76110, 1795},  {86110, 1796},
        {6111, 1806},   {16111, 1807},  {26111, 1808},  {36111, 1809},  {46111, 1810},  {56111, 1811},
        {66111, 1812},  {76111, 1813},  {86111, 1814},  {96111, 1815},  {106111, 1816}, {116111, 1817},
        {126111, 1818}, {6112, 1819},   {16112, 1820},  {26112, 1821},  {36112, 1822},  {46112, 1823},
        {56112, 1824},  {66112, 1825},  {76112, 1826},  {86112, 1827},  {96112, 1828},  {106112, 1829},
        {116112, 1830}, {126112, 1831}, {9110, 1832},   {19110, 1833},  {29110, 1834},  {39110, 1835},
        {49110, 1836},  {59110, 1837},  {69110, 1838},  {79110, 1839},  {89110, 1840},  {9111, 1850},
        {19111, 1851},  {29111, 1852},  {39111, 1853},  {49111, 1854},  {59111, 1855},  {69111, 1856},
        {79111, 1857},  {89111, 1858},  {99111, 1859},  {109111, 1860}, {119111, 1861}, {129111, 1862},
        {9112, 1863},   {19112, 1864},  {29112, 1865},  {39112, 1866},  {49112, 1867},  {59112, 1868},
        {69112, 1869},  {79112, 1870},  {89112, 1871},  {99112, 1872},  {109112, 1873}, {119112, 1874},
        {129112, 1875}, {8110, 1876},   {18110, 1877},  {28110, 1878},  {38110, 1879},  {48110, 1880},
        {58110, 1881},  {68110, 1882},  {78110, 1883},  {88110, 1884},  {8111, 1894},   {18111, 1895},
        {28111, 1896},  {38111, 1897},  {48111, 1898},  {58111, 1899},  {68111, 1900},  {78111, 1901},
        {88111, 1902},  {98111, 1903},  {108111, 1904}, {118111, 1905}, {128111, 1906}, {8112, 1907},
        {18112, 1908},  {28112, 1909},  {38112, 1910},  {48112, 1911},  {58112, 1912},  {68112, 1913},
        {78112, 1914},  {88112, 1915},  {98112, 1916},  {108112, 1917}, {118112, 1918}, {128112, 1919},
        {110, 1920},    {10110, 1921},  {20110, 1922},  {30110, 1923},  {40110, 1924},  {50110, 1925},
        {60110, 1926},  {70110, 1927},  {80110, 1928},  {111, 1938},    {10111, 1939},  {20111, 1940},
        {30111, 1941},  {40111, 1942},  {50111, 1943},  {60111, 1944},  {70111, 1945},  {80111, 1946},
        {90111, 1947},  {100111, 1948}, {110111, 1949}, {120111, 1950}, {112, 1951},    {10112, 1952},
        {20112, 1953},  {30112, 1954},  {40112, 1955},  {50112, 1956},  {60112, 1957},  {70112, 1958},
        {80112, 1959},  {90112, 1960},  {100112, 1961}, {110112, 1962}, {120112, 1963}, {1110, 1964},
        {11110, 1965},  {21110, 1966},  {31110, 1967},  {41110, 1968},  {51110, 1969},  {61110, 1970},
        {71110, 1971},  {81110, 1972},  {1111, 1982},   {11111, 1983},  {21111, 1984},  {31111, 1985},
        {41111, 1986},  {51111, 1987},  {61111, 1988},  {71111, 1989},  {81111, 1990},  {91111, 1991},
        {101111, 1992}, {111111, 1993}, {121111, 1994}, {1112, 1995},   {11112, 1996},  {21112, 1997},
        {31112, 1998},  {41112, 1999},  {51112, 2000},  {61112, 2001},  {71112, 2002},  {81112, 2003},
        {91112, 2004},  {101112, 2005}, {111112, 2006}, {121112, 2007}, {4110, 2008},   {14110, 2009},
        {24110, 2010},  {34110, 2011},  {44110, 2012},  {54110, 2013},  {64110, 2014},  {74110, 2015},
        {84110, 2016},  {4111, 2026},   {14111, 2027},  {24111, 2028},  {34111, 2029},  {44111, 2030},
        {54111, 2031},  {64111, 2032},  {74111, 2033},  {84111, 2034},  {94111, 2035},  {104111, 2036},
        {114111, 2037}, {124111, 2038}, {4112, 2039},   {14112, 2040},  {24112, 2041},  {34112, 2042},
        {44112, 2043},  {54112, 2044},  {64112, 2045},  {74112, 2046},  {84112, 2047},  {94112, 2048},
        {104112, 2049}, {114112, 2050}, {124112, 2051}, {3110, 2052},   {13110, 2053},  {23110, 2054},
        {33110, 2055},  {43110, 2056},  {53110, 2057},  {63110, 2058},  {73110, 2059},  {83110, 2060},
        {3111, 2070},   {13111, 2071},  {23111, 2072},  {33111, 2073},  {43111, 2074},  {53111, 2075},
        {63111, 2076},  {73111, 2077},  {83111, 2078},  {93111, 2079},  {103111, 2080}, {113111, 2081},
        {123111, 2082}, {3112, 2083},   {13112, 2084},  {23112, 2085},  {33112, 2086},  {43112, 2087},
        {53112, 2088},  {63112, 2089},  {73112, 2090},  {83112, 2091},  {93112, 2092},  {103112, 2093},
        {113112, 2094}, {123112, 2095}};

    // mode for the analysis
    unsigned int _mode;

    // 3D vector: [jet radius][lambda variable][pt bin]
    // since each pt bin has its own normalised distribution
    vector<vector<vector<Histo1DPtr>>> _h_dijet_cen, _h_dijet_cen_groomed, _h_dijet_fwd, _h_dijet_fwd_groomed;

    // 3D vector: [jet radius][lambda variable][pt bin]
    // since each pt bin has its own normalised distribution
    vector<vector<vector<Histo1DPtr>>> _h_zpj, _h_zpj_groomed;
  };


  RIVET_DECLARE_PLUGIN(CMS_2021_I1920187);

}