fix AliHLTGlobalEsdConverterComponent
[u/mrichter/AliRoot.git] / TEvtGen / THepMCParser.h
1 // module identifier line...
2 // Author: Brian Thorsbro, 24/6-2014
3
4
5 #ifndef THEPMCPARSER_H
6 #define THEPMCPARSER_H
7
8 #include <string>
9 #include <list>
10 #include <set>
11 #include "TTree.h"
12 #include "TClonesArray.h"
13 #include "TParticle.h"
14
15 namespace HepMC {
16   class IO_BaseClass;
17   class GenVertex;
18   class GenEvent;
19 }
20
21 class THepMCParser {
22
23 private:
24
25    TTree * fTree;
26    void init(HepMC::IO_BaseClass *);
27
28    // 'name(pdgcode,invmass)' if db entry or 'pdgcode()' if no db entry
29    static std::string GetParticleName(TParticle *);
30
31    // Fold out the vertex tree in a list, such that daughters are always last
32    static void ExploreVertex(HepMC::GenVertex *, std::list<HepMC::GenVertex*> &, std::set<int> &, bool);
33
34
35 public:
36
37    // Header struct
38    static const char * fgHeavyIonHeaderBranchString; // "Ncoll_hard/I,Npart_proj,Npart_targ,Ncoll,spectator_neutrons,spectator_protons,N_Nwounded_collisions,Nwounded_N_collisions,Nwounded_Nwounded_collisions,impact_parameter/F,event_plane_angle,eccentricity,sigma_inel_NN";
39    struct HeavyIonHeader_t {
40       Int_t   Ncoll_hard;                    // Number of hard scatterings
41       Int_t   Npart_proj;                    // Number of projectile participants
42       Int_t   Npart_targ;                    // Number of target participants
43       Int_t   Ncoll;                         // Number of NN (nucleon-nucleon) collisions
44       Int_t   spectator_neutrons;            // Number of spectator neutrons
45       Int_t   spectator_protons;             // Number of spectator protons
46       Int_t   N_Nwounded_collisions;         // Number of N-Nwounded collisions
47       Int_t   Nwounded_N_collisions;         // Number of Nwounded-N collisons
48       Int_t   Nwounded_Nwounded_collisions;  // Number of Nwounded-Nwounded collisions
49       Float_t impact_parameter;              // Impact Parameter(in fm) of collision
50       Float_t event_plane_angle;             // Azimuthal angle of event plane
51       Float_t eccentricity;                  // eccentricity of participating nucleons in the transverse plane (as in phobos nucl-ex/0510031)
52       Float_t sigma_inel_NN;                 // nucleon-nucleon inelastic (including diffractive) cross-section
53    };
54    static const char * fgPdfHeaderBranchString; // "id1/I,id2,pdf_id1,pdf_id2,x1/D,x2,scalePDF,pdf1,pdf2";
55    struct PdfHeader_t {
56       Int_t    id1;        // flavour code of first parton
57       Int_t    id2;        // flavour code of second parton
58       Int_t    pdf_id1;    // LHAPDF set id of first parton
59       Int_t    pdf_id2;    // LHAPDF set id of second parton
60       Double_t x1;         // fraction of beam momentum carried by first parton ("beam side")
61       Double_t x2;         // fraction of beam momentum carried by second parton ("target side")
62       Double_t scalePDF;   // Q-scale used in evaluation of PDF's   (in GeV)
63       Double_t pdf1;       // PDF (id1, x1, Q) - x*f(x)
64       Double_t pdf2;       // PDF (id2, x2, Q) - x*f(x)
65    };
66
67    // Default constructor/destructor stuff, don't inherit from this class unless you handle the tree pointer
68    inline THepMCParser() : fTree(0) {;} // nullptr in c++11
69    inline virtual ~THepMCParser() {;} // should be a memory management of the TTree...
70
71    // The actual useful constructors, either take:
72    //  - a file name for a file with HepMC data or
73    //  - a HepMC event data structure
74    THepMCParser(const char *);
75    THepMCParser(HepMC::IO_BaseClass *);
76
77    // Optional validators, set the argument to true for verbose output to STDERR
78    // WARNING: including status code 2 may produce invalid flag when it is in fact valid, not recommended to use
79    bool IsValidMotherDaughtersConsitency(bool useStdErr = false, bool requireSecondMotherBeforeDaughters = false);
80    bool IsValidParticleInvariantMass(bool useStdErr = false, bool includeStatusCode2Particles = false);
81    bool IsValidVertexInvariantMass(bool useStdErr = false, bool includeStatusCode2Particles = false);
82
83    // Show the decay chain by point of view of some particle
84    static std::string ListReactionChain(TClonesArray *, Int_t);
85
86    // Access the TTree generated or write it to a file
87    TTree * GetTTree();
88    void WriteTTreeToFile(const char *);
89
90    // ***** The constructors will parse all the events with this function for you *****
91    // The work horse of the parser, takes one event and generates the corresponding TClonesArray of TParticles,
92    // Units links directly to HepMC library which governs which units are available
93    // The default momentum unit is GEV, other option is MEV
94    // The default length unit is CM, other option is MM
95    // requireSecondMotherBeforeDaughters defaults to false
96    //  - Success if length of return string is 0, the provided TClonesArray has been filled
97    //  - Failure otherwise and the return string then contains the error message
98    //
99    // Note:
100    // The TClonesArray must be initialized before hand
101    // the array will be cleared and filled with TParticles
102    // The capacity of the array will be set to the number of particles parsed
103    // First mother will be before the daughters, but second mother may be after
104    // The two first particles in the array will be the beam particles
105    // The status code set on the particle is copied from HepMC, i.e.
106    //  - 1 = final particle
107    //  - 2 = transitory particle
108    //  - 4 = beam particle
109    // The function is static to enable customized wrappers around it
110    static std::string ParseGenEvent2TCloneArray(HepMC::GenEvent *, TClonesArray *, std::string momUnit = "GEV", std::string lenUnit = "CM", bool requireSecondMotherBeforeDaughters = false);
111
112
113    // Depending on the implementation of HepMC::IO_BaseClass there may be information on
114    // heavy ions or parton distribution functions available. This function will pull them
115    // out if available.
116    // The caller must supply allocated structures which will then be filled.
117    static std::string ParseGenEvent2HeaderStructs(HepMC::GenEvent *, HeavyIonHeader_t &, PdfHeader_t &, bool fillZeroOnMissingHeavyIon = true, bool fillZeroOnMissingPdf = true);
118
119
120 };
121
122 #endif