musrsim/geant3/src/lemsr/gudcay.F
Thomas Prokscha 2439dfdaae Added muon stop position to ntuple output; x0,y0 offsets,
beamspot size scalable and exponential relaxation as additional
option.
2007-02-06 14:05:37 +00:00

111 lines
3.2 KiB
Fortran

c
#include "geant321/pilot.h"
c---------------------------------------------------------------------------
c
subroutine gudcay
c
c in case of muon started with partcode = 500, throw michel spectrum
c and anisotropic angular distribution
c
c T. Prokscha, 15-Sep-2000 PSI
c
c Unix version
c
c TP, 05-Apr-2001 PSI Unix, NT, Linux
c
c---------------------------------------------------------------------------
c
implicit none
c
#define CERNLIB_TYPE
#include "geant321/gctrak.inc"
#include "geant321/gckine.inc"
#include "geant321/gcking.inc"
c
#include "common.inc"
c
c Michel spectrum
c
real*4 pos_tot ! total positron energy (including rest mass)
real*4 p0 ! total positron momentum (MeV)
real*4 px0, py0, pz0 ! components of p0
c
c decay direction in muon rest system (Spin parallel to x-axis !!!)
c
real*4 costheta, sintheta, cosphi, sinphi
c
c 4-momentum of muon particle (if decay in flight); if decay in flight
c do a Lorentz-transformation to get momenta in real space
c
real*4 decay_rest(4), beta(4), decay_lab(4), gamma, beta_tot
real*4 decay_rot(3) ! copy of momentum comp. of decay_lab(4)
c
c----------------------------------------------------------------------------
c
c get the Michel spectrum
c
call michel(pos_tot, p0)
c
call get_direction(costheta, sintheta, cosphi, sinphi, pos_tot)
c
c get the single momentum components in the laboratory system
c the muon spin is directed along the x-axis which points to the
c LEFT detector.)
c
px0 = p0 * costheta
py0 = p0 * sintheta * cosphi
pz0 = p0 * sintheta * sinphi
c
decay_rest(1) = px0/1000. ! GEANT uses GeV/c instead of MeV/c
decay_rest(2) = py0/1000.
decay_rest(3) = pz0/1000.
decay_rest(4) = pos_tot/1000.
c
c for the Lorentz transformation, maybe not important, because the
c mu+ are slow
c
gamma = getot / MU_MASS
beta_tot = vect(7) / getot ! this is p/E, vect(7) = p
beta(1) = -vect(4) * beta_tot ! vect(4) = px/p
beta(2) = -vect(5) * beta_tot ! vect(5) = py/p
beta(3) = -vect(6) * beta_tot ! vect(6) = pz/p
c
c negative sign because we need the velocity of
c the lab-system with respect to the rest-system
c
beta(4) = gamma
c
call gloren(beta, decay_rest, decay_lab)
c
c if there is a B-field present we have to rotate the momentum vector
c at the moment only Bz implemented; exit program if Bx or By are
c given.
c
c
if ( bfield(1) .ne. 0. .or. bfield(2) .ne. 0. or. bfield(3) .ne.
1 0.) then
decay_rot(1) = decay_lab(1)
decay_rot(2) = decay_lab(2)
decay_rot(3) = decay_lab(3)
c
call rotate(decay_rot, tofg)
c
decay_lab(1) = decay_rot(1)
decay_lab(2) = decay_rot(2)
decay_lab(3) = decay_rot(3)
endif
c
ngkine = 1
tofd(1) = 0.
gkin(1,1) = decay_lab(1)
gkin(2,1) = decay_lab(2)
gkin(3,1) = decay_lab(3)
gkin(4,1) = decay_lab(4)
gkin(5,1) = 2
gpos(1,1) = vect(1)
gpos(2,1) = vect(2)
gpos(3,1) = vect(3)
c
return
end