]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG/FLOW/Base/AliFlowOnTheFlyEventGenerator.h
extra classes for on the fly
[u/mrichter/AliRoot.git] / PWG / FLOW / Base / AliFlowOnTheFlyEventGenerator.h
CommitLineData
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
19class AliFlowEventSimple;
20class TVirtualMCDecayer;
21
22class 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