Generator for HBT
[u/mrichter/AliRoot.git] / EVGEN / AliGenHBTosl.h
1 #ifndef ALIGENHBTOSL_H
2 #define ALIGENHBTOSL_H
3 //__________________________________________________________
4 /////////////////////////////////////////////////////////////
5 //                                                         //
6 //  class AliGenHBTosl                                     //
7 //                                                         //
8 //  Genarator simulating particle correlations             //
9 //                                                         //
10 //  The main idea of the generator is to produce particles //
11 //  according to some distribution of two particle         //
12 //  property. In HBT they are qout,qsie and qlong.         //
13 //  In order to be able to generate signal that produces   //
14 //  given two particle correlation background must be      //
15 //  known before in order to produce the shape of signal   //
16 //  to randomize given distribution from.                  //
17 //                                                         //
18 //  The generator works as follows:                        //
19 //  1. Coarse Background (fQCoarseBackground) is generated //
20 //     ade  from the particles                             //
21 //     given by the external generator (variable           //
22 //     fGenerator) by the mixing technique.                //
23 //  2. Coarse signal is prduced by multiplying Coarse      //
24 //     background by a required function                   //
25 //     See method FillCoarseSignal                         //
26 //  3. Signal is randomized out of the coarse signal       //
27 //     histogram (two particle property). First particle   //
28 //     is taken from the external generator, and the       //
29 //     second one is CALCULATED on the basis of the first  //
30 //     one and the two particle property (qout,qside,qlong)//
31 //     Background is made by the mixing out of the         //
32 //     genereted signal events.                            //
33 //     This step is cotinued up to the moment signal       //
34 //     histogram has enough statistics (data member        //
35 //     fMinFill)                                           //
36 //     See method StartSignalPass1()                       //
37 //  4. chi is calculated for each bin (chiarray variqable) // 
38 //     (not the chi2 because sign is important)            //
39 //     Two particle prioperty                              //
40 //     (qout,qside,qlong) is chosen at the points that     //
41 //     chi is the smallest. First particle is taken from   //
42 //     the the external generator (fGenerator) and second's /
43 //     momenta are caclulated out of their momenta and     //
44 //     (qout,qside,qlong). Background is updated           //
45 //     continuesely for all the events. This step is       //
46 //     continued until stability conditions are fullfiled  //
47 //     or maximum number of iteration is reached.          //
48 //  5. The same as step 4 but events are stored.           //
49 //                                                         //
50 ////////////////////////////////////////////////////////////
51
52 #include "AliGenerator.h"
53
54 class TH3D;
55 class AliStack;
56 class TParticle;
57 class TVector;
58
59 class AliGenHBTosl: public AliGenerator
60 {
61  public:
62    AliGenHBTosl();
63    AliGenHBTosl(Int_t n,Int_t pid = 211);
64    virtual ~AliGenHBTosl();
65
66    void      Init();
67    void      Generate();
68    
69    void      SetGenerator(AliGenerator* gen){fGenerator = gen;}
70    void      SetDebug(Bool_t debug){fDebug = debug;}
71    Bool_t    GetDebug() const {return fDebug;}
72
73    void      Rotate(TVector3& relvector, TVector3& vector);
74    Double_t  Rotate(Double_t x,Double_t y,Double_t z);
75    void      SetSamplePhiRange(Float_t min,Float_t max){fSamplePhiMin = min; fSamplePhiMax = max;}
76
77    Int_t GetThreeD(TParticle* first,TParticle* second, Double_t qout, Double_t qside, Double_t qlong);
78       
79    
80  protected:
81
82    void GetOneD(TParticle* first, TParticle* second,Double_t qinv);
83    
84    void FillCoarse();
85    void FillCoarseSignal();
86    void StartSignal();
87    void StartSignalPass1();
88    void Mix(TList* eventbuffer,TH3D* denominator,TH3D* denominator2);
89    void Mix(AliStack* stack, TH3D* numerator, TH3D* numerator2);
90    Double_t GetQInv(TParticle* f, TParticle* s);
91    void     GetQOutQSideQLong(TParticle* f, TParticle* s,Double_t& out, Double_t& side, Double_t& lon);
92    Double_t GetQInvCorrTheorValue(Double_t qinv) const;
93    Double_t GetQOutQSideQLongCorrTheorValue(Double_t& out, Double_t& side, Double_t& lon) const;
94    
95    Double_t Scale(TH3D* num,TH3D* den);
96    void SetTrack(TParticle* p, Int_t& ntr);
97    void SetTrack(TParticle* p, Int_t& ntr, AliStack* stack);
98    
99    AliStack* RotateStack();
100    void SwapGeneratingHistograms();
101    void     TestCoarseSignal();
102    
103    Bool_t CheckParticle(TParticle* p, TParticle* aupair,AliStack* stack);
104  private:
105   TH3D*    fQCoarseBackground;//Initial Background
106   TH3D*    fQCoarseSignal;//
107   TH3D*    fQSignal;
108   TH3D*    fQBackground;
109
110   TH3D*    fQSecondSignal;
111   TH3D*    fQSecondBackground;
112   
113   Float_t  fQRange;
114   Int_t    fQNBins;
115   AliGenerator* fGenerator;
116   
117   TList*   fStackBuffer;
118   Int_t    fBufferSize;
119   Int_t    fNBinsToScale;
120   Bool_t   fDebug;
121   Bool_t   fSignalShapeCreated;
122   
123   Int_t    fMaxIterations;  //maximal nuber of iterations on startup
124   Float_t  fMaxChiSquereChange;//value of ChiSqr change in %, when sturtup process in stable
125   Float_t  fMaxChiSquerePerNDF;//value of the chi2 where generating histograms are considered as good
126   
127   
128   Double_t fQRadius;
129   
130   Int_t    fPID;
131   //we limit mixing to some finit phi range to make it faster
132   Float_t  fSamplePhiMin;//
133   Float_t  fSamplePhiMax;//
134   
135   Float_t  fSignalRegion;
136   
137   Int_t    fMinFill;
138   
139   Bool_t   fSwapped;
140   
141   ClassDef(AliGenHBTosl,1)
142 };
143 #endif