Module firstguessko_mod

module firstguessko_mod

        ! Uses
    use precision_mod
    use namelist_mod
    use physicalconstants_mod, only: pi
    use det_geom_mod, ONLY: max_planes_d, max_planes_p
    use timezero_mod, ONLY:timezero_costheta

        ! Types
    private type hits_type
    private type uvfit_type
    private type zphifit_type
    private type fit_type

        ! Variables
    integer, private, PARAMETER :: kMaxHits = max_planes_d / 2 + max_planes_p / 2
    integer, private, PARAMETER :: kMaxMult = 10
    integer, private, PARAMETER :: kMaxTdc = 100
    integer, private, PARAMETER :: kMinHits = 4
    real, private, PARAMETER :: kMinZ = 1.0
    real, private, PARAMETER :: kMaxZ = 20.0
    real, private, PARAMETER :: kMinCost = 0.01
    real, private, PARAMETER :: kMinRadius = 0.3000
    real, private, PARAMETER :: kMinMuonRadius = 0.05
    real, private, PARAMETER :: kMaxRadius = 15.0
    real, private, PARAMETER :: kMaxTant = 7.999
    real, private, PARAMETER :: kCutQ = 10.0
    real, private, PARAMETER :: kCutRQ = 0.4
    real, private, PARAMETER :: kHUGEVAL = 1E37
    real, private, PARAMETER :: kRadiusWindingGuessChanged = 1.
    integer, private, PARAMETER :: kSuccess = 0
    integer, private, PARAMETER :: kFailUnknown = 1
    integer, private, PARAMETER :: kFailMinHits = 2
    integer, private, PARAMETER :: kFailTooShort = 3
    integer, private, PARAMETER :: kFailZeroRadius = 4
    integer, private, PARAMETER :: kFailMaxTant = 5
    integer, private, PARAMETER :: kFailBadRadius = 6
    integer, private, PARAMETER :: kFailAnchors = 7
    integer, private, PARAMETER :: kFailBadPhaseCost = 8
    integer, private, PARAMETER :: kFailBadPhaseTant = 9
    integer, private, PARAMETER :: kFailNoCircles = 10
    integer, private, PARAMETER :: kFailNoTrack = 11
    integer, private, PARAMETER :: kFailHasGap = 12
    integer (kind=I4), private, EXTERNAL :: iutime

        ! Subroutines and functions
    public subroutine FirstGuessKOwindow (iwindow, iStream)
    private subroutine doGeneric (iwindow, iStream)
    private subroutine removeHits (hits, fit)
    private subroutine doMuon (iwindow)
    public subroutine FirstGuessKOmuon (iwindow, fgresult)
    private subroutine NewUVfit (uvfit)
    private subroutine NewZPhiFit (zphifit)
    private subroutine NewFit (fit)
    private subroutine PrintZPhiFit (hits, fit, doPrintHits)
    private subroutine storeFit (hits, fit, muonmode, fg)
    private subroutine addFit (hits, fit, muonmode)
    private subroutine findHits (iwindow, iStream, muonmode, hits)
    private subroutine ClearHits (hits)
    private subroutine storeHit (hits, isDC, isFullyInstrumented, u, v, du, dv, z, s, w, numtdchits, tdchits)
    private subroutine MergeSort (hits, hits1, hits2)
    private subroutine copyHit (dst, idst, src, isrc)
    private subroutine printHits (hits)
    private subroutine iterateSubtracks (hits, muonmode, fit)
    private subroutine iterateUV (hits, ifirstHit, ilastHit, fit, muonmode)
    private subroutine FudgeDeltaTrack (uv, phase)
    private subroutine ComputeEdges (hits, ifirsthit, ilasthit, isEdge)
    private subroutine ComputeAverageMultiplicity (hits, iFirstHit, iLastHit, avgU, avgV, avgA)
    private subroutine ComputeTant (hits, iFirstHit, iLastHit, minTant, maxTant)
    private function FindMuonCircles (hits, iFirstHit, iLastHit, idir, isEdge, numuvc, uvc, uvcindex)
    private function FindCircles (hits, ifirsthit, ilasthit, idir, isEdge, numuvc, uvc, uvcindex)
    private subroutine FitUV5 (hits, ia1, im1, ia2, im2, ia3, im3, fit)
    private subroutine makeCircle (u, v, uc, vc, rc)
    private subroutine ComputeCircleNorm (hits, ifirst, ilast, isEdge, fituv)
    private subroutine iteratePhase (hits, iFirstHit, iLastHit, isEdge, fit, uv, muonmode, phase)
    private subroutine tryPhase (hits, hitsr, hitsp, hitsdp, r0, ifirst, ilast, ia1, im1, ia2, im2, iwind, minTant, maxTant, muonmode, phase)
    private function angleDiff (a, b)
    private function reduce (a)
    private function rad2deg (a)
    private function deg2rad (a)
    private function jsign (a) result (ival)
    private function sqr (x) result (x2)
    private subroutine Fgkodie ()
    private function kcutrq2 (x) result (x2)

