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

File: [HallC] / simc_gfortran / physics_pion.f (download)
Revision: 1.1.1.1 (vendor branch), Fri Jan 23 13:33:52 2009 UTC (15 years, 7 months ago) by gaskelld
Branch: gaskelld, MAIN
CVS Tags: start, HEAD
Changes since 1.1: +0 -0 lines
initial import

	real*8 function peepi(vertex,main)

* Purpose:
* This function determines the kinematics in the PHOTON-NUCLEON center of mass
* frame, calculates some of the kinematical variables (s,t, and CM quantities
* in the 'main' structure), and returns the pion cross section.
*
*   output:
*	peepi		!d5sigma/dEe'dOmegae'Omegapi	(microbarn/MeV/sr^2)

	implicit none
	include 'simulate.inc'

	type(event_main):: main
	type(event):: vertex

* NOTE: when we refer to the center of mass system, it always refers to the
* photon-NUCLEON center of mass, not the photon-NUCLEUS!  The model gives
* the cross section in the photon-nucleon center of mass frame.

	real*8 sigma_eepi
	real*8 k_eq			!equivalent photon energy.
	real*8 gtpr			!gamma_t prime.
	real*8 fac
	real*8 tfcos,tfsin		!cos/sin of theta between pfermi and q
	real*8 s

! Variables calculated in transformation to gamma-NUCLEON center of mass.
        real*8 gstar,bstar,bstarx,bstary,bstarz		!beta of boost to C.M.
        real*8 nustar,qstar,qstarx,qstary,qstarz	!q in C.M.
        real*8 epicm,ppicm,ppicmx,ppicmy,ppicmz		!p_hadron in C.M.
        real*8 ebeamcm,pbeamcm,pbeamcmx,pbeamcmy,pbeamcmz !p_beam in C.M.
        real*8 etarcm,ptarcm,ptarcmx,ptarcmy,ptarcmz	!p_fermi in C.M.
        real*8 thetacm,phicm,phiqn,jacobian,jac_old

	real*8 sig_multipole,sig_blok,sig_param04

	integer final_state
	logical first,low_w_flag

	data first /.TRUE./
	data low_w_flag /.FALSE./	!Assume high W kinematics to start

* Calculate velocity of PHOTON-NUCLEON C.M. system in the lab frame. Use beta
* and gamma of the cm system (bstar and gstar) to transform particles into
* c.m. frame.  Define z along the direction of q, and x to be along the
* direction of the pion momentum perpendicular to q.

	call transform_to_cm(vertex,main,
     &		gstar,bstar,bstarx,bstary,bstarz,
     &		nustar,qstar,qstarx,qstary,qstarz,
     &		epicm,ppicm,ppicmx,ppicmy,ppicmz,
     &		ebeamcm,pbeamcm,pbeamcmx,pbeamcmy,pbeamcmz,
     &		etarcm,ptarcm,ptarcmx,ptarcmy,ptarcmz,
     &		thetacm,phicm,phiqn,jacobian,jac_old)

	main%thetacm = thetacm
	main%phicm = phicm
	main%pcm = ppicm
	main%davejac = jacobian
	main%johnjac = jac_old		!approx. assuming collinear boost.

!	write (6,*) jacobian,jac_old,100.*(jacobian-jac_old)/jacobian,'%'


* calculate some kinematical variables
* 'f' and 'fer' indicate fermi momenta. 'star' or 'cm' indicate CM system
* Some of the physics calculations (t,epsi,s, etc...) are redundant with
* the calculations in event.f.  We should use the main.* variables from
* complete_ev where possible.  WORSE YET, WE CHANGE UNITS OF MAIN.W,... HERE!!!

	tfcos = pferx*vertex%uq%x+pfery*vertex%uq%y+pferz*vertex%uq%z
	if(tfcos-1..gt.0..and.tfcos-1..lt.1.d-8)tfcos=1.0
	tfsin=sqrt(1.-tfcos**2)

	s = (vertex%nu+efer)**2-(vertex%q+pfer*tfcos)**2-(pfer*tfsin)**2
	main%wcm = sqrt(s)



