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; }
int main(int argc,char** argv) { int err,n,i; // data corresponding to MSSM/mssmh.dat // cross sections of DM-nucleon interaction double csSIp=5.489E-09, csSIn=5.758E-09, csSDp=5.807E-05, csSDn=-4.503E-05; //[pb] // cross section of DM annihilation in halo double vcs = 0.310; // [pb] #define nCH 5 /* annihilation channels and their fractions*/ int pdgCH[nCH] ={ 6, 5, 15, 23, 24}; double fracCH[nCH]={0.59,0.12,0.20,0.03, 0.06}; sortOddParticles(NULL); // Mass of Dark Matter Mcdm=189.0; #ifdef INDIRECT_DETECTION { double sigmaV; char txt[100]; double SpA[NZ],SpE[NZ],SpP[NZ]; double FluxA[NZ],FluxE[NZ],FluxP[NZ], buff[NZ]; double SMmev=320; /* solar potential in MV */ double Etest=Mcdm/2; printf("\n==== Indirect detection =======\n"); sigmaV=vcs*2.9979E-26; printf("sigmav=%.2E[cm^3/s]\n",sigmaV); SpA[0]=SpE[0]=SpP[0]=Mcdm; for(i=1;i<NZ;i++) { SpA[i]=SpE[i]=SpP[i]=0;} // Calculation on photon, positron and antiproton spectra: summation over channels for(n=0;n<nCH;n++) if(fracCH[n]>0) { basicSpectra(Mcdm,pdgCH[n],0, buff); for(i=1;i<NZ;i++) SpA[i]+=buff[i]*fracCH[n]; basicSpectra(Mcdm,pdgCH[n],1, buff); for(i=1;i<NZ;i++) SpE[i]+=buff[i]*fracCH[n]; basicSpectra(Mcdm,pdgCH[n],2, buff); for(i=1;i<NZ;i++) SpP[i]+=buff[i]*fracCH[n]; } // Photon flux { double Emin=1; /* Energy cut in GeV */ double fi=0.0,dfi=M_PI/180.; /* angle of sight and 1/2 of cone angle in [rad] */ gammaFluxTab(fi,dfi, sigmaV, SpA, FluxA); printf("Photon flux for angle of sight f=%.2f[rad]\n" "and spherical region described by cone with angle %.2f[rad]\n",fi,2*dfi); #ifdef SHOWPLOTS sprintf(txt,"Photon flux[cm^2 s GeV]^{1} at f=%.2f[rad], cone angle %.2f[rad]",fi,2*dfi); displaySpectrum(txt,Emin,Mcdm,FluxA); #endif printf("Photon flux = %.2E[cm^2 s GeV]^{-1} for E=%.1f[GeV]\n",SpectdNdE(Etest, FluxA), Etest); } // Positron flux { double Emin=1.; posiFluxTab(Emin, sigmaV, SpE, FluxE); if(SMmev>0) solarModulation(SMmev,0.0005,FluxE,FluxE); #ifdef SHOWPLOTS displaySpectrum("positron flux [cm^2 s sr GeV]^{-1}" ,Emin,Mcdm,FluxE); #endif printf("Positron flux = %.2E[cm^2 sr s GeV]^{-1} for E=%.1f[GeV] \n", SpectdNdE(Etest, FluxE), Etest); } // antiproton flux { double Emin=1; pbarFluxTab(Emin, sigmaV, SpP, FluxP ); if(SMmev>0) solarModulation(SMmev,1,FluxP,FluxP); #ifdef SHOWPLOTS displaySpectrum("antiproton flux [cm^2 s sr GeV]^{-1}" ,Emin, Mcdm,FluxP); #endif printf("Antiproton flux = %.2E[cm^2 sr s GeV]^{-1} for E=%.1f[GeV] \n", SpectdNdE(Etest, FluxP), Etest); } } #endif // Interaction with nucleus #ifdef CDM_NUCLEUS { double dNdE[300]; double nEvents; printf("\n======== Direct Detection ========\n"); nEvents=nucleusRecoilAux(Maxwell,73,Z_Ge,J_Ge73,SxxGe73, csSIp,csSIn, csSDp,csSDn,dNdE); printf("73Ge: Total number of events=%.2E /day/kg\n",nEvents); printf("Number of events in 10 - 50 KeV region=%.2E /day/kg\n", cutRecoilResult(dNdE,10,50)); #ifdef SHOWPLOTS displayRecoilPlot(dNdE,"Distribution of recoil energy of 73Ge",0,199); #endif nEvents=nucleusRecoilAux(Maxwell,131,Z_Xe,J_Xe131,SxxXe131,csSIp,csSIn, csSDp,csSDn,dNdE); printf("131Xe: Total number of events=%.2E /day/kg\n",nEvents); printf("Number of events in 10 - 50 KeV region=%.2E /day/kg\n", cutRecoilResult(dNdE,10,50)); #ifdef SHOWPLOTS displayRecoilPlot(dNdE,"Distribution of recoil energy of 131Xe",0,199); #endif nEvents=nucleusRecoilAux(Maxwell,23,Z_Na,J_Na23,SxxNa23,csSIp,csSIn, csSDp,csSDn,dNdE); printf("23Na: Total number of events=%.2E /day/kg\n",nEvents); printf("Number of events in 10 - 50 KeV region=%.2E /day/kg\n", cutRecoilResult(dNdE,10,50)); #ifdef SHOWPLOTS displayRecoilPlot(dNdE,"Distribution of recoil energy of 23Na",0,199); #endif nEvents=nucleusRecoilAux(Maxwell,127,Z_I,J_I127,SxxI127,csSIp,csSIn, csSDp,csSDn,dNdE); printf("I127: Total number of events=%.2E /day/kg\n",nEvents); printf("Number of events in 10 - 50 KeV region=%.2E /day/kg\n", cutRecoilResult(dNdE,10,50)); #ifdef SHOWPLOTS displayRecoilPlot(dNdE,"Distribution of recoil energy of 127I",0,199); #endif } #endif // Neutrino telescope #ifdef NEUTRINO { double nu[NZ], nu_bar[NZ],mu[NZ],buff[NZ]; double Crate,R,Prop; int forSun=1; double Emin=1; int i,err; double yrs=31556925.2; printf("\n===============Neutrino Telescope======= for "); if(forSun) printf("Sun\n"); else printf("Earth\n"); // Capture rate Crate=captureAux(Maxwell,forSun, Mcdm,csSIp,csSIn,csSDp,csSDn); nu[0]=nu_bar[0]=Mcdm; for(i=1;i<NZ;i++){ nu[i]=nu_bar[i]=0;} // Calculation of neutrino, antineutrino spectra: sumation over chanels for(n=0;n<nCH;n++) if(fracCH[n]>0) { double bn[NZ],bn_[NZ]; basicNuSpectra(forSun,Mcdm, pdgCH[n], 0, bn, bn_); for(i=1;i<NZ;i++) { nu[i] +=bn[i]*fracCH[n]; nu_bar[i] +=bn_[i]*fracCH[n];} } // propagation: neutrino flux at Earth if(forSun) R=150E6; else R=6378.1; // distance in km Prop=yrs/(4*M_PI*R*R); // in Year*km^2 for(i=1;i<NZ;i++) { nu[i]*= 0.5*Crate*Prop; nu_bar[i]*=0.5*Crate*Prop; } // Display neutrino flux #ifdef SHOWPLOTS displaySpectra("neutrino fluxes [1/Year/km^2/GeV]",Emin,Mcdm,2, nu,"nu",nu_bar,"nu_bar"); #endif { printf(" E>%.1E GeV neutrino flux %.3E [1/Year/km^2] \n",Emin,spectrInfo(Emin,nu,NULL)); printf(" E>%.1E GeV anti-neutrino flux %.3E [1/Year/km^2]\n", Emin,spectrInfo(Emin,nu_bar,NULL)); } //Exclusion level if(forSun) printf("IceCube22 exclusion confidence level = %.2E%%\n", exLevIC22(nu,nu_bar,NULL)); } #endif #ifdef CLEAN #endif killPlots(); return 0; }
int basicnuspectra_(int*forSun, double *Mass, int *pdgN, int*pol, double * nu, double * nuB) { return basicNuSpectra(*forSun,*Mass, *pdgN,*pol, nu, nuB);}