15 movedtrack = trackbefmove
16 if(intinfarray(processno)%length .gt. 0.0 )
then 23 if(trackbefmove%p%charge .ne. 0)
then 30 if(movestat .ne.
dead)
then 57 movedtrack%pos%xyz%r(1) = trackbefmove%pos%xyz%r(1)
60 movedtrack%pos%xyz%r(2) = trackbefmove%pos%xyz%r(2)
63 movedtrack%pos%xyz%r(3) = trackbefmove%pos%xyz%r(3)
68 movedtrack%vec%coszenith = cnewcos(movedtrack%pos%radiallen,
69 * trackbefmove%vec%coszenith, leng)
70 if(timestructure )
then 74 movedtrack%t = trackbefmove%t + leng/beta
89 real*8 rho, cvh2den, dedt, dedtF, thick, leng, cupsilon
96 real*8 dedxmu, dedxmuF
101 if( trackbefmove%p%fm%p(4) .gt. magbrememin)
then 102 if( magbrem .eq. 1 .and. trackbefmove%p%code .eq.
kelec)
then 103 upsilon = cupsilon(trackbefmove%p, mag)
104 if(
upsilon .gt. upsilonmin)
then 106 energyloss = csyncteloss(
upsilon) *
107 * intinfarray(processno)%length
108 if(reverse .eq. 0)
then 109 movedtrack%p%fm%p(4) =
110 * movedtrack%p%fm%p(4) - energyloss
111 elseif(reverse .eq. 2)
then 112 movedtrack%p%fm%p(4) =
113 * movedtrack%p%fm%p(4) + energyloss
122 rho = cvh2den(trackbefmove%pos%height)
123 call cdedxinair(trackbefmove%p, rho, dedt, dedtf )
125 if(trackbefmove%p%code .eq.
kmuon )
then 127 call cmudedx(muni, mubr, mupr, trackbefmove%p%fm%p(4),
130 dedxmuf = dedxmuf /10.
132 dedtf = dedtf + dedxmuf
135 energyloss = dedt * intinfarray(processno)%thickness
136 if(reverse .eq. 0)
then 137 movedtrack%p%fm%p(4) = movedtrack%p%fm%p(4) - energyloss
139 if(movedtrack%p%fm%p(4) .lt. movedtrack%p%mass)
then 140 energyloss =( trackbefmove%p%fm%p(4) - movedtrack%p%mass )
141 if(dedt .gt. 0.)
then 142 thick =energyloss / dedt
146 movedtrack%p%fm%p(4) = movedtrack%p%mass
151 call cthick2len(trackbefmove, thick, leng, thick, jcut)
158 call ce2p(movedtrack)
159 elseif(reverse .eq. 2)
then 160 movedtrack%p%fm%p(4) = movedtrack%p%fm%p(4) + energyloss
163 call ce2p(movedtrack)
170 entry cqelossrate(dedx, dedxf)
184 #include "Zelemagp.h" 187 real*8 dt, dispx, dispy
189 if(reverse .eq. 0)
then 190 nodef = onedim .ne. 0 .or.
191 * (mod(howgeomag, 10) .eq. 1 .and. zfirst%pos%depth .eq. 0.)
201 if(.not. nodef .and. reverse .eq. 0)
then 208 call cgetzenith(movedtrack, movedtrack%vec%coszenith)
212 if(timestructure .and. reverse .eq. 0)
then 215 if(beta .gt. 0.)
then 216 movedtrack%t = movedtrack%t + dt/beta
222 #include "ZsubstRec.h" 231 #include "Zelemagp.h" 236 type(
coord)::dispmr, dispmd
245 logical usemiddle, high, usecmiddle
248 real*8 newmom(3), dE, E1, E2, p1sq, p2sq, newE, norm
251 leng = intinfarray(processno)%length
255 p1sq =dot_product(trackbefmove%p%fm%p(1:3),
256 * trackbefmove%p%fm%p(1:3))
257 e1 = sqrt( p1sq + trackbefmove%p%mass**2)
258 p2sq =dot_product(newmom(1:3),newmom(1:3))
259 e2=sqrt(p2sq + trackbefmove%p%mass**2)
263 newe = movedtrack%p%fm%p(4) + de
264 if( newe < trackbefmove%p%mass )
then 265 newe = trackbefmove%p%mass
270 if( p2sq <= 0. )
then 271 write(0,*)
' p2sq = ',p2sq
273 *
' TrackBefMove%p=',trackbefmove%p%fm%p(1:4)
274 write(0,*)
' dE, newE=',de, newe
275 write(0,*)
' leng =', leng
276 write(0,*)
'dispmr=',dispmr%r(:)
277 write(0,*)
'dispmd=',dispmd%r(:)
279 *
'code, chg=',trackbefmove%p%code,
280 * trackbefmove%p%charge
282 newe = trackbefmove%p%mass
284 dispmd%r(:) = (/0.,0.,1./)
286 norm = sqrt( (newe**2 - trackbefmove%p%mass**2)/p2sq)
287 newmom(:) = newmom(:) *norm
290 movedtrack%p%fm%p(4) = newe
294 movedtrack%pos%xyz%r(:) = trackbefmove%pos%xyz%r(:) +
296 movedtrack%p%fm%p(1:3) = newmom(:)
333 if(userungekutta .eq. 8 )
then 334 call cbdefuser(trackbefmove, leng, dispmr, dispmd,
335 * movedtrack%p%fm%p(1:3))
337 movedtrack%pos%xyz = dispmr
343 high = trackbefmove%pos%height .gt. cheight
344 usemiddle = ( userungekutta .ge. 1 .and.
345 * userungekutta .le. 3 .and.
347 usecmiddle = ( userungekutta .ge. 4 .and.
348 * userungekutta .le. 5 .and.
354 middle%r(i) = trackbefmove%pos%xyz%r(i)+
355 * leng/2 * trackbefmove%vec%w%r(i)
359 call cgeomag(yearofgeomag, middle,
363 elseif(usecmiddle)
then 368 middle%r(i) = trackbefmove%pos%xyz%r(i) + dispmr%r(i)
371 call cgeomag(yearofgeomag, middle,
377 if(usemiddle .and. userungekutta .eq. 1)
then 379 elseif( usemiddle .and. userungekutta .eq. 2 )
then 380 temp1 = tempmag%x**2 + tempmag%y**2 + tempmag%z**2
381 temp2 = mag%x**2 + mag%y**2 + mag%z**2
383 if( abs(temp1-temp2)/temp1/2.0 .gt. 4.0
d-3)
then 384 call cbdefbyrk2(trackbefmove, leng, dispmr, dispmd,
385 * movedtrack%p%fm%p(1:3))
387 movedtrack%pos%xyz = dispmr
395 elseif(usemiddle .and. userungekutta .eq. 3)
then 396 temp1 = tempmag%x**2 + tempmag%y**2 + tempmag%z**2
397 temp2 = mag%x**2 + mag%y**2 + mag%z**2
401 if( abs(temp1-temp2)/temp1/2.0 .gt. 4.5
d-3)
then 402 call cbdefbyrk(trackbefmove, leng, dispmr, dispmd,
403 * movedtrack%p%fm%p(1:3))
405 movedtrack%pos%xyz = dispmr
413 elseif(usecmiddle .and. userungekutta .eq. 4)
then 414 temp1 = tempmag%x**2 + tempmag%y**2 + tempmag%z**2
415 temp2 = mag%x**2 + mag%y**2 + mag%z**2
417 if( abs(temp1-temp2)/temp1/2.0 .gt. 4.0
d-3)
then 418 call cbdefbyrk2(trackbefmove, leng, dispmr, dispmd,
419 * movedtrack%p%fm%p(1:3))
421 movedtrack%pos%xyz = dispmr
429 elseif(usecmiddle .and. userungekutta .eq. 5)
then 430 temp1 = tempmag%x**2 + tempmag%y**2 + tempmag%z**2
431 temp2 = mag%x**2 + mag%y**2 + mag%z**2
433 if( abs(temp1-temp2)/temp1/2.0 .gt. 4.5
d-3)
then 434 call cbdefbyrk(trackbefmove, leng, dispmr, dispmd,
435 * movedtrack%p%fm%p(1:3))
437 movedtrack%pos%xyz = dispmr
447 if(userungekutta .le. 5 .or. .not. high )
then 452 movedtrack%pos%xyz%r(i) = trackbefmove%pos%xyz%r(i) +
455 elseif(userungekutta .eq. 6)
then 456 call cbdefbyrk2(trackbefmove, leng, dispmr, dispmd,
457 * movedtrack%p%fm%p(1:3))
459 movedtrack%pos%xyz = dispmr
465 call cbdefbyrk(trackbefmove, leng, dispmr, dispmd,
466 * movedtrack%p%fm%p(1:3))
468 movedtrack%pos%xyz = dispmr
476 movedtrack%vec%w = dispmd
496 #include "Zelemagp.h" 504 real*8 sint, cs, sn, tmp, avx, avy, disp, dt, dl
505 real*8 r, g1, g2, gf1, gf2, beta2, tetarms
509 if(theta .lt. 0.01
d0)
then 512 dsa%r(3) = 1.-theta**2/2
516 dsa%r(3) =
cos(theta)
526 dsa%r(3) =
cos(theta)
527 dt = intinfarray(processno)%thickness/ x0
528 dl = intinfarray(processno)%length
533 if( (moliere == 0 .and. alatecor>=1) .or.
534 * alatecor == 2)
then 548 gf1 = trackbefmove%p%fm%p(4)/movedtrack%p%mass
549 gf2 = movedtrack%p%fm%p(4)/movedtrack%p%mass
550 beta2 = 1.
d0 - 1.
d0/gf1/gf2
551 if(beta2 .le. 0.)
then 554 if(dt .gt. 1.
d-3)
then 555 tetarms = es/trackbefmove%p%fm%p(4)*
556 * abs(movedtrack%p%charge)*
557 * sqrt(dt)*(1.0 + 0.038*log(dt))
559 tetarms = es/trackbefmove%p%fm%p(4)*
560 * abs(movedtrack%p%charge)*
563 disp=tetarms/sqrt(6.
d0*beta2)*dl/2.
d0 567 call kgauss2(0.
d0, 1.0
d0, g1, g2)
590 movedtrack%pos%xyz%r(1:3) =
591 * r*w%r(1:3)+ movedtrack%pos%xyz%r(1:3)
subroutine cgetbeta(aPtcl, beta)
subroutine cputdeflection
subroutine csubstcoord(c1, c2)
! for length to thickness conversion or v v ! integer maxnodes real Hinf ! This is used when making table for dim simulation ! The slant length for vertical height to km is ! divided by LenStep m steps ! It can cover the slant length of about km for cos
subroutine cthick2len(aTrack, tin, leng, t, jcut)
subroutine cresetmom(aTrack)
block data cblkIncident data *Za1ry *HeightOfInj d3
subroutine cmudedx(flagN, flagBr, flagPr, Emu, dEdx, dEdxF)
subroutine celecdef(dx, dy)
max ptcl codes in the kelec
subroutine cbdefuser(aTrack, leng, newpos, newdir, newmom)
subroutine cgetzenith(aTrack, cosz)
subroutine cgeomag(yearin, llh, h, icon)
subroutine cdefbymagande(aTrack, leng, dispmr, dispmd, newmom)
! Parameters used for hadronic cascade shower is generated newline ! For you may give as as or em quick generation of AS for heavy primaries is tried See chookASbyH f character *Generate2 don t touch this for skeleton flesh use integer MagBrem no magnetic bremsstrahlung is considered newline ! if and Ee energy loss due to magnetic brems is considered newline ! if and Ee real sampling of gamma is performed WaitRatio ! must be made small so that WaitRatio *E0 sim MagBremEmin integer MagPair no magnetic pair creation is considered newline ! if and Eg real sampling is the LPM effect is considered when Ee LpmBremEmin for electrons and ! Eg LpmPairEmin for gamma rays real *MagBremEmin E magnetic bremsstrahlung by electrons may be considered if not considered at all newline total energy loss due to brems is considered newline gamma energy is sampled actually newline ! If upsilon(Ee/m *B/Bcr) is small
subroutine cdedxinair(aPtcl, rhoin, dedt, dedtF)
block data cblkEvhnp ! currently usable models data RegMdls ad *special data *Cekaon d0
subroutine ctransvectz(zax, dir1, dir2)
dE dx *! Nuc Int sampling table d
subroutine cbdefbyrk(aTrack, leng, newpos, newdir, newmom)
Compute magnetic deflection (angle and displacement) Use Runge-Kutta-Fehlberg Method.
subroutine cbdefbyrk2(aTrack, leng, newpos, newdir, newmom)
subroutine kcossn(cs, sn)
block data cblkElemag data *AnihiE ! Eposi< 1 TeV, anihilation considered *X0/365.667/, ! radiation length of air in kg/m2 *Ecrit/81.e-3/, ! critical energy of air in GeV *MaxComptonE/1./, ! compton is considered below 1 GeV *MaxPhotoE/1.e-3/, ! above this, PhotoElectric effect neg. *MinPhotoProdE/153.e-3/, ! below 153 MeV, no gp --> hadrons ! scattering const not MeV *Knockon ! knockon is considered Obsolete *PhotoProd false
subroutine cmagneticdef(aTrack, B, leng, dr, dir)
subroutine cmovestreight(leng, dir)
subroutine ctransmagto(sys, pos, a, b)
subroutine cputenergyloss
max ptcl codes in the kmuon
subroutine cexcesslen(dx, dy, dt)
subroutine cmulscat(theta)
subroutine csetpos(location)