*******************************************************************************
* Get photon flux factor (two options, see comments below).
*
* DJG,2000: Replace targ.Mtar_struck in denominator of gammaflux with more 
* general efer-pfer*tfcos, for pfer =0 this reverts to old form
*	k_eq = (s-targ%Mtar_struck**2)/2./(efer-pfer*tfcos)
*
* JRA,2001: Go back to original version - more consistent with phase space used
* in the subroutine (according to DJG - see gaskell_model.ps)
	k_eq = (main%wcm**2-targ%Mtar_struck**2)/2./targ%Mtar_struck

* Initialize some stuff for the multipole model.
	if (first) then
	  first = .false.
	  if(which_pion.eq.0 .or. which_pion.eq.10) then  !pi+
	    final_state = 1
	  else
	    final_state = 2
	  endif
	  if(k_eq.lt.500.)then
	    write(6,*) 'Using low W multipole pion model...'
	    low_w_flag = .TRUE.
	  endif
	endif

* Get cross section in photon-nucleon center of mass.  sigcm1 is blok
* fit (default model - can always be evaluated).  sigcm2 is multipole,
* IF low_w_flag is set.
* NOTE: s, t, mtar, and Q2 must be converted to GeV first.

c	ntup.sigcm1 = sig_blok(thetacm,phicm,main%t/1.d6,vertex%q2/1.d6,s/1%d6,main.epsilon,
c     >		targ%Mtar_struck/1000.,which_pion)

CDG Change default to PARAM04 - this works better at larger Q2
	ntup%sigcm1 = sig_param04(thetacm,phicm,main%t/1.d6,vertex%q2/1.d6,s/1.d6,main%epsilon,
     >		targ%Mtar_struck/1000.,which_pion)

	sigma_eepi = ntup%sigcm1

* For low w, use multipole expansion as default cross section model.
	if(low_w_flag) then

	  ntup%sigcm2 = sig_multipole(k_eq,efer,qstar,tfcos,ppicm,s/1.d6,thetacm,
     >		phicm,main%epsilon,final_state,vertex%q2/1.d6,targ%Mtar_struck/1000.,pfer,mh)
	  sigma_eepi = ntup%sigcm2

	endif
	ntup%sigcm = sigma_eepi		!sig_cm


*******************************************************************************

* sigma_eepi is two-fold C.M. cross section: d2sigma/dt/dphi_cm [ub/MeV**2/rad]
* Convert from dt dphi_cm --> dOmega_lab using 'jacobian' [ub/sr]
* Convert to 5-fold by multiplying by flux factor, gtpr [1/MeV]
* to give d5sigma/dOmega_pi/dOmega_e/dE_e [ub/Mev/sr].
*
* Note that there is an additional factor 'fac' included with gtpr.   This
* takes into account pieces in the flux factor that are neglected (=1) in
* colinear collisions.  The flux factor is |v_1-v_2| * 2E_1 * 2E_2.
* For a stationary target, v_2=0 and so velocity term is v_1=1 (electron
* beam), and E_2=M_2.  For collinear boost, the flux factor can be expressed
* in a way that is lorenz invariant, and so can be used for lab or C.M.
* For a NON-COLLINEAR boost, there are two changes.  First, the |v| term
* becomes 1 - (z component of pfer)/efer.  Second, E_2 isn't just the mass,
* it becomes E_fermi, so we have to remove targ.Mtar_struck (which is used
* for E_2 by default) and replace it with efer.  Since the flux factor 
* comes in the denominator, we replace the usual flux factor (gtpr) with
* gtpr*fac, where fac = 1/ ( (1-pfer_z/efer)* (efer/mtar_struck) ).


	fac = 1./(1.-pferz*pfer/efer) * targ%Mtar_struck/efer
	gtpr = alpha/2./(pi**2)*vertex%e%E/vertex%Ein*k_eq/vertex%q2/(1.-main%epsilon)

	peepi = sigma_eepi*jacobian*(gtpr*fac) !ub/MeV^2/rad-->ub/sr-->ub/MeV/sr

	return
	end


	real*8 function sig_multipole(nu,efer,qstar,tfcos,ppicm,s_gev,thetacm,
     >		phicm,eps,final_state,q2_gev,mtar_gev,pfer,mh)