end module firstguessko_mod

Description of Types

hits_type

private type hits_type
    integer :: iwindow
             this window
    integer :: numHits
             total number of hits
    integer, dimension (kMaxHits) :: mult
             number of clusters per hit
    logical, dimension (kMaxHits) :: isDChit
             TRUE for DC hits, FALSE for others
    logical, dimension (kMaxHits) :: isFullyInstrumented
             TRUE for fully instrumented planes
    real (kind=R8), dimension (kMaxHits) :: z
             cluster z, cm
    real (kind=R8), dimension (kMaxHits,kMaxMult) :: u
             cluster center, cm
    real (kind=R8), dimension (kMaxHits,kMaxMult) :: v
             cluster center, cm
    real (kind=R8), dimension (kMaxHits,kMaxMult) :: du
             cluster u size, cm
    real (kind=R8), dimension (kMaxHits,kMaxMult) :: dv
             cluster v size, cm
    real (kind=R8), dimension (kMaxHits,kMaxMult) :: s
             cluster uv diagonal, cm
    real (kind=R8), dimension (kMaxHits,kMaxMult) :: w
             cluster weight?
    integer, dimension (kMaxHits,kMaxMult,0:kMaxTdc) :: tdchits
             indices of TDC hits
end type hits_type

uvfit_type

private type uvfit_type
    real (kind=R8) :: u
             circle center and radius
    real (kind=R8) :: v
             circle center and radius
    real (kind=R8) :: r
             circle center and radius
    integer :: numhits
             number of hits used in fit
    logical, dimension (kMaxHits) :: isGood
             save only good hits
    integer, dimension (kMaxHits) :: ihit
             index into hits_type%z(), etc
    integer, dimension (kMaxHits) :: imult
             index into hits_type%u(ihit,imult), etc
    real (kind=R8), dimension (kMaxHits,kMaxMult) :: nres
             norm for each hit
    integer :: ia1
    integer :: ia2
    integer :: ia3
    integer :: im1
    integer :: im2
    integer :: im3
    real (kind=R8) :: norm
             Chebyshev norm
end type uvfit_type

zphifit_type

private type zphifit_type
    integer :: ifgerror
             error code
    integer :: ifirst
             first and last hits of subtrack
    integer :: ilast
             first and last hits of subtrack
    integer :: ianchor1
             helix anchors
    integer :: imult1
             helix anchors
    integer :: ianchor2
             helix anchors
    integer :: imult2
             helix anchors
    integer :: iwind
             winding number
    real (kind=R8) :: avgwind
    real (kind=R8) :: avgcost
    real (kind=R8) :: phi0
             phase at z=0
    real (kind=R8) :: afreq
             angular frequency
    real (kind=R8) :: tant
             tan(theta)
    real (kind=R8) :: cost
             cos(theta)
    integer :: numhits
             number of hits used in fit
    integer, dimension (kMaxHits) :: ihit
             index into hits_type%z(), etc
    integer, dimension (kMaxHits) :: imult
             index into hits_type%u(ihit,imult), etc
    logical, dimension (kMaxHits) :: isGood
             save only good hits
    real (kind=R8), dimension (kMaxHits,kMaxMult) :: pwidth
             width of each hit
    real (kind=R8), dimension (kMaxHits,kMaxMult) :: pres
             angle residual for each hit
    real (kind=R8), dimension (kMaxHits,kMaxMult) :: qres
             quality function for each hit
    real (kind=R8), dimension (kMaxHits,kMaxMult) :: rres
             radius residual for each hit
    real (kind=R8) :: qfunc
             quality function
end type zphifit_type

fit_type

