Beispiel #1
0
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;
}
Beispiel #2
0
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;
}