|
9 | 9 | #include "TRandom.h" |
10 | 10 | #include "FairPrimaryGenerator.h" |
11 | 11 | #include "GenieGenerator.h" |
| 12 | +#include "MeanMaterialBudget.h" |
12 | 13 | #include "TGeoVolume.h" |
13 | 14 | #include "TGeoNode.h" |
14 | 15 | #include "TGeoManager.h" |
@@ -67,172 +68,6 @@ Bool_t GenieGenerator::Init(const char* fileName, const int firstEvent) { |
67 | 68 | return kTRUE; |
68 | 69 | } |
69 | 70 | // ------------------------------------------------------------------------- |
70 | | -Double_t GenieGenerator::MeanMaterialBudget(const Double_t *start, const Double_t *end, Double_t *mparam) |
71 | | -{ |
72 | | - // |
73 | | - // Calculate mean material budget and material properties between |
74 | | - // the points "start" and "end". |
75 | | - // |
76 | | - // "mparam" - parameters used for the energy and multiple scattering |
77 | | - // corrections: |
78 | | - // |
79 | | - // mparam[0] - mean density: sum(x_i*rho_i)/sum(x_i) [g/cm3] |
80 | | - // mparam[1] - equivalent rad length fraction: sum(x_i/X0_i) [adimensional] |
81 | | - // mparam[2] - mean A: sum(x_i*A_i)/sum(x_i) [adimensional] |
82 | | - // mparam[3] - mean Z: sum(x_i*Z_i)/sum(x_i) [adimensional] |
83 | | - // mparam[4] - length: sum(x_i) [cm] |
84 | | - // mparam[5] - Z/A mean: sum(x_i*Z_i/A_i)/sum(x_i) [adimensional] |
85 | | - // mparam[6] - number of boundary crosses |
86 | | - // mparam[7] - maximum density encountered (g/cm^3) |
87 | | - // mparam[8] - equivalent interaction length fraction: sum(x_i/I0_i) [adimensional] |
88 | | - // mparam[9] - maximum cross section encountered (mbarn) |
89 | | - // |
90 | | - // Origin: Marian Ivanov, [email protected] |
91 | | - // |
92 | | - // Corrections and improvements by |
93 | | - // Andrea Dainese, [email protected], |
94 | | - // Andrei Gheata, [email protected] |
95 | | - |
96 | | - // |
97 | | - |
98 | | - mparam[0]=0; mparam[1]=1; mparam[2]=0; mparam[3]=0; mparam[4]=0; |
99 | | - mparam[5]=0; mparam[6]=0; mparam[7]=0; mparam[8]=0; mparam[9]=0; |
100 | | - // |
101 | | - Double_t bparam[7]; // total parameters |
102 | | - Double_t lparam[7]; // local parameters |
103 | | - Double_t mbarn = 1E-3*1E-24*TMath::Na(); // cm^2 * Avogadro |
104 | | - |
105 | | - for (Int_t i=0;i<7;i++) bparam[i]=0; |
106 | | - |
107 | | - if (!gGeoManager) { |
108 | | - //AliFatalClass("No TGeo\n"); |
109 | | - return 0.; |
110 | | - } |
111 | | - // |
112 | | - Double_t length; |
113 | | - Double_t dir[3]; |
114 | | - length = TMath::Sqrt((end[0]-start[0])*(end[0]-start[0])+ |
115 | | - (end[1]-start[1])*(end[1]-start[1])+ |
116 | | - (end[2]-start[2])*(end[2]-start[2])); |
117 | | - mparam[4]=length; |
118 | | - if (length<TGeoShape::Tolerance()) return 0.0; |
119 | | - Double_t invlen = 1./length; |
120 | | - dir[0] = (end[0]-start[0])*invlen; |
121 | | - dir[1] = (end[1]-start[1])*invlen; |
122 | | - dir[2] = (end[2]-start[2])*invlen; |
123 | | - |
124 | | - // Initialize start point and direction |
125 | | - TGeoNode *currentnode = 0; |
126 | | - TGeoNode *startnode = gGeoManager->InitTrack(start, dir); |
127 | | - if (!startnode) { |
128 | | - //AliErrorClass(Form("start point out of geometry: x %f, y %f, z %f", |
129 | | - // start[0],start[1],start[2])); |
130 | | - return 0.0; |
131 | | - } |
132 | | - TGeoMaterial *material = startnode->GetVolume()->GetMedium()->GetMaterial(); |
133 | | - lparam[0] = material->GetDensity(); |
134 | | - if (lparam[0] > mparam[7]) mparam[7]=lparam[0]; |
135 | | - lparam[1] = material->GetRadLen(); |
136 | | - lparam[2] = material->GetA(); |
137 | | - lparam[3] = material->GetZ(); |
138 | | - lparam[4] = length; |
139 | | - lparam[5] = lparam[3]/lparam[2]; |
140 | | - lparam[6] = material->GetIntLen(); |
141 | | - Double_t n = lparam[0]/lparam[2]; |
142 | | - Double_t sigma = 1./(n*lparam[6])/mbarn; |
143 | | - if (sigma > mparam[9]) mparam[9]=sigma; |
144 | | - if (material->IsMixture()) { |
145 | | - TGeoMixture * mixture = dynamic_cast<TGeoMixture*>(material); |
146 | | - lparam[5] =0; |
147 | | - Double_t sum =0; |
148 | | - for (Int_t iel=0;iel<mixture->GetNelements();iel++){ |
149 | | - sum += mixture->GetWmixt()[iel]; |
150 | | - lparam[5]+= mixture->GetZmixt()[iel]*mixture->GetWmixt()[iel]/mixture->GetAmixt()[iel]; |
151 | | - } |
152 | | - lparam[5]/=sum; |
153 | | - } |
154 | | - |
155 | | - // Locate next boundary within length without computing safety. |
156 | | - // Propagate either with length (if no boundary found) or just cross boundary |
157 | | - gGeoManager->FindNextBoundaryAndStep(length, kFALSE); |
158 | | - Double_t step = 0.0; // Step made |
159 | | - Double_t snext = gGeoManager->GetStep(); |
160 | | - // If no boundary within proposed length, return current density |
161 | | - if (!gGeoManager->IsOnBoundary()) { |
162 | | - mparam[0] = lparam[0]; |
163 | | - mparam[1] = lparam[4]/lparam[1]; |
164 | | - mparam[2] = lparam[2]; |
165 | | - mparam[3] = lparam[3]; |
166 | | - mparam[4] = lparam[4]; |
167 | | - mparam[8] = lparam[4]/lparam[6]; |
168 | | - return lparam[0]; |
169 | | - } |
170 | | - // Try to cross the boundary and see what is next |
171 | | - Int_t nzero = 0; |
172 | | - while (length>TGeoShape::Tolerance()) { |
173 | | - currentnode = gGeoManager->GetCurrentNode(); |
174 | | - if (snext<2.*TGeoShape::Tolerance()) nzero++; |
175 | | - else nzero = 0; |
176 | | - if (nzero>3) { |
177 | | - // This means navigation has problems on one boundary |
178 | | - // Try to cross by making a small step |
179 | | - //AliErrorClass("Cannot cross boundary\n"); |
180 | | - mparam[0] = bparam[0]/step; |
181 | | - mparam[1] = bparam[1]; |
182 | | - mparam[2] = bparam[2]/step; |
183 | | - mparam[3] = bparam[3]/step; |
184 | | - mparam[5] = bparam[5]/step; |
185 | | - mparam[8] = bparam[6]; |
186 | | - mparam[4] = step; |
187 | | - mparam[0] = 0.; // if crash of navigation take mean density 0 |
188 | | - mparam[1] = 1000000; // and infinite rad length |
189 | | - return bparam[0]/step; |
190 | | - } |
191 | | - mparam[6]+=1.; |
192 | | - step += snext; |
193 | | - bparam[1] += snext/lparam[1]; |
194 | | - bparam[2] += snext*lparam[2]; |
195 | | - bparam[3] += snext*lparam[3]; |
196 | | - bparam[5] += snext*lparam[5]; |
197 | | - bparam[6] += snext/lparam[6]; |
198 | | - bparam[0] += snext*lparam[0]; |
199 | | - |
200 | | - if (snext>=length) break; |
201 | | - if (!currentnode) break; |
202 | | - length -= snext; |
203 | | - material = currentnode->GetVolume()->GetMedium()->GetMaterial(); |
204 | | - lparam[0] = material->GetDensity(); |
205 | | - if (lparam[0] > mparam[7]) mparam[7]=lparam[0]; |
206 | | - lparam[1] = material->GetRadLen(); |
207 | | - lparam[2] = material->GetA(); |
208 | | - lparam[3] = material->GetZ(); |
209 | | - lparam[5] = lparam[3]/lparam[2]; |
210 | | - lparam[6] = material->GetIntLen(); |
211 | | - n = lparam[0]/lparam[2]; |
212 | | - sigma = 1./(n*lparam[6])/mbarn; |
213 | | - if (sigma > mparam[9]) mparam[9]=sigma; |
214 | | - if (material->IsMixture()) { |
215 | | - TGeoMixture * mixture = dynamic_cast<TGeoMixture*>(material); |
216 | | - lparam[5]=0; |
217 | | - Double_t sum =0; |
218 | | - for (Int_t iel=0;iel<mixture->GetNelements();iel++){ |
219 | | - sum+= mixture->GetWmixt()[iel]; |
220 | | - lparam[5]+= mixture->GetZmixt()[iel]*mixture->GetWmixt()[iel]/mixture->GetAmixt()[iel]; |
221 | | - } |
222 | | - lparam[5]/=sum; |
223 | | - } |
224 | | - gGeoManager->FindNextBoundaryAndStep(length, kFALSE); |
225 | | - snext = gGeoManager->GetStep(); |
226 | | - } |
227 | | - mparam[0] = bparam[0]/step; |
228 | | - mparam[1] = bparam[1]; |
229 | | - mparam[2] = bparam[2]/step; |
230 | | - mparam[3] = bparam[3]/step; |
231 | | - mparam[5] = bparam[5]/step; |
232 | | - mparam[8] = bparam[6]; |
233 | | - return bparam[0]/step; |
234 | | -} |
235 | | - |
236 | 71 | std::vector<double> GenieGenerator::Rotate(Double_t x, Double_t y, Double_t z, Double_t px, Double_t py, Double_t pz) |
237 | 72 | { |
238 | 73 | //rotate vector px,py,pz to point at x,y,z at origin. |
@@ -412,7 +247,7 @@ Bool_t GenieGenerator::ReadEvent(FairPrimaryGenerator* cpg) |
412 | 247 | if (fFirst){ |
413 | 248 | Double_t bparam=0.; |
414 | 249 | Double_t mparam[10]; |
415 | | - bparam=MeanMaterialBudget(start, end, mparam); |
| 250 | + bparam=shipgen::MeanMaterialBudget(start, end, mparam); |
416 | 251 | cout << "Info GenieGenerator: MaterialBudget " << start[2] << " - "<< end[2] << endl; |
417 | 252 | cout << "Info GenieGenerator: MaterialBudget " << bparam << endl; |
418 | 253 | cout << "Info GenieGenerator: MaterialBudget 0 " << mparam[0] << endl; |
@@ -511,7 +346,7 @@ Bool_t GenieGenerator::ReadEvent(FairPrimaryGenerator* cpg) |
511 | 346 | end[1]=tynu*(end[2]-ztarget); |
512 | 347 | //cout << "Info GenieGenerator: neutrino xyz-end " << end[0] << "-" << end[1] << "-" << end[2] << endl; |
513 | 348 | //get material density between these two points |
514 | | - bparam=MeanMaterialBudget(start, end, mparam); |
| 349 | + bparam=shipgen::MeanMaterialBudget(start, end, mparam); |
515 | 350 | //printf("param %e %e %e \n",bparam,mparam[6],mparam[7]); |
516 | 351 | } |
517 | 352 | } |
|
0 commit comments