4 *=== Crnkvp ===========================================================*
6 SUBROUTINE CRNKVP ( MREG, NEWREG, DDNEAR, LEMAGN, DEDXCK )
12 *----------------------------------------------------------------------*
14 * Copyright (C) 1997-2003 by Alfredo Ferrari & Paola Sala *
15 * All Rights Reserved. *
18 * CeReNKoV Production: *
20 * Created on 21 september 1997 by Alfredo Ferrari & Paola Sala *
23 * Last change on 30-oct-98 by Alfredo Ferrari *
25 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! *
26 * !!!!!! Important: Etrack, Ptrack, Atrack, are supposed !!!!!! *
27 * !!!!!! to be the INITIAL values (not yet updated at the !!!!!! *
28 * !!!!!! end of the step). !!!!!! *
29 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! *
31 * dN/dEdx = alpha^2 z^2 / [ r_e m_e c^2 ] [ 1 - 1 / (beta n)^2 ] *
33 * Note the wavelength is always assumed to be the vacuum one *
35 *----------------------------------------------------------------------*
46 PARAMETER ( CSNPRN = 100.D+00 * CSNNRM )
47 PARAMETER ( CRNKC0 = ALPFSC * ALPFSC / RCLSEL / AMELCT )
48 LOGICAL LEMAGN, LMEQNT, LNWSUB, LSMPAN, LDUMMY, LBXRFL
49 * Statement functions:
53 * No magnetic field end step Newreg check implemented for the moment:
57 * & CALL FLABRT ( 'CRNKVP', ' STOP:LEMAGN-NOT-YET-IMPLEMENTED' )
58 * No change of lattice check implemented for the moment:
59 * IF ( LT1TRK .NE. LT2TRK ) CALL FLABRT ( 'CRNKVP',
60 * & ' STOP:LT1TRK.NE.LT2TRK-NOT-YET-IMPLEMENTED' )
63 IF ( JTRACK .GE. -6 ) THEN
66 AMPRTC = AMNHEA (-JTRACK)
68 * +-------------------------------------------------------------------*
69 * | Find the maximum refractive index over the interval allowed
70 * | for Cerenkov production:
71 IF ( RMXCER (MMAT) .LT. ZERZER ) THEN
72 RMXCER (MMAT) = RFNDMX (MMAT)
75 * +-------------------------------------------------------------------*
76 BETNCR = PTRACK / ETRACK * RMXCER (MMAT)
77 * Maximum beta x n already below 1: no chance to emit any photon
78 IF ( BETNCR .LE. ONEONE ) RETURN
79 LMEQNT = MTRACK .EQ. NTRACK
81 * +-------------------------------------------------------------------*
82 * | Loop on energy deposition sub-steps:
84 DTRCKT = DTRCKT + DTRACK (ID)
87 * +-------------------------------------------------------------------*
89 * +-------------------------------------------------------------------*
90 * | Loop on track sub-steps (be careful with magnetic field they are
91 * | not the straight distance between the end points):
93 TTRCKT = TTRCKT + TTRACK (IT)
96 * +-------------------------------------------------------------------*
97 CRVCRR = CTRACK / TTRCKT
98 IF ( JTRACK .GE. -6 ) THEN
99 CRNKCS = CRNKC0 * ( DBLE ( ICHRGE (JTRACK) ) )**2 * OPSNMX
101 CRNKCS = CRNKC0 * ( DBLE ( ICHEAV(-JTRACK) ) )**2 * OPSNMX
103 BTNFCR = ( BETNCR - ONEONE ) * ( BETNCR + ONEONE ) / BETNCR**2
104 * Macroscopic sigma for production (cm^-1)
105 SIGMCK = CRNKCS * ( EMXCER (MMAT) - EMNCER (MMAT) ) * BTNFCR
106 * Average number of emitted photons:
107 NEMPHO = NINT ( CTRACK * SIGMCK )
108 * Take a three sigma clearance:
109 NEMPHO = NEMPHO + 10 + 3 * NINT ( SQRT ( CTRACK * SIGMCK ) )
110 NEMPHO = MIN ( NEMPHO, MOSTCK )
111 D IF ( LSTOPP .GT. MOSTCK - NEMPHO ) WRITE (77,*)
112 D & ' ###CRNKVP:LSTOPP:',LSTOPP,NEMPHO
113 * +-------------------------------------------------------------------*
114 * | Empty the stack if too full: compute and save the normal in case
116 IF ( LSTOPP .GT. MOSTCK - NEMPHO ) THEN
117 LDUMMY = LBXRFL ( NEWREG, MREG, ZERZER, ZERZER, ONEONE )
118 CALL KASOPH ( .TRUE. )
121 * +-------------------------------------------------------------------*
122 * Total wiggled and curved track used up to now:
128 * Current lattice number and index inside Mulbou:
130 LATCCR = MULTTC (IRLTCR)
131 * Variables in the current Ntrckr bin:
136 TRNRSD = TTRACK (NTRKCR) * CRVCRR
137 * +-------------------------------------------------------------------*
140 DEDXCR = DTRACK (NTRKCR) / TRNRSD
142 * +-------------------------------------------------------------------*
145 DEDXCR = DTRCKT / CTRACK
148 * +-------------------------------------------------------------------*
149 * +-------------------------------------------------------------------*
150 * | Stacking loop for Cerenkov photons:
152 D IF ( SIGMCK .LT. ZERZER ) WRITE (77,*)
153 D & ' ^^^CRNKVP:SIGMCK,BTNFCR',SIGMCK,BTNFCR
154 *D IF ( DEDXCR .LT. AZRZRZ ) WRITE (77,*)' ###CRNKVP:',
155 *D & 'MMAT,JTRACK,DEDXCR,NTRKCR,DTRACK(NTRKCR),CTRACK,TRNRSD,DTRCKT',
156 *D & MMAT,JTRACK,DEDXCR,NTRKCR,DTRACK(NTRKCR),CTRACK,TRNRSD,DTRCKT
157 * | Empty the stack if too full:
158 D IF ( LSTOPP .EQ. MOSTCK ) WRITE (77,*)
159 D & ' ###CRNKVP:LSTOPP:',LSTOPP
160 * | +----------------------------------------------------------------*
161 * | | Empty the stack if too full: compute and save the normal in
162 * | | case it is required
163 IF ( LSTOPP .EQ. MOSTCK ) THEN
164 LDUMMY = LBXRFL ( NEWREG, MREG, ZERZER, ZERZER, ONEONE )
165 CALL KASOPH ( .TRUE. )
168 * | +----------------------------------------------------------------*
169 DSTPRD = - LOG ( ONEONE - FLRNDM (DSTPRD) ) / SIGMCK
170 TRUSED = TRUSED + DSTPRD
171 *dbgD WRITE (77,*) ' CRNKVP:DSTPRD,TRUSED,CTRACK,TRNRSD',
172 *dbgD & DSTPRD,TRUSED,CTRACK,TRNRSD
173 IF ( TRUSED .GE. CTRACK ) GO TO 7000
174 * | +----------------------------------------------------------------*
177 D IF ( NTRKCR .GT. NTRACK ) WRITE (77,*)
178 D & ' ^^^CRNKVP:NTRKCR,NTRACK',NTRKCR,NTRACK
179 * | | +-------------------------------------------------------------*
180 * | | | The production point is inside the current sub-step:
181 IF ( DSTPRD .LE. TRNRSD ) THEN
182 * | | | Update the distance from the previous interaction:
183 TRINTR = TRINTR + DSTPRD
184 * | | | Update the residual distance available in the current
186 TRNRSD = TRNRSD - DSTPRD
187 ETRKCR = ETRKCR - DSTPRD * DEDXCR
190 * | | +-------------------------------------------------------------*
191 * | | | The production point is outside the current sub-step:
193 * | | | Update the distance from the previous interaction:
194 TRINTR = TRINTR + TRNRSD
195 ETRKCR = ETRKCR - TRNRSD * DEDXCR
196 DSTPRD = DSTPRD - TRNRSD
197 * | | | Change sub-step:
199 * | | | Update the residual distance available in the current
201 TRNRSD = TTRACK (NTRKCR) * CRVCRR
202 * | | | Update the current dE/dx:
203 IF ( LMEQNT ) DEDXCR = DTRACK (NTRKCR) / TRNRSD
207 * | | +-------------------------------------------------------------*
208 IF ( LNWSUB ) GO TO 1500
209 * | | end sub-step loop:
210 * | +----------------------------------------------------------------*
211 PTRKCR = SQRT ( ( ETRKCR - AMPRTC ) * ( ETRKCR + AMPRTC ) )
212 * | +----------------------------------------------------------------*
213 * | | Update the particle "age" (beta=p/E, dp/dE=E/p):
216 * | | Dt = - | dE dx/dE E/(pc) = 1/c dx/dE [ Ptintr - Ptrkcr ]
219 IF ( ETINTR - ETRKCR .GT. CSNNRM * ETRKCR ) THEN
220 * | | Average dE/dx from the previous (fictitious) interaction:
221 DEDXAV = ( ETINTR - ETRKCR ) / TRINTR
222 ATRKCR = ATRKCR + ( PTINTR - PTRKCR ) / DEDXAV / CLIGHT
224 * | +----------------------------------------------------------------*
227 ATRKCR = ATRKCR + TRINTR * ETRKCR / PTRKCR / CLIGHT
230 * | +----------------------------------------------------------------*
235 BETNCR = PTRKCR / ETRKCR * RMXCER (MMAT)
236 *dbgD WRITE (77,*) ' CRNKVP:BETNCR,RMXCER,LSTOPP',
237 *dbgD & BETNCR,RMXCER(MMAT),LSTOPP
238 * | No longer any chance to emit Cerenkov photons:
239 IF ( BETNCR .LE. ONEONE ) GO TO 7000
241 BTNFCR = ( BETNCR - ONEONE ) * ( BETNCR + ONEONE ) / BETNCR**2
242 FREJE = BTNFCR / BTNFLD
243 D IF ( FREJE .GT. ONEPLS ) WRITE (77,*) ' ^^^CRNKVP:',
244 D & 'FREJE,BETNCR,BETNLD,DEDXCR,PTRKCR,ETRKCR,PTRACK,ETRACK',
245 D & FREJE,BETNCR,BETNLD,DEDXCR,PTRKCR,ETRKCR,PTRACK,ETRACK
246 * | Update the macroscopic sigma: beta can only decrease
247 SIGMCK = SIGMCK * FREJE
248 RNDREJ = FLRNDM (RNDREJ)
249 IF ( RNDREJ .GE. FREJE ) GO TO 1000
250 * |--<--<--<--<--< Interaction rejected because of the decrease in beta
251 RNDREJ = RNDREJ / FREJE
252 * | Sample the emitted photon energy:
253 EPHSMP = RNDREJ * ( EMXCER (MMAT) - EMNCER (MMAT) )
256 OMGSMP = GEVOMG * EPHSMP
258 WVLSMP = TWOPIP * CLIGHT / OMGSMP
259 * | Compute the refraction index at the right wavelength/frequency:
260 RFISMP = FOPTPR ( 1, WVLSMP, OMGSMP, MMAT )
261 BETNSM = PTRKCR / ETRKCR * RFISMP
262 *dbgD WRITE (77,*) ' CRNKVP:BETNSM,RFISMP,EPHSMP,WVLSMP,OMGSMP',
263 *dbgD & BETNSM,RFISMP,EPHSMP,WVLSMP,OMGSMP
264 IF ( BETNSM .LE. ONEONE ) GO TO 1000
265 * |--<--<--<--<--< No chance to emit Cerenkov photons at this frequency
266 BTNFSM = ( BETNSM - ONEONE ) * ( BETNSM + ONEONE ) / BETNSM**2
267 * | Compute the quantum efficiency for this emitted energy:
268 OPSENS = FOPTSN ( WVLSMP, OMGSMP )
269 FREJE = BTNFSM / BTNFCR * OPSENS / OPSNMX
270 D IF ( FREJE .GT. ONEPLS ) WRITE (77,*)
271 D & ' ^^^CRNKVP:FREJE,RFISMP,RMXCER(MMAT),OPSENS,MMAT',
272 D & FREJE,RFISMP,RMXCER(MMAT),OPSENS,MMAT
273 RNDREJ = FLRNDM (RNDREJ)
274 *dbgD WRITE (77,*) ' CRNKVP:BTNFSM,BTNFCR,RNDREJ',
275 *dbgD & BTNFSM,BTNFCR,RNDREJ
276 IF ( RNDREJ .GE. FREJE ) GO TO 1000
277 * |--<--<--<--<--< Interaction rejected because of the decrease in n
278 * | Eventually a Cerenkov photon is going to be emitted:
279 * | +----------------------------------------------------------------*
280 * | | New production sub-step:
281 IF ( NTRKCR .NE. NTRKLD ) THEN
282 UTRKCR = XTRACK (NTRKCR) - XTRACK (NTRKCR-1)
283 VTRKCR = YTRACK (NTRKCR) - YTRACK (NTRKCR-1)
284 WTRKCR = ZTRACK (NTRKCR) - ZTRACK (NTRKCR-1)
285 TUVWCR = SQRT ( UTRKCR**2 + VTRKCR**2 + WTRKCR**2 )
286 UTRKCR = UTRKCR / TUVWCR
287 VTRKCR = VTRKCR / TUVWCR
288 WTRKCR = WTRKCR / TUVWCR
289 SINT02 = UTRKCR**2 + VTRKCR**2
290 LSMPAN = SINT02 .LT. ANGLSQ
292 IF ( .NOT. LSMPAN ) THEN
293 SINTH0 = SQRT (SINT02)
294 COSPH0 = UTRKCR / SINTH0
295 SINPH0 = VTRKCR / SINTH0
300 * | +----------------------------------------------------------------*
301 SRNRSD = TUVWCR * TRNRSD / CRVCRR / TTRACK (NTRKCR)
302 D IF ( SRNRSD .LT. ZERZER .OR. SRNRSD .GT. TUVWCR )
303 D & WRITE (77,*)' ^^^CRNKVP:SRNRSD,TUVWCR,NTRKCR',
304 D & SRNRSD,TUVWCR,NTRKCR
305 XTRKCR = XTRACK (NTRKCR) - UTRKCR * SRNRSD
306 YTRKCR = YTRACK (NTRKCR) - VTRKCR * SRNRSD
307 ZTRKCR = ZTRACK (NTRKCR) - WTRKCR * SRNRSD
308 * | +----------------------------------------------------------------*
309 * | | Put here the check on lattice change:
310 IF ( NULTTC .GT. 0 ) THEN
311 * | | Current (possibly curved in mag. field) non wiggled path:
312 TRLATT = TRUSED / CRVCRR
313 IF ( TRLATT .LE. TSLTTC (IRLTCR) ) THEN
314 LATCCR = MULTTC (IRLTCR)
316 DO 2000 IL = IRLTCR + 1, NULTTC
317 IF ( TRLATT .LE. TSLTTC (IL) ) THEN
319 LATCCR = MULTTC (IRLTCR)
323 D CALL FLABRT ( 'CRNKVP', 'STOP:CRNKVP-NO-VALID-LATTICE' )
328 * | +----------------------------------------------------------------*
329 * | +----------------------------------------------------------------*
330 * | | Put here the check on the end point in magnetic field:
331 IF ( LEMAGN .AND. NTRKCR .EQ. NTRACK .AND. MREG .NE. NEWREG )
336 CALL GEOMAG ( XTRKCR, YTRKCR, ZTRKCR, UTRKCR, VTRKCR,
337 & WTRKCR, NWREG , NROLD , IDSCCK )
340 IF ( NWREG .EQ. NROLD ) GO TO 7000
341 * | |-->-->--> already beyond the real crossing point:
344 * | +----------------------------------------------------------------*
347 IF ( NUMOPH .GT. 1000000000 ) THEN
349 NUMOPH = NUMOPH + 1000000000
351 WOPTPH = WOPTPH + WTRACK
352 POPTPH (LSTOPP) = EPHSMP
353 * | +----------------------------------------------------------------*
354 * | | No easy safe way to reconstruct Dnear along a magnetic field
357 DONEAR (LSTOPP) = ZERZER
359 * | +----------------------------------------------------------------*
360 * | | Questionable: ddnear actually refers to the end track point
362 DONEAR (LSTOPP) = MAX ( DDNEAR - CTRACK + TRUSED, ZERZER )
365 * | +----------------------------------------------------------------*
366 XOPTPH (LSTOPP) = XTRKCR
367 YOPTPH (LSTOPP) = YTRKCR
368 ZOPTPH (LSTOPP) = ZTRKCR
369 NREGOP (LSTOPP) = MREG
370 NLATOP (LSTOPP) = LATCCR
371 COSTHE = ONEONE / BETNSM
372 SINTHE = SQRT ( ( ONEONE - COSTHE ) * ( ONEONE + COSTHE ) )
373 CALL SFECFE ( SINPHI, COSPHI )
374 UPRIME = COSPHI * SINTHE
375 VPRIME = SINPHI * SINTHE
378 TXOPPH (LSTOPP) = UPRIME
379 TYOPPH (LSTOPP) = VPRIME
380 TZOPPH (LSTOPP) = WPRIME * COSTH0
382 TXOPPH (LSTOPP) = UNDOXR ( UPRIME, VPRIME, WPRIME, SINPH0,
383 & COSPH0, SINTH0, COSTH0 )
384 TYOPPH (LSTOPP) = UNDOYR ( UPRIME, VPRIME, WPRIME, SINPH0,
385 & COSPH0, SINTH0, COSTH0 )
386 TZOPPH (LSTOPP) = UNDOZR ( UPRIME, VPRIME, WPRIME, SINPH0,
387 & COSPH0, SINTH0, COSTH0 )
389 * | Set-up the polarization vector: the following for linear pola-
390 * | rization lying in the plane defined by the photon and the
391 * | original particle direction:
392 TXPOPP (LSTOPP) = UTRKCR / SINTHE - COSTHE / SINTHE
394 TYPOPP (LSTOPP) = VTRKCR / SINTHE - COSTHE / SINTHE
396 TZPOPP (LSTOPP) = WTRKCR / SINTHE - COSTHE / SINTHE
398 SCADOT = TXOPPH (LSTOPP) * TXPOPP (LSTOPP)
399 & + TYOPPH (LSTOPP) * TYPOPP (LSTOPP)
400 & + TZOPPH (LSTOPP) * TZPOPP (LSTOPP)
401 IF ( SCADOT .GT. CSNPRN ) THEN
402 WRITE (LUNERR,'(A,1PG23.15,A)')
403 & ' *** Crnkvp: bad polarization',
405 D WRITE (77,'(A,1PG23.15)')
406 D & ' ^^^Crnkvp: bad polarization',
409 WTOPPH (LSTOPP) = WTRACK
410 AGOPPH (LSTOPP) = ATRKCR
411 CMPOPP (LSTOPP) = ZERZER
412 LOOPPH (LSTOPP) = LTRACK + 1
417 PXCR = EPHSMP * TXOPPH (LSTOPP)
418 PYCR = EPHSMP * TYOPPH (LSTOPP)
419 PZCR = EPHSMP * TZOPPH (LSTOPP)
423 CALL PushCerenkovPhoton(PXCR, PYCR, PZCR, EPHSMP, XTRKCR,
424 & YTRKCR , ZTRKCR, ATRKCR, POX, POY, POZ, WTRACK, ITFL)
428 * | !!!!!! Here Stuprf should be used !!!!!!
429 LOUOPP (LSTOPP) = ITFL
430 DO 2100 ISPR = 1, MKBMX1
431 SPAROK (ISPR,LSTOPP) = SPAUSR (ISPR)
433 DO 2200 ISPR = 1, MKBMX2
434 ISPORK (ISPR,LSTOPP) = ISPUSR (ISPR)
436 * | Save the parent features:
437 TPROPP (LSTOPP) = ETRACK - AMPRTC
438 APROPP (LSTOPP) = ATRKCR
439 LPROPP (LSTOPP) = LTRACK
440 IPROPP (LSTOPP) = JTRACK
442 * | Update the "current" particle values:
443 ETRKCR = ETRKCR - EPHSMP
444 DEDXCK = DEDXCK + EPHSMP
445 PTRKCR = SQRT ( ( ETRKCR - AMPRTC ) * ( ETRKCR + AMPRTC ) )
450 BETNCR = PTRKCR / ETRKCR * RMXCER (MMAT)
451 * | No longer any chance to emit Cerenkov photons:
452 IF ( BETNCR .LE. ONEONE ) GO TO 7000
454 BTNFCR = ( BETNCR - ONEONE ) * ( BETNCR + ONEONE ) / BETNCR**2
455 * | Update the macroscopic sigma: beta can only decrease
456 SIGMCK = SIGMCK * BTNFCR / BTNFLD
459 * +-------------------------------------------------------------------*
462 *=== End of subroutine Crnkvp =========================================*