00001 #include "TRhoEtaCrossPart.h"
00002 #include "TConstant.h"
00003
00004 #include <complex>
00005 #include <iostream>
00006
00007 using namespace rb;
00008 typedef std::complex<double> complex_t;
00009
00010 inline complex_t operator+(const double &x, const complex_t &y) {
00011 return y + x;
00012 }
00013
00014 inline complex_t operator-(const double &x, const complex_t &y) {
00015 return -(y - x);
00016 }
00017
00018 inline double Gamma(const double Q2, const double M2, const double G){
00019 double beta2 = (Q2-4*mpi2)/(M2-4*mpi2);
00020 double beta = sqrt(beta2);
00021 return G*M2/Q2*beta2*beta;
00022 }
00023
00024
00025 inline complex_t Rrho(double Q2, bool IsIsospinBreak){
00026 if(Q2<4*mpi2) return 0;
00027 const complex_t I(0,1);
00028 double Q = sqrt(Q2);
00029 complex_t prop_rho = Mrho2/(Q2 - Mrho2 + I*(Gamma(Q2,Mrho2,Grho)*Q));
00030 complex_t prop_rhop = Mrhop2/(Q2 - Mrhop2 + I*(Gamma(Q2,Mrhop2,Grhop)*Q));
00031 complex_t prop_rhopp = Mrhopp2/(Q2 - Mrhopp2 + I*(Gamma(Q2,Mrhopp2,Grhopp)*Q));
00032 complex_t prop_rhoppp = Mrhoppp2/(Q2 - Mrhoppp2 + I*(Gamma(Q2,Mrhoppp2,Grhoppp)*Q));
00033
00034
00035
00036
00037 const complex_t beta(-0.178042,-0.369325);
00038
00039
00040 const complex_t gamma(-0.068488,0.0280249);
00041
00042 const complex_t xi(0.05,0.0);
00043 if(IsIsospinBreak){
00044
00045 const complex_t delta(0.002,0);
00046 complex_t prop_omega = Momega2/(Q2 - Momega2 + I*(Gomega*Momega));
00047
00048 return (prop_rho*(1-delta*Q2/Momega2*prop_omega) + beta*prop_rhop + gamma*prop_rhopp + xi*prop_rhoppp)/(1+beta+gamma+xi);
00049 } else {
00050 return (prop_rho + beta*prop_rhop + gamma*prop_rhopp + xi*prop_rhoppp)/(1+beta+gamma+xi);
00051 }
00052 }
00053
00054 inline complex_t Amp(double s){
00055 const complex_t I(0,1);
00056 const double Apsi = 4*alpha*Gpsi/(3*Geepsi);
00057 const double phipsi = -M_PI/2;
00058 const double Apsip = 2*alpha*Gpsip/(3*Geepsip);
00059 const double phipsip = -M_PI/2;
00060 const double Apsipp = alpha*Gpsipp/(3*Geepsipp);
00061 const double phipsipp = -M_PI/2;
00062 complex_t res = 3*sqrt(s)/alpha*
00063 (
00064 Geepsi*(1 + Apsi*exp(I*phipsi))/(s - Mpsi2 + I*Mpsi*Gpsi) +
00065 Geepsip*(1 + Apsip*exp(I*phipsip))/(s - Mpsip2 + I*Mpsip*Gpsip) +
00066 Geepsipp*(1 + Apsipp*exp(I*phipsipp))/(s - Mpsipp2 + I*Mpsipp*Gpsipp));
00067 return res;
00068 }
00069
00070 complex_t FRhoEta(double s, double Q02, double Qp2, double Qm2){
00071
00072 complex_t H = Rrho(Q02,true);
00073 return (5e-3*(1/s))*H*(1+Amp(s));
00074 }
00075
00076 TRhoEtaCrossPart::TRhoEtaCrossPart(double e, double de, double nth0):
00077 TCrossPart(e,de,nth0)
00078 {
00079 const double m[] = { mpi, mpi, meta};
00080 const int pid[] = { 211, -211, 221};
00081 double emax = e*(1 - pow((m[0]+m[1]+m[2])/(2*e),2));
00082
00083 fphot->SetEnergyRange(de,emax);
00084 std::cout<<de<<"MeV <E_gamma< "<<emax<<" MeV"<<std::endl;
00085
00086 SetFinalParticles(3, m, pid);
00087 std::cout<<"Process -- e^+e^- -> rho eta -> pi^+ pi^- eta"<<std::endl;
00088 }
00089
00090
00091
00092
00093 void TRhoEtaCrossPart::SetJ(){
00094
00095 TLorentzVector &qp = *fres[0];
00096 TLorentzVector &qm = *fres[1];
00097 TLorentzVector &q0 = *fres[2];
00098
00099 double Jx = qp.Y()*qm.Z()*q0.T()
00100 - qp.Y()*qm.T()*q0.Z()
00101 + qp.T()*qm.Y()*q0.Z()
00102 - qp.T()*qm.Z()*q0.Y()
00103 + qp.Z()*qm.T()*q0.Y()
00104 - qp.Z()*qm.Y()*q0.T();
00105
00106 double Jy = qp.X()*qm.Z()*q0.T()
00107 - qp.X()*qm.T()*q0.Z()
00108 + qp.T()*qm.X()*q0.Z()
00109 - qp.T()*qm.Z()*q0.X()
00110 + qp.Z()*qm.T()*q0.X()
00111 - qp.Z()*qm.X()*q0.T();
00112
00113
00114 double Jz = qp.Y()*qm.X()*q0.T()
00115 - qp.Y()*qm.T()*q0.X()
00116 + qp.T()*qm.Y()*q0.X()
00117 - qp.T()*qm.X()*q0.Y()
00118 + qp.X()*qm.T()*q0.Y()
00119 - qp.X()*qm.Y()*q0.T();
00120
00121
00122 double Jt = qp.Y()*qm.Z()*q0.X()
00123 - qp.Y()*qm.X()*q0.Z()
00124 + qp.X()*qm.Y()*q0.Z()
00125 - qp.X()*qm.Z()*q0.Y()
00126 + qp.Z()*qm.X()*q0.Y()
00127 - qp.Z()*qm.Y()*q0.X();
00128
00129
00130
00131 double qpqm = qp*qm;
00132 double qpq0 = qp*q0;
00133 double qmq0 = qm*q0;
00134
00135
00136 double Q02 = 2*(mpi2 + qpqm);
00137 double Qp2 = mpi2 + mpi02 + 2*qmq0;
00138 double Qm2 = mpi2 + mpi02 + 2*qpq0;
00139
00140 complex_t F = FRhoEta(fq2,Q02,Qp2,Qm2);
00141
00142 fJc.SetPxPyPzE(F*Jx,F*Jy,F*Jz,F*Jt);
00143 }
00144
00145 bool TRhoEtaCrossPart::Accepted(){
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168 return true;
00169 }
00170