* Purpose:
* This routine calculates p(e,e'pi+)n cross sections from a multipole fit.
* The multipole expansion gives dsigma/dOmega_cm.  We use dt/dcostheta_cm
* to give dsigma/dt/dphi_cm, which is returned as sig_multipole [ub/MeV^2-rad].

	implicit none

	complex*8 H1,H2,H3,H4,H5,H6         !Helicity amplitudes
	complex*8 amplitude(7),A1,A2,A3,A4,A12,A34,A1234
	complex*8 AT(7,3,8,10)
	complex*8 gf1,gf2,gf3,gf4,gf7,gf8
	complex*8 hnperp,hfperp,hnpar,hfpar,hnlong,hflong
	complex*8 XL,XT,XTT,XLT

	real*8 nu,efer,qstar,tfcos,ppicm,s_gev,thetacm,phicm,eps,q2_gev,mtar_gev,pfer,mh

	real*8 sig219,sig
	real*8 sigt,sigl,siglt,sigtt	!components of dsigma/dt
	real*8 sintcm,costcm,sinto2cm,costo2cm
	real*8 root_two,mpi_to_microbarn
	real*8 CLEB(2,3),qfm,Q2_table(8),nu_table(10),atemp(42)
	real*8 Q2_high,Q2_low,deltaQ2,nu_high,nu_low,delta_nu,F

	integer Q2_count,nu_count,multipole,IT1,IT2,IT3,IT4,IT5
	integer final_state,isospin

	logical first

	data first /.TRUE./

	if(nu.ge.500.0) then
	  WRITE(6,*) 'LOOK OUT CHEESY POOF BREATH!'
	  WRITE(6,*) 'W IS TOO HIGH FOR THIS MODEL'
	  WRITE(6,*) 'SETTING NU to 499.9'
	nu=499.9
	endif

* Initialize some shorthand variables.
	sintcm = sin(thetacm)
	costcm = cos(thetacm)
	sinto2cm = sin(thetacm/2.)
	costo2cm = cos(thetacm/2.)


* DJG Read in multipoles and initialize CG coefficients for low W model.
*       Clebsch-Gordon Coefficients  CLEB(FINAL STATE, ISOSPIN)
*					  1: PI+ N--------1(IS.1/2)
*					  2: PI- P--------2(IV.1/2)
*						  --------3(IV.3/2)
	if(first) then
	  first = .FALSE.
	  root_two = sqrt(2.)
	  mpi_to_microbarn = 197.327/mh
	  CLEB(1,1)=root_two
	  CLEB(1,2)=root_two/3.
	  CLEB(1,3)=-root_two/3.
	  CLEB(2,1)=root_two
	  CLEB(2,2)=-root_two/3.
	  CLEB(2,3)=root_two/3.

	  OPEN(3,FILE='MULTIPOL.file',STATUS='OLD')
	  do Q2_count = 1,8
	    read(3,202) qfm				!q**2 in fm**-2
	    Q2_table(Q2_count) = qfm*0.0389379	!convert to GeV**2
	    do nu_count=1,10
	      read(3,203)nu_table(nu_count)
	      read(3,204)atemp	!multipolarity amplitudes, see,eg,table below
	      do multipole=1,7
		IT1=multipole+7
		IT2=multipole+14
		IT3=multipole+21
		IT4=multipole+28
		IT5=multipole+35

C      Multipoles in units of  10**-2 MPI+**-1
C  Multipole Amplitude Table: AT(TYPE    ,  ISOSPIN ,-Q**2 , P.EQ.PH.R.)
C				  1:-----E0+-------0(IS.1/2)
C				  2:-----M1--------1(IV.1/2)
C				  3:-----E1+-------3(IV.3/2)
C				  4:-----M1+
C				  5:-----S0+
C				  6:-----S1-
C				  7:-----S1+
		AT(multipole,3,Q2_count,nu_count)=
     >			CMPLX(ATEMP(multipole),ATEMP(IT1))
		AT(multipole,2,Q2_count,nu_count)=CMPLX(ATEMP(IT2),ATEMP(IT3))
		AT(multipole,1,Q2_count,nu_count)=CMPLX(ATEMP(IT4),ATEMP(IT5))
	      enddo	!multipole
	    enddo	!nu
	  enddo	!Q2
	  close(unit=3)
	endif		!if first time.

* Interpolate multipole amplitudes from table.
	do Q2_count=1,7
	  Q2_high=0.
	  Q2_low=0.
	  nu_high=0.
	  nu_low=0.
	  if((q2_gev.gt.Q2_table(Q2_count)).and.
     >	       (q2_gev.lt.Q2_table(Q2_count+1))) then
	    Q2_high = Q2_table(Q2_count+1)
	    Q2_low = Q2_table(Q2_count)
	    deltaQ2 = (Q2_high-Q2_low)
	    do nu_count=1,9
	      if((nu.gt.nu_table(nu_count)).and.
     >		   (nu.lt.nu_table(nu_count+1))) then
		nu_high = nu_table(nu_count+1)
		nu_low =  nu_table(nu_count)
		delta_nu = nu_high-nu_low
		do multipole=1,7
		amplitude(multipole) = 0.
		  do isospin = 1,3
		    A1 = AT(multipole,isospin,Q2_count,nu_count)
		    A2 = AT(multipole,isospin,Q2_count+1,nu_count)
		    A3 = AT(multipole,isospin,Q2_count,nu_count+1)
		    A4 = AT(multipole,isospin,Q2_count+1,nu_count+1)
		    A12= (A1*(Q2_high-q2_gev) + A2*(q2_gev-Q2_low))/deltaQ2
		    A34= (A3*(Q2_high-q2_gev) + A4*(q2_gev-Q2_low))/deltaQ2
		    A1234 = (A12*(nu_high-nu)+A34*(nu-nu_low))/delta_nu
		    amplitude(multipole) = amplitude(multipole) +
     >					CLEB(final_state,isospin)*A1234
		  enddo
*					!Convert multipoles to microb^.5
		amplitude(multipole) = mpi_to_microbarn*amplitude(multipole)
		enddo
	      endif	!nu check
	    enddo	!nu
	  endif		!Q2 check
	enddo		!Q2

* Now calculate the Helicity amplitudes

* CGLN amplitudes (Chew et. al.,Phys. Rev. 106,1345 (1957).)

	gf1 = amplitude(1) + 3.*costcm*(amplitude(4)+amplitude(3))
	gf2 = 2.*amplitude(4) + amplitude(2)
	gf3 = 3.*(amplitude(3)-amplitude(4))
	gf4 = (0.,0.)
* DJG: gf5 and gf6 are not independent of gf7 and gf8,so only use last two.
	gf7 = amplitude(6) - 2.*amplitude(7)
	gf8 = amplitude(5) + 6.*costcm*amplitude(7)

* DJG WALKER helicity amplitudes (Walker,Phys.Rev. 182,1729 (1969).)
	H5 = -costo2cm*(gf7+gf8)
	H6 = -sinto2cm*(gf7-gf8)
	H4 = (2.*sinto2cm*(gf1+gf2)+costo2cm*sintcm*(gf3+gf4))/root_two
	H2 = (-2.*costo2cm*(gf1-gf2)+sinto2cm*sintcm*(gf3-gf4))/root_two
	H1 = (-costo2cm*sintcm*(gf3+gf4))/root_two
	H3 = (-sinto2cm*sintcm*(gf3-gf4))/root_two

* DJG Bartl helicity amplitudes (Bartl,Nuc.Phys.B62,267 (1973).)
* key:		hnperp -----> photon pol. perp. to scatt. plane,no baryon flip
*		hfpar -----> photon pol. par. to scatt. plane, baryon flip
*		hnlong -----> longitudinal photon pol., no baryon flip
*		hflong -----> longitudinal photon pol., baryon flip
*		hnpar -----> photon pol. par. to scatt. plane, no baryon flip
*		hfperp -----> photon pol. perp. to scatt. plane, baryon flip

	hnperp = (H4+H1)/root_two
	hfpar = (H3+H2)/root_two
	hnlong = H5
	hflong = H6
	hnpar = (H4-H1)/root_two
	hfperp = (H3-H2)/root_two

	XT = hnperp*CONJG(hnperp)+hfpar*CONJG(hfpar)+hnpar*CONJG(hnpar)+
     >		hfperp*CONJG(hfperp)
	XL = hnlong*CONJG(hnlong) + hflong*CONJG(hflong)
	XTT = hnpar*CONJG(hnpar)+hfperp*CONJG(hfperp)-hnperp*CONJG(hnperp)-
     >		hfpar*CONJG(hfpar)
	XLT = hnlong*CONJG(hnpar)+hflong*CONJG(hfpar)

	F = 2.*((efer-pfer*tfcos)/1000.)*sqrt(s_gev)*(ppicm/1000.)/
     >		(s_gev-mtar_gev**2)/mtar_gev

	sigt = F/2.*XT
	sigl = F*XL
	sigtt = F/2.*XTT
	siglt = 2.*F*REAL(XLT)
	siglt=siglt/2.		!Divide siglt by 2 because Henk uses
				!a different convention when adding
				!the four terms together. DJG

	sig219=(sigt+eps*sigl+eps*cos(2.*phicm)*sigtt
     >		+sqrt(2.0*eps*(1.+eps))*cos(phicm)*siglt)/1.d0

* DJG: sig219 is dsig/dOmega_cm - convert to dsig/dtdphi_cm
* DJG: using dt/dcos_cm = 2*ppicm*qcm

	sig = sig219/ppicm/qstar/2.
	sig_multipole = sig

202	format(/11X,f5.1/)
203	format(11X,f5.0)
204	format(6(/9X,7f8.3))

	return
	end





	real*8 function sig_blok(thetacm,phicm,t,q2_gev,s_gev,eps,mtar_gev,which_pion)

* Purpose:
* This routine calculates p(e,e'pi+)n cross sections from a fit to the data of
* Brauel et al., Z.Phys.C. 3(1979)101.
* Fit gives dsigma/dt/dphi_cm, which is returned as sig_blok [ub/MeV^2-rad].

	implicit none
	include 'constants.inc'

	real*8 sig219,sig
	real*8 sigt,sigl,siglt,sigtt	!components of dsigma/dt
	
	real*8 mrho_emp
	real*8 fpi,fpi2

	real*8 thetacm,phicm,t,q2_gev,s_gev,eps,mtar_gev
	integer which_pion

* Fits to p(e,e'pi+)n cross-sections
* HPB: cross sections for pi-fits to Brauel's n(e,e'pi-)p
* HPB: dsigma/dt cross sections at W=2.19 and Q^2=0.70 MODIFIED BY HAND!!!

	  sigl = 27.8*exp(-11.5*abs(t))
	  sigt = 10.0*(5.*abs(t))*exp(-5.*abs(t))
	  siglt= 0.0*sin(thetacm)
	  sigtt= -(4.0*sigl+0.5*sigt)*(sin(thetacm))**2

	  if (which_pion.eq.1 .or. which_pion.eq.11) then	!pi-
	    sigt =sigt *0.25*(1.+3.*exp(-10.*abs(t)))
	    sigtt=sigtt*0.25*(1.+3.*exp(-10.*abs(t)))
	  endif

* GMH: Now scale sigl by Q2*pion_formfactor
* HPB: parametrization of pion formfactor in the region 0.5<Q2<1.8

	  mrho_emp = 0.712   !DETERMINED BY EMPIRICAL FIT TO FORMFACTOR (GeV/c**2)

	  fpi=1./(1.+1.65*q2_gev+0.5*q2_gev**2)
	  fpi2=fpi**2

* HPB: now convert to different Q^2
* HPB: s_L follows Q^2*Fpi^2; s_T and s_TT go as 1/(0.3+Q^2)?
* HPB: factor 0.1215 therefore is value of q2*fpi**2 for q2=0.7

	  sigl=sigl*(fpi2*q2_gev)/0.1215
	  sigt=sigt/(0.3+q2_gev)
	  sigtt=sigtt/(0.3+q2_gev)

	  sig219=(sigt+eps*sigl+eps*cos(2.*phicm)*sigtt
     >		+sqrt(2.0*eps*(1.+eps))*cos(phicm)*siglt)/1.d0

* GMH: Brauel scaled all his data to W=2.19 GeV, so rescale by 1/(W**2-mp**2)**2
* HPB: factor 15.333 therefore is value of (W**2-mp**2)**2 at W=2.19

	  sig=sig219*15.333/(s_gev-mtar_gev**2)**2
	  sig=sig/2./pi/1.d+06   !dsig/dtdphicm in microbarns/MeV**2/rad

	  sig_blok = sig

	  return
	end

	real*8 function sig_param04(thetacm,phicm,t,q2_gev,s_gev,eps,mtar_gev,which_pion)

* Purpose:
* Fit that reproduces Fpi1 results pretty well, but is nicely behaved at 
* larger Q2
* Fit gives dsigma/dt/dphi_cm, which is returned as sig_blok [ub/MeV^2-rad].

	implicit none
	include 'constants.inc'

	real*8 sig219,sig
	real*8 sigt,sigl,siglt,sigtt	!components of dsigma/dt
	
	real*8 fpi,q2fpi2,q2fpi,polefactor

	real*8 thetacm,phicm,t,q2_gev,s_gev,eps,mtar_gev
	integer which_pion

	fpi=1./(1.+1.77*q2_gev+0.05*q2_gev**2)
	q2fpi=q2_gev*fpi
	q2fpi2=q2_gev*fpi**2
	polefactor=abs(t)/((abs(t)-0.02)**2)
	
	sigL =350.0*q2fpi2*exp((16.0-7.5*alog(q2_gev))*(-t))
	sigT =4.5/q2_gev+2.0/q2_gev**2
	sigLT=(exp(0.79-3.4/sqrt(q2_gev)*(t))
     >       +1.1-3.6/q2_gev**2)*sin(thetacm)
	sigTT=-5.0/q2_gev**2*polefactor*sin(thetacm)**2


CDG For now assume sigL(pi+)=sigL(pi-)
	if (which_pion.eq.1 .or. which_pion.eq.11) then	!pi-
	   sigt =sigt *0.25*(1.+3.*exp(-10.*abs(t)))
	   sigtt=sigtt*0.25*(1.+3.*exp(-10.*abs(t)))
	endif


	  sig219=(sigt+eps*sigl+eps*cos(2.*phicm)*sigtt
     >		+sqrt(2.0*eps*(1.+eps))*cos(phicm)*siglt)/1.d0

* GMH: Brauel scaled all his data to W=2.19 GeV, so rescale by 1/(W**2-mp**2)**2
* HPB: factor 15.333 therefore is value of (W**2-mp**2)**2 at W=2.19

	  sig=sig219*8.539/(s_gev-mtar_gev**2)**2
	  sig=sig/2./pi/1.d+06   !dsig/dtdphicm in microbarns/MeV**2/rad

	  sig_param04 = sig

	  return
	end

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