c c generate a vertex for gsvert() in cm c c last modified on 18/08/2000 by R. Holzmann c subroutine makevertex(xvert) implicit none real xvert(3) #include "geatarget.inc" #include "user.inc" real d1, d2, d3, twopi data twopi /6.283185308/ real vec3(3) integer iseg call grndm(vec3,3) if(jver(1).eq.0) then ! fixed vertex xvert(1) = 0.0 xvert(2) = 0.0 xvert(3) = 0.0 else if(jver(1).eq.1) then ! displaced point vertex xvert(1) = tgtpar(1) xvert(2) = tgtpar(2) xvert(3) = tgtpar(3) else if(jver(1).eq.2) then ! segmented target call rantarg(xvert,iseg) else if(jver(1).eq.3) then ! cube target volume centered at 0 xvert(1) = tgtpar(1)*(vec3(1)-0.5) xvert(2) = tgtpar(2)*(vec3(2)-0.5) xvert(3) = tgtpar(3)*(vec3(3)-0.5) else if(jver(1).eq.4) then ! smeared vertex if(jver(2).eq.1) then ! z uniform between tgtpar(1) and tgtpar(2) xvert(3) = tgtpar(1) + vec3(3)*(tgtpar(2)-tgtpar(1)) else if(jver(2).eq.2) then ! z exponential d1 = vec3(3)*exp(-tgtpar(3)*tgtpar(1)) d2 = (1.-vec3(3))*exp(-tgtpar(3)*tgtpar(2)) xvert(3) = -log(d1+d2)/tgtpar(3) else if(jver(2).eq.3) then ! z discrete d1 = (tgtpar(2)-tgtpar(1))/(tgtpar(3)-1.) xvert(3) = tgtpar(1) + float(Int(vec3(3)*tgtpar(3)))*d1 else xvert(3) = 0.0 end if if(jver(3).eq.1) then ! x,y cylindrically uniform d1 = sqrt(vec3(1)) d2 = twopi*vec3(2) xvert(1) = tgtpar(4)*d1*sin(d2) + beampar(5) xvert(2) = tgtpar(5)*d1*cos(d2) + beampar(6) else if(jver(3).eq.2) then ! x,y cylindrically exponential d1 = exp(tgtpar(4)*tgtpar(6)) d2 = exp(-tgtpar(4)*tgtpar(6)) d3 = vec3(1)*(d1-d2) xvert(1) = 0.5*log(0.5*(d3+sqrt(4.+d3*d3))) d1 = exp(tgtpar(5)*tgtpar(7)) d2 = exp(-tgtpar(5)*tgtpar(7)) d3 = vec3(2)*(d1-d2) xvert(2) = 0.5*log(0.5*(d3+sqrt(4.+d3*d3))) else xvert(1) = 0.0 xvert(2) = 0.0 end if end if xvert(1) = xvert(1)/lunit ! go to cm for gsvert() xvert(2) = xvert(2)/lunit xvert(3) = xvert(3)/lunit return end