]>
Commit | Line | Data |
---|---|---|
c28b8f8d | 1 | C Program Mult_Gen |
2 | SUBROUTINE multgen | |
3 | implicit none | |
4 | ||
5 | CCC Documentation and Description: | |
6 | CCC | |
7 | C This code is intended to provide a quick means of producing | |
8 | C uncorrelated simulated events for event-by-event studies, | |
9 | C detector acceptance and efficiency studies, etc. The | |
10 | C user selects the number of events, the one-particle distribution | |
11 | C model, the Geant particles to include, the ranges in transverse | |
12 | C momentum, pseudorapidity and azimuthal angle, the mean | |
13 | C multiplicity for each particle type for the event run, the | |
14 | C mean temperature, Rapidity width, etc., and the standard deviations | |
15 | C for the event-to-event variation in the model parameters. | |
16 | C Note that these events are produced in the c.m. frame only. | |
17 | C | |
18 | C Anisotropic flow may also be simulated by introducing explicit | |
19 | C phi-dependence (azimuthal angle) in the particle distributions. | |
20 | C The assumed model is taken from Poskanzer and Voloshin, Phys. Rev. | |
21 | C C58, 1671 (1998), Eq.(1), where we use, | |
22 | C | |
23 | C E d^3N/dp^3 = (1/2*pi*pt)*[d^2N/dpt*dy] | |
24 | C * [1 + SUM(n=1,nflowterms){2*Vn*cos[n(phi-PSIr)]}] | |
25 | C | |
26 | C with up to 'nflowterms' (currently set to 6, see file | |
27 | C Parameter_values.inc) Fourier components allowed. Vn are | |
28 | C coefficients and PSIr is the reaction plane angle. | |
29 | C The algebraic signs of the Vn terms for n=odd are reversed | |
30 | C from their input values for particles with rapidity (y) < 0 | |
31 | C as suggested in Poskanzer and Voloshin. | |
32 | C The flow parameters can depend on pt and rapidity (y) according | |
33 | C to the model suggested by Art Poskanzer (Feb. 2000) and as | |
34 | C defined in the Function Vn_pt_y. | |
35 | C | |
36 | C The user may select either to have the same multiplicity per | |
37 | C particle type for each event or to let the multiplicity vary | |
38 | C randomly according to a Poisson distribution. In addition, an | |
39 | C overall multiplicative scale factor can be applied to each | |
40 | C particle ID's multiplicity (same factor applied to each PID). | |
41 | C This scaling can vary randomly according to a Gaussian from | |
42 | C event-to-event. This is to simulate trigger acceptance | |
43 | C fluctuations. Similarly the | |
44 | C parameters of the one-particle distribution models may either | |
45 | C be fixed to the same value for each event or allowed to randomly | |
46 | C vary about a specified mean with a specified standard deviation | |
47 | C and assuming a Gaussian distribution. | |
48 | C | |
49 | C With respect to the reaction plane and anisotropic flow simulation, | |
50 | C the user may select among four options: | |
51 | C (1) ignore reaction plane and anisotropic flow effects; all | |
52 | C distributions will be azimuthally invariant, on average. | |
53 | C (2) assume a fixed reaction plane angle, PSIr, for all events | |
54 | C in the run. | |
55 | C (3) assume a Gaussian distribution with specified mean and | |
56 | C standard deviation for the reaction plane angles for the | |
57 | C events in the run. PSIr is randomly determined for each | |
58 | C event. | |
59 | C (4) assume uniformly distributed, random values for the reaction | |
60 | C plane angles from 0 to 360 deg., for each event in the run. | |
61 | C | |
62 | C The user may also select the anisotropic flow parameters, Vn, | |
63 | C to either be fixed for each event, or to randomly vary from event | |
64 | C to event according to a Gaussian distribution where the user must | |
65 | C specify the mean and std. dev. For both cases the input file must | |
66 | C list the 'nflowterms' (e.g. 6) values of the mean and Std.dev. for | |
67 | C the Vn parameters for all particle ID types included in the run. | |
68 | C | |
69 | C The available list of particles has been increased to permit a | |
70 | C number of meson and baryon resonances. For those with broad widths | |
71 | C the code samples the mass distribution for the resonance and outputs | |
72 | C the resonance mass for each instance in a special kinematic file | |
73 | C (see file unit=9, filename = 'mult_gen.kin'). The resonance shapes | |
74 | C are approximately Breit-Wigner and are specific for each resonance | |
75 | C case. The additional particle/resonances include: rho(+,-,0), | |
76 | C omega(0), eta', phi, J/Psi, Delta(-,0,+,++) and K*(+,-,0). Masses | |
77 | C are sampled for the rho, omega, phi, Deltas and D*s. | |
78 | C Refer to SUBR: Particle_prop and Particle_mass for the explicit | |
79 | C parameters, resonance shape models, and sampling ranges. | |
80 | C | |
81 | C The input is from a file, named 'mult_gen.in'. The output is | |
82 | C loaded into a file named 'mult_gen.out' which includes run | |
83 | C header information, event header information and the EVENT: and | |
84 | C TRACK: formats as in the new STAR TEXT Format for event generator | |
85 | C input to GSTAR. A log file, 'mult_gen.log' is also written which | |
86 | C may contain error messages. Normally this file should be empty | |
87 | C after a successful run. These filenames can easily be changed | |
88 | C to more suitable names by the script that runs the program or | |
89 | C by hand. | |
90 | C | |
91 | C The method for generating random multiplicities and model parameter | |
92 | C values involves the following steps: | |
93 | C (1) The Poisson or Gaussian distributions are computed and | |
94 | C loaded into function f(). | |
95 | C (2) The distribution f(x') is integrated from xmin to x | |
96 | C and saved from x = xmin to x = xmax. The range and mesh | |
97 | C spaces are specified by the user. | |
98 | C (3) The integral of f is normalized to unity where | |
99 | C integral[f(x')](at x = xmin) = 0.0 | |
100 | C integral[f(x')](at x = xmax) = 1.0 | |
101 | C (4) A random number generator is called which delivers values | |
102 | C between 0.0 and 1.0. | |
103 | C (5) We consider the coordinate x (from xmin to xmax) to be | |
104 | C dependent on the integral[f]. Using the random number | |
105 | C for the selected value of integral[f] the value of x | |
106 | C is obtained by interpolation. | |
107 | C | |
108 | C An interpolation subroutine from Rubin Landau, Oregon State Univ., | |
109 | C is used to do this interpolation; it involves uneven mesh point | |
110 | C spacing. | |
111 | C | |
112 | C The method for generating the particle momenta uses the | |
113 | C standard random elimination method and involves the following | |
114 | C steps: | |
115 | C | |
116 | C For model_type = 1,2,3,4 which are functions of pt,y (see following): | |
117 | C (1) The y range is computed using the pseudorapidity (eta) | |
118 | C range and includes ample cushioning around the sides | |
119 | C along the eta acceptance edges. | |
120 | C (2) The transverse momentum (pt) and rapidity (y) are | |
121 | C randomly chosen within the specified ranges. | |
122 | C (3) The pseudorapidity is computed for this (pt,y) value | |
123 | C (and the mass for each pid) and checked against the | |
124 | C pseudorapidity acceptance range. | |
125 | C (4) If the pseudorapidity is within range then the one-particle | |
126 | C model distribution is calculated at this point and its ratio | |
127 | C to the maximum value throughout (pt,eta) acceptance region | |
128 | C is calculated. | |
129 | C (5) Another random number is called and if less than the ratio | |
130 | C from step#4 the particle momentum is used; if not, then | |
131 | C another trial value of (pt,y) is obtained. | |
132 | C (6) This continues until the required multiplicity for the | |
133 | C specific event and particle type has been satisfied. | |
134 | C (7) This process is repeated for the requested number of particle | |
135 | C types and events. | |
136 | C | |
137 | C For model_type = 5,6 (see following) which are input bin-by-bin | |
138 | C in pt,eta: | |
139 | C (1) The transverse momentum (pt) and pseudorapidity (eta) are | |
140 | C randomly chosen within the specified ranges. | |
141 | C (2) The one-particle model distribution is calculated at this | |
142 | C point and its ratio to the maximum value throughout the | |
143 | C (pt,eta) region is calculated. | |
144 | C (3) Another random number is called and if less than the ratio | |
145 | C from step(2) the particle momentum is used; if not then | |
146 | C another trial value of (pt,eta) is obtained. | |
147 | C (4) This continues until the required multiplicity for the | |
148 | C specific event and particle type has been satisfied. | |
149 | C (5) This process is repeated for the requested number of particle | |
150 | C types and events. | |
151 | C | |
152 | C Problematic parameter values are tested, bad input values are checked | |
153 | C and in some cases may be changed so that the program will not crash. | |
154 | C In some cases the code execution is stopped. | |
155 | C Some distributions and/or unusual model parameter values may cause the | |
156 | C code to hang up due to the poor performance of the "elimination" | |
157 | C method for very strongly peaked distributions. These are tested for | |
158 | C certain problematic values and if necessary these events are aborted. | |
159 | C A message, "*** Event No. 2903 ABORTED:" for example is printed | |
160 | C in the 'mult_gen.out' file. Temperatures .le. 0.01 GeV and rapidity | |
161 | C width parameters .le. 0.01 will cause the event to abort. | |
162 | C | |
163 | C The input is described below in the 'read' statements and also in | |
164 | C the sample input file. Some additional comments are as follows: | |
165 | C | |
166 | C (1) n_events - Selected number of events in run. Can be anything | |
167 | C .ge. 1. | |
168 | C (2) n_pid_type - Number of particle ID types to include in the | |
169 | C particle list. e.g. pi(+) and pi(-) are counted | |
170 | C separately. The limit is set by parameter npid | |
171 | C in the accompanying include file 'Parameter_values.inc' | |
172 | C and is presently set at 20. | |
173 | C (3) model_type - equals 1,2,3,4,5 or 6 so far. See comments in | |
174 | C Function dNdpty to see what is calculated. | |
175 | C The models included are: | |
176 | C = 1, Factorized mt exponential, Gaussian rapidity model | |
177 | C = 2, Pratt non-expanding, spherical thermal source model | |
178 | C = 3, Bertsch non-expanding spherical thermal source model | |
179 | C = 4, Pratt spherically expanding, thermally equilibrated | |
180 | C source model. | |
181 | C = 5, Factorized pt and eta distributions input bin-by-bin. | |
182 | C = 6, Fully 2D pt,eta distributions input bin-by-bin. | |
183 | C NOTE: model_type = 1-4 are functions of (pt,y) | |
184 | C model_type = 5,6 are functions of (pt,eta) | |
185 | C (4) reac_plane_cntrl - Can be either 1,2,3 or 4 where: | |
186 | C = 1 to ignore reaction plane and anisotropic flow, | |
187 | C all distributions will be azimuthally symm. | |
188 | C = 2 to use a fixed reaction plane angle for all | |
189 | C events in the run. | |
190 | C = 3 to assume a randomly varying reaction plane | |
191 | C angle for each event as determined by a | |
192 | C Gaussian distribution. | |
193 | C = 4 to assume a randomly varying reaction plane | |
194 | C for each event in the run as determined by | |
195 | C a uniform distribution from 0 to 360 deg. | |
196 | C (5) PSIr_mean, PSIr_stdev - Reaction plane angle mean and Gaussian | |
197 | C std.dev. (both are in degrees) for cases | |
198 | C with reac_plane_cntrl = 2 (use mean value) | |
199 | C and 3. Note: these are read in regardless | |
200 | C of the value of reac_plane_cntrl. | |
201 | C (6) MultFac_mean, MultFac_stdev - Overall multiplicity scaling factor | |
202 | C for all PID types; mean and std.dev.; | |
203 | C for trigger fluctuations event-to-evt. | |
204 | C (7) pt_cut_min,pt_cut_max - Range of transverse momentum in GeV/c. | |
205 | C (8) eta_cut_min,eta_cut_max - Pseudorapidity range | |
206 | C (9) phi_cut_min,phi_cut_max - Azimuthal angular range in degrees. | |
207 | C (10) n_stdev_mult - Number of standard deviations about the mean value | |
208 | C of multiplicity to include in the random event-to- | |
209 | C event selection process. The maximum number of | |
210 | C steps that can be covered is determined by | |
211 | C parameter n_mult_max_steps in the accompanying | |
212 | C include file 'Parameter_values.inc' which is | |
213 | C presently set at 1000, but the true upper limit for | |
214 | C this is n_mult_max_steps - 1 = 999. | |
215 | C (11) n_stdev_temp - Same, except for the "Temperature" parameter. | |
216 | C (12) n_stdev_sigma- Same, except for the rapidity width parameter. | |
217 | C (13) n_stdev_expvel - Same, except for the expansion velocity parameter. | |
218 | C (14) n_stdev_PSIr - Same, except for the reaction plane angle | |
219 | C (15) n_stdev_Vn - Same, except for the anisotropy coefficients, Vn. | |
220 | C (16) n_stdev_MultFac - Same, except for the multiplicity scaling factor. | |
221 | C (17) n_integ_pts - Number of mesh points to use in the random model | |
222 | C parameter selection process. The upper limit is | |
223 | C set by parameter nmax_integ in the accompanying | |
224 | C include file 'Parameter_values.inc' which is presently | |
225 | C set at 100, but the true upper limit for n_integ_pts | |
226 | C is nmax_integ - 1 = 99. | |
227 | C (18) n_scan_pts - Number of mesh points to use to scan the (pt,y) | |
228 | C dependence of the model distributions looking for | |
229 | C the maximum value. The 2-D grid has | |
230 | C n_scan_pts * n_scan_pts points; no limit to size of | |
231 | C n_scan_pts. | |
232 | C (19) irand - Starting random number seed. | |
233 | C | |
234 | C************************************************************************** | |
235 | C FOR MODEL_TYPE = 1,2,3 or 4: | |
236 | C Input the following 7 lines for each particle type; repeat these | |
237 | C set of lines n_pid_type times: | |
238 | C | |
239 | C (a) gpid - Geant Particle ID code number | |
240 | C (b) mult_mean,mult_variance_control - Mean multiplicity and | |
241 | C variance control where: | |
242 | C mult_variance_control = 0 for no variance in multiplicity | |
243 | C mult_variance_control = 1 to allow Poisson distribution for | |
244 | C particle multiplicities for all events. | |
245 | C Note that a hard limit exists for the maximum possible | |
246 | C multiplicity for a given particle type per event. This is | |
247 | C determined by parameter factorial_max in accompanying include | |
248 | C file 'common_facfac.inc' and is presently set at 10000. | |
249 | C (c) Temp_mean, Temp_stdev - Temperature parameter mean (in GeV) | |
250 | C and standard deviation (Gaussian distribution assumed). | |
251 | C (d) sigma_mean, sigma_stdev - Rapidity distribution width (sigma) | |
252 | C parameter mean and standard deviation (Gaussian distribution | |
253 | C assumed). | |
254 | C (e) expvel_mean, expvel_stdev - S. Pratt expansion velocity | |
255 | C (in units of c) mean and standard deviation (Gaussian | |
256 | C distribution assumed). | |
257 | C (f) Vn_mean(k); k=1,4 - Anisotropic flow parameters, mean values | |
258 | C for Fourier component n=1. | |
259 | C (g) Vn_stdev(k); k=1,4 - Anisotropic flow parameters, std.dev. | |
260 | C values for Fourier component n=1. | |
261 | C | |
262 | C Repeat the last two lines of input for remaining Fourier | |
263 | C components n=2,3...6. Include all 6 sets of parameters | |
264 | C even if these are not used by the model for Vn(pt,y) (set | |
265 | C unused parameter means and std.dev. to 0.0). List 4 values | |
266 | C on every line, even though for n=even the 4th quantity is | |
267 | C not used. | |
268 | C | |
269 | C************************************************************************** | |
270 | C FOR MODEL_TYPE = 5 input the following set of lines for each particle | |
271 | C type; repeat these n_pid_type times. | |
272 | C | |
273 | C (a) gpid - Geant Particle ID code number | |
274 | C (b) mult_mean,mult_variance_control - Mean multiplicity and | |
275 | C variance control where: | |
276 | C mult_variance_control = 0 for no variance in multiplicity | |
277 | C mult_variance_control = 1 to allow Poisson distribution for | |
278 | C particle multiplicities for all events. | |
279 | C (c) pt_start, eta_start - minimum starting values for pt, eta | |
280 | C input for the bin-by-bin distributions. | |
281 | C (d) n_pt_bins, n_eta_bins - # input pt and eta bins. | |
282 | C (e) delta_pt, pt_bin - pt bin size and function value, repeat for | |
283 | C each pt bin. | |
284 | C (f) delta_eta, eta_bin - eta bin size and function value, repeat | |
285 | C for each eta bin. | |
286 | C (g) Vn_mean(k); k=1,4 - Anisotropic flow parameters, mean values | |
287 | C for Fourier component n=1. | |
288 | C (h) Vn_stdev(k); k=1,4 - Anisotropic flow parameters, std.dev. | |
289 | C values for Fourier component n=1. | |
290 | C | |
291 | C Repeat the last two lines of input for remaining Fourier | |
292 | C components n=2,3...6. Include all 6 sets of parameters | |
293 | C even if these are not used by the model for Vn(pt,y) (set | |
294 | C unused parameter means and std.dev. to 0.0). List 4 values | |
295 | C on every line, even though for n=even the 4th quantity is | |
296 | C not used. | |
297 | C | |
298 | C NOTE: The pt, eta ranges must fully include the requested ranges | |
299 | C in input #4 and 5 above; else the code execution will stop. | |
300 | C | |
301 | C Also, variable bin sizes are permitted for the input distributions. | |
302 | C | |
303 | C Also, this input distribution is used for all events in the run; | |
304 | C no fluctuations in this "parent" distribution are allowed from | |
305 | C event-to-event. | |
306 | C | |
307 | C************************************************************************** | |
308 | C FOR MODEL_TYPE = 6 input the following set of lines for each particle | |
309 | C type; repeat these n_pid_type times. | |
310 | C | |
311 | C (a) gpid - Geant Particle ID code number | |
312 | C (b) mult_mean,mult_variance_control - Mean multiplicity and | |
313 | C variance control where: | |
314 | C mult_variance_control = 0 for no variance in multiplicity | |
315 | C mult_variance_control = 1 to allow Poisson distribution for | |
316 | C particle multiplicities for all events. | |
317 | C (c) pt_start, eta_start - minimum starting values for pt, eta | |
318 | C input for the bin-by-bin distributions. | |
319 | C (d) n_pt_bins, n_eta_bins - # input pt and eta bins. | |
320 | C (e) delta_pt - pt bin size, repeat for each pt bin. | |
321 | C (f) delta_eta - eta bin size, repeat for each eta bin. | |
322 | C (g) i,j,pt_eta_bin(i,j) - read pt (index = i) and eta (index = j) | |
323 | C bin numbers and bin value for full 2D space. | |
324 | C (h) Vn_mean(k); k=1,4 - Anisotropic flow parameters, mean values | |
325 | C for Fourier component n=1. | |
326 | C (i) Vn_stdev(k); k=1,4 - Anisotropic flow parameters, std.dev. | |
327 | C values for Fourier component n=1. | |
328 | C | |
329 | C Repeat the last two lines of input for remaining Fourier | |
330 | C components n=2,3...6. Include all 6 sets of parameters | |
331 | C even if these are not used by the model for Vn(pt,y) (set | |
332 | C unused parameter means and std.dev. to 0.0). List 4 values | |
333 | C on every line, even though for n=even the 4th quantity is | |
334 | C not used. | |
335 | C | |
336 | C NOTE: The pt, eta ranges must fully include the requested ranges | |
337 | C in input #4 and 5 above; else the code execution will stop. | |
338 | C | |
339 | C Also, variable bin sizes are permitted for the input distributions. | |
340 | C | |
341 | C Also, this input distribution is used for all events in the run; | |
342 | C no fluctuations in this "parent" distribution are allowed from | |
343 | C event-to-event. | |
344 | C | |
345 | CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC | |
346 | ||
347 | Include 'Parameter_values.inc' | |
348 | Include 'common_facfac.inc' | |
349 | include 'common_dist_bin.inc' | |
350 | Common/track/ pout(npid,4,factorial_max) | |
351 | real*4 pout | |
352 | Common/Geant/geant_mass(200),geant_charge(200), | |
353 | 1 geant_lifetime(200),geant_width(200) | |
354 | real*4 geant_mass,geant_charge,geant_lifetime,geant_width | |
355 | Common/Mass/ Mass_integ_save(npid,nmax_integ), | |
356 | 1 Mass_xfunc_save(npid,nmax_integ) | |
357 | real*4 Mass_integ_save,Mass_xfunc_save | |
358 | ||
359 | integer n_events, n_pid_type, model_type, n_integ_pts, irand | |
360 | integer gpid(npid),mult_mean(npid),mult_variance_control(npid) | |
361 | integer i,j,k,pid,mult_min,mult_max,n_mult_steps(npid),ievent | |
362 | integer mult_event(npid),n_scan_pts,total_mult,n_vertices | |
363 | integer event_abort,status_abort, status | |
364 | integer iptbin, ietabin | |
365 | integer track_counter,start_v,stop_v | |
366 | integer reac_plane_cntrl | |
367 | integer jodd,total_mult_inc(npid) | |
368 | ||
369 | real*4 pt_cut_min,pt_cut_max,eta_cut_min,eta_cut_max | |
370 | real*4 y_cut_min,y_cut_max | |
371 | real*4 phi_cut_min,phi_cut_max,n_stdev_mult,n_stdev_temp | |
372 | real*4 n_stdev_sigma,n_stdev_expvel,Temp_mean(npid) | |
373 | real*4 Temp_stdev(npid),pi,rad,mult_mean_real,mult_stdev | |
374 | real*4 mult_min_real,mult_max_real,ran | |
375 | real*4 Temp_abort, sigma_abort, bin_value | |
376 | ||
377 | real*4 mult_integ(n_mult_max_steps),mult_xfunc(n_mult_max_steps) | |
378 | real*4 mult_integ_save(npid,n_mult_max_steps) | |
379 | real*4 mult_xfunc_save(npid,n_mult_max_steps) | |
380 | real*4 mult_event_real | |
381 | ||
382 | real*4 Temp_min,Temp_max,integ(nmax_integ),xfunc(nmax_integ) | |
383 | real*4 Temp_integ_save(npid,nmax_integ) | |
384 | real*4 Temp_xfunc_save(npid,nmax_integ) | |
385 | real*4 Temp_event(npid) | |
386 | ||
387 | real*4 sigma_stdev(npid),sigma_mean(npid),sigma_min,sigma_max | |
388 | real*4 sigma_integ_save(npid,nmax_integ) | |
389 | real*4 sigma_xfunc_save(npid,nmax_integ) | |
390 | real*4 sigma_event(npid) | |
391 | ||
392 | real*4 expvel_stdev(npid), expvel_mean(npid) | |
393 | real*4 expvel_min, expvel_max | |
394 | real*4 expvel_integ_save(npid,nmax_integ) | |
395 | real*4 expvel_xfunc_save(npid,nmax_integ) | |
396 | real*4 expvel_event(npid) | |
397 | ||
398 | real*4 masstemp,pxtemp,pytemp,pztemp,pttemp,etatemp,ytemp,phitemp | |
399 | ||
400 | CCC Variables associated with anisotropic flow: | |
401 | ||
402 | real*4 PSIr_mean, PSIr_stdev, n_stdev_PSIr, n_stdev_Vn | |
403 | real*4 PSIr_min, PSIr_max, PSIr_event | |
404 | real*4 PSIr_integ_save(nmax_integ) | |
405 | real*4 PSIr_xfunc_save(nmax_integ) | |
406 | real*4 Vn_mean(nflowterms,4,npid), Vn_stdev(nflowterms,4,npid) | |
407 | real*4 Vn_min, Vn_max | |
408 | real*4 Vn1_integ_save(nflowterms,npid,nmax_integ) | |
409 | real*4 Vn1_xfunc_save(nflowterms,npid,nmax_integ) | |
410 | real*4 Vn2_integ_save(nflowterms,npid,nmax_integ) | |
411 | real*4 Vn2_xfunc_save(nflowterms,npid,nmax_integ) | |
412 | real*4 Vn3_integ_save(nflowterms,npid,nmax_integ) | |
413 | real*4 Vn3_xfunc_save(nflowterms,npid,nmax_integ) | |
414 | real*4 Vn4_integ_save(nflowterms,npid,nmax_integ) | |
415 | real*4 Vn4_xfunc_save(nflowterms,npid,nmax_integ) | |
416 | real*4 Vn_event(nflowterms,4,npid), Vn_event_tmp(nflowterms,4) | |
417 | real*4 Vn_sum(nflowterms,npid),cosinefac(nflowterms) | |
418 | ||
419 | CCC Variables associated with trigger fluctuations: | |
420 | real*4 MultFac_mean, MultFac_stdev, n_stdev_MultFac | |
421 | real*4 MultFac_min, MultFac_max, MultFac_event | |
422 | real*4 MultFac_integ_save(nmax_integ) | |
423 | real*4 MultFac_xfunc_save(nmax_integ) | |
424 | CCC Open I/O Files: | |
425 | ||
426 | open(unit=4,type='old',access='sequential',name='mult_gen.in') | |
427 | C--> Commented for AliRoot direct COMMON block access | |
428 | C open(unit=7,type='new',access='sequential',name='mult_gen.out') | |
429 | C open(unit=8,type='new',access='sequential',name='mult_gen.log') | |
430 | ||
431 | CCC NOTE: | |
432 | CCC Lines throughout the code which are commented out with "C-OUT" | |
433 | CCC can be activated to output special files (unit=9,10) with just the | |
434 | CCC mass,pt,eta,y,phi values listed for all the tracks for all events, | |
435 | CCC or the cos[n*(phi - PSI-reaction-plane)] for n=1,2...6. | |
436 | CCC These files can be directly loaded into PAW ntuples for analysis. | |
437 | ||
438 | C-OUT open(unit=9,type='new',access='sequential',name='mult_gen.kin') | |
439 | C-OUT open(unit=10,type='new',access='sequential',name='mult_gen.cos') | |
440 | C--> Commented for AliRoot direct COMMON block access | |
441 | C open(unit=9,type='new',access='sequential',name='mult_gen.kin') | |
442 | C open(unit=10,type='new',access='sequential',name='mult_gen.cos') | |
443 | ||
444 | CCC File 'mult_gen.in' is the input file for the run. | |
445 | CCC File 'mult_gen.out' is the output file in STAR New TEXT Format. | |
446 | CCC File 'mult_gen.log' is a log file for the run. | |
447 | CCC File 'mult_gen.kin', if activated, lists track kinematics for PAW ntuples. | |
448 | CCC File 'mult_gen.cos', if activated, lists the cos(n*phi) for PAW ntuples. | |
449 | ||
450 | CCC Initialize Arrays to Zero: | |
451 | ||
452 | do i = 1,npid | |
453 | gpid(i) = 0 | |
454 | mult_mean(i) = 0 | |
455 | mult_variance_control(i) = 0 | |
456 | n_mult_steps(i) = 0 | |
457 | Temp_mean(i) = 0.0 | |
458 | Temp_stdev(i) = 0.0 | |
459 | sigma_mean(i) = 0.0 | |
460 | sigma_stdev(i) = 0.0 | |
461 | expvel_mean(i) = 0.0 | |
462 | expvel_stdev(i) = 0.0 | |
463 | mult_event(i) = 0 | |
464 | Temp_event(i) = 0.0 | |
465 | sigma_event(i) = 0.0 | |
466 | expvel_event(i) = 0.0 | |
467 | total_mult_inc(i) = 0 | |
468 | ||
469 | do j = 1,n_mult_max_steps | |
470 | mult_integ_save(i,j) = 0.0 | |
471 | mult_xfunc_save(i,j) = 0.0 | |
472 | end do | |
473 | ||
474 | do j = 1,nmax_integ | |
475 | Temp_integ_save(i,j) = 0.0 | |
476 | Temp_xfunc_save(i,j) = 0.0 | |
477 | sigma_integ_save(i,j) = 0.0 | |
478 | sigma_xfunc_save(i,j) = 0.0 | |
479 | expvel_integ_save(i,j) = 0.0 | |
480 | expvel_xfunc_save(i,j) = 0.0 | |
481 | Mass_integ_save(i,j) = 0.0 | |
482 | Mass_xfunc_save(i,j) = 0.0 | |
483 | end do | |
484 | end do | |
485 | ||
486 | do j = 1,nflowterms | |
487 | cosinefac(j) = 0.0 | |
488 | do k = 1,4 | |
489 | Vn_event_tmp(j,k) = 0.0 | |
490 | end do | |
491 | do i = 1,npid | |
492 | Vn_sum(j,i) = 0.0 | |
493 | do k = 1,4 | |
494 | Vn_mean(j,k,i) = 0.0 | |
495 | Vn_stdev(j,k,i) = 0.0 | |
496 | Vn_event(j,k,i) = 0.0 | |
497 | end do | |
498 | do k = 1,nmax_integ | |
499 | Vn1_integ_save(j,i,k) = 0.0 | |
500 | Vn1_xfunc_save(j,i,k) = 0.0 | |
501 | Vn2_integ_save(j,i,k) = 0.0 | |
502 | Vn2_xfunc_save(j,i,k) = 0.0 | |
503 | Vn3_integ_save(j,i,k) = 0.0 | |
504 | Vn3_xfunc_save(j,i,k) = 0.0 | |
505 | Vn4_integ_save(j,i,k) = 0.0 | |
506 | Vn4_xfunc_save(j,i,k) = 0.0 | |
507 | end do | |
508 | end do | |
509 | end do | |
510 | ||
511 | do i = 1,nmax_integ | |
512 | PSIr_integ_save(i) = 0.0 | |
513 | PSIr_xfunc_save(i) = 0.0 | |
514 | MultFac_integ_save(i) = 0.0 | |
515 | MultFac_xfunc_save(i) = 0.0 | |
516 | end do | |
517 | ||
518 | do i = 1,n_mult_max_steps | |
519 | mult_integ(i) = 0.0 | |
520 | mult_xfunc(i) = 0.0 | |
521 | end do | |
522 | ||
523 | do i = 1,nmax_integ | |
524 | integ(i) = 0.0 | |
525 | xfunc(i) = 0.0 | |
526 | end do | |
527 | ||
528 | do i = 1,factorial_max | |
529 | FACLOG(i) = 0.0 | |
530 | end do | |
531 | ||
532 | do i = 1,60 | |
533 | geant_mass(i) = 0.0 | |
534 | end do | |
535 | ||
536 | do i = 1,npid | |
537 | pt_start(i) = 0.0 | |
538 | pt_stop(i) = 0.0 | |
539 | eta_start(i) = 0.0 | |
540 | eta_stop(i) = 0.0 | |
541 | n_pt_bins(i) = 0 | |
542 | n_eta_bins(i) = 0 | |
543 | do j = 1,n_bins_max | |
544 | delta_pt(i,j) = 0.0 | |
545 | delta_eta(i,j) = 0.0 | |
546 | pt_bin(i,j) = 0.0 | |
547 | eta_bin(i,j) = 0.0 | |
548 | do k = 1,n_bins_max | |
549 | pt_eta_bin(i,j,k) = 0.0 | |
550 | end do | |
551 | end do | |
552 | end do | |
553 | ||
554 | CCC Read Input: | |
555 | ||
556 | read(4,*) n_events ! No. of events to generate | |
557 | read(4,*) n_pid_type ! No. of Geant PID types to include | |
558 | read(4,*) model_type ! Distribution model type (see | |
559 | CCC ! Function dNdpty for explanation). | |
560 | read(4,*) reac_plane_cntrl ! Reaction plane control option (1-4) | |
561 | read(4,*) PSIr_mean,PSIr_stdev ! Reaction plane angle mean and std. | |
562 | CCC ! dev., both are in degrees. | |
563 | read(4,*) MultFac_mean,MultFac_stdev ! Mult scaling factor mean,stdev. | |
564 | read(4,*) pt_cut_min,pt_cut_max ! Min/Max pt range in GeV/c | |
565 | read(4,*) eta_cut_min,eta_cut_max ! Min/Max pseudorapidity range | |
566 | read(4,*) phi_cut_min,phi_cut_max ! Min/Max azimuthal angular range (deg) | |
567 | read(4,*) n_stdev_mult ! No.(+/-) standard deviation range | |
568 | CCC ! for multiplicity | |
569 | read(4,*) n_stdev_temp ! No.(+/-) st.dev. range for Temp. | |
570 | read(4,*) n_stdev_sigma ! No.(+/-) st.dev. range for rapidity | |
571 | CCC ! width, sigma. | |
572 | read(4,*) n_stdev_expvel ! No.(+/-) st.dev. range for expansion | |
573 | CCC ! velocity. | |
574 | read(4,*) n_stdev_PSIr ! No.(+/-) st.dev. range for PSIr | |
575 | read(4,*) n_stdev_Vn ! No.(+/-) st.dev. range for anisotropic | |
576 | CCC ! flow parameters Vn. | |
577 | read(4,*) n_stdev_MultFac ! No.(+/-) st.dev. range for multipli- | |
578 | CCC ! city scaling factor for all PIDs. | |
579 | read(4,*) n_integ_pts ! No. of integration mesh points to use | |
580 | CCC ! for random parameter fluctuations. | |
581 | read(4,*) n_scan_pts ! No. of pt and eta mesh points to use | |
582 | CCC ! in scan for maximum value of dN/dpt*dy | |
583 | read(4,*) irand ! Random number seed; default=12345. | |
584 | ||
585 | CCC Check Validity and Consistency of Input Parameters so far: | |
586 | ||
587 | if(n_events .le. 0) n_events = 1 | |
588 | if(n_pid_type .le. 0) n_pid_type = 1 | |
589 | if(pt_cut_min .gt. pt_cut_max) then | |
590 | C--> write(8,40) pt_cut_min,pt_cut_max | |
591 | RETURN | |
592 | end if | |
593 | if(eta_cut_min .gt. eta_cut_max) then | |
594 | C--> write(8,41) eta_cut_min,eta_cut_max | |
595 | RETURN | |
596 | end if | |
597 | if(phi_cut_min .gt. phi_cut_max) then | |
598 | C--> write(8,42) phi_cut_min,phi_cut_max | |
599 | RETURN | |
600 | end if | |
601 | 40 Format(//10x,'pt_cut_min = ',F7.4,' gt max = ',F7.4,' -STOP') | |
602 | 41 Format(//10x,'eta_cut_min = ',F7.4,' gt max = ',F7.4,' -STOP') | |
603 | 42 Format(//10x,'phi_cut_min = ',F7.4,' gt max = ',F7.4,' -STOP') | |
604 | if(n_stdev_mult .lt. 0.0) n_stdev_mult = 1.0 | |
605 | if(n_stdev_temp .lt. 0.0) n_stdev_temp = 1.0 | |
606 | if(n_stdev_sigma .lt. 0.0) n_stdev_sigma = 1.0 | |
607 | if(n_stdev_expvel .lt. 0.0) n_stdev_expvel = 1.0 | |
608 | if(n_stdev_PSIr .lt. 0.0) n_stdev_PSIr = 1.0 | |
609 | if(n_stdev_Vn .lt. 0.0) n_stdev_Vn = 1.0 | |
610 | if(n_stdev_MultFac .lt. 0.0) n_stdev_MultFac = 1.0 | |
611 | if(n_integ_pts .le. 0) n_integ_pts = 10 | |
612 | if(n_scan_pts .le. 0) n_scan_pts = 10 | |
613 | ||
614 | if(irand .le. 0) irand = 12345 | |
615 | if(n_pid_type .gt. npid) then | |
616 | C--> write(8,10) n_pid_type, npid | |
617 | 10 Format(//10x,'No. requested PID types = ',I7, | |
618 | 1 ', exceeds maximum of ',I7,'; reset') | |
619 | n_pid_type = npid | |
620 | end if | |
621 | if(model_type .lt. 0 .or. model_type .gt. 6) then | |
622 | C--> write(8,11) model_type | |
623 | 11 Format(/10x,'model_type = ',I5,' is not allowed; STOP') | |
624 | RETURN | |
625 | end if | |
626 | if(n_integ_pts .gt. nmax_integ) then | |
627 | C--> write(8,12) n_integ_pts, nmax_integ | |
628 | 12 Format(/10x,'No. integ. pts = ',I7, | |
629 | 1 ', exceeds maximum of ',I7,'; reset') | |
630 | n_integ_pts = nmax_integ | |
631 | end if | |
632 | if(reac_plane_cntrl .lt. 1 .OR. reac_plane_cntrl .gt. 4) then | |
633 | C--> write(8,*) 'reac_plane_cntrl = ',reac_plane_cntrl,'-STOP' | |
634 | RETURN | |
635 | end if | |
636 | ||
637 | CCC Force the reaction plane angle (mean value) to be within the | |
638 | CCC range 0 to 360 deg. | |
639 | PSIr_mean = PSIr_mean - 360.0*float(int(PSIr_mean/360.0)) | |
640 | if(PSIr_mean .lt. 0.0) PSIr_mean = PSIr_mean + 360.0 | |
641 | if(PSIr_stdev .lt. 0.0) then | |
642 | C--> write(8,*) 'Reaction plane angle Std. dev. is < 0.0 - STOP' | |
643 | RETURN | |
644 | end if | |
645 | ||
646 | CCC Check the multiplicity scaling factor input parameters: | |
647 | if(MultFac_mean.lt.0.0 .or. MultFac_stdev.lt.0.0) then | |
648 | C--> write(8,48) MultFac_mean, MultFac_stdev | |
649 | 48 Format(//10x,'Multiplicity scaling factor mean or stdev = ', | |
650 | 1 2F7.4,' - not valid - STOP') | |
651 | RETURN | |
652 | end if | |
653 | ||
654 | CCC FOR MODEL_TYPE = 1,2,3 or 4; | |
655 | CCC Repeat the following lines of input for each particle ID type: | |
656 | ||
657 | IF(model_type.ge.1 .and. model_type.le.4) then | |
658 | ||
659 | do pid = 1,n_pid_type | |
660 | ||
661 | read(4,*) gpid(pid) ! Geant Particle ID code number | |
662 | ||
663 | read(4,*) mult_mean(pid), mult_variance_control(pid) | |
664 | CCC Mean multiplicity and variance control where: | |
665 | CCC mult_variance_control = 0 for no variance in multiplicity | |
666 | CCC mult_variance_control = 1 to allow Poisson distribution for | |
667 | CCC particle multiplicities for all events. | |
668 | ||
669 | read(4,*) Temp_mean(pid), Temp_stdev(pid) | |
670 | CCC Temperature parameter mean (in GeV) and standard deviation (Gaussian | |
671 | CCC distribution assumed). | |
672 | ||
673 | read(4,*) sigma_mean(pid), sigma_stdev(pid) | |
674 | CCC Rapidity distribution width (sigma) parameter mean and standard | |
675 | CCC deviation (Gaussian distribution assumed). | |
676 | ||
677 | read(4,*) expvel_mean(pid), expvel_stdev(pid) | |
678 | CCC S. Pratt expansion velocity (in units of c) mean and standard | |
679 | CCC deviation (Gaussian distribution assumed). | |
680 | ||
681 | do i = 1,nflowterms | |
682 | read(4,*) (Vn_mean(i,k,pid) ,k=1,4) | |
683 | read(4,*) (Vn_stdev(i,k,pid),k=1,4) | |
684 | end do | |
685 | CCC Anisotropic flow Fourier component coefficients specifying the | |
686 | CCC azimuthal (phi angle) dependence as defined in Phys. Rev. C58, | |
687 | CCC 1671 (1998), Eq.(1); 'nflowterms' number of parameters are | |
688 | CCC allowed (see file 'Parameter_values.inc' where this is currently | |
689 | CCC set to 6); these are the mean and Gaussian std. dev. to be used | |
690 | CCC if random, Gaussian variation in the Vn values from event-to-event | |
691 | CCC are selected (via reac_plane_cntrl). | |
692 | CCC The flow parameters are pt and y dependent; see Function Vn_pt_y | |
693 | CCC for the full definitions. | |
694 | ||
695 | CCC Check Validity and Consistency of Input Parameters | |
696 | ||
697 | if(Temp_mean(pid).le.0.0 .or. Temp_stdev(pid).lt.0.0) then | |
698 | C--> write(8,45) pid,Temp_mean(pid),Temp_stdev(pid) | |
699 | 45 Format(//10x,'For pid # ',I7,', Temp_mean or Temp_stdev= ', | |
700 | 1 2F7.4,' - not valid -STOP') | |
701 | RETURN | |
702 | end if | |
703 | if(sigma_mean(pid).le.0.0 .or. sigma_stdev(pid).lt.0.0) then | |
704 | C--> write(8,46) pid,sigma_mean(pid),sigma_stdev(pid) | |
705 | 46 Format(//10x,'For pid # ',I7,', sigma_mean or sigma_stdev= ', | |
706 | 1 2F7.4,' - not valid -STOP') | |
707 | RETURN | |
708 | end if | |
709 | if(expvel_mean(pid).lt.0.0.or.expvel_stdev(pid).lt.0.0) then | |
710 | C--> write(8,47) pid,expvel_mean(pid),expvel_stdev(pid) | |
711 | 47 Format(//10x,'For pid #',I7,',expvel_mean or expvel_stdev=', | |
712 | 1 2F7.4,' - not valid -STOP') | |
713 | RETURN | |
714 | end if | |
715 | ||
716 | do k = 1,4 | |
717 | do i = 1,nflowterms | |
718 | if(Vn_stdev(i,k,pid) .lt. 0.0) then | |
719 | C--> write(8,*) 'For pid#,term#,k= ',pid,i,k | |
720 | C--> write(8,*) 'Vn_stdev = ',Vn_stdev(i,k,pid) | |
721 | C--> write(8,*) 'which is not valid, must be => 0, STOP' | |
722 | RETURN | |
723 | end if | |
724 | end do | |
725 | end do | |
726 | ||
727 | end do ! End of loop over Particle ID types. | |
728 | ||
729 | ELSE IF (model_type .eq. 5) then | |
730 | ||
731 | CCC Input for Factorized pt, eta bin-by-bin distribution: | |
732 | ||
733 | do pid = 1,n_pid_type | |
734 | read(4,*) gpid(pid) | |
735 | read(4,*) mult_mean(pid), mult_variance_control(pid) | |
736 | read(4,*) pt_start(pid), eta_start(pid) | |
737 | read(4,*) n_pt_bins(pid), n_eta_bins(pid) | |
738 | do i = 1,n_pt_bins(pid) | |
739 | read(4,*) delta_pt(pid,i), pt_bin(pid,i) | |
740 | end do | |
741 | do i = 1,n_eta_bins(pid) | |
742 | read(4,*) delta_eta(pid,i), eta_bin(pid,i) | |
743 | end do | |
744 | ||
745 | do i = 1,nflowterms | |
746 | read(4,*) (Vn_mean(i,k,pid) ,k=1,4) | |
747 | read(4,*) (Vn_stdev(i,k,pid),k=1,4) | |
748 | end do | |
749 | CCC Anisotropic flow Fourier component coefficients specifying the | |
750 | CCC azimuthal (phi angle) dependence as defined in Phys. Rev. C58, | |
751 | CCC 1671 (1998), Eq.(1); 'nflowterms' number of parameters are | |
752 | CCC allowed (see file 'Parameter_values.inc' where this is currently | |
753 | CCC set to 6); these are the mean and Gaussian std. dev. to be used | |
754 | CCC if random, Gaussian variation in the Vn values from event-to-event | |
755 | CCC are selected (via reac_plane_cntrl). | |
756 | CCC The flow parameters are pt and y dependent; see Function Vn_pt_y | |
757 | CCC for the full definitions. | |
758 | ||
759 | CCC Evaluate grid and find maximum values of pt and eta for input bins: | |
760 | ||
761 | pt_stop(pid) = pt_start(pid) | |
762 | do i = 1,n_pt_bins(pid) | |
763 | pt_stop(pid) = pt_stop(pid) + delta_pt(pid,i) | |
764 | pt_bin_mesh(pid,i) = pt_stop(pid) | |
765 | end do | |
766 | eta_stop(pid) = eta_start(pid) | |
767 | do i = 1,n_eta_bins(pid) | |
768 | eta_stop(pid) = eta_stop(pid) + delta_eta(pid,i) | |
769 | eta_bin_mesh(pid,i) = eta_stop(pid) | |
770 | end do | |
771 | ||
772 | CCC Check ranges of pt and eta coverage: | |
773 | ||
774 | if(pt_cut_min .lt. pt_start(pid)) then | |
775 | C--> write(8,50) pt_cut_min,pt_start(pid) | |
776 | 50 Format(//10x,'pt_cut_min = ',F10.7,' .lt. pt_start =', | |
777 | 1 F10.7,' - STOP') | |
778 | RETURN | |
779 | end if | |
780 | if(pt_cut_max .gt. pt_stop(pid)) then | |
781 | C--> write(8,51) pt_cut_max,pt_stop(pid) | |
782 | 51 Format(//10x,'pt_cut_max = ',F10.7,' .gt. pt_stop =', | |
783 | 1 F10.7,' - STOP') | |
784 | RETURN | |
785 | end if | |
786 | if(eta_cut_min .lt. eta_start(pid)) then | |
787 | C--> write(8,52) eta_cut_min,eta_start(pid) | |
788 | 52 Format(//10x,'eta_cut_min = ',F10.7,'.lt.eta_start =', | |
789 | 1 F10.7,' - STOP') | |
790 | RETURN | |
791 | end if | |
792 | if(eta_cut_max .gt. eta_stop(pid)) then | |
793 | C--> write(8,53) eta_cut_max,eta_stop(pid) | |
794 | 53 Format(//10x,'eta_cut_max = ',F10.7,'.gt.eta_stop =', | |
795 | 1 F10.7,' - STOP') | |
796 | RETURN | |
797 | end if | |
798 | ||
799 | do k = 1,4 | |
800 | do i = 1,nflowterms | |
801 | if(Vn_stdev(i,k,pid) .lt. 0.0) then | |
802 | C--> write(8,*) 'For pid#,term#,k= ',pid,i,k | |
803 | C--> write(8,*) 'Vn_stdev = ',Vn_stdev(i,k,pid) | |
804 | C--> write(8,*) 'which is not valid, must be => 0, STOP' | |
805 | RETURN | |
806 | end if | |
807 | end do | |
808 | end do | |
809 | ||
810 | end do ! End loop over particle ID types. | |
811 | ||
812 | ELSE IF (model_type .eq. 6) then | |
813 | ||
814 | CCC Input for Full 2D (pt,eta) bin-by-bin distribution: | |
815 | ||
816 | do pid = 1,n_pid_type | |
817 | read(4,*) gpid(pid) | |
818 | read(4,*) mult_mean(pid), mult_variance_control(pid) | |
819 | read(4,*) pt_start(pid), eta_start(pid) | |
820 | read(4,*) n_pt_bins(pid), n_eta_bins(pid) | |
821 | do i = 1,n_pt_bins(pid) | |
822 | read(4,*) delta_pt(pid,i) | |
823 | end do | |
824 | do i = 1,n_eta_bins(pid) | |
825 | read(4,*) delta_eta(pid,i) | |
826 | end do | |
827 | ||
828 | CCC Evaluate grid and find maximum values of pt and eta for input bins: | |
829 | ||
830 | pt_stop(pid) = pt_start(pid) | |
831 | do i = 1,n_pt_bins(pid) | |
832 | pt_stop(pid) = pt_stop(pid) + delta_pt(pid,i) | |
833 | pt_bin_mesh(pid,i) = pt_stop(pid) | |
834 | end do | |
835 | eta_stop(pid) = eta_start(pid) | |
836 | do i = 1,n_eta_bins(pid) | |
837 | eta_stop(pid) = eta_stop(pid) + delta_eta(pid,i) | |
838 | eta_bin_mesh(pid,i) = eta_stop(pid) | |
839 | end do | |
840 | ||
841 | CCC Load 2D bin-by-bin distribution: | |
842 | ||
843 | do i = 1,n_pt_bins(pid)*n_eta_bins(pid) | |
844 | read(4,*) iptbin,ietabin,bin_value | |
845 | pt_eta_bin(pid,iptbin,ietabin) = bin_value | |
846 | end do | |
847 | ||
848 | do i = 1,nflowterms | |
849 | read(4,*) (Vn_mean(i,k,pid) ,k=1,4) | |
850 | read(4,*) (Vn_stdev(i,k,pid),k=1,4) | |
851 | end do | |
852 | CCC Anisotropic flow Fourier component coefficients specifying the | |
853 | CCC azimuthal (phi angle) dependence as defined in Phys. Rev. C58, | |
854 | CCC 1671 (1998), Eq.(1); 'nflowterms' number of parameters are | |
855 | CCC allowed (see file 'Parameter_values.inc' where this is currently | |
856 | CCC set to 6); these are the mean and Gaussian std. dev. to be used | |
857 | CCC if random, Gaussian variation in the Vn values from event-to-event | |
858 | CCC are selected (via reac_plane_cntrl). | |
859 | CCC The flow parameters are pt and y dependent; see Function Vn_pt_y | |
860 | CCC for the full definitions. | |
861 | ||
862 | CCC Check ranges of pt and eta coverage: | |
863 | ||
864 | if(pt_cut_min .lt. pt_start(pid)) then | |
865 | C--> write(8,50) pt_cut_min,pt_start(pid) | |
866 | RETURN | |
867 | end if | |
868 | if(pt_cut_max .gt. pt_stop(pid)) then | |
869 | C--> write(8,51) pt_cut_max,pt_stop(pid) | |
870 | RETURN | |
871 | end if | |
872 | if(eta_cut_min .lt. eta_start(pid)) then | |
873 | C--> write(8,52) eta_cut_min,eta_start(pid) | |
874 | RETURN | |
875 | end if | |
876 | if(eta_cut_max .gt. eta_stop(pid)) then | |
877 | C--> write(8,53) eta_cut_max,eta_stop(pid) | |
878 | RETURN | |
879 | end if | |
880 | do k = 1,4 | |
881 | do i = 1,nflowterms | |
882 | if(Vn_stdev(i,k,pid) .lt. 0.0) then | |
883 | C--> write(8,*) 'For pid#,term#,k= ',pid,i,k | |
884 | C--> write(8,*) 'Vn_stdev = ',Vn_stdev(i,k,pid) | |
885 | C--> write(8,*) 'which is not valid, must be => 0, STOP' | |
886 | RETURN | |
887 | end if | |
888 | end do | |
889 | end do | |
890 | ||
891 | end do ! End loop over particle ID types. | |
892 | ||
893 | END IF ! End of MODEL_TYPE Options input: | |
894 | ||
895 | CCC Check some more input parameters; Set constants, and load data tables: | |
896 | ||
897 | do pid = 1,n_pid_type | |
898 | if(gpid(pid).le.0 .or. gpid(pid).gt.200) then | |
899 | C--> write(8,43) pid,gpid(pid) | |
900 | 43 Format(//10x,'For pid # ',I7,', gpid = ',I7,' - not valid -STOP') | |
901 | RETURN | |
902 | end if | |
903 | if(mult_variance_control(pid) .lt. 0 .or. | |
904 | 1 mult_variance_control(pid) .gt. 1) | |
905 | 2 mult_variance_control(pid) = 0 | |
906 | if(mult_mean(pid) .le. 0) then | |
907 | C--> write(8,44) pid,mult_mean(pid) | |
908 | 44 Format(//10x,'For pid # ',I7,', mult_mean= ',I7, | |
909 | 1 ' - not valid -STOP') | |
910 | RETURN | |
911 | end if | |
912 | end do ! End Particle ID input parameter check and verification loop. | |
913 | ||
914 | pi = 3.141592654 | |
915 | rad = 180.0/pi | |
916 | Temp_abort = 0.01 | |
917 | sigma_abort = 0.01 | |
918 | ||
919 | CCC Load particle properties array; mass in GeV, etc.: | |
920 | ||
921 | Call Particle_prop | |
922 | ||
923 | CCC Load log(n!) values into Common/FACFAC/ | |
924 | ||
925 | Call FACTORIAL | |
926 | ||
927 | CCC Set y (rapidity) range, to be used for model_type = 1-4 | |
928 | if(eta_cut_min .ge. 0.0) then | |
929 | y_cut_min = 0.0 | |
930 | else | |
931 | y_cut_min = eta_cut_min | |
932 | end if | |
933 | if(eta_cut_max .le. 0.0) then | |
934 | y_cut_max = 0.0 | |
935 | else | |
936 | y_cut_max = eta_cut_max | |
937 | end if | |
938 | ||
939 | CCC Obtain integrals of 1D distribution functions of multiplicity | |
940 | CCC (Poisson, integer) and parameters (Gaussian, real*4) for the | |
941 | CCC particle model distributions, for each particle ID type. | |
942 | CCC These integrated quantities are then used with random number | |
943 | CCC selection to generate a distribution of multiplicities and | |
944 | CCC parameter values for each event in the run. | |
945 | ||
946 | CCC Obtain 1D integrals for Gaussian distributions for reaction plane | |
947 | CCC angles: | |
948 | ||
949 | if(reac_plane_cntrl .eq. 3) then | |
950 | if((n_stdev_PSIr*PSIr_stdev).gt. 0.0) then | |
951 | PSIr_min = PSIr_mean - n_stdev_PSIr*PSIr_stdev | |
952 | PSIr_max = PSIr_mean + n_stdev_PSIr*PSIr_stdev | |
953 | Call Gaussian(PSIr_min,PSIr_max,PSIr_mean,PSIr_stdev, | |
954 | 1 n_integ_pts,integ,xfunc,nmax_integ) | |
955 | do i = 1,n_integ_pts + 1 | |
956 | PSIr_integ_save(i) = integ(i) | |
957 | PSIr_xfunc_save(i) = xfunc(i) | |
958 | end do | |
959 | else | |
960 | PSIr_event = PSIr_mean | |
961 | end if | |
962 | end if | |
963 | ||
964 | CCC Obtain 1D integral for Gaussian distribution for the trigger fluctuation | |
965 | CCC simulations via the overall multiplicity scaling factor. | |
966 | if((n_stdev_MultFac*MultFac_stdev).gt.0.0) then | |
967 | Call MinMax(MultFac_mean,MultFac_stdev,n_stdev_MultFac, | |
968 | 1 MultFac_min,MultFac_max) | |
969 | Call Gaussian(MultFac_min,MultFac_max,MultFac_mean, | |
970 | 1 MultFac_stdev,n_integ_pts,integ,xfunc,nmax_integ) | |
971 | do i = 1,n_integ_pts + 1 | |
972 | MultFac_integ_save(i) = integ(i) | |
973 | MultFac_xfunc_save(i) = xfunc(i) | |
974 | end do | |
975 | else | |
976 | MultFac_event = MultFac_mean | |
977 | end if | |
978 | ||
979 | do pid = 1,n_pid_type | |
980 | ||
981 | Call Particle_mass(gpid(pid),pid,n_integ_pts) | |
982 | ||
983 | if(mult_variance_control(pid) .ne. 0) then | |
984 | mult_mean_real = float(mult_mean(pid)) | |
985 | mult_stdev = sqrt(mult_mean_real) | |
986 | Call MinMax(mult_mean_real,mult_stdev,n_stdev_mult, | |
987 | 1 mult_min_real,mult_max_real) | |
988 | mult_min = int(mult_min_real) | |
989 | mult_max = int(mult_max_real + 1) | |
990 | n_mult_steps(pid) = mult_max - mult_min + 1 | |
991 | if((n_mult_steps(pid) + 1) .gt. n_mult_max_steps) then | |
992 | C--> write(8,20) n_mult_steps(pid),n_mult_max_steps | |
993 | 20 Format(//10x,'No. steps in multiplicity integral = ', | |
994 | 1 I7,' + 1, exceeds max no. of ',I7,'; reset') | |
995 | mult_min = mult_mean(pid) - (n_mult_max_steps - 1)/2 | |
996 | mult_max = mult_mean(pid) + (n_mult_max_steps - 1)/2 | |
997 | n_mult_steps(pid) = mult_max - mult_min + 1 | |
998 | end if | |
999 | if((mult_max + 1) .gt. factorial_max) then | |
1000 | C--> write(8,30) mult_max, factorial_max | |
1001 | 30 Format(//10x,'In Poisson multiplicity distribution,', | |
1002 | 1 ' max = ',I7,', exceeds limit of ',I7,' - STOP') | |
1003 | RETURN | |
1004 | end if | |
1005 | ||
1006 | Call Poisson(mult_min,mult_max,mult_mean(pid), | |
1007 | 1 n_mult_steps(pid),mult_integ,mult_xfunc,n_mult_max_steps) | |
1008 | do i = 1,n_mult_steps(pid) + 1 | |
1009 | mult_integ_save(pid,i) = mult_integ(i) | |
1010 | mult_xfunc_save(pid,i) = mult_xfunc(i) | |
1011 | end do | |
1012 | else if (mult_variance_control(pid) .eq. 0) then | |
1013 | mult_event(pid) = mult_mean(pid) | |
1014 | end if | |
1015 | ||
1016 | if(model_type .le. 4) then | |
1017 | if(Temp_stdev(pid) .ne. 0.0) then | |
1018 | Call MinMax(Temp_mean(pid),Temp_stdev(pid),n_stdev_temp, | |
1019 | 1 Temp_min, Temp_max) | |
1020 | Call Gaussian(Temp_min,Temp_max,Temp_mean(pid), | |
1021 | 1 Temp_stdev(pid),n_integ_pts,integ,xfunc,nmax_integ) | |
1022 | do i = 1,n_integ_pts + 1 | |
1023 | Temp_integ_save(pid,i) = integ(i) | |
1024 | Temp_xfunc_save(pid,i) = xfunc(i) | |
1025 | end do | |
1026 | else if(Temp_stdev(pid) .eq. 0.0) then | |
1027 | Temp_event(pid) = Temp_mean(pid) | |
1028 | end if | |
1029 | ||
1030 | if(sigma_stdev(pid) .ne. 0.0) then | |
1031 | Call MinMax(sigma_mean(pid),sigma_stdev(pid),n_stdev_sigma, | |
1032 | 1 sigma_min, sigma_max) | |
1033 | Call Gaussian(sigma_min,sigma_max,sigma_mean(pid), | |
1034 | 1 sigma_stdev(pid),n_integ_pts,integ,xfunc,nmax_integ) | |
1035 | do i = 1,n_integ_pts + 1 | |
1036 | sigma_integ_save(pid,i) = integ(i) | |
1037 | sigma_xfunc_save(pid,i) = xfunc(i) | |
1038 | end do | |
1039 | else if(sigma_stdev(pid) .eq. 0.0) then | |
1040 | sigma_event(pid) = sigma_mean(pid) | |
1041 | end if | |
1042 | ||
1043 | if(expvel_stdev(pid) .ne. 0.0) then | |
1044 | Call MinMax(expvel_mean(pid),expvel_stdev(pid),n_stdev_expvel, | |
1045 | 1 expvel_min, expvel_max) | |
1046 | Call Gaussian(expvel_min,expvel_max,expvel_mean(pid), | |
1047 | 1 expvel_stdev(pid),n_integ_pts,integ,xfunc,nmax_integ) | |
1048 | do i = 1,n_integ_pts + 1 | |
1049 | expvel_integ_save(pid,i) = integ(i) | |
1050 | expvel_xfunc_save(pid,i) = xfunc(i) | |
1051 | end do | |
1052 | else if(expvel_stdev(pid) .eq. 0.0) then | |
1053 | expvel_event(pid) = expvel_mean(pid) | |
1054 | end if | |
1055 | end if ! End model_type .le. 4 options. | |
1056 | ||
1057 | if(reac_plane_cntrl .gt. 1) then | |
1058 | do i = 1,nflowterms | |
1059 | do k = 1,4 | |
1060 | if((n_stdev_Vn*Vn_stdev(i,k,pid)) .gt. 0.0) then | |
1061 | Vn_min = Vn_mean(i,k,pid)-n_stdev_Vn*Vn_stdev(i,k,pid) | |
1062 | Vn_max = Vn_mean(i,k,pid)+n_stdev_Vn*Vn_stdev(i,k,pid) | |
1063 | Call Gaussian(Vn_min,Vn_max,Vn_mean(i,k,pid), | |
1064 | 1 Vn_stdev(i,k,pid),n_integ_pts,integ,xfunc,nmax_integ) | |
1065 | if(k.eq.1) then | |
1066 | do j = 1,n_integ_pts + 1 | |
1067 | Vn1_integ_save(i,pid,j) = integ(j) | |
1068 | Vn1_xfunc_save(i,pid,j) = xfunc(j) | |
1069 | end do | |
1070 | else if(k.eq.2) then | |
1071 | do j = 1,n_integ_pts + 1 | |
1072 | Vn2_integ_save(i,pid,j) = integ(j) | |
1073 | Vn2_xfunc_save(i,pid,j) = xfunc(j) | |
1074 | end do | |
1075 | else if(k.eq.3) then | |
1076 | do j = 1,n_integ_pts + 1 | |
1077 | Vn3_integ_save(i,pid,j) = integ(j) | |
1078 | Vn3_xfunc_save(i,pid,j) = xfunc(j) | |
1079 | end do | |
1080 | else if(k.eq.4) then | |
1081 | do j = 1,n_integ_pts + 1 | |
1082 | Vn4_integ_save(i,pid,j) = integ(j) | |
1083 | Vn4_xfunc_save(i,pid,j) = xfunc(j) | |
1084 | end do | |
1085 | end if | |
1086 | else | |
1087 | Vn_event(i,k,pid) = Vn_mean(i,k,pid) | |
1088 | end if | |
1089 | end do | |
1090 | end do | |
1091 | end if | |
1092 | ||
1093 | end do ! End of PID Loop: | |
1094 | ||
1095 | CCC Write Run Header Output: | |
1096 | ||
1097 | C--> write(7,200) | |
1098 | C--> write(7,201) n_events,n_pid_type | |
1099 | C--> if(model_type .eq. 1) write(7,202) | |
1100 | C--> if(model_type .eq. 2) write(7,203) | |
1101 | C--> if(model_type .eq. 3) write(7,204) | |
1102 | C--> if(model_type .eq. 4) write(7,205) | |
1103 | C--> if(model_type .eq. 5) write(7,2051) | |
1104 | C--> if(model_type .eq. 6) write(7,2052) | |
1105 | C--> write(7,2053) reac_plane_cntrl | |
1106 | C--> write(7,2054) PSIr_mean, PSIr_stdev | |
1107 | C--> write(7,2055) MultFac_mean,MultFac_stdev | |
1108 | C--> write(7,206) pt_cut_min, pt_cut_max | |
1109 | C--> write(7,207) eta_cut_min, eta_cut_max | |
1110 | C--> write(7,2071) y_cut_min,y_cut_max | |
1111 | C--> write(7,208) phi_cut_min, phi_cut_max | |
1112 | C--> write(7,209) n_stdev_mult,n_stdev_temp,n_stdev_sigma, | |
1113 | C--> 1 n_stdev_expvel | |
1114 | C--> write(7,2091) n_stdev_PSIr, n_stdev_Vn | |
1115 | C--> write(7,2092) n_stdev_MultFac | |
1116 | C--> write(7,210) n_integ_pts | |
1117 | C--> write(7,211) n_scan_pts | |
1118 | C--> write(7,212) irand | |
1119 | C--> write(7,213) (gpid(pid),pid = 1,n_pid_type) | |
1120 | C--> write(7,214) (mult_mean(pid),pid = 1,n_pid_type) | |
1121 | C--> write(7,215) (mult_variance_control(pid),pid = 1,n_pid_type) | |
1122 | C--> if(model_type .le. 4) then | |
1123 | C--> write(7,216) (Temp_mean(pid),pid = 1,n_pid_type) | |
1124 | C--> write(7,217) (Temp_stdev(pid),pid = 1,n_pid_type) | |
1125 | C--> write(7,218) (sigma_mean(pid),pid = 1,n_pid_type) | |
1126 | C--> write(7,219) (sigma_stdev(pid),pid = 1,n_pid_type) | |
1127 | C--> write(7,220) (expvel_mean(pid),pid = 1,n_pid_type) | |
1128 | C--> write(7,221) (expvel_stdev(pid),pid = 1,n_pid_type) | |
1129 | C--> else if(model_type .ge. 5) then | |
1130 | C--> write(7,222) (n_pt_bins(pid),pid = 1,n_pid_type) | |
1131 | C--> write(7,223) (n_eta_bins(pid),pid = 1,n_pid_type) | |
1132 | C--> write(7,224) (pt_start(pid),pid = 1,n_pid_type) | |
1133 | C--> write(7,225) (pt_stop(pid),pid = 1,n_pid_type) | |
1134 | C--> write(7,226) (eta_start(pid),pid = 1,n_pid_type) | |
1135 | C--> write(7,227) (eta_stop(pid),pid = 1,n_pid_type) | |
1136 | C--> end if | |
1137 | CCC Print out flow parameters: | |
1138 | do pid = 1,n_pid_type | |
1139 | do i = 1,nflowterms | |
1140 | C--> write(7,2271) pid,i,(Vn_mean(i,k,pid),k=1,4) | |
1141 | C--> write(7,2272) pid,i,(Vn_stdev(i,k,pid),k=1,4) | |
1142 | end do | |
1143 | end do | |
1144 | ||
1145 | 200 Format('*** Multiplicity Generator Run Header ***') | |
1146 | 201 Format('* Number of events = ',I7,'; number of Particle ID', | |
1147 | 1 ' types = ',I5) | |
1148 | 202 Format('* Factorized mt exponential, Gaussian rapidity model') | |
1149 | 203 Format('* Pratt non-expanding, spherical thermal source model') | |
1150 | 204 Format('* Bertsch non-expanding spherical thermal source model') | |
1151 | 205 Format('* Pratt spherically expanding, thermally equilibrated ', | |
1152 | 1 'source model') | |
1153 | 2051 Format('* Factorized pt,eta bin-by-bin Distribution') | |
1154 | 2052 Format('* Full 2D pt,eta bin-by-bin Distribution') | |
1155 | 2053 Format('* Reaction plane control = ',I5) | |
1156 | 2054 Format('* Reaction plane angles - mean and std.dev. = ',2G12.5, | |
1157 | 1 ' (deg)') | |
1158 | 2055 Format('* Multiplicity Scaling Factor - mean and std.dev = ', | |
1159 | 1 2G12.5) | |
1160 | 206 Format('* Min, Max range in pt = ', 2G12.5) | |
1161 | 207 Format('* Min, Max range in pseudorapidity = ', 2G12.5) | |
1162 | 2071 Format('* Min, Max range in rapdity + cush = ', 2G12.5) | |
1163 | 208 Format('* Min, Max range in azimuthal angle = ', 2G12.5) | |
1164 | 209 Format('* No. std. dev. range used for mult and parameters = ', | |
1165 | 1 4F5.2) | |
1166 | 2091 Format('* No. std. dev. range for PSIr, Vn = ', 2G12.5) | |
1167 | 2092 Format('* No. std. dev. range for MultFac = ',G12.5) | |
1168 | 210 Format('* No. integration points for parameter variance = ', | |
1169 | 1 I6) | |
1170 | 211 Format('* No. of dN/dp(pt,y) scanning grid points to find ', | |
1171 | 1 'maximum = ', I6) | |
1172 | 212 Format('* Starting Random Number Seed = ',I10) | |
1173 | 213 Format('* Geant PID: ',10I7) | |
1174 | 214 Format('* Mean Multiplicity: ',10I7) | |
1175 | 215 Format('* Mult. Var. Control: ',10I7) | |
1176 | 216 Format('* Mean Temperature: ',10F7.4) | |
1177 | 217 Format('* Std. Dev. Temp: ',10F7.4) | |
1178 | 218 Format('* Mean Rap. sigma: ',10F7.4) | |
1179 | 219 Format('* Std. Dev. y-sigma: ',10F7.4) | |
1180 | 220 Format('* Mean expansion vel: ',10F7.4) | |
1181 | 221 Format('* Std. Dev. exp. vel: ',10F7.4) | |
1182 | 222 Format('* No. input pt bins: ',10I7) | |
1183 | 223 Format('* No. input eta bins: ',10I7) | |
1184 | 224 Format('* Input pt start: ',10F7.4) | |
1185 | 225 Format('* Input pt stop: ',10F7.4) | |
1186 | 226 Format('* Input eta start: ',10F7.4) | |
1187 | 227 Format('* Input eta stop: ',10F7.4) | |
1188 | 2271 Format('* Anisotropy Vn mean (pid=',I2,',n=',I1,'):',4G12.5) | |
1189 | 2272 Format('* Anisotropy Vn std. (pid=',I2,',n=',I1,'):',4G12.5) | |
1190 | ||
1191 | CCC END Run Header Output | |
1192 | ||
1193 | C************************************************************** | |
1194 | C ** | |
1195 | C START EVENT LOOP ** | |
1196 | C ** | |
1197 | C************************************************************** | |
1198 | ||
1199 | DO ievent = 1,n_events | |
1200 | ||
1201 | CCC Compute the Reaction plane angle for this event: | |
1202 | if(reac_plane_cntrl .eq. 1) then | |
1203 | PSIr_event = 0.0 | |
1204 | else if(reac_plane_cntrl .eq. 2) then | |
1205 | PSIr_event = PSIr_mean | |
1206 | else if(reac_plane_cntrl .eq. 3) then | |
1207 | if((n_stdev_PSIr*PSIr_stdev) .gt. 0.0) then | |
1208 | do i = 1,n_integ_pts + 1 | |
1209 | integ(i) = PSIr_integ_save(i) | |
1210 | xfunc(i) = PSIr_xfunc_save(i) | |
1211 | end do | |
1212 | Call LAGRNG(ran(irand),integ,PSIr_event,xfunc, | |
1213 | 1 n_integ_pts+1,1,5,n_integ_pts+1,1) | |
1214 | CCC Ensure that the randomly selected reaction plane angle | |
1215 | CCC is within the 0 to 360 deg range. | |
1216 | PSIr_event=PSIr_event-360.0*float(int(PSIr_event/360.0)) | |
1217 | if(PSIr_event .lt. 0.0) PSIr_event = PSIr_event + 360.0 | |
1218 | end if | |
1219 | CCC NOTE: If PSIr_stdev=0.0, PSIr_event already calculated (see preceding) | |
1220 | else if(reac_plane_cntrl .eq. 4) then | |
1221 | PSIr_event = 360.0*ran(irand) | |
1222 | else | |
1223 | PSIr_event = 0.0 | |
1224 | end if | |
1225 | ||
1226 | CCC Compute the multiplicity scaling factor for simulating trigger | |
1227 | CCC fluctuations for this event: | |
1228 | if((n_stdev_MultFac*MultFac_stdev).gt.0.0) then | |
1229 | do i = 1,n_integ_pts + 1 | |
1230 | integ(i) = MultFac_integ_save(i) | |
1231 | xfunc(i) = MultFac_xfunc_save(i) | |
1232 | end do | |
1233 | Call LAGRNG(ran(irand),integ,MultFac_event,xfunc, | |
1234 | 1 n_integ_pts+1,1,5,n_integ_pts+1,1) | |
1235 | end if | |
1236 | ||
1237 | do pid = 1,n_pid_type | |
1238 | if(mult_variance_control(pid) .ne. 0) then | |
1239 | do i = 1,n_mult_steps(pid) + 1 | |
1240 | mult_integ(i) = mult_integ_save(pid,i) | |
1241 | mult_xfunc(i) = mult_xfunc_save(pid,i) | |
1242 | end do | |
1243 | Call LAGRNG(ran(irand),mult_integ,mult_event_real, | |
1244 | 1 mult_xfunc,n_mult_steps(pid)+1,1,5, | |
1245 | 2 n_mult_steps(pid)+1,1) | |
1246 | mult_event(pid) = mult_event_real | |
1247 | else if(mult_variance_control(pid) .eq. 0) then | |
1248 | mult_event(pid) = mult_mean(pid) | |
1249 | end if | |
1250 | mult_event(pid) = int(MultFac_event*float(mult_event(pid)) | |
1251 | 1 + 0.5) | |
1252 | CCC Check each multiplicity wrt upper array size limit: | |
1253 | if(mult_event(pid).gt.factorial_max) then | |
1254 | C--> write(8,*) 'For event#',ievent,'and pid#',pid, | |
1255 | C--> 1 'multiplicity=',mult_event(pid), | |
1256 | C--> 2 'which is > array size (factorial_max=', | |
1257 | C--> 3 factorial_max,')-STOP' | |
1258 | RETURN | |
1259 | end if | |
1260 | ||
1261 | if(model_type .le. 4) then | |
1262 | ||
1263 | if(Temp_stdev(pid) .ne. 0.0) then | |
1264 | do i = 1,n_integ_pts + 1 | |
1265 | integ(i) = Temp_integ_save(pid,i) | |
1266 | xfunc(i) = Temp_xfunc_save(pid,i) | |
1267 | end do | |
1268 | Call LAGRNG(ran(irand),integ,Temp_event(pid),xfunc, | |
1269 | 1 n_integ_pts+1,1,5,n_integ_pts+1,1) | |
1270 | end if | |
1271 | ||
1272 | if(sigma_stdev(pid) .ne. 0.0) then | |
1273 | do i = 1,n_integ_pts + 1 | |
1274 | integ(i) = sigma_integ_save(pid,i) | |
1275 | xfunc(i) = sigma_xfunc_save(pid,i) | |
1276 | end do | |
1277 | Call LAGRNG(ran(irand),integ,sigma_event(pid),xfunc, | |
1278 | 1 n_integ_pts+1,1,5,n_integ_pts+1,1) | |
1279 | end if | |
1280 | ||
1281 | if(expvel_stdev(pid) .ne. 0.0) then | |
1282 | do i = 1,n_integ_pts + 1 | |
1283 | integ(i) = expvel_integ_save(pid,i) | |
1284 | xfunc(i) = expvel_xfunc_save(pid,i) | |
1285 | end do | |
1286 | Call LAGRNG(ran(irand),integ,expvel_event(pid),xfunc, | |
1287 | 1 n_integ_pts+1,1,5,n_integ_pts+1,1) | |
1288 | end if | |
1289 | end if | |
1290 | ||
1291 | if(reac_plane_cntrl .gt. 1) then | |
1292 | do i = 1,nflowterms | |
1293 | do k = 1,4 | |
1294 | if((n_stdev_Vn*Vn_stdev(i,k,pid)) .gt. 0.0) then | |
1295 | if(k.eq.1) then | |
1296 | do j = 1,n_integ_pts + 1 | |
1297 | integ(j) = Vn1_integ_save(i,pid,j) | |
1298 | xfunc(j) = Vn1_xfunc_save(i,pid,j) | |
1299 | end do | |
1300 | else if (k.eq.2) then | |
1301 | do j = 1,n_integ_pts + 1 | |
1302 | integ(j) = Vn2_integ_save(i,pid,j) | |
1303 | xfunc(j) = Vn2_xfunc_save(i,pid,j) | |
1304 | end do | |
1305 | else if (k.eq.3) then | |
1306 | do j = 1,n_integ_pts + 1 | |
1307 | integ(j) = Vn3_integ_save(i,pid,j) | |
1308 | xfunc(j) = Vn3_xfunc_save(i,pid,j) | |
1309 | end do | |
1310 | else if (k.eq.4) then | |
1311 | do j = 1,n_integ_pts + 1 | |
1312 | integ(j) = Vn4_integ_save(i,pid,j) | |
1313 | xfunc(j) = Vn4_xfunc_save(i,pid,j) | |
1314 | end do | |
1315 | end if | |
1316 | Call LAGRNG(ran(irand),integ,Vn_event(i,k,pid),xfunc, | |
1317 | 1 n_integ_pts+1,1,5,n_integ_pts+1,1) | |
1318 | end if ! (For n_stdev_Vn*Vn_stdev=0, already have Vn_event) | |
1319 | end do | |
1320 | end do | |
1321 | end if | |
1322 | ||
1323 | end do ! End Particle ID setup Loop | |
1324 | ||
1325 | event_abort = 1 | |
1326 | ||
1327 | if(model_type .le. 4) then | |
1328 | CCC Check validity of Temperature and sigma parameters: | |
1329 | do pid = 1,n_pid_type | |
1330 | if(Temp_event(pid) .le. Temp_abort) event_abort = -86 | |
1331 | if(sigma_event(pid).le.sigma_abort) event_abort = -86 | |
1332 | end do | |
1333 | end if | |
1334 | ||
1335 | if(event_abort .eq. 1) then | |
1336 | ||
1337 | total_mult = 0 | |
1338 | do pid = 1,n_pid_type | |
1339 | total_mult = total_mult + mult_event(pid) | |
1340 | end do | |
1341 | n_vertices = 0 | |
1342 | status_abort = 1 | |
1343 | do pid = 1,n_pid_type | |
1344 | CCC Load Anisotropic flow parameters for this event# and PID type | |
1345 | CCC into temporary array; | |
1346 | do i = 1,nflowterms | |
1347 | do k = 1,4 | |
1348 | Vn_event_tmp(i,k) = Vn_event(i,k,pid) | |
1349 | end do | |
1350 | end do | |
1351 | CCC For the specified Geant PID, multiplicity, model type, temperature, | |
1352 | CCC rapidity width (sigma), and expansion velocity parameter, generate | |
1353 | CCC random track list: | |
1354 | ||
1355 | Call track_gen(gpid(pid),mult_event(pid),model_type, | |
1356 | 1 Temp_event(pid),sigma_event(pid),expvel_event(pid), | |
1357 | 2 reac_plane_cntrl,PSIr_event,Vn_event_tmp, | |
1358 | 3 pt_cut_min,pt_cut_max,eta_cut_min,eta_cut_max, | |
1359 | 4 y_cut_min,y_cut_max, | |
1360 | 5 phi_cut_min,phi_cut_max,n_scan_pts,irand,rad,pid,status, | |
1361 | 6 n_integ_pts) | |
1362 | if(status .eq. -86) status_abort = -86 | |
1363 | end do | |
1364 | end if | |
1365 | ||
1366 | if(event_abort.eq.1 .and. status_abort.eq.1) then | |
1367 | CCC Event Header Output: | |
1368 | C--> write(7,230) ievent, total_mult | |
1369 | C--> write(7,2301) PSIr_event | |
1370 | C--> write(7,2302) MultFac_event | |
1371 | C--> write(7,213) (gpid(pid),pid = 1,n_pid_type) | |
1372 | C--> write(7,231) (mult_event(pid),pid = 1,n_pid_type) | |
1373 | C--> if(model_type .le. 4) then | |
1374 | C--> write(7,232) (Temp_event(pid),pid = 1,n_pid_type) | |
1375 | C--> write(7,233) (sigma_event(pid),pid = 1,n_pid_type) | |
1376 | C--> write(7,234) (expvel_event(pid),pid = 1,n_pid_type) | |
1377 | C--> end if | |
1378 | ||
1379 | 230 Format(/'*** Next Event: No. ',I7,'; Total # tracks = ',I10) | |
1380 | 2301 Format('* Reaction plane angle = ',G12.5,' (deg)') | |
1381 | 2302 Format('* Multiplicity Scaling Factor = ',G12.5) | |
1382 | 231 Format('* Multiplicity: ',10I7) | |
1383 | 232 Format('* Temperature: ',10F7.4) | |
1384 | 233 Format('* Rapidity Dist. sigma: ',10F7.4) | |
1385 | 234 Format('* Expansion Velocity: ',10F7.4) | |
1386 | ||
1387 | CCC Print out flow parameters for this event: | |
1388 | C--> do pid = 1,n_pid_type | |
1389 | C--> do i = 1,nflowterms | |
1390 | C--> write(7,2341) pid,i,(Vn_event(i,k,pid),k=1,4) | |
1391 | C--> end do | |
1392 | C--> end do | |
1393 | 2341 Format('* Anisotropy Vn (pid=',I2,',n=',I1,'):',4G12.5) | |
1394 | ||
1395 | C--> write(7,235) ievent,total_mult,n_vertices | |
1396 | 235 Format('EVENT:',3x,3(1x,I6)) | |
1397 | C--> write(7,236) | |
1398 | C--> write(7,237) | |
1399 | 236 Format('*** Tracks for this event ***') | |
1400 | 237 Format('* Geant PID # px py pz') | |
1401 | CCC End Event Header Output: | |
1402 | ||
1403 | CCC Output track kinematics for ievent and pid: | |
1404 | track_counter = 0 | |
1405 | start_v = 0 | |
1406 | stop_v = 0 | |
1407 | do pid = 1,n_pid_type | |
1408 | do i = 1,mult_event(pid) | |
1409 | track_counter = track_counter + 1 | |
1410 | C--> write(7,240) gpid(pid),(pout(pid,j,i),j=1,3), | |
1411 | C--> 1 track_counter,start_v,stop_v,gpid(pid) | |
1412 | C-OUT masstemp = pout(pid,4,i) | |
1413 | C-OUT pxtemp = pout(pid,1,i) | |
1414 | C-OUT pytemp = pout(pid,2,i) | |
1415 | C-OUT pztemp = pout(pid,3,i) | |
1416 | C-OUT Call kinematics2(masstemp,pxtemp,pytemp,pztemp,pttemp, | |
1417 | C-OUT 1 etatemp,ytemp,phitemp) | |
1418 | C-OUT write(9,270) gpid(pid),masstemp,pttemp,etatemp,ytemp,phitemp | |
1419 | C-OUT270 Format(1x,I4,5E15.6) | |
1420 | masstemp = pout(pid,4,i) | |
1421 | pxtemp = pout(pid,1,i) | |
1422 | pytemp = pout(pid,2,i) | |
1423 | pztemp = pout(pid,3,i) | |
1424 | Call kinematics2(masstemp,pxtemp,pytemp,pztemp,pttemp, | |
1425 | 1 etatemp,ytemp,phitemp) | |
1426 | C--> write(9,270) gpid(pid),masstemp,pttemp,etatemp,ytemp,phitemp | |
1427 | 270 Format(1x,I4,5E15.6) | |
1428 | C-OUT Compute the cos(n*phi) Fourier component projections of the | |
1429 | C-OUT azimuthal distributions for each PID type: | |
1430 | total_mult_inc(pid) = total_mult_inc(pid) + 1 | |
1431 | jodd = 1 | |
1432 | do j = 1,nflowterms | |
1433 | if(jodd.eq.1) then | |
1434 | if(ytemp.ge.0.0) then | |
1435 | cosinefac(j) = | |
1436 | 1 cos(float(j)*(phitemp-PSIr_event)/rad) | |
1437 | else if(ytemp.lt.0.0) then | |
1438 | cosinefac(j) = | |
1439 | 1 -cos(float(j)*(phitemp-PSIr_event)/rad) | |
1440 | end if | |
1441 | else if(jodd.eq.(-1)) then | |
1442 | cosinefac(j) = | |
1443 | 1 cos(float(j)*(phitemp-PSIr_event)/rad) | |
1444 | end if | |
1445 | jodd = -jodd | |
1446 | Vn_sum(j,pid) = Vn_sum(j,pid) + cosinefac(j) | |
1447 | end do | |
1448 | C--> write(10,260) gpid(pid),(cosinefac(j),j=1,nflowterms) | |
1449 | 260 Format(1x,I3,6E12.4) | |
1450 | C-OUT | |
1451 | ||
1452 | end do | |
1453 | end do | |
1454 | 240 Format('TRACK:',1x,I6,3(1x,G12.5),4(1x,I6)) | |
1455 | CCC End track kinematics output. | |
1456 | ||
1457 | else | |
1458 | C--> write(7,250) ievent, event_abort, status_abort | |
1459 | C--> write(8,250) ievent, event_abort, status_abort | |
1460 | 250 Format(/'*** Event No. ',I7,' ABORTED: event_abort,', | |
1461 | 1 'status_abort = ',2I7) | |
1462 | end if | |
1463 | ||
1464 | END DO ! End Event Loop | |
1465 | ||
1466 | CCC Output Anisotropic flow check sums to terminal: | |
1467 | do pid = 1,n_pid_type | |
1468 | C--> write(6,*) 'Total incl # part type (',gpid(pid), | |
1469 | C--> 1 ') = ',total_mult_inc(pid) | |
1470 | do j = 1,nflowterms | |
1471 | Vn_sum(j,pid) = Vn_sum(j,pid)/total_mult_inc(pid) | |
1472 | C--> write(6,*) 'Flow term #',j,': Check sum = ', | |
1473 | C--> 1 Vn_sum(j,pid) | |
1474 | end do | |
1475 | end do | |
1476 | ||
1477 | CCC Output File Termination: | |
1478 | ievent = -999 | |
1479 | total_mult = 0 | |
1480 | n_vertices = 0 | |
1481 | C--> write(7,241) | |
1482 | C--> write(7,235) ievent,total_mult,n_vertices | |
1483 | 241 Format(/'*** End of File ***') | |
1484 | ||
1485 | Close(Unit=4) | |
1486 | Close(Unit=7) | |
1487 | Close(Unit=8) | |
1488 | C-OUT Close(Unit=9) | |
1489 | C-OUT Close(Unit=10) | |
1490 | Close(Unit=9) | |
1491 | Close(Unit=10) | |
1492 | RETURN | |
1493 | END | |
1494 | ||
1495 | Subroutine track_gen(gpid,N,model_type,T,sigma,expvel, | |
1496 | 1 reac_plane_cntrl,PSIr,Vn, | |
1497 | 2 pt_cut_min,pt_cut_max,eta_cut_min,eta_cut_max, | |
1498 | 3 y_cut_min,y_cut_max, | |
1499 | 4 phi_cut_min,phi_cut_max,n_scan_pts,irand,rad,pid,status, | |
1500 | 5 n_integ_pts) | |
1501 | implicit none | |
1502 | Include 'common_facfac.inc' | |
1503 | Include 'Parameter_values.inc' | |
1504 | Common/track/ pout(npid,4,factorial_max) | |
1505 | real*4 pout | |
1506 | Common/Geant/geant_mass(200),geant_charge(200), | |
1507 | 1 geant_lifetime(200),geant_width(200) | |
1508 | real*4 geant_mass,geant_charge,geant_lifetime,geant_width | |
1509 | ||
1510 | real*4 T,sigma,expvel,pt_cut_min,pt_cut_max,eta_cut_min | |
1511 | real*4 eta_cut_max,phi_cut_min,phi_cut_max,mass | |
1512 | real*4 dpt,deta,facmax,pt,eta,y,rapidity,dNdpty,dNdp | |
1513 | real*4 pt_trial,eta_trial,y_trial,ran,rad,phi | |
1514 | real*4 y_cut_min,y_cut_max,pseudorapidity | |
1515 | real*4 PSIr,Vn(nflowterms,4),dphi,facmax_phi,dNdphi | |
1516 | real*4 Vnptmax,Vnymax,Vn_pt_y,Vntmp(nflowterms) | |
1517 | real*4 masstmp,Mass_function | |
1518 | ||
1519 | integer gpid,N,model_type,npt,neta,n_scan_pts,ipt,ieta | |
1520 | integer Track_count,irand,i,j,pid,status | |
1521 | integer reac_plane_cntrl,iphi | |
1522 | integer n_integ_pts | |
1523 | ||
1524 | do i = 1,factorial_max | |
1525 | do j = 1,4 | |
1526 | pout(pid,j,i) = 0.0 | |
1527 | end do | |
1528 | end do | |
1529 | ||
1530 | mass = geant_mass(gpid) | |
1531 | npt = n_scan_pts | |
1532 | neta = n_scan_pts | |
1533 | ||
1534 | CCC Determine maximum value of model distribution in (pt,eta) range: | |
1535 | ||
1536 | dpt = (pt_cut_max - pt_cut_min)/float(npt - 1) | |
1537 | deta = (eta_cut_max - eta_cut_min)/float(neta - 1) | |
1538 | facmax = 0.0 | |
1539 | do ipt = 1,npt | |
1540 | pt = pt_cut_min + dpt*float(ipt - 1) | |
1541 | do ieta = 1,neta | |
1542 | eta = eta_cut_min + deta*float(ieta - 1) | |
1543 | y = rapidity(mass,pt,eta) | |
1544 | dNdp = dNdpty(1.0,pt,eta,y,mass,T,sigma,expvel, | |
1545 | 1 model_type,1,pid) | |
1546 | if(dNdp .gt. facmax) facmax = dNdp | |
1547 | end do | |
1548 | end do | |
1549 | ||
1550 | CCC If dNdp always underflows exp() range, then facmax will stay | |
1551 | CCC equal to 0.0, thus causing a divide by 0.0 error below. | |
1552 | CCC Check for this and Return if this is the case. This event will | |
1553 | CCC be aborted in this instance. | |
1554 | ||
1555 | if(facmax .eq. 0.0) then | |
1556 | status = -86 | |
1557 | Return | |
1558 | else | |
1559 | status = 1 | |
1560 | end if | |
1561 | ||
1562 | CCC Determine the maximum values of the azimuthal model distribution | |
1563 | CCC in phi, for case with reaction plane dependence and anisotropic flow | |
1564 | CCC Find the absolute maximum possible value given the pt and y dependences | |
1565 | CCC and assuming all Fourier components add with maximum coherence. | |
1566 | ||
1567 | if(reac_plane_cntrl .gt. 1) then | |
1568 | facmax_phi = 1.0 | |
1569 | do i = 1,nflowterms | |
1570 | if(i.eq.(2*(i/2))) then ! Select even Fourier components: | |
1571 | Vnptmax = max( | |
1572 | 1 abs(Vn(i,1)+Vn(i,4)*pt_cut_min | |
1573 | 3 +Vn(i,2)*pt_cut_min*pt_cut_min), | |
1574 | 2 abs(Vn(i,1)+Vn(i,4)*pt_cut_max | |
1575 | 4 +Vn(i,2)*pt_cut_max*pt_cut_max)) | |
1576 | Vnymax = max( | |
1577 | 1 exp(-Vn(i,3)*y_cut_min*y_cut_min), | |
1578 | 2 exp(-Vn(i,3)*y_cut_max*y_cut_max)) | |
1579 | if(y_cut_min.lt.0.0 .and. y_cut_max.gt.0.0) then | |
1580 | Vnymax = max(Vnymax,1.0) | |
1581 | end if | |
1582 | else ! Select odd Fourier components | |
1583 | Vnptmax = max( | |
1584 | 1 abs(Vn(i,1)+Vn(i,2)*pt_cut_min), | |
1585 | 2 abs(Vn(i,1)+Vn(i,2)*pt_cut_max)) | |
1586 | Vnymax = max( | |
1587 | 1 abs(Vn(i,3)+Vn(i,4)*abs(y_cut_min**3)), | |
1588 | 2 abs(Vn(i,3)+Vn(i,4)*abs(y_cut_max**3))) | |
1589 | if(y_cut_min.lt.0.0 .and. y_cut_max.gt.0.0) then | |
1590 | Vnymax = max(Vnymax,abs(Vn(i,3))) | |
1591 | end if | |
1592 | end if | |
1593 | facmax_phi = facmax_phi + 2.0*Vnptmax*Vnymax | |
1594 | end do | |
1595 | CCC Check facmax_phi; if 0, then event will be aborted. | |
1596 | if(facmax_phi.eq.0.0) then | |
1597 | status = -86 | |
1598 | Return | |
1599 | else | |
1600 | status = 1 | |
1601 | end if | |
1602 | end if | |
1603 | ||
1604 | CCC Start Random Track Selection: | |
1605 | ||
1606 | Track_count = 0 | |
1607 | ||
1608 | 100 pt_trial = ran(irand)*(pt_cut_max - pt_cut_min)+pt_cut_min | |
1609 | if(model_type.ge.1 .and. model_type.le.4) then | |
1610 | y_trial = ran(irand)*(y_cut_max - y_cut_min)+y_cut_min | |
1611 | eta_trial = pseudorapidity(mass,pt_trial,y_trial) | |
1612 | if(eta_trial.lt.eta_cut_min .or. eta_trial.gt.eta_cut_max) | |
1613 | 1 go to 100 | |
1614 | else if (model_type.eq.5 .or. model_type.eq.6) then | |
1615 | eta_trial=ran(irand)*(eta_cut_max-eta_cut_min)+eta_cut_min | |
1616 | y_trial = rapidity(mass,pt_trial,eta_trial) | |
1617 | end if | |
1618 | dNdp = dNdpty(1.0,pt_trial,eta_trial,y_trial,mass,T,sigma, | |
1619 | 1 expvel,model_type,1,pid)/facmax | |
1620 | if(ran(irand) .le. dNdp) then | |
1621 | Track_count = Track_count + 1 | |
1622 | ||
1623 | CCC Determine phi angle: | |
1624 | if(reac_plane_cntrl .eq. 1) then | |
1625 | phi = (ran(irand)*(phi_cut_max - phi_cut_min) + | |
1626 | 1 phi_cut_min)/rad | |
1627 | else if(reac_plane_cntrl .gt. 1) then | |
1628 | do i = 1,nflowterms | |
1629 | Vntmp(i) = Vn_pt_y(i,Vn(i,1),Vn(i,2),Vn(i,3),Vn(i,4), | |
1630 | 1 pt_trial,y_trial) | |
1631 | end do | |
1632 | 101 phi = ran(irand)*(phi_cut_max - phi_cut_min)+phi_cut_min | |
1633 | dNdphi = 1.0 | |
1634 | do i = 1,nflowterms | |
1635 | dNdphi=dNdphi+2.0*Vntmp(i)*cos(float(i)*(phi-PSIr)/rad) | |
1636 | end do | |
1637 | if(ran(irand).gt.(dNdphi/facmax_phi)) then | |
1638 | go to 101 | |
1639 | else | |
1640 | phi = phi/rad | |
1641 | end if | |
1642 | end if | |
1643 | ||
1644 | masstmp = Mass_function(gpid,pid,n_integ_pts,irand) | |
1645 | Call kinematics(masstmp,pt_trial,y_trial,phi,Track_count,pid) | |
1646 | if(Track_count .lt. N) then | |
1647 | go to 100 | |
1648 | else if(Track_count .ge. N) then | |
1649 | Return | |
1650 | end if | |
1651 | ||
1652 | else | |
1653 | go to 100 | |
1654 | end if | |
1655 | ||
1656 | END | |
1657 | ||
1658 | Real*4 Function rapidity(m,pt,eta) | |
1659 | implicit none | |
1660 | real*4 m,pt,eta,theta,pz,E,pi,expR | |
1661 | ||
1662 | pi = 3.141592654 | |
1663 | theta = 2.0*ATAN(expR(-eta)) | |
1664 | if(abs(theta - pi/2.0) .lt. 0.000001) then | |
1665 | pz = 0.0 | |
1666 | else | |
1667 | pz = pt/tan(theta) | |
1668 | end if | |
1669 | E = sqrt(pt*pt + pz*pz + m*m) | |
1670 | rapidity = 0.5*log((E+pz)/(E-pz)) | |
1671 | Return | |
1672 | END | |
1673 | ||
1674 | Real*4 Function pseudorapidity(m,pt,y) | |
1675 | implicit none | |
1676 | ||
1677 | CCC This Function computes the pseudorapidty for a given mass, pt, y: | |
1678 | ||
1679 | real*4 m,pt,y,mt,coshy,E,pzmag,pz,pmag,expR | |
1680 | ||
1681 | if(y.eq.0.0) then | |
1682 | pseudorapidity = 0.0 | |
1683 | Return | |
1684 | end if | |
1685 | mt = sqrt(m*m + pt*pt) | |
1686 | coshy = 0.5*(expR(y) + expR(-y)) | |
1687 | E = mt*coshy | |
1688 | pzmag = sqrt(abs(E*E - mt*mt)) | |
1689 | if(y.eq.0.0) then | |
1690 | pz = 0.0 | |
1691 | else | |
1692 | pz = (y/abs(y))*pzmag | |
1693 | end if | |
1694 | pmag = sqrt(pt*pt + pz*pz) | |
fddd64df | 1695 | if( (pt.ne.0.0) .and. (pmag .ne.pz) .and. (pmag.ne.(-pz)) ) then |
1696 | ||
c28b8f8d | 1697 | pseudorapidity = 0.5*log((pmag+pz)/(pmag-pz)) |
fddd64df | 1698 | else |
1699 | CCC if (pt.eq.0.0) then | |
c28b8f8d | 1700 | pseudorapidity = 86.0 |
1701 | C--> write(8,10) | |
1702 | 10 Format(10x,'Function pseudorapidity called with pt=0') | |
1703 | end if | |
1704 | Return | |
1705 | END | |
1706 | ||
1707 | Subroutine kinematics(m,pt,y,phi,index,pid) | |
1708 | implicit none | |
1709 | ||
1710 | CCC This SUBR takes the input particle mass (m), pt, y and phi and | |
1711 | CCC computes E, px, py, pz and loads the momenta into the index-th | |
1712 | CCC row of array pout(,,) in Common/track/ . | |
1713 | ||
1714 | integer index,pid | |
1715 | Include 'common_facfac.inc' | |
1716 | Include 'Parameter_values.inc' | |
1717 | Common/track/ pout(npid,4,factorial_max) | |
1718 | real*4 pout | |
1719 | ||
1720 | real*4 m,pt,y,phi,mt,coshy,E,pzmag,px,py,pz,expR | |
1721 | ||
1722 | mt = sqrt(m*m + pt*pt) | |
1723 | coshy = 0.5*(expR(y) + expR(-y)) | |
1724 | E = mt*coshy | |
1725 | pzmag = sqrt(abs(E*E - mt*mt)) | |
1726 | if(y.eq.0.0) then | |
1727 | pz = 0.0 | |
1728 | else | |
1729 | pz = (y/abs(y))*pzmag | |
1730 | end if | |
1731 | px = pt*cos(phi) | |
1732 | py = pt*sin(phi) | |
1733 | ||
1734 | pout(pid,1,index) = px | |
1735 | pout(pid,2,index) = py | |
1736 | pout(pid,3,index) = pz | |
1737 | pout(pid,4,index) = m | |
1738 | ||
1739 | Return | |
1740 | END | |
1741 | ||
1742 | Subroutine kinematics2(m,px,py,pz,pt,eta,y,phi) | |
1743 | implicit none | |
1744 | ||
1745 | CCC This SUBR takes the input particle mass (m), px,py,pz and | |
1746 | CCC computes pt,eta,y,phi: | |
1747 | ||
1748 | real*4 m,px,py,pz,pt,eta,y,phi,pi,E,E0 | |
1749 | ||
1750 | pi = 3.141592654 | |
1751 | pt = sqrt(px*px + py*py) | |
1752 | E = sqrt(m*m + pz*pz + pt*pt) | |
1753 | y = 0.5*log((E + pz)/(E - pz)) | |
1754 | E0 = sqrt(pz*pz + pt*pt) | |
1755 | if(pt.eq.0.0) then | |
1756 | eta = -86.0 | |
1757 | else | |
1758 | eta = 0.5*log((E0 + pz)/(E0 - pz)) | |
1759 | end if | |
1760 | if(px.eq.0.0 .and. py.eq.0.0) then | |
1761 | phi = 0.0 | |
1762 | else | |
1763 | phi = atan2(py,px) | |
1764 | end if | |
1765 | phi = (180.0/pi)*phi | |
1766 | if(phi .lt. 0.0) phi = phi + 360.0 | |
1767 | Return | |
1768 | END | |
1769 | ||
1770 | Real*4 Function dNdpty(A,pt,eta,y,m,T,sigma,vel,control,ktl,pid) | |
1771 | implicit none | |
1772 | ||
1773 | real*4 A,pt,eta,y,m,T,sigma,vel | |
1774 | real*4 pi,mt,coshy,E,ptot,FAC,gamma,yp,sinhyp,coshyp | |
1775 | real*4 FAC2,FAC3,expR | |
1776 | integer control, ktl,pid,pt_index,eta_index,index_locate | |
1777 | Include 'Parameter_values.inc' | |
1778 | Include 'common_dist_bin.inc' | |
1779 | ||
1780 | CCC Calculates dN/dp^3 using several models: | |
1781 | CCC | |
1782 | CCC control = 1, Humanic factorized model | |
1783 | CCC = 2, Pratt non-expanding spherical thermal source | |
1784 | CCC = 3, Bertsch non-expanding spherical thermal source | |
1785 | CCC = 4, Pratt spherical expanding thermally equilibrated | |
1786 | CCC source. | |
1787 | CCC = 5, Factorized pt, eta bin-by-bin distribution. | |
1788 | CCC = 6, Full 2D pt, eta bin-by-bin distribution. | |
1789 | CCC | |
1790 | CCC ktl = 0, to return value of dN/dp^3 | |
1791 | CCC ktl = 1, to return value of dN/dpt*dy | |
1792 | ||
1793 | pi = 3.141592654 | |
1794 | mt = sqrt(pt*pt + m*m) | |
1795 | coshy = 0.5*(expR(y) + expR(-y)) | |
1796 | E = mt*coshy | |
1797 | ptot = sqrt(E*E - m*m) | |
1798 | if(ktl .eq. 0) then | |
1799 | FAC = 2.0*pi*pt*E | |
1800 | else if(ktl .eq. 1) then | |
1801 | FAC = 1.0 | |
1802 | end if | |
1803 | ||
1804 | if(control .eq. 1) then | |
1805 | dNdpty = A*pt*expR(-mt/T)*expR(-y*y/(2.0*sigma*sigma)) | |
1806 | dNdpty = dNdpty/FAC | |
1807 | ||
1808 | else if(control .eq. 2) then | |
1809 | dNdpty = A*pt*E*expR(-E/T) | |
1810 | dNdpty = dNdpty/FAC | |
1811 | ||
1812 | else if(control .eq. 3) then | |
1813 | dNdpty = A*pt*E/(expR(E/T) - 1.0) | |
1814 | dNdpty = dNdpty/FAC | |
1815 | ||
1816 | else if(control .eq. 4) then | |
1817 | gamma = 1.0/sqrt(1.0 - vel*vel) | |
1818 | yp = gamma*vel*ptot/T | |
1819 | sinhyp = 0.5*(expR(yp) - expR(-yp)) | |
1820 | coshyp = 0.5*(expR(yp) + expR(-yp)) | |
1821 | if(yp .ne. 0.0) then | |
1822 | FAC2 = sinhyp/yp | |
1823 | else | |
1824 | FAC2 = 1.0 | |
1825 | end if | |
1826 | FAC3 = FAC2+ (T/(gamma*E))*(FAC2 - coshyp) | |
1827 | dNdpty = A*pt*E*expR(-gamma*E/T)*FAC3 | |
1828 | dNdpty = dNdpty/FAC | |
1829 | ||
1830 | else if(control .eq. 5) then | |
1831 | pt_index = index_locate(pid,pt,1) | |
1832 | eta_index = index_locate(pid,eta,2) | |
1833 | dNdpty = A*pt_bin(pid,pt_index)*eta_bin(pid,eta_index) | |
1834 | dNdpty = dNdpty/FAC | |
1835 | ||
1836 | else if(control .eq. 6) then | |
1837 | pt_index = index_locate(pid,pt,1) | |
1838 | eta_index = index_locate(pid,eta,2) | |
1839 | dNdpty = A*pt_eta_bin(pid,pt_index,eta_index) | |
1840 | dNdpty = dNdpty/FAC | |
1841 | ||
1842 | else | |
1843 | dNdpty = -86.0 | |
1844 | ||
1845 | end if | |
1846 | ||
1847 | return | |
1848 | END | |
1849 | ||
1850 | Integer Function index_locate(pid,arg,kind) | |
1851 | implicit none | |
1852 | ||
1853 | Include 'Parameter_values.inc' | |
1854 | Include 'common_dist_bin.inc' | |
1855 | ||
1856 | integer pid,kind,ibin | |
1857 | real*4 arg | |
1858 | ||
1859 | CCC This Function locates the pt or eta bin number corresponding to the | |
1860 | CCC input bin mesh, the requested value of pt or eta, for the current | |
1861 | CCC value of particle type. | |
1862 | CCC | |
1863 | CCC If kind = 1, then pt bin number is located. | |
1864 | CCC If kind = 2, then eta bin number is located. | |
1865 | ||
1866 | if(kind .eq. 1) then | |
1867 | do ibin = 1,n_pt_bins(pid) | |
1868 | if(arg.le.pt_bin_mesh(pid,ibin)) then | |
1869 | index_locate = ibin | |
1870 | Return | |
1871 | end if | |
1872 | end do | |
1873 | index_locate = n_pt_bins(pid) | |
1874 | C--> write(8,10) pid,arg | |
1875 | 10 Format(//10x,'In Function index_locate, for pid = ',I5, | |
1876 | 1 'pt =',E15.6,' is out of range - use last bin #') | |
1877 | Return | |
1878 | ||
1879 | else if(kind .eq. 2) then | |
1880 | ||
1881 | do ibin = 1,n_eta_bins(pid) | |
1882 | if(arg.le.eta_bin_mesh(pid,ibin)) then | |
1883 | index_locate = ibin | |
1884 | Return | |
1885 | end if | |
1886 | end do | |
1887 | index_locate = n_eta_bins(pid) | |
1888 | C--> write(8,11) pid,arg | |
1889 | 11 Format(//10x,'In Function index_locate, for pid = ',I5, | |
1890 | 1 'eta =',E15.6,' is out of range - use last bin #') | |
1891 | Return | |
1892 | ||
1893 | end if | |
1894 | END | |
1895 | ||
1896 | Real*4 Function expR(x) | |
1897 | implicit none | |
1898 | real*4 x | |
1899 | if(x .gt. 69.0) then | |
1900 | C--> write(8,10) x | |
1901 | STOP | |
1902 | else if(x .lt. -69.0) then | |
1903 | expR = 0.0 | |
1904 | else | |
1905 | expR = exp(x) | |
1906 | end if | |
1907 | 10 Format(///10x,'Func. expR(x) called with x = ',E15.6, | |
1908 | 1 ', gt 69.0 - STOP') | |
1909 | Return | |
1910 | END | |
1911 | ||
1912 | SUBROUTINE LAGRNG (X,ARG,Y,VAL,NDIM,NFS,NPTS,MAXARG,MAXFS) | |
1913 | IMPLICIT REAL*4(A-H,O-Z) | |
1914 | C | |
1915 | C LAGRANGE INTERPOLATION,UNEQUALLY SPACED POINTS | |
1916 | C ROUTINE OBTAINED FROM R. LANDAU, UNIV. OF OREGON. | |
1917 | C ARG=VECTOR OF INDEPENDENT VARIABLE CONTAINING MAXARG VALUES. | |
1918 | C VAL=MATRIX OF FUNCTION VALUES CORRESPONDING TO ARG. (MAXFS | |
1919 | C FUNCTIONS AT MAXARG VALUES.) | |
1920 | C X =VALUE OF INDEP. VARIABLE FOR WHICH INTERPOLATION IS DESIRED. | |
1921 | C Y =VECTOR OF MAXFS FUNCTION VALUES RESULTING FROM SIMUL. INTERP. | |
1922 | C NDIM=NUMBER OF ARG VALUES TO BE USED. (NDIM.LE.MAXARG) | |
1923 | C NFS=NUMBER OF FUNCTIONS SIMUL. INTERP (NFS.LE.MAXFS) | |
1924 | C NPTS=NUMBER OF POINTS USED IN INTERPOLATION. (NPTS=2,3,4,5,6) | |
1925 | C | |
1926 | DIMENSION ARG(MAXARG), VAL(MAXFS,MAXARG), Y(MAXFS) | |
1927 | C | |
1928 | C -----FIND X0, THE CLOSEST POINT TO X. | |
1929 | C | |
1930 | NI=1 | |
1931 | NF=NDIM | |
1932 | 10 IF ((X.LE.ARG(NI)).OR.(X.GE.ARG(NF))) GO TO 30 | |
1933 | IF ((NF-NI+1).EQ.2) GO TO 70 | |
1934 | NMID=(NF+NI)/2 | |
1935 | IF (X.GT.ARG(NMID)) GO TO 20 | |
1936 | NF=NMID | |
1937 | GO TO 10 | |
1938 | 20 NI=NMID | |
1939 | GO TO 10 | |
1940 | C | |
1941 | C ------ X IS ONE OF THE TABLULATED VALUES. | |
1942 | C | |
1943 | 30 IF (X.LE.ARG(NI)) GO TO 60 | |
1944 | NN=NF | |
1945 | 40 NUSED=0 | |
1946 | DO 50 N=1,NFS | |
1947 | 50 Y(N)=VAL(N,NN) | |
1948 | RETURN | |
1949 | 60 NN=NI | |
1950 | GO TO 40 | |
1951 | C | |
1952 | C ------- 2 PTS LEFT, CHOOSE SMALLER ONE. | |
1953 | C | |
1954 | 70 N0=NI | |
1955 | NN=NPTS-2 | |
1956 | GO TO (110,100,90,80), NN | |
1957 | 80 CONTINUE | |
1958 | IF (((N0+3).GT.NDIM).OR.((N0-2).LT.1)) GO TO 90 | |
1959 | NUSED=6 | |
1960 | GO TO 130 | |
1961 | 90 CONTINUE | |
1962 | IF ((N0+2).GT.NDIM) GO TO 110 | |
1963 | IF ((N0-2).LT.1) GO TO 100 | |
1964 | NUSED=5 | |
1965 | GO TO 130 | |
1966 | 100 CONTINUE | |
1967 | IF (((N0+2).GT.NDIM).OR.((N0-1).LT.1)) GO TO 110 | |
1968 | NUSED=4 | |
1969 | GO TO 130 | |
1970 | 110 IF ((N0+1).LT.NDIM) GO TO 120 | |
1971 | C | |
1972 | C ------N0=NDIM, SPECIAL CASE. | |
1973 | C | |
1974 | NN=NDIM | |
1975 | GO TO 40 | |
1976 | 120 NUSED=3 | |
1977 | IF ((N0-1).LT.1) NUSED=2 | |
1978 | 130 CONTINUE | |
1979 | C | |
1980 | C ------AT LEAST 2 PTS LEFT. | |
1981 | C | |
1982 | Y0=X-ARG(N0) | |
1983 | Y1=X-ARG(N0+1) | |
1984 | Y01=Y1-Y0 | |
1985 | C0=Y1/Y01 | |
1986 | C1=-Y0/Y01 | |
1987 | IF (NUSED.EQ.2) GO TO 140 | |
1988 | C | |
1989 | C ------AT LEAST 3 PTS. | |
1990 | C | |
1991 | YM1=X-ARG(N0-1) | |
1992 | Y0M1=YM1-Y0 | |
1993 | YM11=Y1-YM1 | |
1994 | CM1=-Y0*Y1/Y0M1/YM11 | |
1995 | C0=C0*YM1/Y0M1 | |
1996 | C1=-C1*YM1/YM11 | |
1997 | IF (NUSED.EQ.3) GO TO 160 | |
1998 | C | |
1999 | C ------AT LEAST 4 PTS | |
2000 | C | |
2001 | Y2=X-ARG(N0+2) | |
2002 | YM12=Y2-YM1 | |
2003 | Y02=Y2-Y0 | |
2004 | Y12=Y2-Y1 | |
2005 | CM1=CM1*Y2/YM12 | |
2006 | C0=C0*Y2/Y02 | |
2007 | C1=C1*Y2/Y12 | |
2008 | C2=-YM1*Y0*Y1/YM12/Y02/Y12 | |
2009 | IF (NUSED.EQ.4) GO TO 180 | |
2010 | C | |
2011 | C ------AT LEAST 5 PTS. | |
2012 | C | |
2013 | YM2=X-ARG(N0-2) | |
2014 | YM2M1=YM1-YM2 | |
2015 | YM20=Y0-YM2 | |
2016 | YM21=Y1-YM2 | |
2017 | YM22=Y2-YM2 | |
2018 | CM2=YM1*Y0*Y1*Y2/YM2M1/YM20/YM21/YM22 | |
2019 | CM1=-CM1*YM2/YM2M1 | |
2020 | C0=-C0*YM2/YM20 | |
2021 | C1=-C1*YM2/YM21 | |
2022 | C2=-C2*YM2/YM22 | |
2023 | IF (NUSED.EQ.5) GO TO 200 | |
2024 | C | |
2025 | C ------AT LEAST 6 PTS. | |
2026 | C | |
2027 | Y3=X-ARG(N0+3) | |
2028 | YM23=Y3-YM2 | |
2029 | YM13=Y3-YM1 | |
2030 | Y03=Y3-Y0 | |
2031 | Y13=Y3-Y1 | |
2032 | Y23=Y3-Y2 | |
2033 | CM2=CM2*Y3/YM23 | |
2034 | CM1=CM1*Y3/YM13 | |
2035 | C0=C0*Y3/Y03 | |
2036 | C1=C1*Y3/Y13 | |
2037 | C2=C2*Y3/Y23 | |
2038 | C3=YM2*YM1*Y0*Y1*Y2/YM23/YM13/Y03/Y13/Y23 | |
2039 | GO TO 220 | |
2040 | 140 CONTINUE | |
2041 | DO 150 N=1,NFS | |
2042 | 150 Y(N)=C0*VAL(N,N0)+C1*VAL(N,N0+1) | |
2043 | GO TO 240 | |
2044 | 160 CONTINUE | |
2045 | DO 170 N=1,NFS | |
2046 | 170 Y(N)=CM1*VAL(N,N0-1)+C0*VAL(N,N0)+C1*VAL(N,N0+1) | |
2047 | GO TO 240 | |
2048 | 180 CONTINUE | |
2049 | DO 190 N=1,NFS | |
2050 | 190 Y(N)=CM1*VAL(N,N0-1)+C0*VAL(N,N0)+C1*VAL(N,N0+1)+C2*VAL(N,N0+2) | |
2051 | GO TO 240 | |
2052 | 200 CONTINUE | |
2053 | DO 210 N=1,NFS | |
2054 | 210 Y(N)=CM2*VAL(N,N0-2)+CM1*VAL(N,N0-1)+C0*VAL(N,N0)+C1*VAL(N,N0+1)+C | |
2055 | 12*VAL(N,N0+2) | |
2056 | GO TO 240 | |
2057 | 220 CONTINUE | |
2058 | DO 230 N=1,NFS | |
2059 | 230 Y(N)=CM2*VAL(N,N0-2)+CM1*VAL(N,N0-1)+C0*VAL(N,N0)+C1*VAL(N,N0+1)+C | |
2060 | 12*VAL(N,N0+2)+C3*VAL(N,N0+3) | |
2061 | 240 RETURN | |
2062 | C | |
2063 | END | |
2064 | ||
2065 | Subroutine FACTORIAL | |
2066 | implicit none | |
2067 | ||
2068 | integer n | |
2069 | Include 'common_facfac.inc' | |
2070 | real*4 FN | |
2071 | ||
2072 | CCC Computes the natural log of n! for n = 0,1,2...(factorial_max -1) | |
2073 | CCC and puts the result in array FACLOG(). | |
2074 | C | |
2075 | CCC FACLOG(1) = log(0!) = 0.0 | |
2076 | CCC FACLOG(2) = log(1!) = 0.0 | |
2077 | CCC FACLOG(n+1) = log(n!) | |
2078 | ||
2079 | FACLOG(1) = 0.0 | |
2080 | FACLOG(2) = 0.0 | |
2081 | FN = 1.0 | |
2082 | do n = 3,factorial_max | |
2083 | FN = FN + 1.0 | |
2084 | FACLOG(n) = FACLOG(n-1) + log(FN) | |
2085 | end do | |
2086 | Return | |
2087 | END | |
2088 | ||
2089 | Subroutine MinMax(mean,stdev,n_stdev,min,max) | |
2090 | implicit none | |
2091 | ||
2092 | CCC Computes range of integration for random number selections | |
2093 | ||
2094 | real*4 mean,stdev,n_stdev,min,max | |
2095 | ||
2096 | min = mean - n_stdev*stdev | |
2097 | if(min .lt. 0.0) min = 0.0 | |
2098 | max = mean + n_stdev*stdev | |
2099 | Return | |
2100 | END | |
2101 | ||
2102 | Subroutine Poisson(min,max,mean,nsteps,integ,xfunc,ndim) | |
2103 | implicit none | |
2104 | ||
2105 | CCC Computes Poisson distribution from n = min to max; | |
2106 | CCC Integrates this distribution and records result at each step in | |
2107 | CCC array integ(); | |
2108 | CCC Records the coordinates in array xfunc(). | |
2109 | ||
2110 | integer min,max,mean,nsteps,ndim,i,n | |
2111 | Include 'Parameter_values.inc' | |
2112 | real*4 mean_real,mean_real_log,expR | |
2113 | real*4 integ(ndim) | |
2114 | real*4 xfunc(ndim) | |
2115 | real*4 Poisson_dist(n_mult_max_steps) | |
2116 | Include 'common_facfac.inc' | |
2117 | ||
2118 | CCC Initialize arrays to zero: | |
2119 | ||
2120 | do i = 1,ndim | |
2121 | integ(i) = 0.0 | |
2122 | xfunc(i) = 0.0 | |
2123 | Poisson_dist(i) = 0.0 | |
2124 | end do | |
2125 | ||
2126 | mean_real = float(mean) | |
2127 | mean_real_log = log(mean_real) | |
2128 | ||
2129 | CCC Compute Poisson distribution from n = min to max: | |
2130 | do i = 1,nsteps | |
2131 | n = (i - 1) + min | |
2132 | Poisson_dist(i) = expR(-mean_real + float(n)*mean_real_log | |
2133 | 1 - FACLOG(n+1)) | |
2134 | end do | |
2135 | ||
2136 | CCC Integrate the Poisson distribution: | |
2137 | integ(1) = 0.0 | |
2138 | do i = 2,nsteps | |
2139 | integ(i) = 0.5*(Poisson_dist(i-1) + Poisson_dist(i)) + integ(i-1) | |
2140 | end do | |
2141 | ||
2142 | CCC Normalize the integral to unity: | |
2143 | do i = 1,nsteps | |
2144 | integ(i) = integ(i)/integ(nsteps) | |
2145 | end do | |
2146 | ||
2147 | CCC Fill xfunc array: | |
2148 | do i = 1,nsteps | |
2149 | xfunc(i) = float(i - 1 + min) | |
2150 | end do | |
2151 | ||
2152 | CCC Extend integ() and xfunc() by one additional mesh point past the | |
2153 | CCC end point in order to avoid a bug in the Lagrange interpolation | |
2154 | CCC subroutine that gives erroneous interpolation results within the | |
2155 | CCC the last mesh bin. | |
2156 | ||
2157 | integ(nsteps + 1) = integ(nsteps) + 0.01 | |
2158 | xfunc(nsteps + 1) = xfunc(nsteps) | |
2159 | ||
2160 | Return | |
2161 | END | |
2162 | ||
2163 | Subroutine Gaussian(min,max,mean,stdev,npts,integ,xfunc,ndim) | |
2164 | implicit none | |
2165 | ||
2166 | CCC Compute Gaussian distribution from x = min to max at npts; | |
2167 | CCC Integrate this distribution and record result at each mesh in | |
2168 | CCC array integ(); | |
2169 | CCC Record the coordinates in array xfunc(). | |
2170 | ||
2171 | Include 'Parameter_values.inc' | |
2172 | integer npts,ndim,i | |
2173 | real*4 min,max,mean,stdev,integ(ndim),xfunc(ndim) | |
2174 | real*4 dm,x,Gauss_dist(nmax_integ),FAC1,FAC2,pi,expR | |
2175 | ||
2176 | CCC Initialize arrays to zero: | |
2177 | do i = 1,ndim | |
2178 | integ(i) = 0.0 | |
2179 | xfunc(i) = 0.0 | |
2180 | Gauss_dist(i) = 0.0 | |
2181 | end do | |
2182 | ||
2183 | pi = 3.141592654 | |
2184 | FAC1 = 1.0/(sqrt(2.0*pi)*stdev) | |
2185 | FAC2 = 2.0*stdev*stdev | |
2186 | dm = (max - min)/float(npts - 1) | |
2187 | ||
2188 | CCC Compute normalized Gaussian distribution: | |
2189 | do i = 1,npts | |
2190 | x = min + dm*float(i-1) | |
2191 | xfunc(i) = x | |
2192 | Gauss_dist(i) = FAC1*expR(-((x - mean)**2)/FAC2) | |
2193 | end do | |
2194 | ||
2195 | CCC Integrate Gaussian distribution over specified range | |
2196 | integ(1) = 0.0 | |
2197 | do i = 2,npts | |
2198 | integ(i) = 0.5*(Gauss_dist(i-1) + Gauss_dist(i))*dm + integ(i-1) | |
2199 | end do | |
2200 | ||
2201 | CCC Normalize integral to unity: | |
2202 | do i = 1,npts | |
2203 | integ(i) = integ(i)/integ(npts) | |
2204 | end do | |
2205 | ||
2206 | CCC Extend integ() and xfunc() by one mesh point to avoid Lagrange | |
2207 | CCC interpolation subroutine bug: | |
2208 | integ(npts + 1) = integ(npts) + 0.01 | |
2209 | xfunc(npts + 1) = xfunc(npts) | |
2210 | ||
2211 | Return | |
2212 | END | |
2213 | ||
2214 | Subroutine Particle_prop | |
2215 | implicit none | |
2216 | ||
2217 | Common/Geant/geant_mass(200),geant_charge(200), | |
2218 | 1 geant_lifetime(200),geant_width(200) | |
2219 | ||
2220 | CCC Local Variable Type Declarations: | |
2221 | integer i | |
2222 | real*4 geant_mass,geant_charge,geant_lifetime,geant_width | |
2223 | real*4 hbar | |
2224 | Parameter(hbar = 6.5821220E-25) ! hbar in GeV*seconds | |
2225 | ||
2226 | CCC Fill arrays geant_mass(),geant_charge(),geant_lifetime(), | |
2227 | CCC geant_width() with particle mass in GeV, charge in units of | |
2228 | CCC |e|, mean lifetime in seconds, and width in GeV, where | |
2229 | CCC width*lifetime = hbar. For lifetimes listed with values of | |
2230 | CCC 1.0E+30 (i.e. stable particles) the width is set to 0.000. | |
2231 | CCC Row # = Geant Particle ID # code (see Geant Manual 3.10, | |
2232 | CCC User's Guide, CONS 300-1 and 300-2). Note, rows 151 and higher | |
2233 | CCC are used for resonances. These assume the masses and widths | |
2234 | CCC specific to the models used to represent the invariant mass | |
2235 | CCC distributions and therefore may differ slightly from the Particle | |
2236 | CCC Data Group's listing. | |
2237 | ||
2238 | CCC Initialize arrays to zero: | |
2239 | do i = 1,200 | |
2240 | geant_mass(i) = 0.0 | |
2241 | geant_charge(i) = 0.0 | |
2242 | geant_lifetime(i) = 0.0 | |
2243 | geant_width(i) = 0.0 | |
2244 | end do | |
2245 | ||
2246 | CCC Set Particle Masses in GeV: | |
2247 | geant_mass(1) = 0.0 ! Gamma | |
2248 | geant_mass(2) = 0.000511 ! Positron | |
2249 | geant_mass(3) = 0.000511 ! Electron | |
2250 | geant_mass(4) = 0.0 ! Neutrino | |
2251 | geant_mass(5) = 0.105659 ! Muon + | |
2252 | geant_mass(6) = 0.105659 ! Muon - | |
2253 | geant_mass(7) = 0.134693 ! Pion 0 | |
2254 | geant_mass(8) = 0.139567 ! Pion + | |
2255 | geant_mass(9) = 0.139567 ! Pion - | |
2256 | geant_mass(10) = 0.49767 ! Kaon 0 Long | |
2257 | geant_mass(11) = 0.493667 ! Kaon + | |
2258 | geant_mass(12) = 0.493667 ! Kaon - | |
2259 | geant_mass(13) = 0.939573 ! Neutron | |
2260 | geant_mass(14) = 0.93828 ! Proton | |
2261 | geant_mass(15) = 0.93828 ! Antiproton | |
2262 | geant_mass(16) = 0.49767 ! Kaon 0 Short | |
2263 | geant_mass(17) = 0.5488 ! Eta | |
2264 | geant_mass(18) = 1.11560 ! Lambda | |
2265 | geant_mass(19) = 1.18936 ! Sigma + | |
2266 | geant_mass(20) = 1.19246 ! Sigma 0 | |
2267 | geant_mass(21) = 1.19734 ! Sigma - | |
2268 | geant_mass(22) = 1.31490 ! Xi 0 | |
2269 | geant_mass(23) = 1.32132 ! Xi - | |
2270 | geant_mass(24) = 1.67245 ! Omega | |
2271 | geant_mass(25) = 0.939573 ! Antineutron | |
2272 | geant_mass(26) = 1.11560 ! Antilambda | |
2273 | geant_mass(27) = 1.18936 ! Antisigma - | |
2274 | geant_mass(28) = 1.19246 ! Antisigma 0 | |
2275 | geant_mass(29) = 1.19734 ! Antisigma + | |
2276 | geant_mass(30) = 1.3149 ! Antixi 0 | |
2277 | geant_mass(31) = 1.32132 ! Antixi + | |
2278 | geant_mass(32) = 1.67245 ! Antiomega + | |
2279 | geant_mass(33) = 1.7842 ! Tau + | |
2280 | geant_mass(34) = 1.7842 ! Tau - | |
2281 | geant_mass(35) = 1.8694 ! D+ | |
2282 | geant_mass(36) = 1.8694 ! D- | |
2283 | geant_mass(37) = 1.8647 ! D0 | |
2284 | geant_mass(38) = 1.8647 ! Anti D0 | |
2285 | geant_mass(39) = 1.9710 ! F+, now called Ds+ | |
2286 | geant_mass(40) = 1.9710 ! F-, now called Ds- | |
2287 | geant_mass(41) = 2.2822 ! Lambda C+ | |
2288 | geant_mass(42) = 80.8000 ! W+ | |
2289 | geant_mass(43) = 80.8000 ! W- | |
2290 | geant_mass(44) = 92.9000 ! Z0 | |
2291 | geant_mass(45) = 1.877 ! Deuteron | |
2292 | geant_mass(46) = 2.817 ! Tritium | |
2293 | geant_mass(47) = 3.755 ! Alpha | |
2294 | geant_mass(48) = 0.0 ! Geantino | |
2295 | geant_mass(49) = 2.80923 ! He3 | |
2296 | geant_mass(50) = 0.0 ! Cherenkov | |
2297 | geant_mass(151) = 0.783 ! rho + | |
2298 | geant_mass(152) = 0.783 ! rho - | |
2299 | geant_mass(153) = 0.783 ! rho 0 | |
2300 | geant_mass(154) = 0.782 ! omega 0 | |
2301 | geant_mass(155) = 0.95750 ! eta' | |
2302 | geant_mass(156) = 1.0194 ! phi | |
2303 | geant_mass(157) = 3.09693 ! J/Psi | |
2304 | geant_mass(158) = 1.232 ! Delta - | |
2305 | geant_mass(159) = 1.232 ! Delta 0 | |
2306 | geant_mass(160) = 1.232 ! Delta + | |
2307 | geant_mass(161) = 1.232 ! Delta ++ | |
2308 | geant_mass(162) = 0.89183 ! K* + | |
2309 | geant_mass(163) = 0.89183 ! K* - | |
2310 | geant_mass(164) = 0.89610 ! K* 0 | |
2311 | ||
2312 | CCC Set Particle Charge in |e|: | |
2313 | geant_charge( 1) = 0 ! Gamma | |
2314 | geant_charge( 2) = 1 ! Positron | |
2315 | geant_charge( 3) = -1 ! Electron | |
2316 | geant_charge( 4) = 0 ! Neutrino | |
2317 | geant_charge( 5) = 1 ! Muon+ | |
2318 | geant_charge( 6) = -1 ! Muon- | |
2319 | geant_charge( 7) = 0 ! Pion0 | |
2320 | geant_charge( 8) = 1 ! Pion+ | |
2321 | geant_charge( 9) = -1 ! Pion- | |
2322 | geant_charge(10) = 0 ! Kaon 0 long | |
2323 | geant_charge(11) = 1 ! Kaon+ | |
2324 | geant_charge(12) = -1 ! Kaon- | |
2325 | geant_charge(13) = 0 ! Neutron | |
2326 | geant_charge(14) = 1 ! Proton | |
2327 | geant_charge(15) = -1 ! Antiproton | |
2328 | geant_charge(16) = 0 ! Kaon 0 short | |
2329 | geant_charge(17) = 0 ! Eta | |
2330 | geant_charge(18) = 0 ! Lambda | |
2331 | geant_charge(19) = 1 ! Sigma+ | |
2332 | geant_charge(20) = 0 ! Sigma0 | |
2333 | geant_charge(21) = -1 ! Sigma- | |
2334 | geant_charge(22) = 0 ! Xi 0 | |
2335 | geant_charge(23) = -1 ! Xi - | |
2336 | geant_charge(24) = -1 ! Omega | |
2337 | geant_charge(25) = 0 ! Antineutron | |
2338 | geant_charge(26) = 0 ! Antilambda | |
2339 | geant_charge(27) = -1 ! Anti-Sigma - | |
2340 | geant_charge(28) = 0 ! Anti-Sigma 0 | |
2341 | geant_charge(29) = 1 ! Anti-Sigma + | |
2342 | geant_charge(30) = 0 ! AntiXi 0 | |
2343 | geant_charge(31) = 1 ! AntiXi + | |
2344 | geant_charge(32) = 1 ! Anti-Omega + | |
2345 | geant_charge(33) = 1 ! Tau + | |
2346 | geant_charge(34) = -1 ! Tau - | |
2347 | geant_charge(35) = 1 ! D+ | |
2348 | geant_charge(36) = -1 ! D- | |
2349 | geant_charge(37) = 0 ! D0 | |
2350 | geant_charge(38) = 0 ! Anti D0 | |
2351 | geant_charge(39) = 1 ! F+, now called Ds+ | |
2352 | geant_charge(40) = -1 ! F-, now called Ds- | |
2353 | geant_charge(41) = 1 ! Lambda C+ | |
2354 | geant_charge(42) = 1 ! W+ | |
2355 | geant_charge(43) = -1 ! W- | |
2356 | geant_charge(44) = 0 ! Z0 | |
2357 | geant_charge(45) = 1 ! Deuteron | |
2358 | geant_charge(46) = 1 ! Triton | |
2359 | geant_charge(47) = 2 ! Alpha | |
2360 | geant_charge(48) = 0 ! Geantino (Fake particle) | |
2361 | geant_charge(49) = 2 ! He3 | |
2362 | geant_charge(50) = 0 ! Cerenkov (Fake particle) | |
2363 | geant_charge(151) = 1 ! rho+ | |
2364 | geant_charge(152) = -1 ! rho- | |
2365 | geant_charge(153) = 0 ! rho 0 | |
2366 | geant_charge(154) = 0 ! omega 0 | |
2367 | geant_charge(155) = 0 ! eta' | |
2368 | geant_charge(156) = 0 ! phi | |
2369 | geant_charge(157) = 0 ! J/Psi | |
2370 | geant_charge(158) = -1 ! Delta - | |
2371 | geant_charge(159) = 0 ! Delta 0 | |
2372 | geant_charge(160) = 1 ! Delta + | |
2373 | geant_charge(161) = 2 ! Delta ++ | |
2374 | geant_charge(162) = 1 ! K* + | |
2375 | geant_charge(163) = -1 ! K* - | |
2376 | geant_charge(164) = 0 ! K* 0 | |
2377 | ||
2378 | CCC Set Particle Lifetimes in seconds: | |
2379 | geant_lifetime( 1) = 1.0E+30 ! Gamma | |
2380 | geant_lifetime( 2) = 1.0E+30 ! Positron | |
2381 | geant_lifetime( 3) = 1.0E+30 ! Electron | |
2382 | geant_lifetime( 4) = 1.0E+30 ! Neutrino | |
2383 | geant_lifetime( 5) = 2.19703E-06 ! Muon+ | |
2384 | geant_lifetime( 6) = 2.19703E-06 ! Muon- | |
2385 | geant_lifetime( 7) = 8.4E-17 ! Pion0 | |
2386 | geant_lifetime( 8) = 2.603E-08 ! Pion+ | |
2387 | geant_lifetime( 9) = 2.603E-08 ! Pion- | |
2388 | geant_lifetime(10) = 5.16E-08 ! Kaon 0 long | |
2389 | geant_lifetime(11) = 1.237E-08 ! Kaon+ | |
2390 | geant_lifetime(12) = 1.237E-08 ! Kaon- | |
2391 | geant_lifetime(13) = 889.1 ! Neutron | |
2392 | geant_lifetime(14) = 1.0E+30 ! Proton | |
2393 | geant_lifetime(15) = 1.0E+30 ! Antiproton | |
2394 | geant_lifetime(16) = 8.922E-11 ! Kaon 0 short | |
2395 | geant_lifetime(17) = 5.53085E-19 ! Eta | |
2396 | geant_lifetime(18) = 2.632E-10 ! Lambda | |
2397 | geant_lifetime(19) = 7.99E-11 ! Sigma+ | |
2398 | geant_lifetime(20) = 7.40E-20 ! Sigma0 | |
2399 | geant_lifetime(21) = 1.479E-10 ! Sigma- | |
2400 | geant_lifetime(22) = 2.90E-10 ! Xi 0 | |
2401 | geant_lifetime(23) = 1.639E-10 ! Xi - | |
2402 | geant_lifetime(24) = 8.22E-11 ! Omega | |
2403 | geant_lifetime(25) = 889.1 ! Antineutron | |
2404 | geant_lifetime(26) = 2.632E-10 ! Antilambda | |
2405 | geant_lifetime(27) = 7.99E-11 ! Anti-Sigma - | |
2406 | geant_lifetime(28) = 7.40E-20 ! Anti-Sigma 0 | |
2407 | geant_lifetime(29) = 1.479E-10 ! Anti-Sigma + | |
2408 | geant_lifetime(30) = 2.90E-10 ! AntiXi 0 | |
2409 | geant_lifetime(31) = 1.639E-10 ! AntiXi + | |
2410 | geant_lifetime(32) = 8.22E-11 ! Anti-Omega + | |
2411 | geant_lifetime(33) = 0.303E-12 ! Tau + | |
2412 | geant_lifetime(34) = 0.303E-12 ! Tau - | |
2413 | geant_lifetime(35) = 10.62E-13 ! D+ | |
2414 | geant_lifetime(36) = 10.62E-13 ! D- | |
2415 | geant_lifetime(37) = 4.21E-13 ! D0 | |
2416 | geant_lifetime(38) = 4.21E-13 ! Anti D0 | |
2417 | geant_lifetime(39) = 4.45E-13 ! F+, now called Ds+ | |
2418 | geant_lifetime(40) = 4.45E-13 ! F-, now called Ds- | |
2419 | geant_lifetime(41) = 1.91E-13 ! Lambda C+ | |
2420 | geant_lifetime(42) = 2.92E-25 ! W+ | |
2421 | geant_lifetime(43) = 2.92E-25 ! W- | |
2422 | geant_lifetime(44) = 2.60E-25 ! Z0 | |
2423 | geant_lifetime(45) = 1.0E+30 ! Deuteron | |
2424 | geant_lifetime(46) = 1.0E+30 ! Triton | |
2425 | geant_lifetime(47) = 1.0E+30 ! Alpha | |
2426 | geant_lifetime(48) = 1.0E+30 ! Geantino (Fake particle) | |
2427 | geant_lifetime(49) = 1.0E+30 ! He3 | |
2428 | geant_lifetime(50) = 1.0E+30 ! Cerenkov (Fake particle) | |
2429 | geant_lifetime(151) = 3.72E-24 ! rho + | |
2430 | geant_lifetime(152) = 3.72E-24 ! rho - | |
2431 | geant_lifetime(153) = 3.72E-24 ! rho 0 | |
2432 | geant_lifetime(154) = 7.84E-23 ! omega 0 | |
2433 | geant_lifetime(155) = 3.16E-21 ! eta' | |
2434 | geant_lifetime(156) = 1.49E-22 ! phi | |
2435 | geant_lifetime(157) = 9.68E-21 ! J/Psi | |
2436 | geant_lifetime(158) = 9.27E-24 ! Delta -, Based on gamma = 71 MeV | |
2437 | geant_lifetime(159) = 9.27E-24 ! Delta 0, -same- | |
2438 | geant_lifetime(160) = 9.27E-24 ! Delta +, -same- | |
2439 | geant_lifetime(161) = 9.27E-24 ! Delta ++,-same- | |
2440 | geant_lifetime(162) = 1.322E-23 ! K* + | |
2441 | geant_lifetime(163) = 1.322E-23 ! K* - | |
2442 | geant_lifetime(164) = 1.303E-23 ! K* 0 | |
2443 | ||
2444 | CCC Set Particle Widths in GeV: | |
2445 | do i = 1,200 | |
2446 | if(geant_lifetime(i) .le. 0.0) then | |
2447 | geant_width(i) = 0.0 | |
2448 | else if(geant_lifetime(i) .ge. 1.0E+30) then | |
2449 | geant_width(i) = 0.0 | |
2450 | else | |
2451 | geant_width(i) = hbar/geant_lifetime(i) | |
2452 | end if | |
2453 | end do | |
2454 | ||
2455 | Return | |
2456 | END | |
2457 | ||
2458 | Real*4 Function Vn_pt_y(n,V1,V2,V3,V4,pt,y) | |
2459 | implicit none | |
2460 | ||
2461 | CCC Description: This function computes the pt,y dependent flow | |
2462 | CCC parameters Vn(pt,y) for the requested Fourier | |
2463 | CCC component, n = 1-6, pt (GeV/c) and y (rapidity). | |
2464 | CCC | |
2465 | CCC Input: n = Fourier component, 1,2...6 | |
2466 | CCC V1 = Constant coefficient in pt dependent term | |
2467 | CCC V2 = Coefficient of pt(pt^2) dependence for n odd (even). | |
2468 | CCC V3 = Coefficient of y dependence; constant for n=odd, | |
2469 | CCC and inverse range squared for Gaussian for n=even. | |
2470 | CCC V4 = Coefficient of y^3 dependence for n=odd; | |
2471 | CCC pt dependence for n = even. | |
2472 | CCC pt = Transverse momentum (GeV/c) | |
2473 | CCC y = Rapidity relative to y(C.M.) | |
2474 | CCC | |
2475 | CCC Output: Vn_pt_y = Vn(pt,y) based on the model suggested by | |
2476 | CCC Art Poskanzer (LBNL, Feb. 2000) | |
2477 | CCC Vn_pt_y = (V1 + V4*pt + V2*pt*pt)*exp(-V3*y*y) ; n=even | |
2478 | CCC Vn_pt_y = (V1 + V2*pt)*sign(y)*(V3 + V4*abs(y**3)); n=odd | |
2479 | ||
2480 | CCC Local Variable Type Declarations: | |
2481 | ||
2482 | integer n | |
2483 | real*4 V1,V2,V3,V4,pt,y,signy | |
2484 | ||
2485 | if(n .eq. (2*(n/2))) then | |
2486 | Vn_pt_y = (V1 + V4*pt + V2*pt*pt)*exp(-V3*y*y) | |
2487 | else | |
2488 | if(y.ge.0.0) then | |
2489 | signy = 1.0 | |
2490 | else if(y.lt.0.0) then | |
2491 | signy = -1.0 | |
2492 | end if | |
2493 | Vn_pt_y = (V1 + V2*pt)*signy*(V3 + V4*abs(y**3)) | |
2494 | end if | |
2495 | Return | |
2496 | END | |
2497 | ||
2498 | Subroutine Particle_mass(gpid,pid_index,npts) | |
2499 | implicit none | |
2500 | ||
2501 | CCC Description: This subroutine computes the mass distributions for | |
2502 | C included resonances at 'npts' number of mesh points in mass from the | |
2503 | C lower mass limit to an upper mass limit (listed below), integrates | |
2504 | C this mass distribution, normalizes the integral to 1.0, and saves | |
2505 | C the mass steps and integral function in the arrays in Common/Mass/. | |
2506 | C The mass distribution integral is then randomly sampled in a later | |
2507 | C step in order to get the specific resonance mass instances. | |
2508 | C For non-resonant particles (i.e. either stable or those with negligible | |
2509 | C widths) this subroutine returns without doing anything, leaving the | |
2510 | C arrays in Common/Mass/ set to zero. This subroutine is called for | |
2511 | C a specific PID index, corresponding to the input list of particle | |
2512 | C types. | |
2513 | C | |
2514 | C Input: gpid = Geant particle ID code number, see SUBR: | |
2515 | C Particle_prop for listing. | |
2516 | C pid_index = Particle type array index, determined by input | |
2517 | C particle list. | |
2518 | C npts = n_integ_pts in calling program; is the number | |
2519 | C of mass mesh points used to load the mass | |
2520 | C distribution integral. Note that one extra | |
2521 | C mesh point is added to handle the bug in the | |
2522 | C Lagrange interpolator, LAGRNG. | |
2523 | C | |
2524 | C Output: Mass_integ_save( , ) - mass distribution integral | |
2525 | C Mass_xfunc_save( , ) - mass distribution mesh | |
2526 | C These are in Common/Mass/. | |
2527 | ||
2528 | CCC Include files and common blocks: | |
2529 | Include 'Parameter_values.inc' | |
2530 | Common/Geant/geant_mass(200),geant_charge(200), | |
2531 | 1 geant_lifetime(200),geant_width(200) | |
2532 | real*4 geant_mass,geant_charge,geant_lifetime,geant_width | |
2533 | Common/Mass/ Mass_integ_save(npid,nmax_integ), | |
2534 | 1 Mass_xfunc_save(npid,nmax_integ) | |
2535 | real*4 Mass_integ_save,Mass_xfunc_save | |
2536 | ||
2537 | CCC Local Variable Type Declarations: | |
2538 | integer gpid,pid_index,npts,i | |
2539 | real*4 dist(nmax_integ),dM,M0,Gamma,GammaS | |
2540 | real*4 M,Mpi,MK,MN,R_Delta,Jinc,qR | |
2541 | real*4 Mrho_low,Mrho_high,Momega_low,Momega_high | |
2542 | real*4 Mphi_low,Mphi_high,MDelta_low,MDelta_high | |
2543 | real*4 MKstar_low,MKstar_high | |
2544 | real*4 kcm,k0cm,Ecm,E0cm,beta,beta0,Epicm,ENcm,redtotE | |
2545 | ||
2546 | CCC Set Fixed parameter values: | |
2547 | Parameter(Mpi = 0.1395675) ! Charged pion mass (GeV) | |
2548 | Parameter(MK = 0.493646) ! Charged kaon mass (GeV) | |
2549 | Parameter(MN = 0.938919) ! Nucleon average mass (GeV) | |
2550 | Parameter(R_Delta = 0.81) ! Delta resonance range parameter | |
2551 | Parameter(Mrho_low = 0.28 ) ! Lower rho mass limit | |
2552 | Parameter(Mrho_high = 1.200) ! Upper rho mass limit (GeV) | |
2553 | Parameter(Momega_low = 0.75) ! Lower omega mass limit (GeV) | |
2554 | Parameter(Momega_high = 0.81) ! Upper omega mass limit (GeV) | |
2555 | Parameter(Mphi_low = 1.009) ! Lower phi mass limit (GeV) | |
2556 | Parameter(Mphi_high = 1.029) ! Upper phi mass limit (GeV) | |
2557 | Parameter(MDelta_low = 1.1 ) ! Lower Delta mass limit | |
2558 | Parameter(MDelta_high = 1.400) ! Upper Delta mass limit (GeV) | |
2559 | Parameter(MKstar_low = 0.74) ! Lower Kstar mass limit (GeV) | |
2560 | Parameter(MKstar_high = 1.04) ! Upper Kstar mass limit (GeV) | |
2561 | ||
2562 | CCC Check npts: | |
2563 | if(npts.le.1) Return | |
2564 | ||
2565 | CCC Load mass distribution for rho-meson: | |
2566 | if(gpid.ge.151 .and. gpid.le.153) then | |
2567 | do i = 1,nmax_integ | |
2568 | dist(i) = 0.0 | |
2569 | end do | |
2570 | M0 = geant_mass(gpid) | |
2571 | Gamma = geant_width(gpid) | |
2572 | dM = (Mrho_high - Mrho_low)/float(npts-1) | |
2573 | do i = 1,npts | |
2574 | M = Mrho_low + dM*float(i-1) | |
2575 | Mass_xfunc_save(pid_index,i) = M | |
2576 | kcm = sqrt(0.25*M*M - Mpi*Mpi) | |
2577 | dist(i) = kcm/((M-M0)**2 + 0.25*Gamma*Gamma) | |
2578 | end do | |
2579 | ||
2580 | CCC Load mass distribution for omega-meson: | |
2581 | else if(gpid.eq.154) then | |
2582 | do i = 1,nmax_integ | |
2583 | dist(i) = 0.0 | |
2584 | end do | |
2585 | M0 = geant_mass(gpid) | |
2586 | Gamma = geant_width(gpid) | |
2587 | dM = (Momega_high - Momega_low)/float(npts-1) | |
2588 | do i = 1,npts | |
2589 | M = Momega_low + dM*float(i-1) | |
2590 | Mass_xfunc_save(pid_index,i) = M | |
2591 | GammaS = Gamma*((M/M0)**3) | |
2592 | dist(i) = M0*M0*Gamma/((M0*M0 - M*M)**2 | |
2593 | 1 + M*M*GammaS*GammaS) | |
2594 | end do | |
2595 | ||
2596 | CCC Load mass distribution for phi-meson: | |
2597 | else if(gpid.eq.156) then | |
2598 | do i = 1,nmax_integ | |
2599 | dist(i) = 0.0 | |
2600 | end do | |
2601 | M0 = geant_mass(gpid) | |
2602 | Gamma = geant_width(gpid) | |
2603 | dM = (Mphi_high - Mphi_low)/float(npts-1) | |
2604 | k0cm = sqrt(0.25*M0*M0 - MK*MK) | |
2605 | E0cm = sqrt(k0cm*k0cm + MK*MK) | |
2606 | beta0 = k0cm/E0cm | |
2607 | do i = 1,npts | |
2608 | M = Mphi_low + dM*float(i-1) | |
2609 | Mass_xfunc_save(pid_index,i) = M | |
2610 | kcm = sqrt(0.25*M*M - MK*MK) | |
2611 | Ecm = sqrt(kcm*kcm + MK*MK) | |
2612 | beta = kcm/Ecm | |
2613 | dist(i) = 0.25*Gamma*Gamma*((beta/beta0)**3)/ | |
2614 | 1 ((M - M0)**2 + 0.25*Gamma*Gamma) | |
2615 | end do | |
2616 | ||
2617 | CCC Load mass distribution for Delta resonances: | |
2618 | else if(gpid.ge.158 .and. gpid.le.161) then | |
2619 | do i = 1,nmax_integ | |
2620 | dist(i) = 0.0 | |
2621 | end do | |
2622 | M0 = geant_mass(gpid) | |
2623 | Gamma = geant_width(gpid) | |
2624 | dM = (MDelta_high - MDelta_low)/float(npts-1) | |
2625 | do i = 1,npts | |
2626 | M = MDelta_low + dM*float(i-1) | |
2627 | Mass_xfunc_save(pid_index,i) = M | |
2628 | kcm = ((M*M + Mpi*Mpi - MN*MN)**2)/(4.0*M*M) - Mpi*Mpi | |
2629 | kcm = sqrt(abs(kcm)) | |
2630 | Epicm = sqrt(kcm*kcm + Mpi*Mpi) | |
2631 | ENcm = sqrt(kcm*kcm + MN*MN) | |
2632 | redtotE = Epicm*ENcm/(Epicm + ENcm) | |
2633 | Jinc = kcm/redtotE | |
2634 | qR = kcm*R_Delta/Mpi | |
2635 | GammaS = 2.0*qR*qR*qR*Gamma/(1.0 + qR*qR) | |
2636 | dist(i) = (Jinc/(kcm*kcm))*GammaS*GammaS/ | |
2637 | 1 ((M - M0)**2 + 0.25*GammaS*GammaS) | |
2638 | end do | |
2639 | ||
2640 | CCC Load mass distribution for K*(892) resonances: | |
2641 | else if(gpid.ge.162 .and. gpid.le.164) then | |
2642 | do i = 1,nmax_integ | |
2643 | dist(i) = 0.0 | |
2644 | end do | |
2645 | M0 = geant_mass(gpid) | |
2646 | Gamma = geant_width(gpid) | |
2647 | dM = (MKstar_high - MKstar_low)/float(npts-1) | |
2648 | k0cm = ((M0*M0 + Mpi*Mpi - MK*MK)**2)/(4.0*M0*M0) - Mpi*Mpi | |
2649 | k0cm = sqrt(k0cm) | |
2650 | do i = 1,npts | |
2651 | M = MKstar_low + dM*float(i-1) | |
2652 | Mass_xfunc_save(pid_index,i) = M | |
2653 | kcm = ((M*M + Mpi*Mpi - MK*MK)**2)/(4.0*M*M) - Mpi*Mpi | |
2654 | kcm = sqrt(kcm) | |
2655 | qR = kcm/k0cm | |
2656 | GammaS = 2.0*qR*qR*qR*Gamma/(1.0 + qR*qR) | |
2657 | dist(i) = GammaS*GammaS*M0*M0/ | |
2658 | 1 ((M*M - M0*M0)**2 + GammaS*GammaS*M0*M0) | |
2659 | end do | |
2660 | ||
2661 | CCC Load additional resonance mass distributions here: | |
2662 | ||
2663 | else | |
2664 | Return ! Return for Geant PID types without mass distribution | |
2665 | end if | |
2666 | ||
2667 | CCC Integrate mass distribution from mass_low to mass_high: | |
2668 | ||
2669 | Mass_integ_save(pid_index,1) = 0.0 | |
2670 | do i = 2,npts | |
2671 | Mass_integ_save(pid_index,i) = 0.5*(dist(i-1) + dist(i))*dM | |
2672 | 1 + Mass_integ_save(pid_index,i-1) | |
2673 | end do | |
2674 | ||
2675 | CCC Normalize this integral such that the last point is 1.00: | |
2676 | if(Mass_integ_save(pid_index,npts) .ne. 0.0) then | |
2677 | do i = 1,npts | |
2678 | Mass_integ_save(pid_index,i) = | |
2679 | 1 Mass_integ_save(pid_index,i)/Mass_integ_save(pid_index,npts) | |
2680 | end do | |
2681 | end if | |
2682 | ||
2683 | CCC Extend integ() and xfunc() by one mesh point to avoid Lagrange | |
2684 | CCC interpolation subroutine bug: | |
2685 | Mass_integ_save(pid_index,npts+1) = | |
2686 | 1 Mass_integ_save(pid_index,npts) + 0.01 | |
2687 | Mass_xfunc_save(pid_index,npts+1) = | |
2688 | 1 Mass_xfunc_save(pid_index,npts) | |
2689 | ||
2690 | Return | |
2691 | END | |
2692 | ||
2693 | Real*4 Function Mass_function(gpid,pid_index,npts,irand) | |
2694 | implicit none | |
2695 | ||
2696 | CCC Description: For resonance particles which have mass distributions | |
2697 | C this function randomly samples the distributions in Common/Mass/ | |
2698 | C and returns a particle mass in GeV in 'Mass_function'. | |
2699 | C For non-resonant particles this function returns the Geant mass | |
2700 | C listed in SUBR: Particle_prop. | |
2701 | C | |
2702 | C Input: gpid = Geant particle ID code number, see SUBR: | |
2703 | C Particle_prop for listing. | |
2704 | C pid_index = Particle type array index, determined by input | |
2705 | C particle list. | |
2706 | C npts = n_integ_pts in calling program. Is the number | |
2707 | C of mass mesh points for the arrays | |
2708 | C in Common/Mass/ minus 1. | |
2709 | C irand = random number generator argument/seed | |
2710 | C | |
2711 | C Output: Mass_function = particle or resonance mass (GeV) | |
2712 | ||
2713 | CCC Include files and common blocks: | |
2714 | Include 'Parameter_values.inc' | |
2715 | Common/Geant/geant_mass(200),geant_charge(200), | |
2716 | 1 geant_lifetime(200),geant_width(200) | |
2717 | real*4 geant_mass,geant_charge,geant_lifetime,geant_width | |
2718 | Common/Mass/ Mass_integ_save(npid,nmax_integ), | |
2719 | 1 Mass_xfunc_save(npid,nmax_integ) | |
2720 | real*4 Mass_integ_save,Mass_xfunc_save | |
2721 | ||
2722 | CCC Local Variable Type Declarations: | |
2723 | integer gpid,pid_index,npts,irand,i | |
2724 | real*4 integ(nmax_integ),xfunc(nmax_integ) | |
2725 | real*4 ran,masstmp | |
2726 | ||
2727 | if(Mass_integ_save(pid_index,npts) .ne. 0.0) then | |
2728 | do i = 1,npts+1 | |
2729 | integ(i) = Mass_integ_save(pid_index,i) | |
2730 | xfunc(i) = Mass_xfunc_save(pid_index,i) | |
2731 | end do | |
2732 | Call LAGRNG(ran(irand),integ,masstmp,xfunc, | |
2733 | 1 npts+1, 1, 5, npts+1, 1) | |
2734 | Mass_function = masstmp | |
2735 | else | |
2736 | Mass_function = geant_mass(gpid) | |
2737 | end if | |
2738 | ||
2739 | Return | |
2740 | END | |
2741 | * | |
2742 | * real*4 function ran(i) | |
2743 | * implicit none | |
2744 | * integer i | |
2745 | * real*4 r | |
2746 | * Call ranlux2(r,1,i) | |
2747 | * ran = r | |
2748 | * Return | |
2749 | * END | |
2750 | * | |
2751 | * Include 'ranlux2.F' | |
2752 | ||
2753 | ||
2754 | ||
2755 | ||
2756 | ||
2757 |