In this section I give a brief example (of anal1, anal2, anal3 routines) of how kwfit is used, from initialization to fitting, for building D0 --> K pi combinations. All calls to kwfit routines are hyperlinked to the documentation for those routines.
subroutine anal1
* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
* Called at beginning of job
* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
c Initialization of kwfit
call kset_init
return
end
subroutine anal2
* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
* Called once per run
* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
implicit none
#include "seq/clinc/anclev.inc"
integer I
logical ltesla
double precision beam_pos(3), beam_sig(3)
double precision bfield, bdir(3)
real bscale
data bdir/0., 0., 1./
* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
c Set beam position & width
c You need to do this in case you make vertices weighted by the
c beam spot
c All quantities must be double precision
do I=1,3
beam_pos(I) = dble(bmpos(I,1)) !dble function actually not needed
beam_sig(I) = dble(bmpos(I,2))
enddo
call kset_beam_position(beam_pos, beam_sig)
c Set B field (including bfudge correction) and direction
c Remember that bfie is in kGauss & set ltesla accordingly
call bfudge(runn, bscale)
bfield = dble(bfie * bscale) !dble function actually not needed
ltesla = .FALSE.
call kset_bfield(bfield, bdir, ltesla)
return
end
subroutine anal3
* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
* Called once per event
* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
implicit none
#include "seq/clinc/anclev.inc"
c Externals
double precision kget_track_mass
external kget_track_mass
c Local variables
integer I, type, error, update, list_d0(2), option_d0(2)
integer ipi, iK, npi, nK, list_pi(100), list_K(100)
logical lcovar, ldedx, lvtx
double precision w_K(10), w_pi(10), w_d0(10), chisq
double precision chisq_d0, chisq_mass, mass_d0
double precision vtx(3), Vvtx(3,3)
c Clear the kwfit track list every event
call kset_clear
c Get CD tracks
call getcd
c Make list of pions and kaons from CD tracks. We want
c the covariance matrix built but no dE/dx correction is
c necessary because the tracks have already been Kalman fit.
c The list of kwfit tracks is returned in list_pi and list_K
lcovar = .TRUE.
ldedx = .FALSE.
type = 3
call kfil_track_cd_all(type, ldedx, lcovar, npi, list_pi, error)
type = 4
call kfil_track_cd_all(typr, lcovar, lcovar, nK, list_K, error)
c Now loop over K, pi lists and build D0's
do iK=1,nK
call kget_track_param(list_K(iK), w_K)
do ipi=1,npi
call kget_track_param(list_pi(ipi), w_pi)
mass_d0 = kutl_mass2(w_k, w_pi)
c Find the vertex of the K-pi pair. Do not update the tracks at this time.
update = 0
list_d0(1) = list_K(iK)
list_d0(2) = list_pi(ipi)
lvtx = .FALSE.
call kvtx_unknown(2, list_d0, update, lvtx, vtx, Vvtx, chisq, error)
c If the chisq is OK, update the input tracks. The update will cause the
c track parameters to be adjusted in such a way as to make them pass through
c the new vertex point (However, the (x, y, z) location of the tracks
c will not necessarily be at the vertex point. To make that happen, you
c must call ktrk_move_point_bend to move the tracks and covariance matrices
c to the new vertex point). The covariance matrices of the tracks are not
c changed.
if(chisq .lt. 10.) call kfit_update_tracks(1)
c Alternatively, you can build a D0 particle with a vertex constraint
c (to a previously unknown position). The chisq_d0 is from the vertex
c constraint. The D0 track parameters and covariance matrix are evaluated
c at the vertex point.
option_d0(1) = 2
option_d0(2) = 2
update = 0
lvtx = .FALSE.
c First create a new track entry then fill it with the virtual particle
call kfil_track_create(kd0)
call kvir_vertex_unknown(2, list_d0, option_d0, update, lvtx, vtx,
* chisq_d0, kd0, error)
c Check the Kpi mass. If OK, apply a mass constraint forcing the D0 to
c have the correct mass. The idea is to improve the D0 track parameters
c so that the D0 can be used in subsequent fits.
mass_d0 = kget_track_mass(kd0)
if(abs(mass_d0 - 1.8654) .lt. 0.010) then
update = 2
call kfit_mass(kd0, update, 1.865, chisq_mass, error)
endif
enddo
enddo
return
end