private type fit_type
    integer :: ifirsthit
             first and last hits used by this fit
    integer :: ilasthit
             first and last hits used by this fit
    integer :: idir
             direction we should loop over hits
    integer :: ifgerror
             error code for this fit
    type (uvfit_type) :: uv
             u-v circle fit for this fit
    real (kind=R8) :: clusterSize
             average cluster size
    real (kind=R8) :: minTant
             minimum tan(theta) from cluster size 
    real (kind=R8) :: maxTant
             maximum tan(theta) from cluster size 
    type (zphifit_type) :: zphi
             phase fit
end type fit_type

Description of Variables

kMaxHits

integer, private, PARAMETER :: kMaxHits = max_planes_d / 2 + max_planes_p / 2

kMaxMult

integer, private, PARAMETER :: kMaxMult = 10
 maximum cluster multiplicity

kMaxTdc

integer, private, PARAMETER :: kMaxTdc = 100
 maximum number of hits per cluster

kMinHits

integer, private, PARAMETER :: kMinHits = 4
 min number of hits to make a track

kMinZ

real, private, PARAMETER :: kMinZ = 1.0

kMaxZ

real, private, PARAMETER :: kMaxZ = 20.0
 maximum distance between hits, cm

kMinCost

real, private, PARAMETER :: kMinCost = 0.01
 minimum cos(theta)

kMinRadius

real, private, PARAMETER :: kMinRadius = 0.3000
 minimum radius, cm

kMinMuonRadius

real, private, PARAMETER :: kMinMuonRadius = 0.05
 min radius for muonmode, cm

kMaxRadius

real, private, PARAMETER :: kMaxRadius = 15.0
 maximum radius, cm

kMaxTant

real, private, PARAMETER :: kMaxTant = 7.999
 maximum tan(theta)

kCutQ

real, private, PARAMETER :: kCutQ = 10.0
 degrees

kCutRQ

real, private, PARAMETER :: kCutRQ = 0.4
 cm

kHUGEVAL

real, private, PARAMETER :: kHUGEVAL = 1E37
 huge value

kRadiusWindingGuessChanged

real, private, PARAMETER :: kRadiusWindingGuessChanged = 1.
cm

kSuccess

integer, private, PARAMETER :: kSuccess = 0
 no error

kFailUnknown

integer, private, PARAMETER :: kFailUnknown = 1
 unknown, unexpected error

kFailMinHits

integer, private, PARAMETER :: kFailMinHits = 2
 too few hits

kFailTooShort

integer, private, PARAMETER :: kFailTooShort = 3
 track is too short in z

kFailZeroRadius

integer, private, PARAMETER :: kFailZeroRadius = 4
 helix radius is zero

kFailMaxTant

integer, private, PARAMETER :: kFailMaxTant = 5
 failed max Tan(theta) cut

kFailBadRadius

integer, private, PARAMETER :: kFailBadRadius = 6
 helix radius is too big

kFailAnchors

integer, private, PARAMETER :: kFailAnchors = 7
 cannot find helix anchors

kFailBadPhaseCost

integer, private, PARAMETER :: kFailBadPhaseCost = 8
 xxx

kFailBadPhaseTant

integer, private, PARAMETER :: kFailBadPhaseTant = 9
 xxx

kFailNoCircles

integer, private, PARAMETER :: kFailNoCircles = 10
 cannot find any circle candidates

kFailNoTrack

integer, private, PARAMETER :: kFailNoTrack = 11
 cannot find any tracks

kFailHasGap

integer, private, PARAMETER :: kFailHasGap = 12
 track has a gap

iutime

integer (kind=I4), private, EXTERNAL :: iutime

Description of Subroutines and Functions

FirstGuessKOwindow

public subroutine FirstGuessKOwindow (iwindow, iStream)
    integer, INTENT(in) :: iwindow
    integer, INTENT(IN) :: iStream
    ! Calls: doGeneric, doMuon
end subroutine FirstGuessKOwindow

doGeneric

private subroutine doGeneric (iwindow, iStream)
    integer, INTENT(in) :: iwindow
    integer, INTENT(IN) :: iStream
    ! Calls: addFit, findHits, iterateSubtracks, printHits, removeHits
end subroutine doGeneric

removeHits

private subroutine removeHits (hits, fit)
    type (hits_type), INTENT(inout) :: hits
    type (fit_type), INTENT(in) :: fit
    ! Calls: compressHits, removeMult
end subroutine removeHits

doMuon

private subroutine doMuon (iwindow)
    integer, INTENT(in) :: iwindow
    ! Calls: FirstGuessKOmuon
end subroutine doMuon

FirstGuessKOmuon

