]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EVGEN/AliGenCocktail.cxx
Phi range consistent with new coordinate system.
[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     flnk1 = 0;
43     flnk2 = 0;
44     fNGenerators=0;
45     fEntries = 0;
46     
47 }
48
49 AliGenCocktail::AliGenCocktail(const AliGenCocktail & cocktail):
50     AliGenerator(cocktail)
51 {
52 // Copy constructor
53     cocktail.Copy(*this);
54 }
55
56 AliGenCocktail::~AliGenCocktail()
57 {
58 // Destructor
59     delete fEntries;
60 }
61
62 void AliGenCocktail::
63 AddGenerator(AliGenerator *Generator, char* Name, Float_t RateExp)
64 {
65 //
66 // Add a generator to the list 
67 // First check that list exists
68     if (!fEntries) fEntries = new TList();
69
70 //
71 //  Forward parameters to the new generator
72     if(TestBit(kPtRange) && !(Generator->TestBit(kPtRange)) && !(Generator->TestBit(kMomentumRange))) 
73         Generator->SetPtRange(fPtMin,fPtMax);
74     if(TestBit(kMomentumRange) && !(Generator->TestBit(kPtRange)) && !(Generator->TestBit(kMomentumRange)))
75         Generator->SetMomentumRange(fPMin,fPMax);
76     
77     if (!(Generator->TestBit(kYRange)))    
78         Generator->SetYRange(fYMin,fYMax);
79     if (!(Generator->TestBit(kPhiRange)))   
80         Generator->SetPhiRange(fPhiMin*180/TMath::Pi(),fPhiMax*180/TMath::Pi());
81     if (!(Generator->TestBit(kThetaRange))) 
82         Generator->SetThetaRange(fThetaMin*180/TMath::Pi(),fThetaMax*180/TMath::Pi());
83     if (!(Generator->TestBit(kVertexRange))) 
84         Generator->SetOrigin(fOrigin[0], fOrigin[1], fOrigin[2]);
85
86     Generator->SetSigma(fOsigma[0], fOsigma[1], fOsigma[2]);
87     Generator->SetVertexSmear(fVertexSmear);
88     Generator->SetVertexSource(kContainer);
89     Generator->SetTrackingFlag(fTrackIt);
90 //
91 //  Add generator to list   
92     
93     AliGenCocktailEntry *entry = 
94         new AliGenCocktailEntry(Generator, Name, RateExp);
95      fEntries->Add(entry);
96      fNGenerators++;
97  }
98
99   void AliGenCocktail::Init()
100 {
101 // Initialisation
102     TIter next(fEntries);
103     AliGenCocktailEntry *entry;
104     //
105     // Loop over generators and initialize
106     while((entry = (AliGenCocktailEntry*)next())) {
107         entry->Generator()->Init();
108     }  
109 }
110
111   void AliGenCocktail::FinishRun()
112 {
113 // Initialisation
114     TIter next(fEntries);
115     AliGenCocktailEntry *entry;
116     //
117     // Loop over generators and initialize
118     while((entry = (AliGenCocktailEntry*)next())) {
119         entry->Generator()->FinishRun();
120     }  
121 }
122
123  void AliGenCocktail::Generate()
124 {
125 //
126 // Generate event 
127     TIter next(fEntries);
128     AliGenCocktailEntry *entry = 0;
129     AliGenCocktailEntry *preventry = 0;
130     AliGenerator* gen = 0;
131
132     TObjArray *partArray = gAlice->Particles();
133
134 //
135 //  Generate the vertex position used by all generators
136 //    
137     if(fVertexSmear == kPerEvent) Vertex();
138
139     
140   //
141     // Loop over generators and generate events
142     Int_t igen=0;
143     
144     while((entry = (AliGenCocktailEntry*)next())) {
145         igen++;
146         if (igen ==1) {
147             entry->SetFirst(0);
148         } else {
149             entry->SetFirst((partArray->GetEntriesFast())+1);
150         }
151 //
152 //      Handle case in which current generator needs collision geometry from previous generator
153 //
154         gen = entry->Generator();
155         if (gen->NeedsCollisionGeometry())
156         {
157             if (preventry && preventry->Generator()->ProvidesCollisionGeometry())
158             {
159                 gen->SetCollisionGeometry(preventry->Generator()->CollisionGeometry());
160             } else {
161                 Fatal("Generate()", "No Collision Geometry Provided");
162             }
163         }
164         entry->Generator()->SetVertex(fVertex.At(0), fVertex.At(1), fVertex.At(2));
165         entry->Generator()->Generate();
166         entry->SetLast(partArray->GetEntriesFast());
167         preventry = entry;
168     }  
169     next.Reset();
170 }
171
172 AliGenCocktailEntry *  AliGenCocktail::FirstGenerator()
173 {
174 // Iterator over generators: Initialisation
175     flnk1 = fEntries->FirstLink();
176     if (flnk1) {
177         return (AliGenCocktailEntry*) (flnk1->GetObject());
178     } else {
179         return 0;
180     }
181 }
182
183 AliGenCocktailEntry*  AliGenCocktail::NextGenerator()
184 {
185 // Iterator over generators: Increment
186     flnk1 = flnk1->Next();
187     if (flnk1) {
188         return (AliGenCocktailEntry*) (flnk1->GetObject());
189     } else {
190         return 0;
191     }
192 }
193
194 void AliGenCocktail::
195 FirstGeneratorPair(AliGenCocktailEntry*& e1, AliGenCocktailEntry*& e2)
196 {
197 // Iterator over generator pairs: Initialisation
198     flnk2 = flnk1 = fEntries->FirstLink();
199     if (flnk1) {
200         e2 = e1 = (AliGenCocktailEntry*) (flnk1->GetObject());
201     } else {
202         e2= e1 = 0;
203     }
204 }
205
206 void AliGenCocktail::
207 NextGeneratorPair(AliGenCocktailEntry*& e1, AliGenCocktailEntry*& e2)
208 {
209 // Iterator over generators: Increment
210     flnk2 = flnk2->Next();
211     if (flnk2) {
212         e1 = (AliGenCocktailEntry*) (flnk1->GetObject());
213         e2 = (AliGenCocktailEntry*) (flnk2->GetObject());       
214     } else {
215         flnk2 = flnk1 = flnk1->Next();
216         if (flnk1) {
217             e1 = (AliGenCocktailEntry*) (flnk1->GetObject());
218             e2 = (AliGenCocktailEntry*) (flnk2->GetObject());
219         } else {
220             e1=0;
221             e2=0;
222         }
223     }
224 }
225
226 AliGenCocktail& AliGenCocktail::operator=(const  AliGenCocktail& rhs)
227 {
228 // Assignment operator
229     rhs.Copy(*this); 
230     return (*this);
231 }
232
233 void AliGenCocktail::Copy(AliGenCocktail &) const
234 {
235     Fatal("Copy","Not implemented!\n");
236 }
237
238
239