coverity fix
[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 "AliStack.h"
38 #include "AliGenEventHeader.h"
39 #include "AliGenReader.h"
40
41 #include <TParticle.h>
42 #include <TFile.h>
43 #include <TTree.h>
44
45
46 ClassImp(AliGenExtFile)
47
48 AliGenExtFile::AliGenExtFile()
49     :AliGenMC(),
50      fFileName(0),
51      fReader(0)
52 {
53 //  Constructor
54 //
55 //  Read all particles
56     fNpart  =- 1;
57 }
58
59 AliGenExtFile::AliGenExtFile(Int_t npart)
60     :AliGenMC(npart),
61      fFileName(0),
62      fReader(0)
63 {
64 //  Constructor
65     fName   = "ExtFile";
66     fTitle  = "Primaries from ext. File";
67 }
68
69 //____________________________________________________________
70 AliGenExtFile::~AliGenExtFile()
71 {
72 // Destructor
73     delete fReader;
74 }
75
76 //___________________________________________________________
77 void AliGenExtFile::Init()
78 {
79 // Initialize
80     if (fReader) fReader->Init();
81 }
82
83     
84 void AliGenExtFile::Generate()
85 {
86 // Generate particles
87
88   Double_t polar[3]  = {0,0,0};
89   //
90   Double_t origin[3] = {0,0,0};
91   Double_t p[4];
92   Float_t random[6];
93   Int_t i = 0, j, nt;
94   //
95   //
96   if (fVertexSmear == kPerEvent) Vertex();
97
98   while(1) {
99     Int_t nTracks = fReader->NextEvent();       
100     if (nTracks == 0) {
101       // printf("\n No more events !!! !\n");
102       Warning("AliGenExtFile::Generate","\nNo more events in external file!!!\nLast event may be empty or incomplete.\n");
103       return;
104     }
105
106     //
107     // Particle selection loop
108     //
109     // The selection criterium for the external file generator is as follows:
110     //
111     // 1) All tracks are subject to the cuts defined by AliGenerator, i.e.
112     //    fThetaMin, fThetaMax, fPhiMin, fPhiMax, fPMin, fPMax, fPtMin, fPtMax,
113     //    fYMin, fYMax.
114     //    If the particle does not satisfy these cuts, it is not put on the
115     //    stack.
116     // 2) If fCutOnChild and some specific child is selected (e.g. if
117     //    fForceDecay==kSemiElectronic) the event is rejected if NOT EVEN ONE
118     //    child falls into the child-cuts.
119     TParticle* iparticle = 0x0;
120     
121     if(fCutOnChild) {
122       // Count the selected children
123       Int_t nSelected = 0;
124       while ((iparticle=fReader->NextParticle()) ) {
125           Int_t kf = CheckPDGCode(iparticle->GetPdgCode());
126           kf = TMath::Abs(kf);
127           if (ChildSelected(kf) && KinematicSelection(iparticle, 1)) {
128               nSelected++;
129           }
130       }
131       if (!nSelected) continue;    // No particle selected:  Go to next event
132       fReader->RewindEvent();
133     }
134
135     //
136     // Stack filling loop
137     //
138     fNprimaries = 0;
139     for (i = 0; i < nTracks; i++) {
140         TParticle* jparticle = fReader->NextParticle();
141         Bool_t selected = KinematicSelection(jparticle,0); 
142         if (!selected) continue;
143         p[0] = jparticle->Px();
144         p[1] = jparticle->Py();
145         p[2] = jparticle->Pz();
146         p[3] = jparticle->Energy();
147         
148         Int_t idpart = jparticle->GetPdgCode();
149         if(fVertexSmear==kPerTrack) 
150         {
151             Rndm(random,6);
152             for (j = 0; j < 3; j++) {
153                 origin[j]=fOrigin[j]+
154                     fOsigma[j]*TMath::Cos(2*random[2*j]*TMath::Pi())*
155                     TMath::Sqrt(-2*TMath::Log(random[2*j+1]));
156             }
157         } else {
158             origin[0] = fVertex[0] + jparticle->Vx();
159             origin[1] = fVertex[1] + jparticle->Vy();
160             origin[2] = fVertex[2] + jparticle->Vz();
161         }
162         Double_t tof = jparticle->T();
163         Int_t doTracking = fTrackIt && selected && (jparticle->TestBit(kTransportBit));
164         Int_t parent     = jparticle->GetFirstMother();
165         
166         PushTrack(doTracking, parent, idpart,
167                   p[0], p[1], p[2], p[3], origin[0], origin[1], origin[2], tof,
168                   polar[0], polar[1], polar[2],
169                   kPPrimary, nt, 1., jparticle->GetStatusCode());
170
171         KeepTrack(nt);
172         fNprimaries++;
173     } // track loop
174
175     // Generated event header
176     
177     AliGenEventHeader * header = new AliGenEventHeader();
178     header->SetNProduced(fNprimaries);
179     header->SetPrimaryVertex(fVertex);
180     AddHeader(header);
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::Instance()->CdGAFile();
193 }
194
195
196
197
198