LCOV - code coverage report
Current view: top level - PYTHIA8/pythia8210dev/include/Pythia8 - History.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 29 0.0 %
Date: 2016-06-14 17:26:59 Functions: 0 14 0.0 %

          Line data    Source code
       1             : // History.h is a part of the PYTHIA event generator.
       2             : // Copyright (C) 2015 Torbjorn Sjostrand.
       3             : // PYTHIA is licenced under the GNU GPL version 2, see COPYING for details.
       4             : // Please respect the MCnet Guidelines, see GUIDELINES for details.
       5             : 
       6             : // This file is written by Stefan Prestel.
       7             : // It contains the main class for matrix element merging.
       8             : // Header file for the Clustering and History classes.
       9             : 
      10             : #ifndef Pythia8_History_H
      11             : #define Pythia8_History_H
      12             : 
      13             : #include "Pythia8/Basics.h"
      14             : #include "Pythia8/BeamParticle.h"
      15             : #include "Pythia8/Event.h"
      16             : #include "Pythia8/Info.h"
      17             : #include "Pythia8/ParticleData.h"
      18             : #include "Pythia8/PythiaStdlib.h"
      19             : #include "Pythia8/Settings.h"
      20             : #include "Pythia8/PartonLevel.h"
      21             : 
      22             : namespace Pythia8 {
      23             : 
      24             : //==========================================================================
      25             : 
      26             : // Declaration of Clustering class.
      27             : // This class holds information about one radiator, recoiler, emitted system.
      28             : // This class is a container class for History class use.
      29             : 
      30             : class Clustering {
      31             : 
      32             : public:
      33             : 
      34             :    // The emitted parton location.
      35             :   int emitted;
      36             :   // The emittor parton
      37             :   int emittor;
      38             :   // The recoiler parton.
      39             :   int recoiler;
      40             :   // The colour connected recoiler (Can be different for ISR)
      41             :   int partner;
      42             :   // The scale associated with this clustering.
      43             :   double pTscale;
      44             : 
      45             :   // Default constructor
      46           0 :   Clustering(){
      47           0 :     emitted   = 0;
      48           0 :     emittor   = 0;
      49           0 :     recoiler  = 0;
      50           0 :     partner   = 0;
      51           0 :     pTscale   = 0.0;
      52           0 :   }
      53             : 
      54             :   // Default destructor
      55           0 :   ~Clustering(){}
      56             : 
      57             :   // Copy constructor
      58           0 :   Clustering( const Clustering& inSystem ){
      59           0 :     emitted  = inSystem.emitted;
      60           0 :     emittor  = inSystem.emittor;
      61           0 :     recoiler = inSystem.recoiler;
      62           0 :     partner  = inSystem.partner;
      63           0 :     pTscale  = inSystem.pTscale;
      64           0 :   }
      65             : 
      66             :   // Constructor with input
      67             :   Clustering( int emtIn, int radIn, int recIn, int partnerIn,
      68           0 :     double pTscaleIn ){
      69           0 :     emitted  = emtIn;
      70           0 :     emittor  = radIn;
      71           0 :     recoiler = recIn;
      72           0 :     partner  = partnerIn;
      73           0 :     pTscale  = pTscaleIn;
      74           0 :   }
      75             : 
      76             :   // Function to return pythia pT scale of clustering
      77           0 :   double pT() const { return pTscale; }
      78             : 
      79             :   // print for debug
      80             :   void list() const;
      81             : 
      82             : };
      83             : 
      84             : //==========================================================================
      85             : 
      86             : // Declaration of History class
      87             : //
      88             : // A History object represents an event in a given step in the CKKW-L
      89             : // clustering procedure. It defines a tree-like recursive structure,
      90             : // where the root node represents the state with n jets as given by
      91             : // the matrix element generator, and is characterized by the member
      92             : // variable mother being null. The leaves on the tree corresponds to a
      93             : // fully clustered paths where the original n-jets has been clustered
      94             : // down to the Born-level state. Also states which cannot be clustered
      95             : // down to the Born-level are possible - these will be called
      96             : // incomplete. The leaves are characterized by the vector of children
      97             : // being empty.
      98             : 
      99             : class History {
     100             : 
     101             : public:
     102             : 
     103             :   // The only constructor. Default arguments are used when creating
     104             :   // the initial history node. The \a depth is the maximum number of
     105             :   // clusterings requested. \a scalein is the scale at which the \a
     106             :   // statein was clustered (should be set to the merging scale for the
     107             :   // initial history node. \a beamAIn and beamBIn are needed to
     108             :   // calcutate PDF ratios, \a particleDataIn to have access to the
     109             :   // correct masses of particles. If \a isOrdered is true, the previous
     110             :   // clusterings has been ordered. \a is the PDF ratio for this
     111             :   // clustering (=1 for FSR clusterings). \a probin is the accumulated
     112             :   // probabilities for the previous clusterings, and \ mothin is the
     113             :   // previous history node (null for the initial node).
     114             :   History( int depth,
     115             :            double scalein,
     116             :            Event statein,
     117             :            Clustering c,
     118             :            MergingHooks* mergingHooksPtrIn,
     119             :            BeamParticle beamAIn,
     120             :            BeamParticle beamBIn,
     121             :            ParticleData* particleDataPtrIn,
     122             :            Info* infoPtrIn,
     123             :            bool isOrdered,
     124             :            bool isStronglyOrdered,
     125             :            bool isAllowed,
     126             :            bool isNextInInput,
     127             :            double probin,
     128             :            History * mothin);
     129             : 
     130             :   // The destructor deletes each child.
     131           0 :   ~History() {
     132           0 :     for ( int i = 0, N = children.size(); i < N; ++i ) delete children[i];
     133           0 :   }
     134             : 
     135             :   // Function to project paths onto desired paths.
     136             :   bool projectOntoDesiredHistories();
     137             : 
     138             :   // For CKKW-L, NL3 and UMEPS:
     139             :   // In the initial history node, select one of the paths according to
     140             :   // the probabilities. This function should be called for the initial
     141             :   // history node.
     142             :   // IN  trialShower*    : Previously initialised trialShower object,
     143             :   //                       to perform trial showering and as
     144             :   //                       repository of pointers to initialise alphaS
     145             :   //     PartonSystems* : PartonSystems object needed to initialise
     146             :   //                      shower objects
     147             :   // OUT double         : (Sukadov) , (alpha_S ratios) , (PDF ratios)
     148             :   double weightTREE(PartonLevel* trial, AlphaStrong * asFSR,
     149             :                     AlphaStrong * asISR, double RN);
     150             : 
     151             :   // For default NL3:
     152             :   // Return weight of virtual correction and subtractive for NL3 merging
     153             :   double weightLOOP(PartonLevel* trial, double RN);
     154             :   // Return O(\alpha_s)-term of CKKWL-weight for NL3 merging
     155             :   double weightFIRST(PartonLevel* trial, AlphaStrong* asFSR,
     156             :                   AlphaStrong* asISR, double RN, Rndm* rndmPtr );
     157             : 
     158             :   // For UMEPS:
     159             :   double weight_UMEPS_TREE(PartonLevel* trial, AlphaStrong * asFSR,
     160             :                     AlphaStrong * asISR, double RN);
     161             :   double weight_UMEPS_SUBT(PartonLevel* trial, AlphaStrong * asFSR,
     162             :                     AlphaStrong * asISR, double RN);
     163             : 
     164             :   // For unitary NL3:
     165             :   double weight_UNLOPS_TREE(PartonLevel* trial, AlphaStrong * asFSR,
     166             :                     AlphaStrong * asISR, double RN);
     167             :   double weight_UNLOPS_SUBT(PartonLevel* trial, AlphaStrong * asFSR,
     168             :                     AlphaStrong * asISR, double RN);
     169             :   double weight_UNLOPS_LOOP(PartonLevel* trial, double RN);
     170             :   double weight_UNLOPS_SUBTNLO(PartonLevel* trial, double RN);
     171             :   double weight_UNLOPS_CORRECTION( int order, PartonLevel* trial,
     172             :                   AlphaStrong* asFSR, AlphaStrong* asISR,
     173             :                   double RN, Rndm* rndmPtr );
     174             : 
     175             :   // Function to check if any allowed histories were found
     176             :   bool foundAllowedHistories() {
     177             :     return (children.size() > 0 && foundAllowedPath); }
     178             :   // Function to check if any ordered histories were found
     179             :   bool foundOrderedHistories() {
     180             :     return (children.size() > 0 && foundOrderedPath); }
     181             :   // Function to check if any ordered histories were found
     182             :   bool foundCompleteHistories() {
     183             :     return (children.size() > 0 && foundCompletePath); }
     184             : 
     185             :   // Function to set the state with complete scales for evolution
     186             :   void getStartingConditions( const double RN, Event& outState );
     187             :   // Function to get the state with complete scales for evolution
     188             :   bool getClusteredEvent( const double RN, int nSteps, Event& outState);
     189             :   // Function to get the first reclustered state above the merging scale.
     190             :   bool getFirstClusteredEventAboveTMS( const double RN, int nDesired,
     191             :     Event& process, int & nPerformed, bool updateProcess = true );
     192             :   // Function to return the depth of the history (i.e. the number of
     193             :   // reclustered splittings)
     194             :   int nClusterings();
     195             : 
     196             :   // Function to get the lowest multiplicity reclustered event
     197             :   Event lowestMultProc( const double RN) {
     198             :     // Return lowest multiplicity state
     199           0 :     return (select(RN)->state);
     200             :   }
     201             : 
     202             :   // Calculate and return pdf ratio
     203             :   double getPDFratio( int side, bool forSudakov, bool useHardPDF,
     204             :                       int flavNum, double xNum, double muNum,
     205             :                       int flavDen, double xDen, double muDen);
     206             : 
     207             :   // Function to print the history that would be chosen from the random number
     208             :   // RN. Mainly for debugging.
     209             :   void printHistory( const double RN );
     210             :   // Function to print the states in a history, starting from the hard process.
     211             :   // Mainly for debugging.
     212             :   void printStates();
     213             : 
     214             :   // Make Pythia class friend
     215             :   friend class Pythia;
     216             :   // Make Merging class friend
     217             :   friend class Merging;
     218             : 
     219             : private:
     220             : 
     221             :   // Number of trial emission to use for calculating the average number of
     222             :   // emissions
     223             :   static const int NTRIAL;
     224             : 
     225             :   // Function to set all scales in the sequence of states. This is a
     226             :   // wrapper routine for setScales and setEventScales methods
     227             :   void setScalesInHistory();
     228             : 
     229             :   // Function to find the index (in the mother histories) of the
     230             :   // child history, thus providing a way access the path from both
     231             :   // initial history (mother == 0) and final history (all children == 0)
     232             :   // IN vector<int> : The index of each child in the children vector
     233             :   //                  of the current history node will be saved in
     234             :   //                  this vector
     235             :   // NO OUTPUT
     236             :   void findPath(vector<int>& out);
     237             : 
     238             :   // Functions to set the  parton production scales and enforce
     239             :   // ordering on the scales of the respective clusterings stored in
     240             :   // the History node:
     241             :   // Method will start from lowest multiplicity state and move to
     242             :   // higher states, setting the production scales the shower would
     243             :   // have used.
     244             :   // When arriving at the highest multiplicity, the method will switch
     245             :   // and go back in direction of lower states to check and enforce
     246             :   // ordering for unordered histories.
     247             :   // IN vector<int> : Vector of positions of the chosen child
     248             :   //                  in the mother history to allow to move
     249             :   //                  in direction initial->final along path
     250             :   //    bool        : True: Move in direction low->high
     251             :   //                       multiplicity and set production scales
     252             :   //                  False: Move in direction high->low
     253             :   //                       multiplicity and check and enforce
     254             :   //                       ordering
     255             :   // NO OUTPUT
     256             :   void setScales( vector<int> index, bool forward);
     257             : 
     258             :   // Function to find a particle in all higher multiplicity events
     259             :   // along the history path and set its production scale to the input
     260             :   // scale
     261             :   // IN  int iPart       : Parton in refEvent to be checked / rescaled
     262             :   //     Event& refEvent : Reference event for iPart
     263             :   //     double scale    : Scale to be set as production scale for
     264             :   //                       unchanged copies of iPart in subsequent steps
     265             :   void scaleCopies(int iPart, const Event& refEvent, double rho);
     266             : 
     267             :   // Function to set the OVERALL EVENT SCALES [=state.scale()] to
     268             :   // the scale of the last clustering
     269             :   // NO INPUT
     270             :   // NO OUTPUT
     271             :   void setEventScales();
     272             : 
     273             :   // Function to print information on the reconstructed scales in one path.
     274             :   // For debug only.
     275             :   void printScales() { if ( mother ) mother->printScales();
     276             :     cout << " size " << state.size() << " scale " << scale << " clusterIn "
     277             :       << clusterIn.pT() << " state.scale() " << state.scale() << endl; }
     278             : 
     279             :   // Function to project paths onto desired paths.
     280             :   bool trimHistories();
     281             :   // Function to tag history for removal.
     282           0 :   void remove(){ doInclude = false; }
     283             :   // Function to return flag of allowed histories to choose from.
     284           0 :   bool keep(){ return doInclude; }
     285             :   // Function implementing checks on a paths, for deciding if the path should
     286             :   // be considered valid or not.
     287             :   bool keepHistory();
     288             :   // Function to check if a path is ordered in evolution pT.
     289             :   bool isOrderedPath( double maxscale );
     290             : 
     291             :   bool followsInputPath();
     292             : 
     293             :   // Function to check if all reconstucted states in a path pass the merging
     294             :   // scale cut.
     295             :   bool allIntermediateAboveRhoMS( double rhoms, bool good = true );
     296             :   // Function to check if any ordered paths were found (and kept).
     297             :   bool foundAnyOrderedPaths();
     298             : 
     299             :   // Functions to return the z value of the last ISR splitting
     300             :   // NO INPUT
     301             :   // OUTPUT double : z value of last ISR splitting in history
     302             :   double zISR();
     303             : 
     304             :   // Functions to return the z value of the last FSR splitting
     305             :   // NO INPUT
     306             :   // OUTPUT double : z value of last FSR splitting in history
     307             :   double zFSR();
     308             : 
     309             :   // Functions to return the pT scale of the last ISR splitting
     310             :   // NO INPUT
     311             :   // OUTPUT double : pT scale of last ISR splitting in history
     312             :   double pTISR();
     313             : 
     314             :   // Functions to return the pT scale of the last FSR splitting
     315             :   // NO INPUT
     316             :   // OUTPUT double : pT scale of last FSR splitting in history
     317             :   double pTFSR();
     318             : 
     319             :   // Functions to return the event with nSteps additional partons
     320             :   // INPUT  int   : Number of splittings in the event,
     321             :   //                as counted from core 2->2 process
     322             :   // OUTPUT Event : event with nSteps additional partons
     323             :   Event clusteredState( int nSteps);
     324             : 
     325             :   // Function to choose a path from all paths in the tree
     326             :   // according to their splitting probabilities
     327             :   // IN double    : Random number
     328             :   // OUT History* : Leaf of history path chosen
     329             :   History * select(double rnd);
     330             : 
     331             :   // For a full path, find the weight calculated from the ratio of
     332             :   // couplings, the no-emission probabilities, and possible PDF
     333             :   // ratios. This function should only be called for the last history
     334             :   // node of a full path.
     335             :   // IN  TimeShower : Already initialised shower object to be used as
     336             :   //                  trial shower
     337             :   //     double     : alpha_s value used in ME calculation
     338             :   //     double     : Maximal mass scale of the problem (e.g. E_CM)
     339             :   //     AlphaStrong: Initialised shower alpha_s object for FSR alpha_s
     340             :   //                  ratio calculation
     341             :   //     AlphaStrong: Initialised shower alpha_s object for ISR alpha_s
     342             :   //                  ratio calculation (can be different from previous)
     343             :   double weightTree(PartonLevel* trial, double as0, double maxscale,
     344             :     double pdfScale, AlphaStrong * asFSR, AlphaStrong * asISR,
     345             :     double& asWeight, double& pdfWeight);
     346             : 
     347             :   // Function to return the \alpha_s-ratio part of the CKKWL weight.
     348             :   double weightTreeALPHAS( double as0, AlphaStrong * asFSR,
     349             :     AlphaStrong * asISR );
     350             :   // Function to return the PDF-ratio part of the CKKWL weight.
     351             :   double weightTreePDFs( double maxscale, double pdfScale );
     352             :   // Function to return the no-emission probability part of the CKKWL weight.
     353             :   double weightTreeEmissions( PartonLevel* trial, int type, int njetMin,
     354             :     int njetMax, double maxscale );
     355             : 
     356             :   // Function to generate the O(\alpha_s)-term of the CKKWL-weight
     357             :   double weightFirst(PartonLevel* trial, double as0, double muR,
     358             :     double maxscale, AlphaStrong * asFSR, AlphaStrong * asISR, Rndm* rndmPtr );
     359             : 
     360             :   // Function to generate the O(\alpha_s)-term of the \alpha_s-ratios
     361             :   // appearing in the CKKWL-weight.
     362             :   double weightFirstALPHAS( double as0, double muR, AlphaStrong * asFSR,
     363             :     AlphaStrong * asISR);
     364             :   // Function to generate the O(\alpha_s)-term of the PDF-ratios
     365             :   // appearing in the CKKWL-weight.
     366             :   double weightFirstPDFs( double as0, double maxscale, double pdfScale,
     367             :     Rndm* rndmPtr );
     368             :   // Function to generate the O(\alpha_s)-term of the no-emission
     369             :   // probabilities appearing in the CKKWL-weight.
     370             :   double weightFirstEmissions(PartonLevel* trial, double as0, double maxscale,
     371             :     AlphaStrong * asFSR, AlphaStrong * asISR, bool fixpdf, bool fixas );
     372             : 
     373             :   // Function to return the default factorisation scale of the hard process.
     374             :   double hardFacScale(const Event& event);
     375             :   // Function to return the default renormalisation scale of the hard process.
     376             :   double hardRenScale(const Event& event);
     377             : 
     378             :   // Perform a trial shower using the \a pythia object between
     379             :   // maxscale down to this scale and return the corresponding Sudakov
     380             :   // form factor.
     381             :   // IN  trialShower : Shower object used as trial shower
     382             :   //     double     : Maximum scale for trial shower branching
     383             :   // OUT  0.0       : trial shower emission outside allowed pT range
     384             :   //      1.0       : trial shower successful (any emission was below
     385             :   //                  the minimal scale )
     386             :   double doTrialShower(PartonLevel* trial, int type, double maxscale,
     387             :     double minscale = 0.);
     388             : 
     389             :   // Function to bookkeep the indices of weights generated in countEmissions
     390             :   bool updateind(vector<int> & ind, int i, int N);
     391             : 
     392             :   // Function to count number of emissions between two scales for NLO merging
     393             :   vector<double> countEmissions(PartonLevel* trial, double maxscale,
     394             :     double minscale, int showerType, double as0, AlphaStrong * asFSR,
     395             :     AlphaStrong * asISR, int N, bool fixpdf, bool fixas);
     396             : 
     397             :   // Function to integrate PDF ratios between two scales over x and t,
     398             :   // where the PDFs are always evaluated at the lower t-integration limit
     399             :   double monteCarloPDFratios(int flav, double x, double maxScale,
     400             :            double minScale, double pdfScale, double asME, Rndm* rndmPtr);
     401             : 
     402             :   // Default: Check if a ordered (and complete) path has been found in
     403             :   // the initial node, in which case we will no longer be interested in
     404             :   // any unordered paths.
     405             :   bool onlyOrderedPaths();
     406             : 
     407             :   // Check if a strongly ordered (and complete) path has been found in the
     408             :   // initial node, in which case we will no longer be interested in
     409             :   // any unordered paths.
     410             :   bool onlyStronglyOrderedPaths();
     411             : 
     412             :   // Check if an allowed (according to user-criterion) path has been found in
     413             :   // the initial node, in which case we will no longer be interested in
     414             :   // any forbidden paths.
     415             :   bool onlyAllowedPaths();
     416             : 
     417             :   // When a full path has been found, register it with the initial
     418             :   // history node.
     419             :   // IN  History : History to be registered as path
     420             :   //     bool    : Specifying if clusterings so far were ordered
     421             :   //     bool    : Specifying if path is complete down to 2->2 process
     422             :   // OUT true if History object forms a plausible path (eg prob>0 ...)
     423             :   bool registerPath(History & l, bool isOrdered, bool isStronglyOrdered,
     424             :          bool isAllowed, bool isComplete);
     425             : 
     426             :   // For the history-defining state (and if necessary interfering
     427             :   // states), find all possible clusterings.
     428             :   // NO INPUT
     429             :   // OUT vector of all (rad,rec,emt) systems
     430             :   vector<Clustering> getAllQCDClusterings();
     431             : 
     432             :   // For one given state, find all possible clusterings.
     433             :   // IN  Event : state to be investigated
     434             :   // OUT vector of all (rad,rec,emt) systems in the state
     435             :   vector<Clustering> getQCDClusterings( const Event& event);
     436             : 
     437             :   // Function to construct (rad,rec,emt) triples from the event
     438             :   // IN  int   : Position of Emitted in event record for which
     439             :   //             dipoles should be constructed
     440             :   //     int   : Colour topogy to be tested
     441             :   //             1= g -> qqbar, causing 2 -> 2 dipole splitting
     442             :   //             2= q(bar) -> q(bar) g && g -> gg,
     443             :   //              causing a 2 -> 3 dipole splitting
     444             :   //     Event : event record to be checked for ptential partners
     445             :   // OUT vector of all allowed radiator+recoiler+emitted triples
     446             :   vector<Clustering> findQCDTriple (int EmtTagIn, int colTopIn,
     447             :                        const Event& event, vector<int> PosFinalPartn,
     448             :                        vector <int> PosInitPartn );
     449             : 
     450             :   vector<Clustering> getAllEWClusterings();
     451             :   vector<Clustering> getEWClusterings( const Event& event);
     452             :   vector<Clustering> findEWTriple( int EmtTagIn, const Event& event,
     453             :                        vector<int> PosFinalPartn );
     454             : 
     455             :   vector<Clustering> getAllSQCDClusterings();
     456             :   vector<Clustering> getSQCDClusterings( const Event& event);
     457             :   vector<Clustering> findSQCDTriple (int EmtTagIn, int colTopIn,
     458             :                        const Event& event, vector<int> PosFinalPartn,
     459             :                        vector <int> PosInitPartn );
     460             : 
     461             :   // Calculate and return the probability of a clustering.
     462             :   // IN  Clustering : rad,rec,emt - System for which the splitting
     463             :   //                  probability should be calcuated
     464             :   // OUT splitting probability
     465             :   double getProb(const Clustering & SystemIn);
     466             : 
     467             :   // Set up the beams (fill the beam particles with the correct
     468             :   // current incoming particles) to allow calculation of splitting
     469             :   // probability.
     470             :   // For interleaved evolution, set assignments dividing PDFs into
     471             :   // sea and valence content. This assignment is, until a history path
     472             :   // is chosen and a first trial shower performed, not fully correct
     473             :   // (since content is chosen form too high x and too low scale). The
     474             :   // assignment used for reweighting will be corrected after trial
     475             :   // showering
     476             :   void setupBeams();
     477             : 
     478             :   // Calculate the PDF ratio used in the argument of the no-emission
     479             :   // probability.
     480             :   double pdfForSudakov();
     481             : 
     482             :   // Calculate the hard process matrix element to include in the selection
     483             :   // probability.
     484             :   double hardProcessME( const Event& event);
     485             : 
     486             :   // Perform the clustering of the current state and return the
     487             :   // clustered state.
     488             :   // IN Clustering : rad,rec,emt triple to be clustered to two partons
     489             :   // OUT clustered state
     490             :   Event cluster(const Clustering & inSystem);
     491             : 
     492             :   // Function to get the flavour of the radiator before the splitting
     493             :   // for clustering
     494             :   // IN  int   : Position of the radiator after the splitting, in the event
     495             :   //     int   : Position of the emitted after the splitting, in the event
     496             :   //     Event : Reference event
     497             :   // OUT int   : Flavour of the radiator before the splitting
     498             :   int getRadBeforeFlav(const int RadAfter, const int EmtAfter,
     499             :         const Event& event);
     500             : 
     501             :   // Function to get the colour of the radiator before the splitting
     502             :   // for clustering
     503             :   // IN  int   : Position of the radiator after the splitting, in the event
     504             :   //     int   : Position of the emitted after the splitting, in the event
     505             :   //     Event : Reference event
     506             :   // OUT int   : Colour of the radiator before the splitting
     507             :   int getRadBeforeCol(const int RadAfter, const int EmtAfter,
     508             :         const Event& event);
     509             : 
     510             :   // Function to get the anticolour of the radiator before the splitting
     511             :   // for clustering
     512             :   // IN  int   : Position of the radiator after the splitting, in the event
     513             :   //     int   : Position of the emitted after the splitting, in the event
     514             :   //     Event : Reference event
     515             :   // OUT int   : Anticolour of the radiator before the splitting
     516             :   int getRadBeforeAcol(const int RadAfter, const int EmtAfter,
     517             :         const Event& event);
     518             : 
     519             :   // Function to get the parton connected to in by a colour line
     520             :   // IN  int   : Position of parton for which partner should be found
     521             :   //     Event : Reference event
     522             :   // OUT int   : If a colour line connects the "in" parton with another
     523             :   //             parton, return the Position of the partner, else return 0
     524             :   int getColPartner(const int in, const Event& event);
     525             : 
     526             :   // Function to get the parton connected to in by an anticolour line
     527             :   // IN  int   : Position of parton for which partner should be found
     528             :   //     Event : Reference event
     529             :   // OUT int   : If an anticolour line connects the "in" parton with another
     530             :   //             parton, return the Position of the partner, else return 0
     531             :   int getAcolPartner(const int in, const Event& event);
     532             : 
     533             :   // Function to get the list of partons connected to the particle
     534             :   // formed by reclusterinf emt and rad by colour and anticolour lines
     535             :   // IN  int          : Position of radiator in the clustering
     536             :   // IN  int          : Position of emitted in the clustering
     537             :   //     Event        : Reference event
     538             :   // OUT vector<int>  : List of positions of all partons that are connected
     539             :   //                    to the parton that will be formed
     540             :   //                    by clustering emt and rad.
     541             :   vector<int> getReclusteredPartners(const int rad, const int emt,
     542             :     const Event& event);
     543             : 
     544             :   // Function to extract a chain of colour-connected partons in
     545             :   // the event
     546             :   // IN     int          : Type of parton from which to start extracting a
     547             :   //                       parton chain. If the starting point is a quark
     548             :   //                       i.e. flavType = 1, a chain of partons that are
     549             :   //                       consecutively connected by colour-lines will be
     550             :   //                       extracted. If the starting point is an antiquark
     551             :   //                       i.e. flavType =-1, a chain of partons that are
     552             :   //                       consecutively connected by anticolour-lines
     553             :   //                       will be extracted.
     554             :   // IN      int         : Position of the parton from which a
     555             :   //                       colour-connected chain should be derived
     556             :   // IN      Event       : Refernence event
     557             :   // IN/OUT  vector<int> : Partons that should be excluded from the search.
     558             :   // OUT     vector<int> : Positions of partons along the chain
     559             :   // OUT     bool        : Found singlet / did not find singlet
     560             :   bool getColSinglet(const int flavType, const int iParton,
     561             :     const Event& event, vector<int>& exclude,
     562             :     vector<int>& colSinglet);
     563             : 
     564             :   // Function to check that a set of partons forms a colour singlet
     565             :   // IN  Event       : Reference event
     566             :   // IN  vector<int> : Positions of the partons in the set
     567             :   // OUT bool        : Is a colour singlet / is not
     568             :   bool isColSinglet( const Event& event, vector<int> system);
     569             :   // Function to check that a set of partons forms a flavour singlet
     570             :   // IN  Event       : Reference event
     571             :   // IN  vector<int> : Positions of the partons in the set
     572             :   // IN  int         : Flavour of all the quarks in the set, if
     573             :   //                   all quarks in a set should have a fixed flavour
     574             :   // OUT bool        : Is a flavour singlet / is not
     575             :   bool isFlavSinglet( const Event& event,
     576             :     vector<int> system, int flav=0);
     577             : 
     578             :   // Function to properly colour-connect the radiator to the rest of
     579             :   // the event, as needed during clustering
     580             :   // IN  Particle& : Particle to be connected
     581             :   //     Particle  : Recoiler forming a dipole with Radiator
     582             :   //     Event     : event to which Radiator shall be appended
     583             :   // OUT true               : Radiator could be connected to the event
     584             :   //     false              : Radiator could not be connected to the
     585             :   //                          event or the resulting event was
     586             :   //                          non-valid
     587             :   bool connectRadiator( Particle& Radiator, const int RadType,
     588             :                         const Particle& Recoiler, const int RecType,
     589             :                         const Event& event );
     590             : 
     591             :   // Function to find a colour (anticolour) index in the input event
     592             :   // IN  int col       : Colour tag to be investigated
     593             :   //     int iExclude1 : Identifier of first particle to be excluded
     594             :   //                     from search
     595             :   //     int iExclude2 : Identifier of second particle to be excluded
     596             :   //                     from  search
     597             :   //     Event event   : event to be searched for colour tag
     598             :   //     int type      : Tag to define if col should be counted as
     599             :   //                      colour (type = 1) [->find anti-colour index
     600             :   //                                         contracted with col]
     601             :   //                      anticolour (type = 2) [->find colour index
     602             :   //                                         contracted with col]
     603             :   // OUT int           : Position of particle in event record
     604             :   //                     contraced with col [0 if col is free tag]
     605             :   int FindCol(int col, int iExclude1, int iExclude2,
     606             :               const Event& event, int type, bool isHardIn);
     607             : 
     608             :   // Function to in the input event find a particle with quantum
     609             :   // numbers matching those of the input particle
     610             :   // IN  Particle : Particle to be searched for
     611             :   //     Event    : Event to be searched in
     612             :   // OUT int      : > 0 : Position of matching particle in event
     613             :   //                < 0 : No match in event
     614             :   int FindParticle( const Particle& particle, const Event& event,
     615             :     bool checkStatus = true );
     616             : 
     617             :   // Function to check if rad,emt,rec triple is allowed for clustering
     618             :   // IN int rad,emt,rec,partner : Positions (in event record) of the three
     619             :   //                      particles considered for clustering, and the
     620             :   //                      correct colour-connected recoiler (=partner)
     621             :   //    Event event     : Reference event
     622             :   bool allowedClustering( int rad, int emt, int rec, int partner,
     623             :     const Event& event );
     624             : 
     625             :   // Function to check if rad,emt,rec triple is results in
     626             :   // colour singlet radBefore+recBefore
     627             :   // IN int rad,emt,rec : Positions (in event record) of the three
     628             :   //                      particles considered for clustering
     629             :   //    Event event     : Reference event
     630             :   bool isSinglett( int rad, int emt, int rec, const Event& event );
     631             : 
     632             :   // Function to check if event is sensibly constructed: Meaning
     633             :   // that all colour indices are contracted and that the charge in
     634             :   // initial and final states matches
     635             :   // IN  event : event to be checked
     636             :   // OUT TRUE  : event is properly construced
     637             :   //     FALSE : event not valid
     638             :   bool validEvent( const Event& event );
     639             : 
     640             :   // Function to check whether two clusterings are identical, used
     641             :   // for finding the history path in the mother -> children direction
     642             :   bool equalClustering( Clustering clus1 , Clustering clus2 );
     643             : 
     644             :   // Chose dummy scale for event construction. By default, choose
     645             :   //     sHat     for 2->Boson(->2)+ n partons processes and
     646             :   //     M_Boson  for 2->Boson(->)             processes
     647             :   double choseHardScale( const Event& event ) const;
     648             : 
     649             :   // If the state has an incoming hadron return the flavour of the
     650             :   // parton entering the hard interaction. Otherwise return 0
     651             :   int getCurrentFlav(const int) const;
     652             : 
     653             :    // If the state has an incoming hadron return the x-value for the
     654             :    // parton entering the hard interaction. Otherwise return 0.
     655             :   double getCurrentX(const int) const;
     656             : 
     657             :   double getCurrentZ(const int rad, const int rec, const int emt) const;
     658             : 
     659             :   // Function to compute "pythia pT separation" from Particle input
     660             :   double pTLund(const Particle& RadAfterBranch,const Particle& EmtAfterBranch,
     661             :                 const Particle& RecAfterBranch, int ShowerType);
     662             : 
     663             :   // Function to return the position of the initial line before (or after)
     664             :   // a single (!) splitting.
     665             :   int posChangedIncoming(const Event& event, bool before);
     666             : 
     667             :   // Function to give back the ratio of PDFs and PDF * splitting kernels
     668             :   // needed to convert a splitting at scale pdfScale, chosen with running
     669             :   // PDFs, to a splitting chosen with PDFs at a fixed scale mu. As needed to
     670             :   // properly count emissions.
     671             :   double pdfFactor( const Event& event, const int type, double pdfScale,
     672             :     double mu );
     673             : 
     674             :   // Function giving the product of splitting kernels and PDFs so that the
     675             :   // resulting flavour is given by flav. This is used as a helper routine
     676             :   // to dgauss
     677             :   double integrand(int flav, double x, double scaleInt, double z);
     678             : 
     679             :   //----------------------------------------------------------------------//
     680             :   // Class members.
     681             :   //----------------------------------------------------------------------//
     682             : 
     683             :   // The state of the event correponding to this step in the
     684             :   // reconstruction.
     685             :   Event state;
     686             : 
     687             :   // The previous step from which this step has been clustered. If
     688             :   // null, this is the initial step with the n-jet state generated by
     689             :   // the matrix element.
     690             :   History * mother;
     691             : 
     692             :   // The different steps corresponding to possible clusterings of this
     693             :   // state.
     694             :   vector<History *> children;
     695             : 
     696             :   // The different paths which have been reconstructed indexed with
     697             :   // the (incremental) corresponding probability. This map is empty
     698             :   // unless this is the initial step (mother == 0).
     699             :   map<double,History *> paths;
     700             : 
     701             :   // The sum of the probabilities of the full paths. This is zero
     702             :   // unless this is the initial step (mother == 0).
     703             :   double sumpath;
     704             : 
     705             :   // The different allowed paths after projection, indexed with
     706             :   // the (incremental) corresponding probability. This map is empty
     707             :   // unless this is the initial step (mother == 0).
     708             :   map<double,History *> goodBranches, badBranches;
     709             :   // The sum of the probabilities of allowed paths after projection. This is
     710             :   // zero unless this is the initial step (mother == 0).
     711             :   double sumGoodBranches, sumBadBranches;
     712             : 
     713             :   // This is set true if an ordered (and complete) path has been found
     714             :   // and inserted in paths.
     715             :   bool foundOrderedPath;
     716             : 
     717             :   // This is set true if a strongly ordered (and complete) path has been found
     718             :   // and inserted in paths.
     719             :   bool foundStronglyOrderedPath;
     720             : 
     721             :   // This is set true if an allowed (according to a user criterion) path has
     722             :   // been found and inserted in paths.
     723             :   bool foundAllowedPath;
     724             : 
     725             :   // This is set true if a complete (with the required number of
     726             :   // clusterings) path has been found and inserted in paths.
     727             :   bool foundCompletePath;
     728             : 
     729             :   // The scale of this step, corresponding to clustering which
     730             :   // constructed the corresponding state (or the merging scale in case
     731             :   // mother == 0).
     732             :   double scale;
     733             : 
     734             :   // Flag indicating if a clustering in the construction of all histories is
     735             :   // the next clustering demanded by inout clusterings in LesHouches 2.0
     736             :   // accord.
     737             :   bool nextInInput;
     738             : 
     739             :   // The probability associated with this step and the previous steps.
     740             :   double prob;
     741             : 
     742             :   // The partons and scale of the last clustering.
     743             :   Clustering clusterIn;
     744             :   int iReclusteredOld, iReclusteredNew;
     745             : 
     746             :   // Flag to include the path amongst allowed paths.
     747             :   bool doInclude;
     748             : 
     749             :   // Pointer to MergingHooks object to get all the settings.
     750             :   MergingHooks* mergingHooksPtr;
     751             : 
     752             :    // The default constructor is private.
     753             :   History() {}
     754             : 
     755             :   // The copy-constructor is private.
     756             :   History(const History &) {}
     757             : 
     758             :   // The assignment operator is private.
     759             :   History & operator=(const History &) {
     760             :     return *this;
     761             :   }
     762             : 
     763             :   // BeamParticle to get access to PDFs
     764             :   BeamParticle beamA;
     765             :   BeamParticle beamB;
     766             :   // ParticleData needed to initialise the shower AND to get the
     767             :   // correct masses of partons needed in calculation of probability
     768             :   ParticleData* particleDataPtr;
     769             : 
     770             :   // Info object to have access to all information read from LHE file
     771             :   Info* infoPtr;
     772             : 
     773             :   // Minimal scalar sum of pT used in Herwig to choose history
     774             :   double sumScalarPT;
     775             : 
     776             : };
     777             : 
     778             : //==========================================================================
     779             : 
     780             : } // end namespace Pythia8
     781             : 
     782             : #endif // end Pythia8_History_H

Generated by: LCOV version 1.11