static double calcSpectrum0(char *name1,char*name2, int forSun, double *Spectranu, double *SpectraNu) { int i,k; double vcsSum=0; int ntot,err; double * v_cs; char name1L[10],name2L[10], lib[20],process[400]; numout * libPtr; for(i=0;i<NZ;i++) Spectranu[i]=SpectraNu[i]=0; pname2lib(name1,name1L); pname2lib(name2,name2L); sprintf(lib,"omg_%s%s",name1L,name2L); sprintf(process,"%s,%s->AllEven,1*x{%s",name1,name2,EvenParticles()); // Warning!! in should be done in the same manner as annihilation libraries for Omega libPtr=getMEcode(0,ForceUG,process,NULL,NULL,lib); if(!libPtr) return 0; passParameters(libPtr); procInfo1(libPtr,&ntot,NULL,NULL); v_cs=malloc(sizeof(double)*ntot); (*libPtr->interface->twidth)=0; for(k=0;k<ntot;k++) { double m[4]; char *N[4]; procInfo2(libPtr,k+1,N,m); if((m[2]+m[3])/(m[0]+m[1])<1) { #ifdef V0 v_cs[k]=V0*cs22(libPtr,k+1,V0*m[0]/2,-1.,1.,&err); #else v_cs[k]= vcs22(libPtr,k+1,&err); #endif if(v_cs[k]<0) v_cs[k]=0; vcsSum+=v_cs[k]; } else v_cs[k]=-1; } for(k=0;k<ntot ;k++) if(v_cs[k]>=0) { char * N[4]; double m[4]; int l, charge3[2],spin2[2],cdim[2],pdg[2]; int PlusAok=0; procInfo2(libPtr,k+1,N,m); for(l=0;l<2;l++) pdg[l]=qNumbers(N[2+l],spin2+l,charge3+l,NULL); if(v_cs[k]>1.E-3*vcsSum) { double tab2[NZ]; #ifdef PRINT { char txt[100]; sprintf(txt,"%s,%s -> %s %s", N[0],N[1],N[2],N[3]); printf(" %-20.20s %.2E\n",txt,v_cs[k]*2.9979E-26); } #endif for(l=0;l<2;l++) switch(abs(pdg[l])) { case 12: case 14: case 16: if(pdg[l]>0) { basicNuSpectra(forSun,pdg[l],1,tab2); for(i=0;i<NZ;i++) Spectranu[i]+=tab2[i]*v_cs[k]/vcsSum; } else { basicNuSpectra(forSun,pdg[l],-1,tab2); for(i=0;i<NZ;i++) SpectraNu[i]+=tab2[i]*v_cs[k]/vcsSum; } break; default: basicNuSpectra(forSun,pdg[l],1,tab2); for(i=0;i<NZ;i++) Spectranu[i]+=0.5*tab2[i]*v_cs[k]/vcsSum; basicNuSpectra(forSun,pdg[l],-1,tab2); for(i=0;i<NZ;i++) SpectraNu[i]+=0.5*tab2[i]*v_cs[k]/vcsSum; } } } free(v_cs); return vcsSum*2.9979E-26; }
double vSigmaCC(double T,numout* cc) { int i,err,n,n0,m,w; char*s, *pname[6]; int pdg[6]; double msum; double a=0,factor,dMax=0; int spin2,cdim,neutral1,neutral2; double oldQ; double bEps=1.E-4; double dI; CI=cc->interface; T_=T; if(passParameters(cc)) return -1; if(Qaddress && CI->nout==2) { oldQ=*Qaddress; for(i=0;i<2;i++) pname[i]=CI->pinf(1,i+1,pmass+i,pdg+i); *Qaddress=pmass[0]+pmass[1]; calcMainFunc(); if(passParameters(cc)) return -1; } for(i=0;i<2+CI->nout;i++) pname[i]=CI->pinf(1,i+1,pmass+i,pdg+i); M1=pmass[0]; M2=pmass[1]; for(i=2,msum=0;i<CI->nout;i++) msum+=pmass[i]; sqrtSmin=M1+M2; if(msum > sqrtSmin) { if(T==0) return 0; else sqrtSmin=msum; } sqrtSmax=sqrtSmin-T*log(bEps); n0=0; if(CI->nout>2) for(n=1;(s=CI->den_info(1,n,&m,&w));n++) { double d=sing2(s,CI->nout,CI->va[m],CI->va[w]); if(!isfinite(d)) { printf("non-integrable pole\n"); return 0;} if(d>dMax){ dMax=d; n0=n;} } switch(CI->nout) { case 2: if(T==0) a=vcs22(cc,1,&err); else { double eps=1.E-3; sqme22=CI->sqme; nsub22=1; a=simpson(u_integrand_,0.,1.,eps)*3.8937966E8; } break; case 3: { if(n0) { s=CI->den_info(1,n0,&m,&w); for(i3=2;i3<5;i3++) if(i3!=s[0]-1 && i3!=s[1]-1) break; for(i4=2;i4<4;i4++) if(i4!=i3) break; for(i5=i4+1;i5<=4;i5++) if(i5!=i3) break; } else {i3=2;i4=3;i5=4;} printf("i3,i4,i5=%d %d %d\n",i3,i4,i5); if(T==0) a=vegas_chain(3, vsigma23integrand0 ,2000,1., 0.03,&dI); else a=vegas_chain(5, vsigma23integrandT ,2000,1., 0.03,&dI); break; } case 4: if(n0) { s=CI->den_info(1,n0,&m,&w); i3=s[0]-1; i4=s[1]-1; for(i5=2;i5<5;i5++) if(i5!=i3 && i5!=i4) break; for(i6=i5+1;i6<=5;i6++) if(i6!=i3 && i6!=i4) break; }else { i3=2;i4=3;i5=4;i6=5;} printf("i3,i4,i5,i6= %d %d %d %d\n", i3,i4,i5,i6); if(T==0) a=vegas_chain(6, vsigma24integrand0 ,4000,1., 0.03,&dI); else a=vegas_chain(8, vsigma24integrandT ,5000,1., 0.03,&dI); break; default: printf("Too many outgoing particles\n"); a=0; } // WIDTH_FOR_OMEGA=0; if(Qaddress && CI->nout==2) { *Qaddress=oldQ; calcMainFunc();} return a; }