]>
Commit | Line | Data |
---|---|---|
09c93afd | 1 | /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * |
2 | * See cxx source for full Copyright notice */ | |
3 | /* $Id$ */ | |
4 | ||
5 | // AliFlowOnTheFlyEventGenerator | |
6 | // origin: Redmer Alexander Bertens (rbertens@cern.ch, rbertens@nikhef.nl, rbertens@uu.nl) | |
7 | ||
8 | #ifndef ALIFLOWONTHEFLYEVENTGENERATOR_H | |
9 | #define ALIFLOWONTHEFLYEVENTGENERATOR_H | |
10 | ||
11 | #include "TObject.h" | |
12 | #include "TClonesArray.h" | |
13 | #include "TRandom.h" | |
14 | #include "TH1F.h" | |
15 | #include "TH2F.h" | |
16 | #include "TF1.h" | |
17 | #include "TParticle.h" | |
18 | ||
19 | class AliFlowEventSimple; | |
20 | class TVirtualMCDecayer; | |
21 | ||
22 | class AliFlowOnTheFlyEventGenerator : public TObject { | |
23 | public: | |
24 | // general | |
25 | AliFlowOnTheFlyEventGenerator(); | |
26 | AliFlowOnTheFlyEventGenerator(Bool_t qa, Int_t mult, TVirtualMCDecayer* decayer, Bool_t a, Bool_t b, Bool_t c, Bool_t d); | |
27 | virtual ~AliFlowOnTheFlyEventGenerator(); | |
28 | class NaiveFlowAndSpectrumGenerator : public TObject { // small nested helper class. use methods of AliFlowOnTheFlyEventGenerator to get access to members | |
29 | public: | |
30 | NaiveFlowAndSpectrumGenerator(Short_t pdg, Bool_t qa) : fPdg(pdg), fQA(qa), fpt(0), fv2(0), fv3(0), fQApt(0), fQAv2(0), fQAv3(0) { | |
31 | TParticle* t = new TParticle(); t->SetPdgCode(fPdg); | |
32 | fpt = new TF1(Form("pt_%i", pdg), Form("x/TMath::Power(1+2*TMath::Sqrt(%f*%f+x*x),4)", t->GetMass(), t->GetMass()),0.,20); | |
33 | fv2 = new TF1(Form("v2_%i", pdg), Form("TMath::Log(x+1)*.2/TMath::Power(%f*%f+x*x,.2)", t->GetMass(), t->GetMass()), 0., 20); | |
34 | fv3 = new TF1(Form("v3_%i", pdg), Form("TMath::Log(x+1)*.1/TMath::Power(%f*%f+x*x,.2)", t->GetMass(), t->GetMass()), 0., 20); | |
35 | if(fQA) { fQApt = new TH1F(Form("pt_%i", fPdg),Form("pt_%i", fPdg),100,0,20); | |
36 | fQAv2 = new TH2F(Form("v2_%i", fPdg),Form("v2_%i", fPdg),100,0,20, 100, 0, .2); | |
37 | fQAv3 = new TH2F(Form("v3_%i", fPdg),Form("v3_%i", fPdg),100,0,20, 100, 0, .2); } | |
38 | delete t; | |
39 | } | |
40 | virtual ~NaiveFlowAndSpectrumGenerator() {if(fpt) delete fpt; if(fv2) delete fv2; if(fv3) delete fv3; if(fQA) {delete fQApt; delete fQAv2; delete fQAv3;};} | |
41 | Short_t GetPDGCode() const {return fPdg;} | |
42 | Double_t GetPt() const {double _pt(fpt->GetRandom()); if(fQA) fQApt->Fill(_pt); return _pt;} | |
43 | Double_t GetV2(Double_t pt) const {double _v2(fv2->Eval(pt)); if(fQA) fQAv2->Fill(pt, _v2); return _v2;} | |
44 | Double_t GetV3(Double_t pt) const {double _v3(fv3->Eval(pt)); if(fQA) fQAv3->Fill(pt, _v3); return _v3;} | |
45 | TF1* GetPtSpectrum() const {return fpt;} // return pt fSpectrum | |
46 | TF1* GetDifferentialV2() const {return fv2;} // return fDifferential v2 | |
47 | TF1* GetDifferentialV3() const {return fv3;} // return fDifferential v3 | |
48 | TH1* GetQAType(Int_t t) const { if(t==0) return (TH1*)fQApt; | |
49 | if(t==1) return (TH1*)fQAv2; | |
50 | if(t==2) return (TH1*)fQAv3; | |
51 | return 0x0; } // return fQA histo | |
52 | void SetPtSpectrum(TF1* s) {fpt = s;} // set custom fSpectrum | |
53 | void SetDifferentialV2(TF1* v2) {fv2 = v2; } // set custom fDifferential v2 | |
54 | void SetDifferentialV3(TF1* v3) {fv3 = v3; } // set custom fDifferential v3 | |
55 | private: | |
56 | Short_t fPdg; // pdg value of track | |
57 | Bool_t fQA; // make fQA plots for all generated species | |
58 | TF1* fpt; // !pt fSpectrum | |
59 | TF1* fv2; // !fDifferential v2 | |
60 | TF1* fv3; // !fDifferential v3 | |
61 | TH1F* fQApt; // !pt fSpectrum for fQA | |
62 | TH2F* fQAv2; // !v2 for fQA | |
63 | TH2F* fQAv3; // !v3 for fQA | |
64 | NaiveFlowAndSpectrumGenerator(const NaiveFlowAndSpectrumGenerator& dummy); // not implemented | |
65 | NaiveFlowAndSpectrumGenerator& operator =(const NaiveFlowAndSpectrumGenerator& dummy); // not implemented | |
66 | }; // end of NaiveFlowAndSpectrumGenerator | |
67 | // access to some members of the hidden nested class | |
68 | NaiveFlowAndSpectrumGenerator* Find(Short_t pdg, Bool_t make); | |
69 | TObjArray* GetGenerators() {return fGenerators; } | |
70 | void SetPtSpectrum(const char* func, Short_t pdg); | |
71 | void SetPtDependentV2(const char* func, Short_t pdg); | |
72 | void SetPtDependentV3(const char* func, Short_t pdg); | |
73 | TF1* GetPtSpectrum(Short_t pdg) {return Find(pdg, kTRUE)->GetPtSpectrum();} | |
74 | TF1* GetDifferentialV2(Short_t pdg) {return Find(pdg, kTRUE)->GetDifferentialV2();} | |
75 | TF1* GetDifferentialV3(Short_t pdg) {return Find(pdg, kTRUE)->GetDifferentialV3();} | |
76 | TH1* GetQAType(Short_t pdg, Int_t type) {return Find(pdg, kTRUE)->GetQAType(type);} | |
77 | // event generator | |
78 | void AddV2(TParticle* particle, Double_t v2); | |
79 | void AddV2(TClonesArray* event); | |
80 | void SetAfterBurnerPrecision(Double_t a, Int_t b) { fPrecisionPhi = a; fMaxNumberOfIterations = b; } | |
81 | void GenerateOnTheFlyTracks(Int_t mult, Int_t pid, TClonesArray* event); | |
82 | void DecayOnTheFlyTracks(TClonesArray* event); | |
83 | void ForceGammaDecay(TClonesArray* arr, TParticle* part); | |
84 | AliFlowEventSimple* GenerateOnTheFlyEvent(TClonesArray* event, Int_t nSpecies, Int_t species[], Int_t mult[], Int_t bg, Bool_t fluc); | |
85 | void EmbedEvent(TClonesArray* embedMe) {fEmbedMe = embedMe;} | |
86 | AliFlowEventSimple* ConvertTClonesToFlowEvent(TClonesArray* event, Int_t totalMultiplicity); | |
87 | void AddV2Mothers(Bool_t b) { fAddV2Mothers = b; } | |
88 | void AddV3Mothers(Bool_t b) { fAddV3Mothers = b; } | |
89 | void AddV2Daughters(Bool_t b) { fAddV2Daughters = b; } | |
90 | void AddV3Daughters(Bool_t b) { fAddV3Daughters = b; } | |
91 | // 'bookkeeping' | |
92 | void InitGenerators(); | |
93 | void PrintGenerators(); | |
94 | void DoGeneratorQA(Bool_t v2, Bool_t v3); | |
95 | ||
96 | private: | |
97 | // (transient) class members | |
98 | TObjArray* fGenerators; // array with generators | |
99 | TClonesArray* fEmbedMe; // tclones array for embedding | |
100 | AliFlowEventSimple* fFlowEvent; //! flow event simple for output | |
101 | TVirtualMCDecayer* fDecayer; // virtual decayer, needs to be set in macro | |
102 | Bool_t fAddV2Mothers; // add v2 to mother tracks | |
103 | Bool_t fAddV3Mothers; // add v3 to mother tracks | |
104 | Bool_t fAddV2Daughters; // add v2 to daughter tracks (not implemented) | |
105 | Bool_t fAddV3Daughters; // add v3 to daughter tracks (not implemented) | |
106 | Double_t fPsi2; // 2nd order symmetry plane | |
107 | Double_t fPsi3; // 3rd order symmetry plane (not implemented) | |
108 | Double_t fPrecisionPhi; // afterburner convergence precision | |
109 | Int_t fMaxNumberOfIterations; // afterburner convergence precision | |
110 | Bool_t fQA; // save qa histograms for all generated species | |
111 | // assignment operator and copy constructor | |
112 | AliFlowOnTheFlyEventGenerator(const AliFlowOnTheFlyEventGenerator& dummy); // not implemented | |
113 | AliFlowOnTheFlyEventGenerator& operator =(const AliFlowOnTheFlyEventGenerator& dummy); // not implemented | |
114 | ||
115 | ClassDef(AliFlowOnTheFlyEventGenerator, 0) | |
116 | }; | |
117 | ||
118 | #endif |