Code causing warning messages corrected.
[u/mrichter/AliRoot.git] / EVGEN / AliGenCocktail.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /* $Id$ */
17
18 // Container class for AliGenerator through recursion.
19 // Container is itself an AliGenerator.
20 // What is stored are not the pointers to the generators directly but to objects of type
21 // AliGenCocktail entry.   
22 // The class provides also iterator functionality.  
23 // Author: andreas.morsch@cern.ch 
24 //
25
26 #include <TList.h>
27 #include <TObjArray.h>
28
29 #include "AliGenCocktail.h"
30 #include "AliGenCocktailEntry.h"
31 #include "AliCollisionGeometry.h"
32 #include "AliRun.h"
33
34 ClassImp(AliGenCocktail)
35
36 AliGenCocktail::AliGenCocktail()
37                  :AliGenerator()
38 {
39 // Constructor
40     fName = "Cocktail";
41     fTitle= "Particle Generator using cocktail of generators";
42     fEntries = new TList;
43     flnk1 = 0;
44     flnk2 = 0;
45     fNGenerators=0;
46 }
47
48 AliGenCocktail::AliGenCocktail(const AliGenCocktail & cocktail):
49     AliGenerator(cocktail)
50 {
51 // Copy constructor
52     cocktail.Copy(*this);
53 }
54
55 AliGenCocktail::~AliGenCocktail()
56 {
57 // Destructor
58     delete fEntries;
59 }
60
61 void AliGenCocktail::
62 AddGenerator(AliGenerator *Generator, char* Name, Float_t RateExp)
63 {
64 //
65 //  Forward parameters to the new generator
66     if(TestBit(kPtRange) && !(Generator->TestBit(kPtRange)) && !(Generator->TestBit(kMomentumRange))) 
67         Generator->SetPtRange(fPtMin,fPtMax);
68     if(TestBit(kMomentumRange) && !(Generator->TestBit(kPtRange)) && !(Generator->TestBit(kMomentumRange)))
69         Generator->SetMomentumRange(fPMin,fPMax);
70     
71     if (!(Generator->TestBit(kYRange)))    
72         Generator->SetYRange(fYMin,fYMax);
73     if (!(Generator->TestBit(kPhiRange)))   
74         Generator->SetPhiRange(fPhiMin*180/TMath::Pi(),fPhiMax*180/TMath::Pi());
75     if (!(Generator->TestBit(kThetaRange))) 
76         Generator->SetThetaRange(fThetaMin*180/TMath::Pi(),fThetaMax*180/TMath::Pi());
77     if (!(Generator->TestBit(kVertexRange))) 
78         Generator->SetOrigin(fOrigin[0], fOrigin[1], fOrigin[2]);
79
80     Generator->SetSigma(fOsigma[0], fOsigma[1], fOsigma[2]);
81     Generator->SetVertexSmear(fVertexSmear);
82     Generator->SetVertexSource(kContainer);
83     Generator->SetTrackingFlag(fTrackIt);
84 //
85 //  Add generator to list   
86     
87     AliGenCocktailEntry *entry = 
88         new AliGenCocktailEntry(Generator, Name, RateExp);
89      fEntries->Add(entry);
90      fNGenerators++;
91  }
92
93   void AliGenCocktail::Init()
94 {
95 // Initialisation
96     TIter next(fEntries);
97     AliGenCocktailEntry *entry;
98     //
99     // Loop over generators and initialize
100     while((entry = (AliGenCocktailEntry*)next())) {
101         entry->Generator()->Init();
102     }  
103 }
104
105   void AliGenCocktail::FinishRun()
106 {
107 // Initialisation
108     TIter next(fEntries);
109     AliGenCocktailEntry *entry;
110     //
111     // Loop over generators and initialize
112     while((entry = (AliGenCocktailEntry*)next())) {
113         entry->Generator()->FinishRun();
114     }  
115 }
116
117  void AliGenCocktail::Generate()
118 {
119 //
120 // Generate event 
121     TIter next(fEntries);
122     AliGenCocktailEntry *entry = 0;
123     AliGenCocktailEntry *preventry = 0;
124     AliGenerator* gen = 0;
125
126     TObjArray *partArray = gAlice->Particles();
127
128 //
129 //  Generate the vertex position used by all generators
130 //    
131     if(fVertexSmear == kPerEvent) Vertex();
132
133     
134   //
135     // Loop over generators and generate events
136     Int_t igen=0;
137     
138     while((entry = (AliGenCocktailEntry*)next())) {
139         igen++;
140         if (igen ==1) {
141             entry->SetFirst(0);
142         } else {
143             entry->SetFirst((partArray->GetEntriesFast())+1);
144         }
145 //
146 //      Handle case in which current generator needs collision geometry from previous generator
147 //
148         gen = entry->Generator();
149         if (gen->NeedsCollisionGeometry())
150         {
151             if (preventry && preventry->Generator()->ProvidesCollisionGeometry())
152             {
153                 gen->SetCollisionGeometry(preventry->Generator()->CollisionGeometry());
154             } else {
155                 Fatal("Generate()", "No Collision Geometry Provided");
156             }
157         }
158         entry->Generator()->SetVertex(fVertex.At(0), fVertex.At(1), fVertex.At(2));
159         entry->Generator()->Generate();
160         entry->SetLast(partArray->GetEntriesFast());
161         preventry = entry;
162     }  
163     next.Reset();
164 }
165
166 AliGenCocktailEntry *  AliGenCocktail::FirstGenerator()
167 {
168 // Iterator over generators: Initialisation
169     flnk1 = fEntries->FirstLink();
170     if (flnk1) {
171         return (AliGenCocktailEntry*) (flnk1->GetObject());
172     } else {
173         return 0;
174     }
175 }
176
177 AliGenCocktailEntry*  AliGenCocktail::NextGenerator()
178 {
179 // Iterator over generators: Increment
180     flnk1 = flnk1->Next();
181     if (flnk1) {
182         return (AliGenCocktailEntry*) (flnk1->GetObject());
183     } else {
184         return 0;
185     }
186 }
187
188 void AliGenCocktail::
189 FirstGeneratorPair(AliGenCocktailEntry*& e1, AliGenCocktailEntry*& e2)
190 {
191 // Iterator over generator pairs: Initialisation
192     flnk2 = flnk1 = fEntries->FirstLink();
193     if (flnk1) {
194         e2 = e1 = (AliGenCocktailEntry*) (flnk1->GetObject());
195     } else {
196         e2= e1 = 0;
197     }
198 }
199
200 void AliGenCocktail::
201 NextGeneratorPair(AliGenCocktailEntry*& e1, AliGenCocktailEntry*& e2)
202 {
203 // Iterator over generators: Increment
204     flnk2 = flnk2->Next();
205     if (flnk2) {
206         e1 = (AliGenCocktailEntry*) (flnk1->GetObject());
207         e2 = (AliGenCocktailEntry*) (flnk2->GetObject());       
208     } else {
209         flnk2 = flnk1 = flnk1->Next();
210         if (flnk1) {
211             e1 = (AliGenCocktailEntry*) (flnk1->GetObject());
212             e2 = (AliGenCocktailEntry*) (flnk2->GetObject());
213         } else {
214             e1=0;
215             e2=0;
216         }
217     }
218 }
219
220 AliGenCocktail& AliGenCocktail::operator=(const  AliGenCocktail& rhs)
221 {
222 // Assignment operator
223     rhs.Copy(*this); 
224     return (*this);
225 }
226
227 void AliGenCocktail::Copy(AliGenCocktail &) const
228 {
229     Fatal("Copy","Not implemented!\n");
230 }
231
232
233