public subroutine FirstGuessKOmuon (iwindow, fgresult)
    integer, INTENT(in) :: iwindow
    type (FGresult_type), INTENT(out) :: fgresult
    ! Calls: NewFit, findHits, iterateUV, printHits, storeFit
end subroutine FirstGuessKOmuon

NewUVfit

private subroutine NewUVfit (uvfit)
    type (uvfit_type), INTENT(out) :: uvfit
end subroutine NewUVfit

NewZPhiFit

private subroutine NewZPhiFit (zphifit)
    type (zphifit_type), INTENT(out) :: zphifit
end subroutine NewZPhiFit

NewFit

private subroutine NewFit (fit)
    type (fit_type), INTENT(out) :: fit
    ! Calls: NewUVFit, NewZPhiFit
end subroutine NewFit

PrintZPhiFit

private subroutine PrintZPhiFit (hits, fit, doPrintHits)
    type (hits_type), INTENT(in) :: hits
    type (zphifit_type), INTENT(in) :: fit
    logical, INTENT(in) :: doPrintHits
end subroutine PrintZPhiFit

storeFit

private subroutine storeFit (hits, fit, muonmode, fg)
    type (hits_type), INTENT(in) :: hits
    type (fit_type), INTENT(in) :: fit
    logical, INTENT(in) :: muonmode
    type (FGresult_type), INTENT(out) :: fg
    ! Calls: printzphifit
end subroutine storeFit

addFit

private subroutine addFit (hits, fit, muonmode)
    type (hits_type), INTENT(in) :: hits
    type (fit_type), INTENT(in) :: fit
    logical, INTENT(in) :: muonmode
    ! Calls: filltree, makebranch, setbranchvar, storeFit
end subroutine addFit

findHits

private subroutine findHits (iwindow, iStream, muonmode, hits)
    integer, INTENT(in) :: iwindow
    integer, INTENT(IN) :: iStream
    logical, INTENT(in) :: muonmode
    type (hits_type), INTENT(out) :: hits
    ! Calls: ClearHits, MergeSort, storeHit
end subroutine findHits

ClearHits

private subroutine ClearHits (hits)
    type (hits_type), INTENT(out) :: hits
end subroutine ClearHits

storeHit

private subroutine storeHit (hits, isDC, isFullyInstrumented, u, v, du, dv, z, s, w, numtdchits, tdchits)
    type (hits_type), INTENT(inout) :: hits
    logical, INTENT(in) :: isDC
    logical, INTENT(in) :: isFullyInstrumented
    real (kind=R8), INTENT(in) :: u
    real (kind=R8), INTENT(in) :: v
    real (kind=R8), INTENT(in) :: du
    real (kind=R8), INTENT(in) :: dv
    real (kind=R8), INTENT(in) :: z
    real (kind=R8), INTENT(in) :: s
    real (kind=R8), INTENT(in) :: w
    integer, INTENT(in) :: numtdchits
    integer, INTENT(in), dimension (:) :: tdchits
end subroutine storeHit

MergeSort

private subroutine MergeSort (hits, hits1, hits2)
    type (hits_type), INTENT(out) :: hits
    type (hits_type), INTENT(in) :: hits1
    type (hits_type), INTENT(in) :: hits2
    ! Calls: copyHit, fgkodie
end subroutine MergeSort

copyHit

private subroutine copyHit (dst, idst, src, isrc)
    type (hits_type), INTENT(inout) :: dst
    integer, INTENT(in) :: idst
    type (hits_type), INTENT(in) :: src
    integer, INTENT(in) :: isrc
end subroutine copyHit

printHits

private subroutine printHits (hits)
    type (hits_type), INTENT(in) :: hits
end subroutine printHits

iterateSubtracks

private subroutine iterateSubtracks (hits, muonmode, fit)
    type (hits_type), INTENT(in) :: hits
    logical, INTENT(in) :: muonmode
    type (fit_type), INTENT(out) :: fit
    ! Calls: iterateUV
end subroutine iterateSubtracks
$    if (rootTreeType .eq. 5) then
$       if (firsttime) then
$          firsttime = .false.
$          call makebranch("FGKO", &
$               "numhits/I:"// &
$               "mean/D:rms/D:isect/I:mean1/D:mean2/D:rms1/D:rms2/D"// &
$               "")
$          call setbranchvar("FGKO","numhits",hits%numhits)
$          call setbranchvar("FGKO","mean", meanmult)
$          call setbranchvar("FGKO","rms",  rmsmult)
$          call setbranchvar("FGKO","isect",bestsect)
$          call setbranchvar("FGKO","mean1",bestmult1)
$          call setbranchvar("FGKO","mean2",bestmult2)
$          call setbranchvar("FGKO","rms1", bestrms1)
$          call setbranchvar("FGKO","rms2", bestrms2)
$       end if
$
$       call filltree()
$    end if

