(file) Return to simc.f CVS log (file) (dir) Up to [HallC] / simc_gfortran

File: [HallC] / simc_gfortran / simc.f (download)
Revision: 1.4, Mon Mar 12 20:37:00 2012 UTC (12 years, 6 months ago) by jones
Branch: MAIN
CVS Tags: HEAD
Changes since 1.3: +9 -5 lines
Add additional SHMS "STOP" counter to output file

	program simc

! Last modified:
!
!	This program represents variations on themes by
!		N. C. R. Makins (Argonne National Lab),
!		T. G. O'Neill (Argonne National Lab), and
!		Seemingly Countless Others (Virtually Everywhere).
!
	implicit none
!	include 'simulate_init.inc'
	include 'simulate.inc'
	include 'histograms_init.inc'
	include 'radc.inc'
	include 'hbook.inc'
	include 'sos/struct_sos.inc'
	include 'hms/struct_hms.inc'
	include 'hrsr/struct_hrsr.inc'
	include 'hrsl/struct_hrsl.inc'
	include 'shms/struct_shms.inc'
	include 'calo/struct_calo.inc'

	integer*4	i, ninform
	integer*8       itime1,itime2
	real*8		r, sum_sigcc, tmpnum
	real*8		domega_e, domega_p !populated e/hadron solid angles.
	logical		success
	logical		pass_cuts
	character	filename*80, genfile*80, histfile*80, timestring1*30
	character	timestring2*30,genifile*80
	type(event)::		vertex, vertex0, orig, recon
	type(event_main)::	main
	type(contribtype)::	contrib
	type(histograms)::	H
	type(event_central)::	central
	type(sums_twoarm)::	sumerr, sumerr2, aveerr, resol

	real*8 one
	parameter (one=1.0d0)	!double precision 1 for subroutine calls

	real*8 grnd
	real*8 ang_targ_earm,ang_targ_parm
c 

! INITIALIZE
!-----------

! ... initialize all the *min/max variables here since we can 
! ... no longer do it in the * include file
	call min_max_init(contrib)

	

! ... initialize histogram area for HBOOK

	call hlimit(PawSize)

! ... read in the data base

	call dbase_read(H)

	if (debug(3)) write(6,*) 'Main after dbrd: p,e th',
     >	    spec%p%theta,spec%e%theta,using_P_arm_montecarlo,using_E_arm_montecarlo

! ... open diagnostic ntuple file, if requested

	i = index(base,' ')
	if (Nntu.gt.0) then
	  filename = 'worksim/'//base(1:i-1)//'.rzdat'
	  call NtupleInit(filename)
	endif

! ... set up some quantities that the radiative corrections routines will need
! ... N.B. Call this even if we're not using radiative corrections -- the
! ... target thicknesses seen by the incoming and
! ... scattered particles (in radiation lengths) are determined here, and
! ... are needed for the multiple scattering calculations
! ... done in the Monte Carlos.

	if (debug(2)) write(6,*)'sim: calling radc_init'
	call radc_init
	if (debug(2)) write(6,*)'sim: done with radc_init'

! ... compute some quantities for a central event

	call calculate_central(central,vertex0)
	if (debug(2)) write(6,*)'sim: done with calc_central'
	if (debug(2)) write(6,*)'central%sigcc=',central%sigcc
	if (debug(4)) write(6,*)'sim: at 1'

	targetfac=targ%mass_amu/3.75914d+6/(targ%abundancy/100.)
     >		*abs(cos(targ%angle))/(targ%thick*1000.)
	if (debug(4)) write(6,*)'sim: at 2'

! ... Note: EXPER.charge is in mC and the luminosity comes out in fm^-2
! ...   now luminosity is in ub^-1

	luminosity = EXPER%charge/targetfac
	if (debug(4)) write(6,*)'sim: at 3'

! ... initialize the random number generator and number of attempts

	r = grnd()
	ntried = 0

! GAW - insert calls to initialize target field for both arms
! mkj 10-20-2003 add if statements to determine the angle magnitude
!                and sign between target direction and e-arm or p-arm.
!       
	if(using_tgt_field) then
	   if ( degrad*abs(targ_Bphi-spec%e%phi) .lt. .01) then
	      if (targ_Bangle .ge. spec%e%theta) then
		 ang_targ_earm = -1*sin(spec%e%phi)*(targ_Bangle-spec%e%theta)
	      else
		 ang_targ_earm = +1*sin(spec%e%phi)*(spec%e%theta-targ_Bangle)
	      endif
	   elseif ( degrad*abs(targ_Bphi-spec%e%phi)-180.0 .lt. .01) then 
	      ang_targ_earm = +1*sin(spec%e%phi)*(targ_Bangle+spec%e%theta)
	   else
	      write(*,*) ' Error determining angle between target and e-arm'
	      write(*,*) ' targ_Bangle =',targ_Bangle*degrad,' targ_Bphi =',targ_Bphi*degrad
	      write(*,*) ' Central e-arm angle =',spec%e%theta*degrad,' e-arm phi =',spec%e%phi*degrad
	   endif
c
	   if ( degrad*abs(targ_Bphi-spec%p%phi) .lt. .01) then
	      if (targ_Bangle .ge. spec%p%theta) then
		 ang_targ_parm = -1*sin(spec%p%phi)*(targ_Bangle-spec%p%theta)
	      else
		 ang_targ_parm = +1*sin(spec%p%phi)*(targ_Bangle-spec%p%theta)
	      endif
	   elseif ( degrad*abs(targ_Bphi-spec%p%phi)-180.0 .lt. .01) then 
	      ang_targ_parm = +1*sin(spec%p%phi)*(targ_Bangle+spec%p%theta)
	   else
	      write(*,*) ' Error determining angle between target and p-arm'
	      write(*,*) ' targ_Bangle =',targ_Bangle*degrad,' targ_Bphi =',targ_Bphi*degrad
	      write(*,*) ' Central p-arm angle =',spec%p%theta*degrad,' p-arm phi =',spec%p%theta*degrad
	   endif
c
	   write(*,*) ' targ_Bangle =',targ_Bangle*degrad,' targ_Bphi =',targ_Bphi*degrad
	   write(*,*) ' Angle between target and e-arm',ang_targ_earm*degrad	
	   write(*,*) ' Angle between target and p-arm',ang_targ_parm*degrad	
c

	   call trgInit(tgt_field_file,ang_targ_earm*degrad,0.,
     >      	ang_targ_parm*degrad,0.)
	endif

! LOOP OVER SIMULATED EVENTS
!---------------------------
	write(6,*) ' '
	itime1=time8()
	call ctime(itime1,timestring1)
cdg	call date (timestring1)
cdg	call time (timestring1(11:23))
	nevent = 0
	ninform = 1000
	sum_sigcc = 0.0	!sum of main.sigcc (for generating ave sigcc)

	do while (nevent.lt.abs(ngen))

! reset decay distance, initial hadron mass (modified if particle decays),
! and some ntuple variables.

	  Mh2_final = Mh2
	  ntup%radphot = 0.0
	  ntup%radarm = 0.0
	  decdist = 0.0		!decay distance.
	  ntup%resfac = 0.0
	  ntup%sigcm = 0.0
	  ntup%krel = 0.0
	  ntup%mm = 0.0
	  ntup%mmA = 0.0
	  ntup%t = 0.0

! Setup for this event

! ... keep the human interested

	  ntried = ntried + 1

	  if(debug(2)) then
     	    write(6,*)'********************************************'
	    write(6,*)'SIM:  ntried =',ntried
	    write(6,*)'      ncontribute =',ncontribute
	  endif

	  if (mod(ntried,ninform).eq.1) then
	    write (6,'(1x,a,i9,a,i8,a,e11.4)') 'Generating Event',
     >		ntried, ' ... ', nevent,'  successes so far - Monitor:',
     >		wtcontribute*luminosity/ntried
	    if (ntried.ge.5000) ninform = 20000
	  endif

! ... generate an event
	  call generate(main,vertex,orig,success)
	  if(debug(2)) write(6,*)'sim: after gen, success =',success

! Run the event through various manipulations, checking to see whether
! it made it at each stage

! ... run through spectrometers and check SP cuts

	  if(debug(3)) write(6,*)'sim: before mc: orig.p.E =',orig%p%E
	  if(success)call montecarlo(orig,main,recon,success)
	  if(debug(2)) write(6,*)'sim: after mc, success =',success

! ... calculate everything else about the event

	  if (success) then
	    call complete_recon_ev(recon,success)
	  endif

	  if(debug(2)) write(6,*)'sim: after comp_ev, success =',success
	  if(debug(5)) write(6,*) 'recon%Em,recon%Pm',recon%Em,recon%Pm
! ... calculate remaining pieces of the main structure

	  if (success) call complete_main(.false.,main,vertex,vertex0,recon,success)
! ... Apply SPedge cuts to success if hard_cuts is set.
	    pass_cuts = .not. (
     >	      recon%e%delta .le. (SPedge%e%delta%min+slop%MC%e%delta%used) .or.
     >	      recon%e%delta .ge. (SPedge%e%delta%max-slop%MC%e%delta%used) .or.
     >	      recon%e%yptar .le. (SPedge%e%yptar%min+slop%MC%e%yptar%used) .or.
     >	      recon%e%yptar .ge. (SPedge%e%yptar%max-slop%MC%e%yptar%used) .or.
     >	      recon%e%xptar .le. (SPedge%e%xptar%min+slop%MC%e%xptar%used) .or.
     >	      recon%e%xptar .ge. (SPedge%e%xptar%max-slop%MC%e%xptar%used) .or.
     >	      recon%p%delta .le. (SPedge%p%delta%min+slop%MC%p%delta%used) .or.
     >	      recon%p%delta .ge. (SPedge%e%delta%max-slop%MC%p%delta%used) .or.
     >	      recon%p%yptar .le. (SPedge%p%yptar%min+slop%MC%p%yptar%used) .or.
     >	      recon%p%yptar .ge. (SPedge%p%yptar%max-slop%MC%p%yptar%used) .or.
     >	      recon%p%xptar .le. (SPedge%p%xptar%min+slop%MC%p%xptar%used) .or.
     >	      recon%p%xptar .ge. (SPedge%p%xptar%max-slop%MC%p%xptar%used) )

	  if (hard_cuts) then		!apply spec. limit and Em cuts.
	    if (.not.pass_cuts) success = .false.
	    if (doing_eep .and. (recon%Em .gt. cuts%Em%max)) success = .false.
	  endif

	  if (success) sum_sigcc = sum_sigcc + main%sigcc

! Em and Pm histos are NEW.  Check that they don't suffer from energy
! shifts (e.g. coulomb distortions - see update_range call in limits_update).

	  if(ntried.gt.0)then
	    call inc(H%geni%e%delta, vertex%e%delta, one)
	    call inc(H%geni%e%yptar, vertex%e%yptar, one)
	    call inc(H%geni%e%xptar, -vertex%e%xptar, one)
	    call inc(H%geni%p%delta, vertex%p%delta, one)
	    call inc(H%geni%p%yptar, vertex%p%yptar, one)
	    call inc(H%geni%p%xptar, -vertex%p%xptar, one)
	    call inc(H%geni%Em, vertex%Em, one)
	    call inc(H%geni%Pm, vertex%Pm, one)
	  endif

	  if (success) then
	    if (debug(2)) write(6,*)'sim: We have a success!'

! ... Output ntuple and histograms if passed all cuts, or if not using
! ... SPedge limits as hard cuts.

! ... increment the "experimental" spectrometer arm and "contribution"
! ... histograms
	    call inc(H%RECON%e%delta, main%RECON%e%delta, main%weight)
	    call inc(H%RECON%e%yptar, main%RECON%e%yptar, main%weight)
	    call inc(H%RECON%e%xptar, main%RECON%e%xptar, main%weight)
	    call inc(H%RECON%p%delta, main%RECON%p%delta, main%weight)
	    call inc(H%RECON%p%yptar, main%RECON%p%yptar, main%weight)
	    call inc(H%RECON%p%xptar, main%RECON%p%xptar, main%weight)
	    call inc(H%RECON%Em, recon%Em, one)
	    call inc(H%RECON%Pm, recon%Pm, one)
	    call inc(H%gen%e%delta, vertex%e%delta, one)
	    call inc(H%gen%e%yptar, vertex%e%yptar, one)
	    call inc(H%gen%e%xptar, -vertex%e%xptar, one)
	    call inc(H%gen%p%delta, vertex%p%delta, one)
	    call inc(H%gen%p%yptar, vertex%p%yptar, one)
	    call inc(H%gen%p%xptar, -vertex%p%xptar, one)
	    call inc(H%gen%Em, vertex%Em, one)
	    
