Improved common vertex handling in cocktails.
[u/mrichter/AliRoot.git] / EVGEN / AliGenBox.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 /*
17 $Log$
18 Revision 1.8  2003/01/14 10:50:18  alibrary
19 Cleanup of STEER coding conventions
20
21 Revision 1.7  2002/02/08 16:50:50  morsch
22 Add name and title in constructor.
23
24 Revision 1.6  2001/07/27 17:09:35  morsch
25 Use local SetTrack, KeepTrack and SetHighWaterMark methods
26 to delegate either to local stack or to stack owned by AliRun.
27 (Piotr Skowronski, A.M.)
28
29 Revision 1.5  2000/12/21 16:24:06  morsch
30 Coding convention clean-up
31
32 Revision 1.4  2000/11/30 07:12:49  alibrary
33 Introducing new Rndm and QA classes
34
35 Revision 1.3  2000/10/02 21:28:06  fca
36 Removal of useless dependecies via forward declarations
37
38 Revision 1.2  2000/07/11 18:24:55  fca
39 Coding convention corrections + few minor bug fixes
40
41 Revision 1.1  2000/06/09 20:22:58  morsch
42 Same class as previously in AliSimpleGen.cxx
43 All coding rule violations except RS3 corrected (AM)
44
45 */
46
47
48
49 // Generator for particles in a preset
50 // kinematic range (flat distribution)
51 // Note that for a given theta pt and p are not independent 
52 // Range for only one variable (pt or p) should be given.
53 //
54 // Comments and suggestions: andreas.morsch@cern.ch
55 //
56 //Begin_Html
57 /*
58 <img src="picts/AliGeneratorClass.gif">
59 </pre>
60 <br clear=left>
61 <font size=+2 color=red>
62 <p>The responsible person for this module is
63 <a href="mailto:andreas.morsch@cern.ch">Andreas Morsch</a>.
64 </font>
65 <pre>
66 */
67 //End_Html
68 //                                                               //
69 ///////////////////////////////////////////////////////////////////
70
71 #include "TPDGCode.h"
72
73 #include "AliConst.h"
74 #include "AliGenBox.h"
75 #include "AliRun.h"
76
77 ClassImp(AliGenBox)
78
79 //_____________________________________________________________________________
80 AliGenBox::AliGenBox()
81     :AliGenerator()
82 {
83   //
84   // Default constructor
85   //
86   fIpart=0;
87 }
88
89 //_____________________________________________________________________________
90 AliGenBox::AliGenBox(Int_t npart)
91   :AliGenerator(npart)
92 {
93   //
94   // Standard constructor
95   //
96   fName  = "Box";
97   fTitle = "Box particle generator";
98   // Generate Proton by default
99   fIpart=kProton;
100 }
101
102 //_____________________________________________________________________________
103
104 void AliGenBox::Generate()
105 {
106   //
107   // Generate one trigger
108   //
109   
110     Float_t polar[3]= {0,0,0};
111   //
112     Float_t origin[3];
113     Float_t p[3];
114     Int_t i, j, nt;
115     Double_t pmom, theta, phi, pt;
116     //
117     Float_t random[6];
118   //
119     for (j=0;j<3;j++) origin[j]=fOrigin[j];
120     if(fVertexSmear==kPerEvent) {
121         Vertex();
122         for (j=0;j<3;j++) origin[j]=fVertex[j];
123     }
124
125     for(i=0;i<fNpart;i++) {
126         Rndm(random,3);
127         theta=fThetaMin+random[0]*(fThetaMax-fThetaMin);
128         if(TestBit(kMomentumRange)) {
129             pmom=fPMin+random[1]*(fPMax-fPMin);
130             pt=pmom*TMath::Sin(theta);
131         } else {
132
133             pt=fPtMin+random[1]*(fPtMax-fPtMin);
134             pmom=pt/TMath::Sin(theta);
135         }
136         phi=fPhiMin+random[2]*(fPhiMax-fPhiMin);
137         p[0] = pt*TMath::Cos(phi);
138         p[1] = pt*TMath::Sin(phi);
139         p[2] = pmom*TMath::Cos(theta);
140
141         if(fVertexSmear==kPerTrack) {
142             Rndm(random,6);
143             for (j=0;j<3;j++) {
144                 origin[j]=fOrigin[j]+fOsigma[j]*TMath::Cos(2*random[2*j]*TMath::Pi())*
145                     TMath::Sqrt(-2*TMath::Log(random[2*j+1]));
146             }
147         }
148         SetTrack(fTrackIt,-1,fIpart,p,origin,polar,0,kPPrimary,nt);
149     }
150 }
151
152 //_____________________________________________________________________________
153
154 void AliGenBox::Init()
155 {
156 // Initialisation, check consistency of selected ranges
157   if(TestBit(kPtRange)&&TestBit(kMomentumRange)) 
158     Fatal("Init","You should not set the momentum range and the pt range!\n");
159   if((!TestBit(kPtRange))&&(!TestBit(kMomentumRange))) 
160     Fatal("Init","You should set either the momentum or the pt range!\n");
161 }
162