iterateUV

private subroutine iterateUV (hits, ifirstHit, ilastHit, fit, muonmode)
    type (hits_type), INTENT(in) :: hits
    integer, INTENT(in) :: iFirstHit
    integer, INTENT(in) :: iLastHit
    type (fit_type), INTENT(out) :: fit
    logical, INTENT(in) :: muonmode
    ! Calls: ComputeAverageMultiplicity, ComputeEdges, ComputeTant, FudgeDeltaTrack, NewFit, NewZPhiFit, NewZphiFit, addFit, iteratePhase
end subroutine iterateUV

FudgeDeltaTrack

private subroutine FudgeDeltaTrack (uv, phase)
    type (uvfit_type), INTENT(inout) :: uv
    type (zphifit_type), INTENT(inout) :: phase
end subroutine FudgeDeltaTrack

ComputeEdges

private subroutine ComputeEdges (hits, ifirsthit, ilasthit, isEdge)
    type (hits_type), INTENT(in) :: hits
    integer, INTENT(in) :: iFirstHit
    integer, INTENT(in) :: iLastHit
    logical, INTENT(out), dimension (kMaxHits,kMaxMult) :: isEdge
end subroutine ComputeEdges

ComputeAverageMultiplicity

private subroutine ComputeAverageMultiplicity (hits, iFirstHit, iLastHit, avgU, avgV, avgA)
    type (hits_type), INTENT(in) :: hits
    integer, INTENT(in) :: iFirstHit
    integer, INTENT(in) :: iLastHit
    real (kind=R8), INTENT(out) :: avgU
    real (kind=R8), INTENT(out) :: avgV
    real (kind=R8), INTENT(out) :: avgA
end subroutine ComputeAverageMultiplicity

ComputeTant

private subroutine ComputeTant (hits, iFirstHit, iLastHit, minTant, maxTant)
    type (hits_type), INTENT(in) :: hits
    integer, INTENT(in) :: iFirstHit
    integer, INTENT(in) :: iLastHit
    real (kind=R8), INTENT(out) :: minTant
    real (kind=R8), INTENT(out) :: maxTant
end subroutine ComputeTant

FindMuonCircles

private function FindMuonCircles (hits, iFirstHit, iLastHit, idir, isEdge, numuvc, uvc, uvcindex)
    type (hits_type), INTENT(in) :: hits
    integer, INTENT(in) :: iFirstHit
    integer, INTENT(in) :: iLastHit
    integer, INTENT(in) :: idir
    logical, INTENT(in), dimension (kMaxHits,kMaxMult) :: isEdge
    integer, INTENT(out) :: numuvc
    type (uvfit_type), INTENT(out), dimension (:) :: uvc
    integer, INTENT(out), dimension (:) :: uvcindex
    integer :: FindMuonCircles
             return value
    ! Calls: ComputeCircleNorm
end function FindMuonCircles

FindCircles

private function FindCircles (hits, ifirsthit, ilasthit, idir, isEdge, numuvc, uvc, uvcindex)
    type (hits_type), INTENT(in) :: hits
    integer, INTENT(in) :: iFirstHit
    integer, INTENT(in) :: iLastHit
    integer, INTENT(in) :: idir
    logical, INTENT(in), dimension (kMaxHits,kMaxMult) :: isEdge
    integer, INTENT(out) :: numuvc
    type (uvfit_type), INTENT(out), dimension (:) :: uvc
    integer, INTENT(out), dimension (:) :: uvcindex
    integer :: FindCircles
             return value
    ! Calls: ComputeCircleNorm, fitUV5
end function FindCircles

FitUV5

private subroutine FitUV5 (hits, ia1, im1, ia2, im2, ia3, im3, fit)
    type (hits_type), INTENT(in) :: hits
    integer, INTENT(in) :: ia1
    integer, INTENT(in) :: im1
    integer, INTENT(in) :: ia2
    integer, INTENT(in) :: im2
    integer, INTENT(in) :: ia3
    integer, INTENT(in) :: im3
    type (uvfit_type), INTENT(out) :: fit
    ! Calls: NewUVfit, makeCircle