! ... update counters and integrated weights AND keep track of resolution
! ...  FOR EVENTS INSIDE OF spectrometer population limits (events are only
! ...  generated to fill region inside of the given delta limits) and below
! ...  cuts.Em.max (used for elastic/quasielastic only).

	    if (debug(4)) write(6,*)'sim: cut'

	    ncontribute = ncontribute + 1
	    if (debug(4)) write(6,*)'sim: ncontribute =',ncontribute
	    if (.not.rad_proton_this_ev) ncontribute_no_rad_proton =
     >			ncontribute_no_rad_proton + 1


! Using main.SP.e.delta means that we correct for eloss/coulomb, which we
! shouldn't do. Using vertex.e.delta means radiation counts as error in recon.
! --> USE MAIN.SP AND UNDERESTIMATE RESOLUTION (MISSING TARGET ELOSS)

! For xptar/yptar, main.SP.e.xptar/yptar corrects for mult. scatt. --> USE VERTEX.

! For z, we HAVE to use main.SP.e.z, but there are not corrections, so USE MAIN.SP
!  vertex.e.z is not defined (main.target.x/y/z --> y_E_arm
!  (offsets and rotation)  --> spectrometer M.C. --> RECON.e.z 

	    if (pass_cuts) then
	      npasscuts = npasscuts + 1
	      wtcontribute = wtcontribute + main%weight
	      sumerr%e%delta = sumerr%e%delta + (recon%e%delta - main%SP%e%delta)
	      sumerr%e%xptar = sumerr%e%xptar + (recon%e%xptar - vertex%e%xptar)
	      sumerr%e%yptar = sumerr%e%yptar + (recon%e%yptar - vertex%e%yptar)
	      sumerr%e%ytar  = sumerr%e%ytar  + (recon%e%z  - main%SP%e%z)
	      sumerr%p%delta = sumerr%p%delta + (recon%p%delta - main%SP%p%delta)
	      sumerr%p%xptar = sumerr%p%xptar + (recon%p%xptar - vertex%p%xptar)
	      sumerr%p%yptar = sumerr%p%yptar + (recon%p%yptar - vertex%p%yptar)
	      sumerr%p%ytar  = sumerr%p%ytar  + (recon%p%z  - main%SP%p%z)
	      sumerr2%e%delta= sumerr2%e%delta + (recon%e%delta - main%SP%e%delta)**2
	      sumerr2%e%xptar= sumerr2%e%xptar + (recon%e%xptar - vertex%e%xptar)**2
	      sumerr2%e%yptar= sumerr2%e%yptar + (recon%e%yptar - vertex%e%yptar)**2
	      sumerr2%e%ytar = sumerr2%e%ytar  + (recon%e%z  - main%SP%e%z)**2
	      sumerr2%p%delta= sumerr2%p%delta + (recon%p%delta - main%SP%p%delta)**2
	      sumerr2%p%xptar= sumerr2%p%xptar + (recon%p%xptar - vertex%p%xptar)**2
	      sumerr2%p%yptar= sumerr2%p%yptar + (recon%p%yptar - vertex%p%yptar)**2
	      sumerr2%p%ytar = sumerr2%p%ytar  + (recon%p%z  - main%SP%p%z)**2
	    endif

! ... update the "contribution" and "slop" limits
	    call limits_update(main,vertex,orig,recon,doing_deuterium,
     >		doing_pion,doing_kaon,doing_delta,doing_rho,contrib,slop)

	  endif ! <success>

! ... write out line to diagnostic ntuple file, if requested
	  if (Nntu.gt.0) call results_ntu_write(main,vertex,orig,recon,success)
! END of LOOP over events
! Cute thing here, if ngen < 0, then just make |ngen| ATTEMPTS rather than
! insisting on ngen good events ... this is suitable for tests with new
! and uncertain parameters, you don't want the program fishing around all
! day for an event!

	  if (ngen.lt.0) then
	    nevent = nevent+1
	  else
	    if (success) nevent = nevent+1
	  endif
	enddo ! <loop over ntried>


! END GAME: NORMALIZE, GENERATE OUTPUT
!-------------------------------------

! Our last event announcement ... and how long did it all take?
	write (6,'(1x,''---> Last Event '',i9,'' ...'',i9,''  successes'')') ntried, nevent
	itime2=time8()
	call ctime(itime2,timestring2)
c	call date (timestring2)
c	call time (timestring2(11:23))

! NORMALIZE!

! ... put in the luminosity and efficiency factors

	normfac = luminosity/ntried*nevent

! ... multiply in the relevant phase spaces (see event.f for description
! ... of generated variables.  Electron angles for all cases.
! ... add hadron angles and electron energy for all but H(e,e'p).
! ... add hadron energy for A(e,e'p) (what about phase_space?)
! ... Cross sections are all in microbarn/MeV**i/sr**j (i,j depend on reaction)

	domega_e=(gen%e%yptar%max-gen%e%yptar%min)*(gen%e%xptar%max-gen%e%xptar%min)
	if(doing_rho) then
	   domega_p = 4.*pi
	else
	   domega_p=(gen%p%yptar%max-gen%p%yptar%min)*(gen%p%xptar%max-gen%p%xptar%min)
	endif

	genvol = domega_e
!	genvol_inclusive = genvol	!may want dOmega, or dE*dOmega

! ... 2-fold to 5-fold.
	if (doing_deuterium.or.doing_heavy.or.doing_pion.or.doing_kaon
     >      .or.doing_delta.or.doing_rho .or. doing_semi) then
	  genvol = genvol * domega_p * (gen%e%E%max-gen%e%E%min)
	endif

	if (doing_heavy.or.doing_semi) then		!6-fold
	  genvol = genvol * (gen%p%E%max-gen%p%E%min)	
	endif

	normfac = normfac * genvol
	if (doing_phsp) normfac = 1.0
	wtcontribute = wtcontribute*normfac

! Close diagnostic ntuple file, if used

	if (Nntu.gt.0) call NtupleClose(filename)

! Calculate resolutions

	if (npasscuts.gt.1) then
	  tmpnum = dble(npasscuts)
	  aveerr%e%delta = sumerr%e%delta/tmpnum
	  aveerr%e%xptar = sumerr%e%xptar/tmpnum
	  aveerr%e%yptar = sumerr%e%yptar/tmpnum
	  aveerr%e%ytar  = sumerr%e%ytar /tmpnum
	  aveerr%p%delta = sumerr%p%delta/tmpnum
	  aveerr%p%xptar = sumerr%p%xptar/tmpnum
	  aveerr%p%yptar = sumerr%p%yptar/tmpnum
	  aveerr%p%ytar  = sumerr%p%ytar /tmpnum
	  resol%e%delta = sqrt(max(0.,(sumerr2%e%delta/tmpnum) -
     >				     (sumerr%e%delta/tmpnum)**2 ))
	  resol%e%xptar = sqrt(max(0.,(sumerr2%e%xptar/tmpnum) -
     >				     (sumerr%e%xptar/tmpnum)**2 ))
	  resol%e%yptar = sqrt(max(0.,(sumerr2%e%yptar/tmpnum) -
     >				     (sumerr%e%yptar/tmpnum)**2 ))
	  resol%e%ytar  = sqrt(max(0.,(sumerr2%e%ytar/tmpnum) -
     >				     (sumerr%e%ytar/tmpnum)**2 ))
	  resol%p%delta = sqrt(max(0.,(sumerr2%p%delta/tmpnum) -
     >				     (sumerr%p%delta/tmpnum)**2 ))
	  resol%p%xptar = sqrt(max(0.,(sumerr2%p%xptar/tmpnum) -
     >				     (sumerr%p%xptar/tmpnum)**2 ))
	  resol%p%yptar = sqrt(max(0.,(sumerr2%p%yptar/tmpnum) -
     >				     (sumerr%p%yptar/tmpnum)**2 ))
	  resol%p%ytar  = sqrt(max(0.,(sumerr2%p%ytar/tmpnum) -
     >				     (sumerr%p%ytar/tmpnum)**2 ))
	endif

!	write(6,9910) 'e- delta=',10.*aveerr.e.delta,10.*resol.e.delta,'x10^-3'
!	write(6,9910) 'e- xptar=',1000.*aveerr.e.xptar,1000.*resol.e.xptar,'mr'
!	write(6,9910) 'e- yptar=',1000.*aveerr.e.yptar,1000.*resol.e.yptar,'mr'
!	write(6,9910) 'e- ytar =',10.*aveerr.e.ytar,10.*resol.e.ytar ,'mm'
!	write(6,9910) 'p  delta=',10.*aveerr.p.delta,10.*resol.p.delta,'x10-3'
!	write(6,9910) 'p  xptar=',1000.*aveerr.p.xptar,1000.*resol.p.xptar,'mr'
!	write(6,9910) 'p  yptar=',1000.*aveerr.p.yptar,1000.*resol.p.yptar,'mr'
!	write(6,9910) 'p  ytar =',10.*aveerr.p.ytar,10.*resol.p.ytar,'mm'
!9910	format(1x,a10,2f10.3,3x,a)

! Produce output files

900	if (ngen.eq.0) goto 1000

! ... the diagnostic histograms

	i = index(base,' ')
	genfile = ' '
	write(genfile,'(a,''.gen'')') 'outfiles/'//base(1:i-1)
	genifile = ' '
	write(genifile,'(a,''.geni'')') 'outfiles/'//base(1:i-1)
	histfile = ' '
	write(histfile,'(a,''.hist'')') 'outfiles/'//base(1:i-1)
	write(6,'(1x,''... writing '',a)') genfile

	write(6,*) 'Come back soon!'

	open(unit=7, file=genifile, status='unknown')
	if (electron_arm.eq.1 .or. hadron_arm.eq.1) then
	  write(7,*) 'HMS Trials:           ',hSTOP_trials
	  write(7,*) 'Slit hor/vert/corners ',hSTOP_slit_hor,hSTOP_slit_vert,hSTOP_slit_oct
	  write(7,*) 'Q1 entrance/mid/exit  ',hSTOP_Q1_in,hSTOP_Q1_mid,hSTOP_Q1_out
	  write(7,*) 'Q2 entrance/mid/exit  ',hSTOP_Q2_in,hSTOP_Q2_mid,hSTOP_Q2_out
	  write(7,*) 'Q3 entrance/mid/exit  ',hSTOP_Q3_in,hSTOP_Q3_mid,hSTOP_Q3_out
	  write(7,*) 'Dipole entrance/exit  ',hSTOP_D1_in,hSTOP_D1_out
	  write(7,*) 'Events reaching hut   ',hSTOP_hut
	  write(7,*) 'DC1, DC2, Scin, Cal   ',hSTOP_dc1,hSTOP_dc2,hSTOP_scin,hSTOP_cal
	  write(7,*) 'Successes             ',hSTOP_successes
	  write(7,*)
	endif
	if (electron_arm.eq.2 .or. hadron_arm.eq.2) then
	  write(7,*) 'SOS Trials:           ',sSTOP_trials
	  write(7,*) 'Slit hor/vert/corners ',sSTOP_slit_vert,sSTOP_slit_hor,sSTOP_slit_oct
	  write(7,*) 'Quad entrance/mid/exit',sSTOP_quad_in,sSTOP_quad_mid,sSTOP_quad_out
	  write(7,*) 'D1 entrance/exit      ',sSTOP_bm01_in,sSTOP_bm01_out
	  write(7,*) 'D2 entrance/exit      ',sSTOP_bm02_in,sSTOP_bm02_out
	  write(7,*) 'Vacuum exit           ',sSTOP_exit
	  write(7,*) 'Events reaching hut   ',sSTOP_hut
	  write(7,*) 'DC1, DC2, Scin, Cal   ',sSTOP_dc1,sSTOP_dc2,sSTOP_scin,sSTOP_cal
	  write(7,*) 'Successes             ',sSTOP_successes
	  write(7,*) 
	endif
	if (electron_arm.eq.3 .or. hadron_arm.eq.3) then
	  write(7,*) 'HRSr Trials:          ',rSTOP_trials
	  write(7,*) 'Slit hor/vert         ',rSTOP_slit_vert,rSTOP_slit_hor
	  write(7,*) 'Q1 entrance/mid/exit  ',rSTOP_Q1_in,rSTOP_Q1_mid,rSTOP_Q1_out
	  write(7,*) 'Q2 entrance/mid/exit  ',rSTOP_Q2_in,rSTOP_Q2_mid,rSTOP_Q2_out
	  write(7,*) 'Dipole entrance/exit  ',rSTOP_D1_in,rSTOP_D1_out
	  write(7,*) 'Q3 entrance/mid/exit  ',rSTOP_Q3_in,rSTOP_Q3_mid,rSTOP_Q3_out
	  write(7,*) 'Events reaching hut   ',rSTOP_hut
	  write(7,*) 'VDC1, VDC2            ',rSTOP_dc1,rSTOP_dc2
	  write(7,*) 'S1, S2, Cal	    ',rSTOP_s1,rSTOP_s2,rSTOP_cal
	  write(7,*)
	endif
	if (electron_arm.eq.4 .or. hadron_arm.eq.4) then
	  write(7,*) 'HRSl Trials:          ',lSTOP_trials
	  write(7,*) 'Slit hor/vert         ',lSTOP_slit_vert,lSTOP_slit_hor
	  write(7,*) 'Q1 entrance/mid/exit  ',lSTOP_Q1_in,lSTOP_Q1_mid,lSTOP_Q1_out
	  write(7,*) 'Q2 entrance/mid/exit  ',lSTOP_Q2_in,lSTOP_Q2_mid,lSTOP_Q2_out
	  write(7,*) 'Dipole entrance/exit  ',lSTOP_D1_in,lSTOP_D1_out
	  write(7,*) 'Q3 entrance/mid/exit  ',lSTOP_Q3_in,lSTOP_Q3_mid,lSTOP_Q3_out
	  write(7,*) 'Events reaching hut   ',lSTOP_hut
	  write(7,*) 'VDC1, VDC2            ',lSTOP_dc1,lSTOP_dc2
	  write(7,*) 'S1, S2, Cal	    ',lSTOP_s1,lSTOP_s2,lSTOP_cal
	endif
	if (electron_arm.eq.5 .or. hadron_arm.eq.5 .or.
     >	    electron_arm.eq.6 .or. hadron_arm.eq.6) then
	  write(7,*) 'SHMS Trials:          ',shmsSTOP_trials
	  write(7,*) 'HB phys entrance/mag entr/mag exit/phys exit  ',shmsSTOP_hb_in,shmsSTOP_hb_men,shmsSTOP_hb_mex,shmsSTOP_hb_out
	  write(7,*) 'Slit hor/vert/corners ',shmsSTOP_slit_hor,shmsSTOP_slit_vert,shmsSTOP_slit_oct
	  write(7,*) 'Q1 phys entrance/mag entr/mid/mag exit/phys exit  '
     >,shmsSTOP_q1_in,shmsSTOP_q1_men,shmsSTOP_q1_mid,shmsSTOP_q1_mex,shmsSTOP_q1_out
	  write(7,*) 'Q2 phys entrance/mag entr/mid/mag exit/phys exit  '
     >,shmsSTOP_q2_in,shmsSTOP_q2_men,shmsSTOP_q2_mid,shmsSTOP_q2_mex,shmsSTOP_q2_out
	  write(7,*) 'Q3 phys entrance/mag entr/mid/mag exit/phys exit       '
     >,shmsSTOP_q3_in,shmsSTOP_q3_men,shmsSTOP_q2_mid,shmsSTOP_q3_mex,shmsSTOP_q3_out
	  write(7,*) 'D1 entrance/flare/mid 1-2   ',shmsSTOP_D1_in,shmsSTOP_D1_flr,shmsSTOP_D1_mid1,shmsSTOP_D1_mid2
	  write(7,*) 'D1 mid 3-5            ',shmsSTOP_D1_mid3,shmsSTOP_D1_mid4,shmsSTOP_D1_mid5
	  write(7,*) 'D1 mid 6-7/mag exit/phys exit         ',shmsSTOP_D1_mid6,shmsSTOP_D1_mid7,shmsSTOP_D1_mex,shmsSTOP_D1_out
c	  write(7,*) 'BP thingie in/out     ',shmsSTOP_BP_in,shmsSTOP_BP_out
	  write(7,*) 'Events reaching hut   ',shmsSTOP_hut
	  write(7,*) 'DC1, DC2, Scin, Cal   ',shmsSTOP_dc1,shmsSTOP_dc2
	  write(7,*) 'S1, S2, S3, Cal       ',shmsSTOP_s1,shmsSTOP_s2,shmsSTOP_s3,shmsSTOP_cal
	  write(7,*) 'Successes             ',shmsSTOP_successes
	  write(7,*)
	endif
	if (electron_arm.eq.7 .or. hadron_arm.eq.7 .or. electron_arm.eq. 8 .or. hadron_arm.eq.8) then
	  write(7,*) 'Calo Trials:          ',caloSTOP_trials
	  write(7,*) 'Extent hor/vert       ',caloSTOP_slit_hor,caloSTOP_slit_vert
	  write(7,*) 'Successes             ',caloSTOP_successes
	  endif

	close(7)

	open(unit=7, file=genfile, status='unknown')

	write(7,*) 'E arm Experimental Target Distributions:'
	write(7,'(6a12)') 'delta','EXPERIM','yptar','EXPERIM','xptar','EXPERIM'
	do i=1,nHbins
	  write(7,'(3(1x,2(e11.4,1x)))')
     >		H%RECON%e%delta%min+(i-0.5)*H%RECON%e%delta%bin,
     >		H%RECON%e%delta%buf(i), H%RECON%e%yptar%min+(i-0.5)*
     >		H%RECON%e%yptar%bin, H%RECON%e%yptar%buf(i),
     >		H%RECON%e%xptar%min+(i-0.5)*H%RECON%e%xptar%bin,
     >		H%RECON%e%xptar%buf(i)
	enddo

	write(7,*) 'P arm Experimental Target Distributions:'
	write(7,'(6a12)') 'delta','EXPERIM','yptar','EXPERIM','xptar','EXPERIM'
	do i=1,nHbins
	  write(7,'(3(1x,2(e11.4,1x)))')
     >		H%RECON%p%delta%min+(i-0.5)*H%RECON%p%delta%bin,
     >		H%RECON%p%delta%buf(i), H%RECON%p%yptar%min+(i-0.5)*
     >		H%RECON%p%yptar%bin, H%RECON%p%yptar%buf(i),
     >		H%RECON%p%xptar%min+(i-0.5)*H%RECON%p%xptar%bin,
     >		H%RECON%p%xptar%buf(i)
	enddo

	write(7,*) 'Distributions of Contributing E arm Events:'
	write(7,'(6a12)') 'delta','CONTRIB','yuptar','CONTRIB','xptar','CONTRIB'
	do i=1,nHbins
	  write(7,'(3(1x,2(e11.4,1x)))')
     >		H%gen%e%delta%min+(i-0.5)*H%gen%e%delta%bin,
     >		H%gen%e%delta%buf(i), H%gen%e%yptar%min+(i-0.5)*
     >		H%gen%e%yptar%bin, H%gen%e%yptar%buf(i),
     >		H%gen%e%xptar%min+(i-0.5)*H%gen%e%xptar%bin, H%gen%e%xptar%buf(i)
	enddo

	write(7,*) 'Distributions of Contributing P arm Events:'
	write(7,'(6a12)') 'delta','CONTRIB','yptar','CONTRIB','xptar','CONTRIB'
	do i=1,nHbins
	  write(7,'(3(1x,2(e11.4,1x)))')
     >		H%gen%p%delta%min+(i-0.5)*H%gen%p%delta%bin,
     >		H%gen%p%delta%buf(i), H%gen%p%yptar%min+(i-0.5)*
     >		H%gen%p%yptar%bin, H%gen%p%yptar%buf(i),
     >		H%gen%p%xptar%min+(i-0.5)*H%gen%p%xptar%bin, H%gen%p%xptar%buf(i)
	enddo

	write(7,*) 'Original E arm Events:'
	write(7,'(6a12)') 'delta','ORIGIN','yptar','ORIGIN','xptar','ORIGIN'
	do i=1,nHbins
	  write(7,'(3(1x,2(e11.4,1x)))')
     >		H%gen%e%delta%min+(i-0.5)*H%gen%e%delta%bin,
     >		H%gen%e%delta%buf(i), H%gen%e%yptar%min+(i-0.5)*
     >		H%gen%e%yptar%bin, H%geni%e%yptar%buf(i),
     >		H%gen%e%xptar%min+(i-0.5)*H%gen%e%xptar%bin, H%geni%e%xptar%buf(i)
	enddo

	write(7,*) 'Original P arm Events:'
	write(7,'(6a12)') 'delta','ORIGIN','yptar','ORIGIN','xptar','ORIGIN'
	do i=1,nHbins
	  write(7,'(3(1x,2(e11.4,1x)))')
     >		H%geni%p%delta%min+(i-0.5)*H%geni%p%delta%bin,
     >		H%geni%p%delta%buf(i), H%geni%p%yptar%min+(i-0.5)*
     >		H%geni%p%yptar%bin, H%geni%p%yptar%buf(i),
     >		H%geni%p%xptar%min+(i-0.5)*H%geni%p%xptar%bin, H%geni%p%xptar%buf(i)
	enddo

	write(7,*) 'Original Em/Pm distributions:'
	write(7,'(4a12)') 'Em','ORIGIN','Pm','ORIGIN'
	do i=1,nHbins
	  write(7,'(3(1x,4(e11.4,1x)))')
     >		H%geni%Em%min+(i-0.5)*H%geni%Em%bin,
     >		H%geni%Em%buf(i), H%geni%Pm%min+(i-0.5)*
     >		H%geni%Pm%bin, H%geni%Pm%buf(i)
	enddo

	close(7)

! Counters, etc report to the screen and to the diagnostic histogram file
!	call report(6,timestring1,timestring2,central,contrib,sum_sigcc,aveerr,resol)
	open(unit=7,file=histfile,status='unknown')
	call report(7,timestring1,timestring2,central,contrib,sum_sigcc,aveerr,resol)
	close(unit=7)

1000	end

!-------------------------------------------------------------------

	subroutine inc(hist,val,weight)

	implicit none
	include 'histograms.inc'

	integer*4		ibin
	real*8			val, weight
	type(hist_entry)::	hist

	ibin= nint(0.5+(val-hist%min)/hist%bin)
	if(ibin.ge.1.and.ibin.le.nHbins)then
	hist%buf(ibin) = hist%buf(ibin) + weight
	endif

	return
	end

!--------------------------------------------------------------------

	subroutine report(iun,timestring1,timestring2,central,contrib,
     >		sum_sigcc,aveerr,resol)

	implicit none
	include 'simulate.inc'
	include 'radc.inc'
	include 'brem.inc'

	integer*4	iun
	real*8		sum_sigcc
	character*30	timestring1, timestring2
	type(contribtype)::    contrib
	type(event_central):: central
	type(sums_twoarm):: aveerr, resol

! Output of diagnostics

! Run time
	write(iun,'(/1x,''BEGIN Time: '',a30)') timestring1
	write(iun,'(1x,''END Time:   '',a30)') timestring2

! Kinematics
	write(iun,*) 'KINEMATICS:'
	if (doing_eep) then
	  if (doing_hyd_elast) then
	    write(iun,*) '              ****--------  H(e,e''p)  --------****'
	  else if (doing_deuterium) then
	    write(iun,*) '              ****--------  D(e,e''p)  --------****'
	  else if (doing_heavy) then
	    write(iun,*) '              ****--------  A(e,e''p)  --------****'
	  else
	    stop 'I don''t have ANY idea what (e,e''p) we''re doing!!!'
	  endif
	else if (doing_semi) then 
	   if (doing_semipi) then 
	      if (targ%A .eq. 1) then 
		 if(doing_hplus) then
		    write(iun,*) ' ****--------  H(e,e''pi+)X  --------****'
		 else
		    write(iun,*) ' ****--------  H(e,e''pi-)X  --------****'
		 endif
	      elseif (targ%A .eq. 2) then
		 if(doing_hplus) then
		    write(iun,*) ' ****--------  D(e,e''pi+)X  --------****'
		 else
		    write(iun,*) ' ****--------  D(e,e''pi-)X  --------****'
		 endif
	      else
		 stop 'I don''t have ANY idea what A(e,e''pi)X we''re doing!!!'
	      endif
	   else if (doing_semika) then  
	      if (targ%A .eq. 1) then 
		 if(doing_hplus) then
		    write(iun,*) ' ****--------  H(e,e''k+)X  --------****'
		 else
		    write(iun,*) ' ****--------  H(e,e''k-)X  --------****'
		 endif
	      elseif (targ%A .eq. 2) then
		 if(doing_hplus) then
		    write(iun,*) ' ****--------  D(e,e''k+)X  --------****'
		 else
		    write(iun,*) ' ****--------  D(e,e''k-)X  --------****'
		 endif
	      else
		 stop 'I don''t have ANY idea what A(e,e''k)X we''re doing!!!'
	      endif
	   else   
	      stop 'I don''t have ANY idea what A(e,e''x)X we''re doing!!!'
          endif         
	else if (doing_rho) then
	   if (targ%A .eq. 1) then
	      write(iun,*) '              ****--------  H(e,e''rho)  --------****'
	   else
	      write(iun,*) 'I am not set up for anything else yet!'
	   endif
	else if (doing_delta) then
	  if (doing_hyddelta) then
	    write(6,*) ' ****--------  H(e,e''p)pi  --------****'
	  else if (doing_deutdelta) then
	    write(6,*) ' ****--------  D(e,e''p)pi  --------****'
	  else if (doing_hedelta) then
	    write(6,*) ' ****--------  A(e,e''p)pi  --------****'
	  else
	    stop 'I don''t have ANY idea what (e,e''p)pi we''re doing!!!'
	  endif
	else if (doing_pion) then
	  if (doing_hydpi) then
	    if (targ%A .eq. 1) then
	      write(iun,*) '              ****--------  H(e,e''pi)  --------****'
	    else if (targ%A .ge.3) then
	      write(iun,*) '              ****--------  A(e,e''pi)  --------****'
	    endif
	  else if (doing_deutpi) then
	    write(iun,*) '              ****--------  D(e,e''pi)  --------****'
	  else if (doing_hepi) then
	    write(iun,*) '              ****--------  A(e,e''pi)  --------****'
	  else
	    stop 'I don''t have ANY idea what (e,e''pi) we''re doing!!!'
	  endif
	  if (which_pion .eq. 0) then
	    write(iun,*) '              ****----  Default Final State ----****'
	  else if (which_pion .eq. 10) then
	    write(iun,*) '              ****----  Final State is A+pi ----****'
	  endif
	else if (doing_kaon) then
	  if (doing_hydkaon) then
	    if (targ%A .eq. 1) then
	      write(iun,*) '              ****--------  H(e,e''K)  --------****'
	    else if (targ%A .ge.3) then
	      write(iun,*) '              ****--------  A(e,e''K)  --------****'
	    endif
	  else if (doing_deutkaon) then
	    write(iun,*) '              ****--------  D(e,e''K)  --------****'
	  else if (doing_hekaon) then
	    write(iun,*) '              ****--------  A(e,e''K)  --------****'
	  else
	    stop 'I don''t have ANY idea what (e,e''K) we''re doing!!!'
	  endif
	  if (which_kaon.eq.0) then
	    write(iun,*) '              ****---- producing a LAMBDA ----****'
	  else if (which_kaon.eq.1) then
	    write(iun,*) '              ****---- producing a SIGMA0 ----****'
	  else if (which_kaon.eq.2) then
	    write(iun,*) '              ****---- producing a SIGMA- ----****'
	  else if (which_kaon.eq.10) then
	    write(iun,*) '              ****---- WITH BOUND LAMBDA  ----****'
	  else if (which_kaon.eq.11) then
	    write(iun,*) '              ****---- WITH BOUND SIGMA0  ----****'
	  else if (which_kaon.eq.12) then
	    write(iun,*) '              ****---- WITH BOUND SIGMA-  ----****'
	  else
	    stop 'I don''t have ANY idea what (e,e''K) we''re doing!!!'
	  endif
	else if (doing_phsp) then
	  write(iun,*) '              ****--- PHASE SPACE - NO physics, NO radiation (may not work)---****'
	else
	  stop 'I don''t have ANY idea what we''re doing!!!'
	endif

	write(iun,'(9x,a12,'' = '',f15.4,2x,a10)') 'Ebeam', Ebeam, 'MeV'
	write(iun,'(9x,a12,'' = '',f15.4,2x,a10)')
     >		'(dE/E)beam', dEbeam/Ebeam, '(full wid)'
	write(iun,'(9x,a12,'' = '',f15.4,2x,a10)') 'x-width', gen%xwid, 'cm'
	write(iun,'(9x,a12,'' = '',f15.4,2x,a10)') 'y-width', gen%ywid, 'cm'
	write(iun,'(9x,a12,'' = '',i15,2x,a16)')
     >		'fr_pattern',targ%fr_pattern, '1=square,2=circ'
	write(iun,'(9x,a12,'' = '',f15.4,2x,a10)') 'fr1', targ%fr1, 'cm'
	write(iun,'(9x,a12,'' = '',f15.4,2x,a10)') 'fr2', targ%fr2, 'cm'

	write(iun,*) ' '
	write(iun,'(9x,18x,2(a15,2x))') '____E arm____','____P arm____'
	write(iun,'(9x,a12,'' = '',2(f15.4,2x),2x,a5)') 'angle',
     >		spec%e%theta*degrad, spec%p%theta*degrad, 'deg'
	write(iun,'(9x,a12,'' = '',2(f15.4,2x),2x,a5)') 'momentum',
     >		spec%e%p, spec%p%p, 'MeV/c'

	write(iun,'(9x,a12,'' = '',2(f15.4,2x),2x,a5)') 'x offset',
     >		spec%e%offset%x, spec%p%offset%x, 'cm'
	write(iun,'(9x,a12,'' = '',2(f15.4,2x),2x,a5)') 'y offset',
     >		spec%e%offset%y, spec%p%offset%y, 'cm'
	write(iun,'(9x,a12,'' = '',2(f15.4,2x),2x,a5)') 'z offset',
     >		spec%e%offset%z, spec%p%offset%z, 'cm'
	write(iun,'(9x,a12,'' = '',2(f15.4,2x),2x,a5)') 'xptar offset',
     >		spec%e%offset%xptar, spec%p%offset%xptar, 'mr'
	write(iun,'(9x,a12,'' = '',2(f15.4,2x),2x,a5)') 'yptar offset',
     >		spec%e%offset%yptar, spec%p%offset%yptar, 'mr'

	write(iun,*) '                      VALUES FOR "CENTRAL" EVENT:'
	write(iun,'(9x,a12,'' = '',2(f15.4,2x),2x,a5)') 'delta',
     >		central%e%delta, central%p%delta, '%'
	write(iun,'(9x,a12,'' = '',2(f15.4,2x),2x,a5)') 'xptar',
     >		central%e%xptar, central%p%xptar, 'mr'
	write(iun,'(9x,a12,'' = '',2(f15.4,2x),2x,a5)') 'yptar',
     >		central%e%yptar, central%p%yptar, 'mr'

	write(iun,'(17x,a10,'' = '',f15.4,2x,a9)') 'Q2',central%Q2/1.d6,'(GeV/c)^2'
	write(iun,'(17x,a10,'' = '',f15.4,2x,a9)') 'q', central%q, 'MeV/c'
	write(iun,'(17x,a10,'' = '',f15.4,2x,a9)') 'nu',
     >		central%nu, 'MeV'
	write(iun,'(17x,a10,'' = '',f15.4,2x,a9)') 'recon Em', central%Em, 'MeV'
	write(iun,'(17x,a10,'' = '',f15.4,2x,a9)') 'recon Pm', central%Pm, 'MeV/c'
	write(iun,'(17x,a10,'' = '',f15.4,2x,a9)') 'recon  W', central%W, 'MeV/c'
	write(iun,'(17x,a10,'' = '',f15.4,2x,a9)') 'recon MM', central%MM, 'MeV/c'

! Target
	write(iun,*) 'TARGET specs:'
9911	format(2x,2(5x,a10,' = ',e12.6,1x,a5))
	write(iun,9911) 'A', targ%A, ' ', 'Z', targ%Z, ' '
	write(iun,9911) 'mass', targ%mass_amu, 'amu', 'mass', targ%M,'MeV'
	write(iun,9911) 'Mrec', targ%mrec_amu, 'amu', 'Mrec', targ%Mrec,'MeV'
	write(iun,9911) 'Mtar_struc',targ%Mtar_struck,'MeV',
     >		'Mrec_struc',targ%Mrec_struck,'MeV'
	write(iun,9911) 'rho', targ%rho, 'g/cm3', 'thick', targ%thick,'g/cm2'
	write(iun,9911) 'angle', targ%angle*degrad, 'deg', 'abundancy',
     >		targ%abundancy, '%'
	write(iun,9911) 'X0', targ%X0, 'g/cm2', 'X0_cm', targ%X0_cm,'cm'
	write(iun,9911) 'length',targ%length,'cm','zoffset',targ%zoffset,'cm'
	write(iun,9911) 'xoffset',targ%xoffset,'cm','yoffset',targ%yoffset,'cm'
	write(iun,'(t12,3a15)') '__ave__', '__lo__', '__hi__'
9912	format(1x,a15,3f15.5,2x,a6)
	write(iun,9912) 'Coulomb', targ%Coulomb%ave, targ%Coulomb%min,
     >		targ%Coulomb%max, 'MeV'
	write(iun,9912) 'Eloss_beam', targ%Eloss(1)%ave,
     >		targ%Eloss(1)%min, targ%Eloss(1)%max, 'MeV'
	write(iun,9912) 'Eloss_e', targ%Eloss(2)%ave, targ%Eloss(2)%min,
     >		targ%Eloss(2)%max, 'MeV'
	write(iun,9912) 'Eloss_p', targ%Eloss(3)%ave, targ%Eloss(3)%min,
     >		targ%Eloss(3)%max, 'MeV'
	write(iun,9912) 'teff_beam', targ%teff(1)%ave, targ%teff(1)%min,
     >		targ%teff(1)%max, 'radlen'
	write(iun,9912) 'teff_e', targ%teff(2)%ave, targ%teff(2)%min,
     >		targ%teff(2)%max, 'radlen'
	write(iun,9912) 'teff_p', targ%teff(3)%ave, targ%teff(3)%min,
     >		targ%teff(3)%max, 'radlen'
9913	format(1x,a15,t25,f15.5,2x,a6)
	write(iun,9913) 'musc_nsig_max', targ%musc_nsig_max, ' '
	write(iun,9913) 'musc_max_beam', targ%musc_max(1)*1000., 'mr'
	write(iun,9913) 'musc_max_e', targ%musc_max(2)*1000., 'mr'
	write(iun,9913) 'musc_max_p', targ%musc_max(3)*1000., 'mr'

! Flags
	write(iun,*) 'FLAGS:'
	write(iun,'(5x,3(2x,a19,''='',l2))') 'doing_eep', doing_eep,
     >		'doing_kaon', doing_kaon, 'doing_pion', doing_pion
	write(iun,'(5x,3(2x,a19,''='',l2))') 'doing_semi', doing_semi,
     >		'doing_rho', doing_rho, 'doing_hplus', doing_hplus
	write(iun,'(5x,2(2x,a19,''='',l2))') 'doing_semipi',doing_semipi,
     >		'doing_semika', doing_semika
	write(iun,'(5x,2(2x,a19,''='',l2))') 'doing_delta',doing_delta,
     >		'doing_phsp', doing_phsp
	write(iun,'(5x,2(2x,a19,''='',i2))') 'which_pion', which_pion,
     >		'which_kaon', which_kaon
	write(iun,'(5x,3(2x,a19,''='',l2))') 'doing_hyd_elast', doing_hyd_elast,
     >		'doing_deuterium', doing_deuterium, 'doing_heavy', doing_heavy
	write(iun,'(5x,3(2x,a19,''='',l2))') 'doing_hydpi', doing_hydpi,
     >          'doing_deutpi', doing_deutpi, 'doing_hepi', doing_hepi
	write(iun,'(5x,3(2x,a19,''='',l2))') 'doing_hydkaon', doing_hydkaon,
     >		'doing_deutkaon', doing_deutkaon, 'doing_hekaon', doing_hekaon
	write(iun,'(5x,3(2x,a19,''='',l2))') 'doing_hydsemi', doing_hydsemi,
     >          'doing_deutsemi', doing_deutsemi, 'do_fermi', do_fermi
	write(iun,'(5x,3(2x,a19,''='',l2))') 'doing_hydrho', doing_hydrho,
     >          'doing_deutrho', doing_deutrho, 'doing_herho', doing_herho
	write(iun,'(5x,(2x,a19,''='',l2),2(2x,a19,''='',i2))') 'mc_smear',
     >		mc_smear,'electron_arm',electron_arm,'hadron_arm',hadron_arm
	write(iun,'(5x,3(2x,a19,''='',l2)))') 'using_Eloss', using_Eloss,
     >		'using_Coulomb',using_Coulomb,'deForest_flag',deForest_flag
	write(iun,'(5x,3(2x,a19,''='',l2)))') 'correct_Eloss', correct_Eloss,
     >		'correct_raster',correct_raster, 'doing_decay', doing_decay
	write(iun,'(5x,2(2x,a19,''='',l2))') 
     >		'using_E_arm_montecarlo', using_E_arm_montecarlo,
     >		'using_P_arm_montecarlo', using_P_arm_montecarlo
	if (electron_arm.eq.5 .or. hadron_arm.eq.5 .or.
     >	    electron_arm.eq.6 .or. hadron_arm.eq.6)
     >	    write(iun,'(7x,a19,''='',l2)') 'use_first_cer',use_first_cer
	write(iun,'(7x,a11,''='',f10.3,a4)') 'ctau',ctau,'cm'

! Counters
	write(iun,*) 'COUNTERS:'
	write(iun,'(12x,''Ngen (request) = '',i10)') ngen
	write(iun,'(12x,''Ntried         = '',i10)') ntried
	write(iun,'(12x,''Ncontribute    = '',i10)') ncontribute
	write(iun,'(12x,''Nco_no_rad_prot= '',i10)') ncontribute_no_rad_proton
	write(iun,'(12x,''-> %no_rad_prot= '',f10.3)')
     >		(100.*ncontribute_no_rad_proton/max(dble(ncontribute),0.1d0))
	write(iun,'(/1x,''INTEGRATED WEIGHTS (number of counts in delta/Em cuts!):'')')
	write(iun,'(1x,''              MeV: wtcontr= '',e16.8)') wtcontribute/nevent

! Radiative corrections
	write(iun,*) 'RADIATIVE CORRECTIONS:'
	if (.not.using_rad) then
	  write(iun,'(x,a14,''='',l3)') 'using_rad', using_rad
	else
	  write(iun,'(4(x,a14,''='',l3))') 'use_expon',use_expon,
     >		'include_hard',include_hard,'calc_spence',calculate_spence
	  write(iun,'(2(x,a14,''='',l3))') 'using_rad', using_rad,
     >		'use_offshell_rad', use_offshell_rad
	  write(iun,'(4(x,a14,''='',i3))') 'rad_flag',rad_flag,
     >		'extrad_flag', extrad_flag, 'one_tail', one_tail,
     >		'intcor_mode', intcor_mode
	  write(iun,'(x,a14,''='',f11.3)') 'dE_edge_test',dE_edge_test
	  write(iun,'(x,a14,''='',f11.3)') 'Egamma_max', Egamma_tot_max

9914	  format(1x,a18,' = ',4f11.3)
	  write(iun,*) 'Central Values:'
	  write(iun,9914) 'hardcorfac', central%rad%hardcorfac
	  write(iun,9914) 'etatzai', central%rad%etatzai
	  write(iun,9914) 'frac(1:3)', central%rad%frac
	  write(iun,9914) 'lambda(1:3)', central%rad%lambda
	  write(iun,9914) 'bt(1:2)', central%rad%bt
	  write(iun,9914) 'c_int(0:3)', central%rad%c_int
	  write(iun,9914) 'c_ext(0:3)', central%rad%c_ext
	  write(iun,9914) 'c(0:3)', central%rad%c
	  write(iun,9914) 'g_int', central%rad%g_int
	  write(iun,9914) 'g_ext', central%rad%g_ext
	  write(iun,9914) 'g(0:3)', central%rad%g
	endif

! Miscellaneous
	write(iun,*) 'MISCELLANEOUS:'
9915	format(12x,a14,' = ',e16.6,1x,a6)
	write(iun,*) 'Note that central.sigcc is for central delta,theta,phi in both spectrometers'
	write(iun,*) ' and may give non-physical kinematics, esp. for Hydrogen'
	write(iun,*) 'Note also that AVE.sigcc is really AVER.weight (the two arenot exactly equal)'
	write(iun,9915) 'CENTRAL.sigcc', central%sigcc, ' '
	write(iun,9915) 'AVERAGE.sigcc', sum_sigcc/nevent, ' '
	write(iun,9915) 'charge', EXPER%charge, 'mC'
	write(iun,9915) 'targetfac', targetfac, ' '
	write(iun,9915) 'luminosity', luminosity, 'ub^-1'
	write(iun,9915) 'luminosity', luminosity*(hbarc/100000.)**2, 'GeV^2'
	write(iun,9915) 'genvol', genvol, ' '
	write(iun,9915) 'normfac', normfac, ' '
9916	format(12x,a14,' = ',f6.1,' to ',f6.1,' in ',i4,' bins of ',f7.2,1x,a5)
	if (doing_heavy) then
	  write(iun,'(12x,''Theory file:  '',a)')
     >		theory_file(1:index(theory_file,' ')-1)
	endif

! Resolution summary

	write(iun,*) 'RECON SUMMARY:            Ave.Error   Resolution'
        write(iun,99165) 'Electron arm: delta =',10.*aveerr%e%delta,10.*resol%e%delta,'x10^-3'
        write(iun,99165) 'xptar =',1000.*aveerr%e%xptar,1000.*resol%e%xptar,'mr'
        write(iun,99165) 'yptar =',1000.*aveerr%e%yptar,1000.*resol%e%yptar,'mr'
        write(iun,99165) 'ytar  =',10.*aveerr%e%ytar,10.*resol%e%ytar ,'mm'
        write(iun,99165) 'Hadron arm:   delta =',10.*aveerr%p%delta,10.*resol%p%delta,'x10-3'
        write(iun,99165) 'xptar =',1000.*aveerr%p%xptar,1000.*resol%p%xptar,'mr'
        write(iun,99165) 'yptar =',1000.*aveerr%p%yptar,1000.*resol%p%yptar,'mr'
        write(iun,99165) 'ytar  =',10.*aveerr%p%ytar,10.*resol%p%ytar,'mm'
99165    format(2x,a22,2f12.5,2x,a)


! Input spectrometer limits.

	write(iun,*) 'Input Spectrometer Limits:'
	write(iun,'(9x,a25,'' = '',2(2x,f15.4),a5)') 'SPedge.e.delta.min/max',
     >		SPedge%e%delta%min,SPedge%e%delta%max,'%'
	write(iun,'(9x,a25,'' = '',2(2x,f15.4),a5)') 'SPedge.e.yptar.min/max',
     >		SPedge%e%yptar%min,SPedge%e%yptar%max,'rad'
	write(iun,'(9x,a25,'' = '',2(2x,f15.4),a5)') 'SPedge.e.xptar.min/max',
     >		SPedge%e%xptar%min,SPedge%e%xptar%max,'rad'
	write(iun,'(9x,a25,'' = '',2(2x,f15.4),a5)') 'SPedge.p.delta.min/max',
     >		SPedge%p%delta%min,SPedge%p%delta%max,'%'
	write(iun,'(9x,a25,'' = '',2(2x,f15.4),a5)') 'SPedge.p.yptar.min/max',
     >		SPedge%p%yptar%min,SPedge%p%yptar%max,'rad'
	write(iun,'(9x,a25,'' = '',2(2x,f15.4),a5)') 'SPedge.p.xptar.min/max',
     >		SPedge%p%xptar%min,SPedge%p%xptar%max,'rad'


! Edges used in generation and checking, as well as range of events found
! to contribute within those edges

! ... on GENERATED qties
	write(iun,*) 'Limiting VERTEX values (vertex.e/p.*,Em,Pm,Trec)'
	write(iun,*) '   USED limits are gen.e/p.*, and VERTEXedge.Em,Pm,Trec'
	write(iun,'(t25,2x,a16,2x,t50,2x,a16,2x)') '______used______',
     >		'_____found______'
	write(iun,'(t25,2a10,t50,2a10)') 'min','max', 'lo', 'hi'
9917	format(1x,a18,t21,2f12.3,t50,2f10.3,2x,a5)
	write(iun,9917) 'E arm  delta', gen%e%delta%min, gen%e%delta%max,
     >		contrib%gen%e%delta%lo, contrib%gen%e%delta%hi, '%'
	write(iun,9917) 'E arm  yptar', gen%e%yptar%min*1000.,
     >		gen%e%yptar%max*1000.,
     >		contrib%gen%e%yptar%lo*1000., contrib%gen%e%yptar%hi*1000.,'mr'
	write(iun,9917) 'E arm  xptar', gen%e%xptar%min*1000.,
     >		gen%e%xptar%max*1000.,
     >		contrib%gen%e%xptar%lo*1000., contrib%gen%e%xptar%hi*1000.,'mr'
	write(iun,9917) 'P arm  delta', gen%p%delta%min, gen%p%delta%max,
     >		contrib%gen%p%delta%lo, contrib%gen%p%delta%hi, '%'
	write(iun,9917) 'P arm  yptar', gen%p%yptar%min*1000.,
     >		gen%p%yptar%max*1000.,
     >		contrib%gen%p%yptar%lo*1000., contrib%gen%p%yptar%hi*1000.,'mr'
	write(iun,9917) 'P arm  xptar', gen%p%xptar%min*1000.,
     >		gen%p%xptar%max*1000.,
     >		contrib%gen%p%xptar%lo*1000., contrib%gen%p%xptar%hi*1000.,'mr'
	write(iun,9917) 'sumEgen', gen%sumEgen%min, gen%sumEgen%max,
     >		contrib%gen%sumEgen%lo, contrib%gen%sumEgen%hi, 'MeV'

! ... on VERTEX qties
!	write(iun,*) 'Limiting VERTEX values:'
!	write(iun,'(t25,2x,a16,2x,t50,2x,a16,2x)')
!     >		'______used______', '_____found______'
!	write(iun,'(t25,2a10,t50,2a10)') 'min','max', 'lo', 'hi'
	write(iun,9917) 'Trec', VERTEXedge%Trec%min, VERTEXedge%Trec%max,
     >      contrib%vertex%Trec%lo, contrib%vertex%Trec%hi, 'MeV'
	write(iun,9917) 'Em', VERTEXedge%Em%min, VERTEXedge%Em%max,
     >      contrib%vertex%Em%lo, contrib%vertex%Em%hi, 'MeV'
	write(iun,9917) 'Pm', VERTEXedge%Pm%min, VERTEXedge%Pm%max,
     >       contrib%vertex%Pm%lo, contrib%vertex%Pm%hi, 'MeV/c'
	if ((doing_deuterium .or. doing_pion .or. doing_kaon .or. doing_delta) .and. using_rad) then
	   write(iun,*) '      *** NOTE: sumEgen.min only used in GENERATE_RAD'
	endif

! ... on TRUE qties
	write(iun,*) 'Limiting ORIGINAL values: orig.e/p.*,Em,Pm,Trec (no edge.* limits for Pm,Trec)'
	write(iun,'(t25,2x,a16,2x,t50,2x,a16,2x)')
     >		'______used______', '_____found______'
	write(iun,'(t25,2a10,t50,2a10)') 'min','max', 'lo', 'hi'
	write(iun,9917) 'E arm   E', edge%e%E%min, edge%e%E%max,
     >		contrib%tru%e%E%lo, contrib%tru%e%E%hi, 'MeV'
	write(iun,9917) 'E arm  yptar', edge%e%yptar%min*1000.,
     >		edge%e%yptar%max*1000.,
     >		contrib%tru%e%yptar%lo*1000., contrib%tru%e%yptar%hi*1000.,'mr'
	write(iun,9917) 'E arm  xptar', edge%e%xptar%min*1000., edge%e%xptar%max*1000.,
     >		contrib%tru%e%xptar%lo*1000., contrib%tru%e%xptar%hi*1000., 'mr'
	write(iun,9917) 'P arm      E', edge%p%E%min, edge%p%E%max,
     >		contrib%tru%p%E%lo, contrib%tru%p%E%hi, 'MeV'
	write(iun,9917) 'P arm  yptar', edge%p%yptar%min*1000.,
     >		edge%p%yptar%max*1000.,
     >		contrib%tru%p%yptar%lo*1000., contrib%tru%p%yptar%hi*1000.,'mr'
	write(iun,9917) 'P arm  xptar', edge%p%xptar%min*1000., edge%p%xptar%max*1000.,
     >		contrib%tru%p%xptar%lo*1000., contrib%tru%p%xptar%hi*1000., 'mr'
	write(iun,9917) 'Em', max(-999999.999d0,edge%Em%min), min(999999.999d0,edge%Em%max),
     >		contrib%tru%Em%lo, contrib%tru%Em%hi, 'MeV'
	write(iun,9917) 'Pm', 0., 0., contrib%tru%Pm%lo,
     >		contrib%tru%Pm%hi, 'MeV'
	write(iun,9917) 'Trec', 0., 0., contrib%tru%Trec%lo,
     >		contrib%tru%Trec%hi, 'MeV'

! ... on SPECTROMETER qties
	write(iun,*) 'Limiting SPECTROMETER values'
	write(iun,'(t25,2x,a16,2x,t50,2x,a16,2x)')
     >		'______used______', '_____found______'
	write(iun,'(t25,2a10,t50,2a10)') 'min','max', 'lo', 'hi'
	write(iun,9917) 'E arm delta', SPedge%e%delta%min,
     >		SPedge%e%delta%max, contrib%SP%e%delta%lo,
     >		contrib%SP%e%delta%hi, '%'
	write(iun,9917) 'E arm  yptar', SPedge%e%yptar%min*1000.,
     >		SPedge%e%yptar%max*1000.,
     >		contrib%SP%e%yptar%lo*1000., contrib%SP%e%yptar%hi*1000., 'mr'
	write(iun,9917) 'E arm  xptar', SPedge%e%xptar%min*1000.,
     >		SPedge%e%xptar%max*1000.,
     >		contrib%SP%e%xptar%lo*1000., contrib%SP%e%xptar%hi*1000., 'mr'
	write(iun,9917) 'P arm  delta', SPedge%p%delta%min,
     >		SPedge%p%delta%max, contrib%SP%p%delta%lo,
     >		contrib%SP%p%delta%hi, '%'
	write(iun,9917) 'P arm  yptar', SPedge%p%yptar%min*1000.,
     >		SPedge%p%yptar%max*1000.,
     >		contrib%SP%p%yptar%lo*1000., contrib%SP%p%yptar%hi*1000., 'mr'
	write(iun,9917) 'P arm  xptar', SPedge%p%xptar%min*1000.,
     >		SPedge%p%xptar%max*1000.,
     >		contrib%SP%p%xptar%lo*1000., contrib%SP%p%xptar%hi*1000., 'mr'

! ... on RADIATION qties
	if (using_rad) then
	  write(iun,*) 'Limiting RADIATION values CONTRIBUTING to the (Em,Pm) distributions:'
	  write(iun,'(t25,2x,a16,2x,t50,2x,a16,2x)')
     >		'______used______', '_____found______'
	  write(iun,'(t25,2a10,t50,2a10)') 'min','max', 'lo', 'hi'
	  write(iun,9917) 'Egamma(1)', 0., Egamma1_max,
     >		contrib%rad%Egamma(1)%lo, contrib%rad%Egamma(1)%hi, 'MeV'
	  write(iun,9917) 'Egamma(2)', 0., Egamma2_max, contrib%rad%Egamma(2)%lo,
     >		contrib%rad%Egamma(2)%hi, 'MeV'
	  write(iun,9917) 'Egamma(3)', 0., Egamma3_max, contrib%rad%Egamma(3)%lo,
     >		contrib%rad%Egamma(3)%hi, 'MeV'
	  write(iun,9917) 'Egamma_total', 0., Egamma_tot_max,
     >		contrib%rad%Egamma_total%lo, contrib%rad%Egamma_total%hi,'MeV'
	endif

! ... on slops
	write(iun,*) 'ACTUAL and LIMITING SLOP values used/obtained:'
	write(iun,'(t25,3a10)') '__used__', '__min__', '__max__'
9918	format(1x,a10,a12,t25,3f10.3,2x,a5)
	write(iun,9918) 'slop.MC  ', 'E arm delta', slop%MC%e%delta%used,
     >		slop%MC%e%delta%lo, slop%MC%e%delta%hi, '%'
	write(iun,9918) ' ', 'E arm yptar', slop%MC%e%yptar%used*1000.,
     >		slop%MC%e%yptar%lo*1000., slop%MC%e%yptar%hi*1000., 'mr'
	write(iun,9918) ' ', 'E arm xptar', slop%MC%e%xptar%used*1000.,
     >		slop%MC%e%xptar%lo*1000., slop%MC%e%xptar%hi*1000., 'mr'
	write(iun,9918) ' ', 'P arm delta', slop%MC%p%delta%used,
     >		slop%MC%p%delta%lo, slop%MC%p%delta%hi, '%'
	write(iun,9918) ' ', 'P arm yptar', slop%MC%p%yptar%used*1000.,
     >		slop%MC%p%yptar%lo*1000., slop%MC%p%yptar%hi*1000., 'mr'
	write(iun,9918) ' ', 'P arm xptar', slop%MC%p%xptar%used*1000.,
     >		slop%MC%p%xptar%lo*1000., slop%MC%p%xptar%hi*1000., 'mr'
	write(iun,9918) 'slop.total', 'Em', slop%total%Em%used,
     >		slop%total%Em%lo, slop%total%Em%hi, 'MeV'
	write(iun,9918) ' ', 'Pm', 0., slop%total%Pm%lo,
     >		slop%total%Pm%hi, 'MeV/c'

	write(iun,'(/)')
	return
	end

!-----------------------------------------------------------------------

	subroutine calculate_central(central,vertex0)

	implicit none
	include 'simulate.inc'
	include 'radc.inc'

	integer i
	real*8 m_spec
	logical success
	type(event_main)::	main0
	type(event)::		vertex0, recon0
	type(event_central)::	central

! JRA 2002:  Redo this so that central values are chosen as in generate,
! and then call complete_ev and complete_recon_ev, just like a normal event.

	if (debug(2)) write(6,*)'calc_cent: entering...'
	main0%target%x = 0.0
	main0%target%y = 0.0
	main0%target%z = targ%zoffset
	main0%target%rastery = 0.0
	main0%target%Eloss(1) = targ%Eloss(1)%ave
	main0%target%Coulomb = targ%Coulomb%ave
	main0%target%teff(1) = targ%teff(1)%ave
	vertex0%Ein = Ebeam_vertex_ave
	main0%Ein_shift = 0.0
	main0%Ee_shift = 0.0
	main0%gen_weight = 1.0

! Set all of these to central values, but then complete_ev will force
! the variables that are not normally generated to their appropriate values.
	vertex0%e%delta = 0.0
	vertex0%e%yptar = 0.0
	vertex0%e%xptar = 0.0
	vertex0%e%theta = spec%e%theta
	vertex0%e%phi = spec%e%phi
	vertex0%e%P = spec%e%P*(1.+vertex0%e%delta/100.)
	vertex0%e%E = vertex0%e%P

	vertex0%p%delta = 0.0
	vertex0%p%yptar = 0.0
	vertex0%p%xptar = 0.0
	vertex0%p%theta = spec%p%theta
	vertex0%p%phi = spec%p%phi
	vertex0%p%P = spec%p%P*(1.+vertex0%p%delta/100.)
	vertex0%p%E = sqrt(vertex0%p%P**2 + Mh2)

	pfer = 0.0
	pferx = 0.0
	pfery = 0.0
	pferz = 0.0
	vertex0%Em = targ%Mtar_struck + targ%Mrec - targ%M
	m_spec = targ%M - targ%Mtar_struck + vertex0%Em		!=targ.Mrec
	efer = targ%M - sqrt(m_spec**2+pfer**2)			!=M-Mrec

! Old version - not appropriate for all event types.
! Pop in generation values for central event
!
!	if (debug(2)) write(6,*)'calc_cent: entering...'
!	main0.target.x = 0.0
!	main0.target.y = 0.0
!	main0.target.z = 0.0
!	vertex0.Ein = Ebeam_vertex_ave
!	main0.target.Coulomb = targ.Coulomb.ave
!	main0.target.Eloss(1) = targ.Eloss(1).ave
!	main0.target.teff(1) = targ.teff(1).ave
!	vertex0.e.delta = 0.0
!	vertex0.e.yptar = 0.0
!	vertex0.e.xptar = 0.0
!	vertex0.e.theta = spec.e.theta
!	vertex0.e.phi = spec.e.phi
!	vertex0.e.P = spec.e.P*(1.+vertex0.e.delta/100.)
!	vertex0.e.E = vertex0.e.P
!	vertex0.p.delta = 0.0
!	vertex0.p.yptar = 0.0
!	vertex0.p.xptar = 0.0
!	vertex0.p.theta = spec.p.theta
!	vertex0.p.phi = spec.p.phi
!	vertex0.p.P = spec.p.P*(1.+vertex0.p.delta/100.)
!	vertex0.p.E = sqrt(vertex0.p.P**2 + Mh2)

! Complete_recon_ev for vertex0.   Note: complete_recon_ev doesn't
! call radc_init_ev or calculate teff(2,3).

! JRA: Do we want complete_ev or complete_recon_ev?  Do we want to calculate
! and/or dump other central values (for pion/kaon production, for example).

c	call complete_ev(main0,vertex0,success)
c	if (debug(2)) write(6,*)'calc_cent: done with complete_ev'
c	if (.not.success) stop 'COMPLETE_EV failed trying to complete a CENTRAL event!'

	call complete_recon_ev(vertex0,success)
	if (debug(2)) write(6,*)'calc_cent: done with complete_recon_ev'
	if (.not.success) stop 'COMPLETE_EV failed trying to complete a CENTRAL event!'
	central%Q2 = vertex0%Q2
	central%q = vertex0%q
	central%nu = vertex0%nu
	central%Em = vertex0%Em
	central%Pm = vertex0%Pm
	central%W = vertex0%W
	central%e%xptar = vertex0%e%xptar
	central%e%yptar = vertex0%e%yptar
	central%e%delta = vertex0%e%delta
	central%p%xptar = vertex0%p%xptar
	central%p%yptar = vertex0%p%yptar
	central%p%delta = vertex0%p%delta

	if (central%Em**2-central%Pm**2 .lt. 0) then
	  central%MM = -sqrt(abs(central%Em**2-central%Pm**2))
	else
	  central%MM = sqrt(central%Em**2-central%Pm**2)
	endif

	main0%target%teff(2) = targ%teff(2)%ave
	main0%target%teff(3) = targ%teff(3)%ave
	if (debug(2)) write(6,*)'calc_cent: calling radc_init_ev'
	if (debug(4)) write(6,*)'calc_cent: Ein =',vertex0%Ein
	call radc_init_ev(main0,vertex0)
	if (debug(2)) write(6,*)'calc_cent: done with radc_init_ev'
	if (using_rad) then
	  central%rad%hardcorfac = hardcorfac
	  central%rad%etatzai= etatzai
	  central%rad%g_int = g_int
	  central%rad%g_ext = g_ext
	  do i = 0, 3
	    if (i.gt.0) central%rad%frac(i) = frac(i)
	    if (i.gt.0) central%rad%lambda(i) = lambda(i)
	    if (i.gt.0.and.i.lt.3) central%rad%bt(i) = bt(i)
	    central%rad%c_int(i) = c_int(i)
	    central%rad%c_ext(i) = c_ext(i)
	    central%rad%c(i) = c(i)
	    central%rad%g(i) = g(i)
	  enddo
	endif
	if (debug(4)) write(6,*)'calc_cent: at 1'

c	do i = 1, neventfields
c	  recon0%all(i) = vertex0%all(i)
c	enddo

	recon0 = vertex0
	call complete_main(.true.,main0,vertex0,vertex0,recon0,success)
	central%sigcc = main0%sigcc

	if(doing_semi) then
	   write(6,*) 'central event'
	   write(6,*) 'Pt',sqrt(vertex0%pt2)/1.d3
	   write(6,*) 'z', vertex0%zhad
	   write(6,*) 'lab cross section (nb/Gev2/sr2)',central%sigcc*1000.0*1000.0*1000.0
	endif
	if (debug(2)) write(6,*)'calc_cent: ending...'
	return
	end

!-------------------------------------------------------------------------

	subroutine montecarlo(orig,main,recon,success)

	implicit none
	include 'simulate.inc'

* Track-coordinate and spectrometer common blocks

	real*8 x_E_arm,y_E_arm,z_E_arm,dx_E_arm,dy_E_arm,delta_E_arm
	real*8 x_P_arm,y_P_arm,z_P_arm,dx_P_arm,dy_P_arm,delta_P_arm
	real*8 xfp, yfp, dxfp, dyfp
	real*8 eloss_E_arm, eloss_P_arm, r, beta, dangles(2), dang_in(2)
	logical success
	logical ok_E_arm, ok_P_arm
	type(event):: orig, recon
	type (event_main)::	main

	real*8 beta_electron
	parameter (beta_electron = 1.)
	real*8 tmpfact
	real*8 fry	!fast raster y position.
	real*8 frx      !fast raster x position - left as looking downstream
	real*8 m2	!mass for call to mc_hms(sos). Changes if decay
	real*8 pathlen

	real*8 dx_tmp,dy_tmp

	real*8 ctheta,stheta,phad,pelec
	real*8 zhadron

	real*8 zero
	parameter (zero=0.0d0)	!double precision zero for subroutine calls

! Prepare the event for the Monte Carlo's and/or spectrometer cuts

	success = .false.
	ntup%resfac = 0.0			!resfac (see simulate.inc)
	if (correct_raster) then
	  fry = -main%target%rastery
	  frx = -main%target%rasterx   !This should make frx positive for beam left
	else
	  fry = 0.0
	  frx = 0.0
	endif

!BEAM MULTIPLE SCATTERING:  NOT YET IMPLEMENTED, JUST GETTING IT READY!

! ... multiple scattering of the beam.  Generate angles for beam deflection,
! ... and then apply those angles to the electron and proton.
! ... The yptar offset goes directly to yptar of both arms (small angle approx).
! ... xptar is multiplied by cos(theta) to get the xptar offsets.

	if (mc_smear) then
	  call target_musc(orig%Ein,beta_electron,main%target%teff(1),dang_in)
	else
	  dang_in(1)=0.0	!yp offset, goes directly to yp of both arms
	  dang_in(2)=0.0	!xp offset, mult. by cos_th for xp of both arms
	endif

	if (debug(3)) write(6,*) 'mc: using p,e arm mc =',
     >		using_P_arm_montecarlo,using_E_arm_montecarlo

!____ P arm ________________

! Go from TRUE to SPECTROMETER quantities by computing target distortions
! ... ionization loss correction (if requested)

	if (using_Eloss) then
	  if (debug(3)) write(6,*)'mc: p arm stuff0 =',
     >		orig%p%E,main%target%Eloss(3),spec%p%P
	  main%SP%p%delta = (sqrt(abs((orig%p%E-main%target%Eloss(3))**2
     >		          -Mh2))-spec%p%P) / spec%p%P*100.
	else
	  if (debug(3)) write(6,*)'mc: p arm stuff1 =',orig%p%delta
	  main%SP%p%delta = orig%p%delta
	endif

! ... multiple scattering

	if (mc_smear) then
	  beta = orig%p%p/orig%p%E
	  call target_musc(orig%p%p, beta, main%target%teff(3), dangles)
	else
	  dangles(1)=0.0
	  dangles(2)=0.0
	endif
	main%SP%p%yptar = orig%p%yptar + dangles(1) + dang_in(1)
	main%SP%p%xptar = orig%p%xptar + dangles(2) + dang_in(2)*spec%p%cos_th

! CASE 1: Using the spectrometer Monte Carlo

	if (using_P_arm_montecarlo) then

! ... change to P arm spectrometer coordinates (TRANSPORT system),

	  if (abs(cos(spec%p%phi)).gt.0.0001) then  !phi not at +/- pi/2
	    write(6,*) 'y_P_arm, z_P_arm will be incorrect if spec.p.phi <> pi/2 or 3*pi/2'
	    write(6,*) 'spec%p%phi=',spec%p%phi,'=',spec%p%phi*180/pi,'degrees'
	  endif
	  delta_P_arm = main%SP%p%delta
	  x_P_arm = -main%target%y
	  y_P_arm = -main%target%x*spec%p%cos_th - main%target%z*spec%p%sin_th*sin(spec%p%phi)
	  z_P_arm =  main%target%z*spec%p%cos_th + main%target%x*spec%p%sin_th*sin(spec%p%phi)

! %.. Apply spectrometer offset (using spectrometer coordinate system).
	  x_P_arm = x_P_arm - spec%p%offset%x
	  y_P_arm = y_P_arm - spec%p%offset%y
	  z_P_arm = z_P_arm - spec%p%offset%z
	  dx_P_arm = main%SP%p%xptar - spec%p%offset%xptar
	  dy_P_arm = main%SP%p%yptar - spec%p%offset%yptar


c	   write(*,*) 'sign_hms_part =' ,sign_hms_part
          if (using_tgt_field) then      ! do target field tracking - GAW
            if (debug(6)) then
               write(*,*) '------------------------------'
               write(*,'("frx,fry,x_E_arm =      ",3f12.5)') frx,fry,x_P_arm
           endif
            call track_from_tgt(x_P_arm,y_P_arm,z_P_arm,dx_P_arm,dy_P_arm,
     >       sign_hadron*spec%p%P*(1+delta_P_arm/100.),Mh,1,ok_P_arm)
          endif 
! GAW - end 99/11/3

C DJG need to decay the rho here before we begin transporting through the
C DJG spectrometer
c	  m2 = Mh2
c	  if(doing_rho) then
c	     call rho_decay(dx_P_arm,dy_P_arm,delta_P_arm,spec.p.P,m2,
c	1	  main.epsilon,orig.Q2)
c	  endif
C DJG moved this to the last part of generate!!!

! ........ drift this position back to z=0, the plane through the target center

	  x_P_arm = x_P_arm - z_P_arm*dx_P_arm
	  y_P_arm = y_P_arm - z_P_arm*dy_P_arm
	  z_P_arm = 0.0

	  main%SP%p%z=y_P_arm

! ... Monte Carlo through the P arm! if we succeed, continue ...
! ... Here's what's passed:
!	spectrometer central momentum
!	spectrometer central theta angle
!	momentum delta
!	x, y, z, theta, and phi in TRANSPORT coordinates
!	x, y, theta, and phi at the focal plane
!	radiation length of target (NOT USED!)
!	particle mass (modified if the hadron decays)
!	multiple scattering flag
!	wcs smearing flag
!	decay flag
!	resmult=resolution factor for DCs (see simulate.inc)
!	vertical position at target (for reconstruction w/raster MEs).
!	ok flag

	  m2 = Mh2
	  pathlen = 0.0
	  if (hadron_arm.eq.1) then
	    call mc_hms(spec%p%P, spec%p%theta, delta_P_arm, x_P_arm,
     >		y_P_arm, z_P_arm, dx_P_arm, dy_P_arm, xfp, dxfp, yfp, dyfp,
     >		m2, mc_smear, mc_smear, doing_decay,
     >		ntup%resfac, fry, ok_P_arm, pathlen)
	  else if (hadron_arm.eq.2) then
	    call mc_sos(spec%p%P, spec%p%theta, delta_P_arm, x_P_arm,
     >		y_P_arm, z_P_arm, dx_P_arm, dy_P_arm, xfp, dxfp, yfp, dyfp,
     >		m2, mc_smear, mc_smear, doing_decay,
     >		ntup%resfac, fry, ok_P_arm, pathlen)
	  else if (hadron_arm.eq.3) then
	    call mc_hrsr(spec%p%P, spec%p%theta, delta_P_arm, x_P_arm,
     >		y_P_arm, z_P_arm, dx_P_arm, dy_P_arm, xfp, dxfp, yfp, dyfp,
     >		m2, mc_smear, mc_smear, doing_decay,
     >		ntup%resfac, fry, ok_P_arm, pathlen)
	  else if (hadron_arm.eq.4) then
	    call mc_hrsl(spec%p%P, spec%p%theta, delta_P_arm, x_P_arm,
     >		y_P_arm, z_P_arm, dx_P_arm, dy_P_arm, xfp, dxfp, yfp, dyfp,
     >		m2, mc_smear, mc_smear, doing_decay,
     >		ntup%resfac, fry, ok_P_arm, pathlen)
	  else if (hadron_arm.eq.5 .or. hadron_arm.eq.6) then
	    call mc_shms(spec%p%P, spec%p%theta, delta_P_arm, x_P_arm,
     >		y_P_arm, z_P_arm, dx_P_arm, dy_P_arm, xfp, dxfp, yfp, dyfp,
     >		m2, mc_smear, mc_smear, doing_decay,
     >		ntup%resfac, fry, ok_P_arm, pathlen, hadron_arm, use_first_cer)
	  endif


C DJG Do polarized target field stuff if needed
C DJG Note that the call to track_to_tgt is with -fry: for some reason that routine then
C DJG sets xx=-fry, and calls mc_hms_recon with xx, so it all works out. Whatever.
C DJG To summarize: fry points "down", frx points beam left (facing downstream)
C DJG For spectrometers to the right of the beamline, need to pass ctheta,stheta to track_to_tgt
C DJG For spectrometers to the left of the beamline, need to pass ctheta,-stheta to track_to_tgt

          if (using_tgt_field) then
	     phad = spec%p%P*(1.+delta_P_arm/100.0)
	     ctheta = cos(spec%p%theta)
	     stheta = sin(spec%p%theta)
	     if((hadron_arm.eq.1).or.(hadron_arm.eq.3)) then !spectrometers of the right (HMS, HRSR)
		call track_to_tgt(delta_P_arm,y_P_arm,dx_P_arm,dy_P_arm,frx,-fry,
     >   	     sign_hadron*phad,sqrt(m2),ctheta,stheta,1,ok_P_arm,hadron_arm)
	     else if((hadron_arm.eq.2).or.(hadron_arm.eq.4).or.(hadron_arm.eq.5)) then !left spects (SOS,HRSL,SHMS)
		call track_to_tgt(delta_P_arm,y_P_arm,dx_P_arm,dy_P_arm,frx,-fry,
     >  	     sign_hadron*phad,sqrt(m2),ctheta,-stheta,1,ok_P_arm,hadron_arm)
	     else
		write(6,*) 'Target field reconstruction not set up for your spectrometer'
		stop
	     endif
	  endif


	  if (.not.ok_P_arm) then
	     if (debug(3)) write(6,*)'mc: ok_P_arm =',ok_P_arm
	     return
	  endif

	  main%RECON%p%delta = delta_P_arm
	  main%RECON%p%yptar = dy_P_arm
	  main%RECON%p%xptar = dx_P_arm
	  main%RECON%p%z = y_P_arm
	  main%FP%p%x = xfp
	  main%FP%p%dx = dxfp
	  main%FP%p%y = yfp
	  main%FP%p%dy = dyfp
	  main%FP%p%path = pathlen

! CASE 2: Not using the detailed Monte Carlo, just copy the IN event to the
! OUT record

	else
	  main%RECON%p%delta = main%SP%p%delta
	  main%RECON%p%yptar = main%SP%p%yptar
	  main%RECON%p%xptar = main%SP%p%xptar
	endif

! Fill recon quantities.

	recon%p%delta = main%RECON%p%delta
	recon%p%yptar = main%RECON%p%yptar
	recon%p%xptar = main%RECON%p%xptar
	recon%p%z = main%RECON%p%z
	recon%p%P = spec%p%P*(1.+recon%p%delta/100.)
	recon%p%E = sqrt(recon%p%P**2 + Mh2)
	dx_tmp = recon%p%xptar + spec%p%offset%xptar
	dy_tmp = recon%p%yptar + spec%p%offset%yptar

	call physics_angles(spec%p%theta,spec%p%phi,dx_tmp,
     >           dy_tmp,recon%p%theta,recon%p%phi)

! ... correct for energy loss - use most probable (last flag = 4)

	if (correct_Eloss) then
	  call trip_thru_target (3, zero, recon%p%E,
     >		recon%p%theta, eloss_P_arm, r,Mh,4)
	  recon%p%E = recon%p%E + eloss_P_arm
	  recon%p%E = max(recon%p%E,sqrt(Mh2+0.000001)) !can get P~0 when calculating hadron momentum-->P<0 after eloss
	  recon%p%P = sqrt(recon%p%E**2-Mh2)
C DJG Should not correct delta for Eloss - delta is a SPECTROMETER variable
C	  recon%p%delta = (recon%p%P-spec%p%P)/spec%p%P*100.
	endif

!___ E arm ______________

! Go from TRUE to SPECTROMETER quantities by computing target distortions

! ... ionization loss correction (if requested) and Coulomb deceleration

	if (debug(3)) write(6,*)'mc: e arm stuff0 =',
     >		orig%e%E,main%target%Eloss(2),spec%e%P
	main%SP%e%delta=100* (orig%e%E - main%target%Eloss(2)
     >		- main%target%Coulomb - spec%e%P) / spec%e%P

! ... multiple scattering

	if (mc_smear) then
	  call target_musc(orig%e%p, beta_electron, main%target%teff(2), dangles)
	else
	  dangles(1)=0.0
	  dangles(2)=0.0
	endif

	main%SP%e%yptar = orig%e%yptar + dangles(1) + dang_in(1)
	main%SP%e%xptar = orig%e%xptar + dangles(2) + dang_in(2)*spec%p%cos_th

! CASE 1: Using the spectrometer Monte Carlo

	if (using_E_arm_montecarlo) then

! ... change to E arm spectrometer coordinates (TRANSPORT system),

	  if (abs(cos(spec%e%phi)).gt.0.0001) then  !phi not at +/- pi/2
	    write(6,*) 'y_E_arm, z_E_arm will be incorrect if spec.e.phi <> pi/2 or 3*pi/2'
	    write(6,*) 'spec.e.phi=',spec%e%phi,'=',spec%e%phi*180/pi,'degrees'
	  endif
	  delta_E_arm = main%SP%e%delta
	  x_E_arm = -main%target%y
	  y_E_arm = -main%target%x*spec%e%cos_th - main%target%z*spec%e%sin_th*sin(spec%e%phi)
	  z_E_arm =  main%target%z*spec%e%cos_th + main%target%x*spec%e%sin_th*sin(spec%e%phi)

! ... Apply spectrometer offset (using spectrometer coordinate system).
	  x_E_arm = x_E_arm - spec%e%offset%x
	  y_E_arm = y_E_arm - spec%e%offset%y
	  z_E_arm = z_E_arm - spec%e%offset%z
	  dx_E_arm = main%SP%e%xptar - spec%e%offset%xptar
	  dy_E_arm = main%SP%e%yptar - spec%e%offset%yptar

! GAW -project to z=0 to compare with reconstructed target positions
          if (using_tgt_field) then      ! do target field tracking - GAW

            if (debug(6)) then
               write(*,*) '------------------------------'
               write(*,'("frx,fry,x_E_arm =      ",3f12.5)') frx,fry,x_E_arm
            endif
            call track_from_tgt(x_E_arm,y_E_arm,z_E_arm,dx_E_arm,dy_E_arm,
     >                          -spec%e%P*(1+delta_E_arm/100.),Me,-1,ok_E_arm)
          endif 

! ........ drift this position back to z=0, the plane through the target center

	  x_E_arm = x_E_arm - z_E_arm*dx_E_arm
	  y_E_arm = y_E_arm - z_E_arm*dy_E_arm
	  z_E_arm = 0.0

	  main%SP%e%z=y_E_arm

! ... Monte Carlo through the E arm! if we succeed, continue ...
! ... Here's what's passed:
!	spectrometer central momentum
!	spectrometer central theta angle
!	momentum delta
!	x, y, z, theta, and phi in TRANSPORT coordinates
!	x, y, theta, and phi at the focal plane
!	radiation length of target (NOT USED!)
!	particle mass
!	multiple scattering flag
!	wcs smearing flag
!	resmult=resolution factor for DCs (see simulate.inc)
!	decay flag (hardwired to .false. for electron arm).
!	ok flag

	  m2 = me2
	  pathlen = 0.0
	  if (electron_arm.eq.1) then
	    call mc_hms(spec%e%P, spec%e%theta, delta_E_arm, x_E_arm,
     >		y_E_arm, z_E_arm, dx_E_arm, dy_E_arm, xfp, dxfp, yfp, dyfp,
     >		me2, mc_smear, mc_smear, .false.,
     >		tmpfact, fry, ok_E_arm, pathlen)
	  else if (electron_arm.eq.2) then
	    call mc_sos(spec%e%P, spec%e%theta, delta_E_arm, x_E_arm,
     >		y_E_arm, z_E_arm, dx_E_arm, dy_E_arm, xfp, dxfp, yfp, dyfp,
     >		me2, mc_smear, mc_smear, .false.,
     >		tmpfact, fry, ok_E_arm, pathlen)
	  else if (electron_arm.eq.3) then
	    call mc_hrsr(spec%e%P, spec%e%theta, delta_E_arm, x_E_arm,
     >		y_E_arm, z_E_arm, dx_E_arm, dy_E_arm, xfp, dxfp, yfp, dyfp,
     >		me2, mc_smear, mc_smear, .false.,
     >		tmpfact, fry, ok_E_arm, pathlen)
	  else if (electron_arm.eq.4) then
	    call mc_hrsl(spec%e%P, spec%e%theta, delta_E_arm, x_E_arm,
     >		y_E_arm, z_E_arm, dx_E_arm, dy_E_arm, xfp, dxfp, yfp, dyfp,
     >		me2, mc_smear, mc_smear, .false.,
     >		tmpfact, fry, ok_E_arm, pathlen)
	  else if (electron_arm.eq.5 .or. electron_arm.eq.6) then
	    call mc_shms(spec%e%P, spec%e%theta, delta_E_arm, x_E_arm,
     >		y_E_arm, z_E_arm, dx_E_arm, dy_E_arm, xfp, dxfp, yfp, dyfp,
     >		me2, mc_smear, mc_smear, .false.,
     >		tmpfact, fry, ok_E_arm, pathlen, electron_arm, use_first_cer)
	  else if (electron_arm.eq.7 .or. electron_arm .eq. 8) then
             if (abs(spec%p%phi-pi/2) .eq. 10.) then
	     zhadron = -recon%p%z*(cos(spec%p%theta)/tan(spec%p%theta+recon%p%yptar)+sin(spec%p%theta)) ! recon.p.z is really ytgt
	     else
	     zhadron = recon%p%z*(cos(spec%p%theta)/tan(spec%p%theta-recon%p%yptar)+sin(spec%p%theta))
	     endif
	    call mc_calo(spec%e%p, spec%e%theta, delta_e_arm, x_e_arm,
     >		y_e_arm, z_e_arm, dx_e_arm, dy_e_arm, xfp, dxfp, yfp, dyfp,
     >		m2, mc_smear, mc_smear, doing_decay,
     >		ntup%resfac, frx, fry, ok_e_arm, pathlen, using_tgt_field,
     >          zhadron,electron_arm,drift_to_cal)
	  endif
	  ntup%resfac=ntup%resfac+tmpfact


C DJG Do polarized target field stuff if needed
C DJG Note that the call to track_to_tgt is with -fry: for some reason that routine then
C DJG sets xx=-fry, and calls mc_hms_recon with xx, so it all works out. Whatever.
C DJG To summarize: fry points "down", frx points beam left (facing downstream)
C DJG For spectrometers to the right of the beamline, need to pass ctheta,stheta to track_to_tgt
C DJG For spectrometers to the left of the beamline, need to pass ctheta,-stheta to track_to_tgt

          if (using_tgt_field) then
	     pelec = spec%e%P*(1.+delta_E_arm/100.0)
	     ctheta = cos(spec%e%theta)
	     stheta = sin(spec%e%theta)
	     if((electron_arm.eq.1).or.(electron_arm.eq.3)) then !spectrometers on the right (HMS, HRSR)
		call track_to_tgt(delta_E_arm,y_E_arm,dx_E_arm,dy_E_arm,frx,-fry,
     > 	          -1.0*pelec,sqrt(me2),ctheta,stheta,-1,ok_E_arm,electron_arm)
	     else if((electron_arm.eq.2).or.(electron_arm.eq.4).or.(electron_arm.eq.5)) then !left spects(SOS,HRSL,SHMS)
		call track_to_tgt(delta_E_arm,y_E_arm,dx_E_arm,dy_E_arm,frx,-fry,
     >	           -1.0*pelec,sqrt(me2),ctheta,-stheta,-1,ok_E_arm,electron_arm)
	     else
		write(6,*) 'Target field reconstruction not set up for your spectrometer'
		stop
	     endif
	  endif

	  if (.not.ok_E_arm) then
	    if (debug(3)) write(6,*)'mc: ok_E_arm =',ok_E_arm
	    return
	  endif

	  main%RECON%e%delta = delta_E_arm
	  main%RECON%e%yptar = dy_E_arm
	  main%RECON%e%xptar = dx_E_arm
	  main%RECON%e%z = y_E_arm
	  main%FP%e%x = xfp
	  main%FP%e%dx = dxfp
	  main%FP%e%y = yfp
	  main%FP%e%dy = dyfp
	  main%FP%e%path = pathlen

! CASE 2: Not using the detailed Monte Carlo, just copy the IN event to the
! OUT record

	else
	  main%RECON%e%delta = main%SP%e%delta
	  main%RECON%e%yptar = main%SP%e%yptar
	  main%RECON%e%xptar = main%SP%e%xptar
	endif

! Fill recon quantities%

	recon%e%delta = main%RECON%e%delta
	recon%e%yptar = main%RECON%e%yptar
	recon%e%xptar = main%RECON%e%xptar
	recon%e%z = main%RECON%e%z
	recon%e%P = spec%e%P*(1.+recon%e%delta/100.)
	recon%e%E = recon%e%P

	dx_tmp = recon%e%xptar + spec%e%offset%xptar
        dy_tmp = recon%e%yptar + spec%e%offset%yptar

	call physics_angles(spec%e%theta,spec%e%phi,dx_tmp,
     >		dy_tmp,recon%e%theta,recon%e%phi)


! ... correct for energy loss and correct for Coulomb deceleration

	if (correct_Eloss) then
	  call trip_thru_target (2, zero, recon%e%E, recon%e%theta,
     >                              eloss_E_arm, r, Me, 4)
	  recon%e%E = recon%e%E + eloss_E_arm
	endif
c	recon%e%E = recon%e%E + targ%Coulomb%ave
c Generally, we do not correct for coulomb effects in the reconstruction
	recon%e%E = recon%e%E 
	recon%e%P = recon%e%E
C DJG Should not correct delta for energy loss - delta is a SPECTROMETER
C variable!!
c	recon.e.delta = (recon.e.P-spec.e.P)/spec.e.P*100.

! Made it!
	success = .true.

	return
	end

Analyzer/Replay: Mark Jones, Documents: Stephen Wood
Powered by
ViewCVS 0.9.2-cvsgraph-1.4.0