EffC++ warnings corrected.
[u/mrichter/AliRoot.git] / EVGEN / AliGenExtFile.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 // Event generator that using an instance of type AliGenReader
19 // reads particles from a file and applies cuts.
20 // Example: In your Config.C you can include the following lines
21 //  AliGenExtFile *gener = new AliGenExtFile(-1);
22 //  gener->SetMomentumRange(0,999);
23 //  gener->SetPhiRange(-180.,180.);
24 //  gener->SetThetaRange(0,180);
25 //  gener->SetYRange(-999,999);
26 //  AliGenReaderTreeK * reader = new AliGenReaderTreeK();
27 //  reader->SetFileName("myFileWithTreeK.root");
28 //  gener->SetReader(reader);
29 //  gener->Init();
30
31
32 #include <Riostream.h>
33
34 #include "AliGenExtFile.h"
35 #include "AliRunLoader.h"
36 #include "AliHeader.h"
37 #include "AliGenEventHeader.h"
38
39 #include <TParticle.h>
40 #include <TFile.h>
41 #include <TTree.h>
42
43
44 ClassImp(AliGenExtFile)
45
46 AliGenExtFile::AliGenExtFile()
47     :AliGenMC(),
48      fFileName(0),
49      fReader(0)
50 {
51 //  Constructor
52 //
53 //  Read all particles
54     fNpart  =- 1;
55 }
56
57 AliGenExtFile::AliGenExtFile(Int_t npart)
58     :AliGenMC(npart),
59      fFileName(0),
60      fReader(0)
61 {
62 //  Constructor
63     fName   = "ExtFile";
64     fTitle  = "Primaries from ext. File";
65 }
66
67 AliGenExtFile::AliGenExtFile(const AliGenExtFile & ExtFile):
68     AliGenMC(ExtFile),
69      fFileName(0),
70      fReader(0)
71 {
72 // Copy constructor
73     ExtFile.Copy(*this);
74 }
75 //____________________________________________________________
76 AliGenExtFile::~AliGenExtFile()
77 {
78 // Destructor
79     delete fReader;
80 }
81
82 //___________________________________________________________
83 void AliGenExtFile::Init()
84 {
85 // Initialize
86     if (fReader) fReader->Init();
87 }
88
89     
90 void AliGenExtFile::Generate()
91 {
92 // Generate particles
93
94   Float_t polar[3]  = {0,0,0};
95   //
96   Float_t origin[3] = {0,0,0};
97   Float_t p[3];
98   Float_t random[6];
99   Int_t i = 0, j, nt;
100   //
101   //
102   if (fVertexSmear == kPerEvent) Vertex();
103
104   while(1) {
105     Int_t nTracks = fReader->NextEvent();       
106     if (nTracks == 0) {
107       // printf("\n No more events !!! !\n");
108       Warning("AliGenExtFile::Generate","\nNo more events in external file!!!\nLast event may be empty or incomplete.\n");
109       return;
110     }
111
112     //
113     // Particle selection loop
114     //
115     // The selection criterium for the external file generator is as follows:
116     //
117     // 1) All tracks are subject to the cuts defined by AliGenerator, i.e.
118     //    fThetaMin, fThetaMax, fPhiMin, fPhiMax, fPMin, fPMax, fPtMin, fPtMax,
119     //    fYMin, fYMax.
120     //    If the particle does not satisfy these cuts, it is not put on the
121     //    stack.
122     // 2) If fCutOnChild and some specific child is selected (e.g. if
123     //    fForceDecay==kSemiElectronic) the event is rejected if NOT EVEN ONE
124     //    child falls into the child-cuts.
125     TParticle* iparticle = 0x0;
126     
127     if(fCutOnChild) {
128       // Count the selected children
129       Int_t nSelected = 0;
130       while ((iparticle=fReader->NextParticle()) ) {
131           Int_t kf = CheckPDGCode(iparticle->GetPdgCode());
132           kf = TMath::Abs(kf);
133           if (ChildSelected(kf) && KinematicSelection(iparticle, 1)) {
134               nSelected++;
135           }
136       }
137       if (!nSelected) continue;    // No particle selected:  Go to next event
138       fReader->RewindEvent();
139     }
140
141     //
142     // Stack filling loop
143     //
144     for (i = 0; i < nTracks; i++) {
145         TParticle* iparticle = fReader->NextParticle();
146         Bool_t selected = KinematicSelection(iparticle,0); 
147         if (!selected) continue;
148         p[0] = iparticle->Px();
149         p[1] = iparticle->Py();
150         p[2] = iparticle->Pz();
151         Int_t idpart = iparticle->GetPdgCode();
152         if(fVertexSmear==kPerTrack) 
153         {
154             Rndm(random,6);
155             for (j = 0; j < 3; j++) {
156                 origin[j]=fOrigin[j]+
157                     fOsigma[j]*TMath::Cos(2*random[2*j]*TMath::Pi())*
158                     TMath::Sqrt(-2*TMath::Log(random[2*j+1]));
159             }
160         } else {
161             origin[0] = fVertex[0] + iparticle->Vx();
162             origin[1] = fVertex[1] + iparticle->Vy();
163             origin[2] = fVertex[2] + iparticle->Vz();
164         }
165         
166         Int_t decayed    = iparticle->GetFirstDaughter();
167         Int_t doTracking = fTrackIt && (decayed < 0) && (TMath::Abs(idpart) > 10) && selected;
168         Int_t parent     = iparticle->GetFirstMother();
169         
170         PushTrack(doTracking,parent,idpart,p,origin,polar,0,kPPrimary,nt);
171         KeepTrack(nt);
172     } // track loop
173
174     // Generated event header
175     
176     AliGenEventHeader * header = new AliGenEventHeader();
177     header->SetNProduced(nt+1);
178     header->SetPrimaryVertex(fVertex);
179     AliRunLoader::GetRunLoader()->GetHeader()->SetGenEventHeader(header);
180
181     break;
182     
183   } // event loop
184   
185   SetHighWaterMark(nt);
186   CdEventFile();
187 }
188
189 void AliGenExtFile::CdEventFile()
190 {
191 // CD back to the event file
192     (AliRunLoader::GetRunLoader())->CdGAFile();
193 }
194
195
196 AliGenExtFile& AliGenExtFile::operator=(const  AliGenExtFile& rhs)
197 {
198 // Assignment operator
199     rhs.Copy(*this);
200     return *this;
201 }
202  
203
204 void AliGenExtFile::Copy(TObject&) const
205 {
206     //
207     // Copy 
208     //
209     Fatal("Copy","Not implemented!\n");
210 }
211
212
213
214
215
216
217