New class added.
[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 TVector3;
58
59 #include <Riostream.h>
60
61 class AliGenHBTosl: public AliGenerator
62 {
63  public:
64    AliGenHBTosl();
65    AliGenHBTosl(Int_t n,Int_t pid = 211);
66    AliGenHBTosl(const AliGenHBTosl& hbt);
67    virtual ~AliGenHBTosl();
68
69    void      Init();
70    void      Generate();
71    
72    void      SetGenerator(AliGenerator* gen){fGenerator = gen;}
73    void      SetDebug(Int_t debug){fDebug = debug;}
74    Int_t    GetDebug() const {return fDebug;}
75
76    void      Rotate(TVector3& relvector, TVector3& vector);
77    Double_t  Rotate(Double_t x,Double_t y,Double_t z);
78    void      SetSamplePhiRange(Float_t min,Float_t max){fSamplePhiMin = min; fSamplePhiMax = max;}
79
80    Int_t GetThreeD(TParticle* first,TParticle* second, Double_t qout, Double_t qside, Double_t qlong);
81       
82    
83  protected:
84
85    void GetOneD(TParticle* first, TParticle* second,Double_t qinv);
86    
87    void FillCoarse();
88    void FillCoarseSignal();
89    void StartSignal();
90    void StartSignalPass1();
91    void Mix(TList* eventbuffer,TH3D* denominator,TH3D* denominator2);
92    void Mix(AliStack* stack, TH3D* numerator, TH3D* numerator2);
93    Double_t GetQInv(TParticle* f, TParticle* s);
94    void     GetQOutQSideQLong(TParticle* f, TParticle* s,Double_t& out, Double_t& side, Double_t& lon);
95    Double_t GetQInvCorrTheorValue(Double_t qinv) const;
96    Double_t GetQOutQSideQLongCorrTheorValue(Double_t& out, Double_t& side, Double_t& lon) const;
97    
98    Double_t Scale(TH3D* num,TH3D* den);
99    void SetTrack(TParticle* p, Int_t& ntr) ;
100    void SetTrack(TParticle* p, Int_t& ntr, AliStack* stack) const ;
101    
102    AliStack* RotateStack();
103    void SwapGeneratingHistograms();
104    void     TestCoarseSignal();
105    
106    Bool_t CheckParticle(TParticle* p, TParticle* aupair,AliStack* stack);
107    void Copy(TObject&) const;
108    AliGenHBTosl & operator=(const AliGenHBTosl & rhs);
109  private:
110   TH3D*    fQCoarseBackground;//Initial Background
111   TH3D*    fQCoarseSignal;//signal calculated by multiplying coarse background and model function
112   TH3D*    fQSignal;//generating signal histogram
113   TH3D*    fQBackground;//generating background histogram
114
115   TH3D*    fQSecondSignal;//second signal histogram
116   TH3D*    fQSecondBackground;//seconf background histogram
117   
118   Float_t  fQRange;//range of generating histograms
119   Int_t    fQNBins;//number of bins of generating histograms
120   AliGenerator* fGenerator;//input generator
121   
122   TList*   fStackBuffer;//List with stacks
123   Int_t    fBufferSize;//defines number of events used for background mixing
124   Int_t    fNBinsToScale;//defines how many bins are used to calculate scaling factor
125   Int_t   fDebug;//debug flag
126   Bool_t   fSignalShapeCreated;//flag indicating that generating histograms are ready
127   
128   Int_t    fMaxIterations;  //maximal nuber of iterations on startup
129   Float_t  fMaxChiSquereChange;//value of ChiSqr change in %, when sturtup process in stable
130   Float_t  fMaxChiSquerePerNDF;//value of the chi2 where generating histograms are considered as good
131   
132   
133   Double_t fQRadius;//simulated radius
134   
135   Int_t    fPID;//pid of particle
136   //we limit mixing to some finit phi range to make it faster
137   Float_t  fSamplePhiMin;//min phi
138   Float_t  fSamplePhiMax;//max phi
139   
140   Float_t  fSignalRegion;//Defines signal region
141   
142   Int_t    fMinFill;//Minimal allowed fill in background histograms - fill is continued until all bins have more than this
143   
144   Bool_t   fSwapped;//indicates if generating histograms were already swapped
145
146   ofstream* fLogFile;//! File where logs are stored
147   
148   ClassDef(AliGenHBTosl,1)
149 };
150 #endif