end subroutine FitUV5

makeCircle

private subroutine makeCircle (u, v, uc, vc, rc)
    real (kind=R8), INTENT(in), dimension (3) :: u
    real (kind=R8), INTENT(in), dimension (3) :: v
    real (kind=R8), INTENT(out) :: uc
    real (kind=R8), INTENT(out) :: vc
    real (kind=R8), INTENT(out) :: rc
end subroutine makeCircle

ComputeCircleNorm

private subroutine ComputeCircleNorm (hits, ifirst, ilast, isEdge, fituv)
    type (hits_type), intent(in) :: hits
    integer, intent(in) :: ifirst
    integer, intent(in) :: ilast
    logical, INTENT(in), dimension (kMaxHits,kMaxMult) :: isEdge
    type (uvfit_type), intent(inout) :: fituv
end subroutine ComputeCircleNorm

iteratePhase

private subroutine iteratePhase (hits, iFirstHit, iLastHit, isEdge, fit, uv, muonmode, phase)
    type (hits_type), INTENT(in) :: hits
    integer, INTENT(in) :: iFirstHit
    integer, INTENT(in) :: iLastHit
    logical, INTENT(in), dimension (kMaxHits,kMaxMult) :: isEdge
    type (fit_type), INTENT(in) :: fit
    type (uvfit_type), INTENT(in) :: uv
    logical, INTENT(in) :: muonmode
    type (zphifit_type), INTENT(out) :: phase
    ! Calls: NewZphiFit, addFit, tryPhase
end subroutine iteratePhase

tryPhase

private subroutine tryPhase (hits, hitsr, hitsp, hitsdp, r0, ifirst, ilast, ia1, im1, ia2, im2, iwind, minTant, maxTant, muonmode, phase)
    type (hits_type), INTENT(in) :: hits
    real (kind=R8), INTENT(in), dimension (:,:) :: hitsr
    real (kind=R8), INTENT(in), dimension (:,:) :: hitsp
    real (kind=R8), INTENT(in), dimension (:,:) :: hitsdp
    real (kind=R8), INTENT(in) :: r0
    integer, INTENT(in) :: ifirst
             first and last hits of subtrack
    integer, INTENT(in) :: ilast
             first and last hits of subtrack
    integer, INTENT(in) :: ia1
             first anchor
    integer, INTENT(in) :: im1
             first anchor
    integer, INTENT(in) :: ia2
             last anchor
    integer, INTENT(in) :: im2
             last anchor
    integer, INTENT(in) :: iwind
             anchor windings
    real (kind=R8), INTENT(in) :: minTant
             minimum and maximum tan(theta) allowed by cluster size
    real (kind=R8), INTENT(in) :: maxTant
             minimum and maximum tan(theta) allowed by cluster size
    logical, INTENT(in) :: muonmode
             true if particle is muon
    type (zphifit_type), INTENT(out) :: phase
    ! Calls: NewZPhiFit, fgkodie
end subroutine tryPhase

angleDiff

private function angleDiff (a, b)
    real (kind=R8), INTENT(in) :: a
    real (kind=R8), INTENT(in) :: b
    real (kind=R8) :: angleDiff
end function angleDiff

reduce

private function reduce (a)
    real (kind=R8), INTENT(in) :: a
    real (kind=R8) :: reduce
end function reduce

rad2deg

private function rad2deg (a)
    real (kind=R8), INTENT(in) :: a
    real (kind=R8) :: rad2deg
end function rad2deg

deg2rad

private function deg2rad (a)
    real (kind=R8), INTENT(in) :: a
    real (kind=R8) :: deg2rad
end function deg2rad

jsign

private function jsign (a) result (ival)
    real (kind=R8), INTENT(in) :: a
    integer :: ival
end function jsign

sqr

private function sqr (x) result (x2)
    real (kind=R8), INTENT(in) :: x
    real (kind=R8) :: x2
end function sqr

Fgkodie

private subroutine Fgkodie ()
    ! Calls: kerror
end subroutine Fgkodie
 SUBROUTINE fgkodie

 "call fgkodie" prints the current run and event number and kills mofia.

 It is used like C "assert": to bomb out on internal errors
 and other unrecoverable or unhandled situations, where processing
 further events is dangerous and meaningless unless the asserted
 condition is fixed. K.O.

kcutrq2

private function kcutrq2 (x) result (x2)
    real (kind=R8), INTENT(in) :: x
    real (kind=R8) :: x2
end function kcutrq2