Line data Source code
1 : /**************************************************************************
2 : * Copyright(c) 1998-2007, 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 : // Particle generator according to 4 correlated variables : here
18 : // z, ptot, r, theta. The input is a THnSparse object included in
19 : // the root file (path and name to be set via the SetTHnSparse method).
20 : // This class is similar to AliGenFunction.
21 : //-----------------------------------------------------------------------
22 : // Author : X. Lopez - LPC Clermont (fr)
23 : //-----------------------------------------------------------------------
24 : /*
25 : Example for generation :
26 : AliGenTHnSparse *gener = new AliGenTHnSparse();
27 : gener->SetNumberParticles(10);
28 : gener->SetPart(13,kTRUE); // for generating id 13 and -13
29 : gener->SetThnSparse("file_name","thn_name");
30 : gener->Init();
31 : */
32 :
33 : #include <TRandom.h>
34 : #include <TFile.h>
35 : #include "THnSparse.h"
36 :
37 : #include "AliGenTHnSparse.h"
38 :
39 : // NEW
40 : #include "AliRun.h"
41 : #include "AliLog.h"
42 : #include "AliGenEventHeader.h"
43 : //
44 :
45 6 : ClassImp(AliGenTHnSparse)
46 :
47 : //_______________________________________________________________________
48 : AliGenTHnSparse::AliGenTHnSparse():
49 0 : AliGenerator(),
50 0 : fHn(0),
51 0 : fFile(0),
52 0 : fIpart(0),
53 0 : fBoth(kFALSE)
54 0 : {
55 : // Default constructor
56 0 : SetNumberParticles(1);
57 0 : }
58 :
59 : //_______________________________________________________________________
60 : AliGenTHnSparse::AliGenTHnSparse(const AliGenTHnSparse& func):
61 0 : AliGenerator(),
62 0 : fHn(func.fHn),
63 0 : fFile(func.fFile),
64 0 : fIpart(func.fIpart),
65 0 : fBoth(func.fBoth)
66 0 : {
67 : // Copy constructor
68 0 : SetNumberParticles(1);
69 0 : }
70 :
71 : //_______________________________________________________________________
72 : AliGenTHnSparse & AliGenTHnSparse::operator=(const AliGenTHnSparse& func)
73 : {
74 : // Assigment operator
75 0 : if(&func == this) return *this;
76 0 : fHn = func.fHn;
77 0 : fFile = func.fFile;
78 0 : fIpart = func.fIpart;
79 0 : fBoth = func.fBoth;
80 :
81 0 : return *this;
82 0 : }
83 :
84 : //_______________________________________________________________________
85 0 : AliGenTHnSparse::~AliGenTHnSparse()
86 0 : {
87 : // Destructor
88 0 : delete fFile;
89 0 : }
90 :
91 : //_______________________________________________________________________
92 : void AliGenTHnSparse::Generate()
93 : {
94 : // Generate Npart of id Ipart
95 : Int_t naccepted =0;
96 :
97 0 : Double_t rand[4]; // z, ptot, r, theta
98 0 : Float_t pos[3], phi, ptot, theta, pt, z, r;
99 0 : Float_t mom[3];
100 0 : Int_t pdg = fIpart;
101 :
102 0 : for (Int_t ipart = 0; ipart < fNpart && naccepted<fNpart; ipart++) {
103 :
104 0 : fHn->GetRandom(rand);
105 0 : z=rand[0];
106 0 : ptot=rand[1];
107 0 : r=rand[2];
108 0 : theta=rand[3];
109 :
110 : // Phi: same for position and momemtum
111 :
112 0 : phi=(-180+gRandom->Rndm()*360)*TMath::Pi()/180;
113 :
114 : // position at production
115 :
116 0 : pos[0] = r*TMath::Cos(phi);
117 0 : pos[1] = r*TMath::Sin(phi);
118 0 : pos[2] = z;
119 :
120 : // momentum at production
121 :
122 0 : pt = ptot*TMath::Sin(theta);
123 0 : mom[0] = pt*TMath::Cos(phi);
124 0 : mom[1] = pt*TMath::Sin(phi);
125 0 : mom[2] = ptot*TMath::Cos(theta);
126 :
127 : // propagation
128 :
129 0 : Float_t polarization[3] = {0,0,0};
130 0 : Int_t nt;
131 :
132 : // Part and anti-part
133 :
134 0 : if(fBoth){
135 0 : Double_t sign = gRandom->Rndm();
136 0 : if(sign < 0.5) pdg = -fIpart;
137 : else pdg = fIpart;
138 0 : }
139 :
140 0 : PushTrack(fTrackIt,-1,pdg,mom, pos, polarization,0,kPPrimary,nt);
141 0 : naccepted++;
142 0 : }
143 :
144 0 : AliGenEventHeader* header = new AliGenEventHeader("THn");
145 0 : gAlice->SetGenEventHeader(header);
146 : return;
147 :
148 0 : }
149 :
150 : //_______________________________________________________________________
151 : void AliGenTHnSparse::Init()
152 : {
153 :
154 : // Initialisation, check consistency of selected file
155 0 : printf("************ AliGenTHnSparse ****************\n");
156 0 : printf("*********************************************\n");
157 0 : if (!fHn){
158 0 : AliFatal("THnSparse file not specified");
159 0 : }
160 :
161 0 : return;
162 : }
163 :
164 : //_______________________________________________________________________
165 : void AliGenTHnSparse::SetThnSparse(char *file_name, char *thn_name)
166 : {
167 :
168 : // Open the file and get object
169 0 : fFile = new TFile(file_name);
170 0 : fHn = (THnSparseF*)(fFile->Get(thn_name));
171 :
172 0 : }
|