コード例 #1
0
ファイル: main.c プロジェクト: xueweiphy/superpy
int main(int argc,char** argv)
{  int err,nw;
   char cdmName[10];
   int spin2, charge3,cdim;
   double laMax;   

  delFiles=0; /* switch to save/delete NMSSMTools input/output */
  ForceUG=0;  /* to Force Unitary Gauge assign 1 */
   
#ifdef SUGRA
{
  double m0,mhf,a0,tb;
  double Lambda, aLambda,aKappa,sgn;

  if(argc<7) 
  { 
    printf(" This program needs 6 parameters:\n"
           "   m0      common scalar mass at GUT scale\n"
           "   mhf     common gaugino mass at GUT scale\n"
           "   a0      trilinear soft breaking parameter at GUT scale\n"
           "   tb      tan(beta) \n"
           "   Lambda   Lambda parameter at SUSY\n"
           "   aKappa  aKappa parameter at GUT\n"
           );
    printf(" Auxiliary parameters are:\n"
           "   sgn     +/-1,  sign of Higgsino mass term (default 1)\n" 
           "   aLambda at GUT (default aLambda=a0)\n"    
           "   Mtp     top quark pole mass\n"
           "   MbMb    Mb(Mb) scale independent b-quark mass\n"
           "   alfSMZ  strong coupling at MZ\n");
    printf("Example:  ./main 320 600 -1300 2 0.5 -1400\n");
      exit(1); 
  } else  
  {  double Mtp,MbMb,alfSMZ;
     sscanf(argv[1],"%lf",&m0);
     sscanf(argv[2],"%lf",&mhf);
     sscanf(argv[3],"%lf",&a0);
     sscanf(argv[4],"%lf",&tb);
     sscanf(argv[5],"%lf",&Lambda);
     sscanf(argv[6],"%lf",&aKappa);
     if(argc>7)  sscanf(argv[7],"%lf",&sgn); else sgn=1;
     if(argc>8)  sscanf(argv[8],"%lf",&aLambda); else aLambda=a0;

     if(argc>9){ sscanf(argv[9],"%lf",&Mtp);    assignValW("Mtp",Mtp);      }
     if(argc>10){ sscanf(argv[10],"%lf",&MbMb);   assignValW("MbMb",MbMb);    }
     if(argc>11){ sscanf(argv[11],"%lf",&alfSMZ); assignValW("alfSMZ",alfSMZ);}
  }

  err=nmssmSUGRA( m0,mhf, a0,tb, sgn,  Lambda, aLambda, aKappa);
}
#elif defined(EWSB)
{
  if(argc!=2)
  { 
      printf(" Correct usage:  ./main <file with NMSSM parameters> \n");
      printf(" Example      :  ./main  data1.par \n");
      exit(1);
  }

  err=readVarNMSSM(argv[1]);
  
  if(err==-1)     {printf("Can not open the file\n"); exit(1);}
  else if(err>0)  { printf("Wrong file contents at line %d\n",err);exit(1);}          
  err=nmssmEWSB();  
}
#else
{
   printf("\n========= SLHA file input =========\n");

   if(argc <2) 
   {  printf("The program needs one argument:the name of SLHA input file.\n"
            "Example: ./main spectr.dat \n");
      exit(1);
   }  
   
   printf("Initial file  \"%s\"\n",argv[1]);
     
   err=readSLHA(argv[1]);
   
   if(err) exit(2);
}

#endif

  slhaWarnings(stdout);

  if(err) exit(1);

//assignValW("Ms2GeV",0.14);
  err=sortOddParticles(cdmName);
  if(err) { printf("Can't calculate %s\n",cdmName); return 1;}
  laMax=findValW("laMax");
  printf("Largest coupling of Higgs self interaction %.1E\n",laMax);

  qNumbers(cdmName,&spin2, &charge3, &cdim);
  printf("\nDark matter candidate is '%s' with spin=%d/2\n",
  cdmName,       spin2); 
  if(charge3) { printf("Dark Matter has electric charge %d/3\n",charge3); exit(1);}
  if(cdim!=1) { printf("Dark Matter is a color particle\n"); exit(1);}
  if(strcmp(cdmName,"~o1")) printf(" ~o1 is not CDM\n"); 
                    else o1Contents(stdout);

/*  printVar(stdout);  */


#ifdef MASSES_INFO
{
  printf("\n=== MASSES OF HIGGS AND SUSY PARTICLES: ===\n");
  printHiggs(stdout);
  printMasses(stdout,1);
}
#endif

#ifdef CONSTRAINTS
{ double constr0,constrM, constrP;

  printf("\n\n==== Physical Constraints: =====\n");

  constr0=bsgnlo(&constrM,&constrP);
  printf("B->s,gamma = %.2E (%.2E ,  %.2E  ) \n",constr0,constrM, constrP );

  constr0= bsmumu(&constrM,&constrP);
  printf("Bs->mu,mu  = %.2E (%.2E ,  %.2E  ) \n",constr0,constrM, constrP );
  
  constr0=btaunu(&constrM,&constrP);
  printf("B+->tau+,nu= %.2E (%.2E ,  %.2E  ) \n",constr0, constrM, constrP );
  
  constr0=deltaMd(&constrM,&constrP);
  printf("deltaMd    = %.2E (%.2E ,  %.2E  ) \n",constr0,constrM, constrP );

  constr0=deltaMs(&constrM,&constrP);
  printf("deltaMs    = %.2E (%.2E ,  %.2E  ) \n",constr0,constrM, constrP );

  constr0=gmuon(&constrM,&constrP);
  printf("(g-2)/BSM = %.2E (%.2E ,  %.2E  ) \n",constr0,constrM, constrP );
     
}
#endif

#ifdef OMEGA
{ int fast=1;
  double Beps=1.E-5, cut=0.01;
  double Omega,Xf;   
  printf("\n==== Calculation of relic density =====\n");  
  Omega=darkOmega(&Xf,fast,Beps);
  printf("Xf=%.2e Omega=%.2e\n",Xf,Omega);
  printChannels(Xf,cut,Beps,1,stdout);
}
#endif

#ifdef INDIRECT_DETECTION
{ 
  int err,i;
  double Emin=0.1,/* Energy cut  in GeV   */  sigmaV;
  double vcs_gz,vcs_gg;
  char txt[100];
  double SpA[NZ],SpE[NZ],SpP[NZ];
  double FluxA[NZ],FluxE[NZ],FluxP[NZ];
//  double * SpNe=NULL,*SpNm=NULL,*SpNl=NULL;
double SpNe[NZ],SpNm[NZ],SpNl[NZ];
  double Etest=Mcdm/2;
  
printf("\n==== Indirect detection =======\n");  

  sigmaV=calcSpectrum(2+4,SpA,SpE,SpP,SpNe,SpNm,SpNl ,&err);
    /* Returns sigma*v in cm^3/sec.     SpX - calculated spectra of annihilation.
       Use SpectdNdE(E, SpX) to calculate energy distribution in  1/GeV units.
       
       First parameter 1-includes W/Z polarization
                       2-includes gammas for 2->2+gamma
                       4-print cross sections             
    */
  printf("sigmav=%.2E[cm^3/s]\n",sigmaV);  

  if(SpA)
  { 
     double fi=0.1,dfi=0.05; /* 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(FluxA,txt,Emin,Mcdm,1);
#endif
     printf("Photon flux = %.2E[cm^2 s GeV]^{-1} for E=%.1f[GeV]\n",SpectdNdE(Etest, SpA), Etest);       
  }

  if(SpE)
  { 
    posiFluxTab(Emin, sigmaV, SpE,  FluxE);
#ifdef SHOWPLOTS     
    displaySpectrum(FluxE,"positron flux [cm^2 s sr GeV]^{-1}" ,Emin,Mcdm,1);
#endif
    printf("Positron flux  =  %.2E[cm^2 sr s GeV]^{-1} for E=%.1f[GeV] \n",
    SpectdNdE(Etest, FluxE),  Etest);           
  }
  
  if(SpP)
  { 
    pbarFluxTab(Emin, sigmaV, SpP, FluxP  ); 
#ifdef SHOWPLOTS    
     displaySpectrum(FluxP,"antiproton flux [cm^2 s sr GeV]^{-1}" ,Emin,Mcdm,1);
#endif
    printf("Antiproton flux  =  %.2E[cm^2 sr s GeV]^{-1} for E=%.1f[GeV] \n",
    SpectdNdE(Etest, FluxP),  Etest);             
  }
}  
#endif

#ifdef RESET_FORMFACTORS
{
/* 
   The user has approach to form factors  which specifies quark contents 
   of  proton and nucleon via global parametes like
      <Type>FF<Nucleon><q>
   where <Type> can be "Scalar", "pVector", and "Sigma"; 
         <Nucleon>     "P" or "N" for proton and neutron
         <q>            "d", "u","s"

   calcScalarFF( Mu/Md, Ms/Md, sigmaPiN[MeV], sigma0[MeV])  
   calculates and rewrites Scalar form factors
*/

  printf("protonFF (default) d %E, u %E, s %E\n",ScalarFFPd, ScalarFFPu,ScalarFFPs);                               
  printf("neutronFF(default) d %E, u %E, s %E\n",ScalarFFNd, ScalarFFNu,ScalarFFNs);

  calcScalarFF(0.553,18.9,70.,35.);

  printf("protonFF (new)     d %E, u %E, s %E\n",ScalarFFPd, ScalarFFPu,ScalarFFPs);                               
  printf("neutronFF(new)     d %E, u %E, s %E\n",ScalarFFNd, ScalarFFNu,ScalarFFNs);



/* Option to change parameters of DM velocity  distribution  */   
   SetfMaxwell(220.,600.);
/* 
    dN  ~  exp(-v^2/arg1^2)*Theta(v-arg2)  d^3v     
    Earth velocity with respect to Galaxy defined by 'Vearth' parameter.
    All parameters are  in [km/s] units.       
*/
}
#endif

#ifdef CDM_NUCLEON
{ double pA0[2],pA5[2],nA0[2],nA5[2];
  double Nmass=0.939; /*nucleon mass*/
  double SCcoeff;        

printf("\n==== Calculation of CDM-nucleons amplitudes  =====\n");   

    nucleonAmplitudes(FeScLoop, pA0,pA5,nA0,nA5);
    printf("CDM-nucleon micrOMEGAs amplitudes:\n");
    printf("proton:  SI  %.3E  SD  %.3E\n",pA0[0],pA5[0]);
    printf("neutron: SI  %.3E  SD  %.3E\n",nA0[0],nA5[0]); 

  SCcoeff=4/M_PI*3.8937966E8*pow(Nmass*Mcdm/(Nmass+ Mcdm),2.);
    printf("CDM-nucleon cross sections[pb]:\n");
    printf(" proton  SI %.3E  SD %.3E\n",SCcoeff*pA0[0]*pA0[0],3*SCcoeff*pA5[0]*pA5[0]);
    printf(" neutron SI %.3E  SD %.3E\n",SCcoeff*nA0[0]*nA0[0],3*SCcoeff*nA5[0]*nA5[0]);

}
#endif
  
#ifdef CDM_NUCLEUS
{ double dNdE[300];
  double nEvents;

printf("\n======== Direct Detection ========\n");    

  nEvents=nucleusRecoil(Maxwell,73,Z_Ge,J_Ge73,S00Ge73,S01Ge73,S11Ge73,FeScLoop,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=nucleusRecoil(Maxwell,131,Z_Xe,J_Xe131,S00Xe131,S01Xe131,S11Xe131,FeScLoop,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=nucleusRecoil(Maxwell,23,Z_Na,J_Na23,S00Na23,S01Na23,S11Na23,FeScLoop,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=nucleusRecoil(Maxwell,127,Z_I,J_I127,S00I127,S01I127,S11I127,FeScLoop,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 

#ifdef DECAYS
{  
  txtList L;
   int dim;
   double width,br;
   char * pname;
   
   printf("\nParticle decays\n"); 
   pname = "h1";
    width=pWidth(pname,&L,&dim);
    printf("%s->%d*x :   total width=%E \n and Branchings:\n",pname,dim,width);
    printTxtList(L,stdout);

   pname = "l";
    width=pWidth(pname,&L,&dim);
    printf("%s->%d*x :   total width=%E \n and Branchings:\n",pname,dim,width);
    printTxtList(L,stdout);
    printf("Br(e,Ne,nl)= %E\n",findBr(L,"e,Ne,nl"));

   pname = "~o2";
    width=pWidth(pname,&L,&dim);
    printf("%s->%d*x :   total width=%E \n and Branchings:\n",pname,dim,width);
    printTxtList(L,stdout);
}
#endif

#ifdef CROSS_SECTIONS
{
  double Pcm=500, cosmin=-0.99, cosmax=0.99, cs;
  numout* cc;
printf("\n====== Calculation of cross section ====\n");  

printf(" e^+, e^- annihilation\n");
  Pcm=500.;
  Helicity[0]=0.5;    /* helicity : spin projection on direction of motion   */    
  Helicity[1]=-0.5;   /* helicities ={ 0.5, -0.5} corresponds to vector state */
  printf("Process e,E->2*x at Pcm=%.3E GeV\n",Pcm);
  cc=newProcess("e%,E%->2*x","eE_2x");
  if(cc)
  { int ntot,l;
    char * name[4];
    procInfo1(cc,&ntot,NULL,NULL);
    for(l=1;l<=ntot; l++)
    { int err;
      double cs;
      char txt[100];
      procInfo2(cc,l,name,NULL);
      sprintf(txt,"%3s,%3s -> %3s %3s  ",name[0],name[1],name[2],name[3]);
      cs= cs22(cc,l,Pcm,cosmin,cosmax,&err);
      if(err) printf("%-20.20s    Error\n",txt);
      else if(cs) printf("%-20.20s  %.2E [pb]\n",txt,cs); 
    }
  } 
}
#endif

  killPlots();
  return 0;
}
コード例 #2
0
ファイル: DDtest.c プロジェクト: leloulight/micro_omega_4
int MSSMDDtest(int loop, double*pA0,double*pA5,double*nA0,double*nA5)
{
  double  ApB[2][7],AmB[2][7],MI[2][2][7],NL[5],T3Q[2],EQ[2],mq[7],mqSM[7],
          msq[2][7],Aq[7];
  double mh,mH,ca,sa,mu;
  double o1o1h,o1o1H,SQM[2][2][2][2],capb,sapb,w2s3,w4s3;
  char buffName[10];
  char * ZqNames[6]={"Zdd" ,"Zuu" ,"Zss", "Zcc", "Zb",  "Zt"};
  char * MS1mass[6]={"MSdL","MSuL","MSsL","MScL","MSb1","MSt1"};
  char * MS2mass[6]={"MSdR","MSuR","MSsR","MScR","MSb2","MSt2"};
  char * AqNames[6]={"Ad","Au", "Ad","Au","Ab","At"};
  char mess[10];
  double  ALPE,SW,CW,MW,MZ,E,G,mne,beta,sb,cb,s;
  int i,II,IQ,i1,i2;
  double Ampl0,Ampl2;
  double MN=0.939;
  double MqPole[7]={0,0,0,0,1.67,4.78,173.};
  double qcdNLO,qcdNLOs;
  
  double wS0P__[6],wS0N__[6]; /*scalar */
  double wV5P__[3],wV5N__[3]; /*pseudo-vector*/
  
   for(i=0;i<3;i++)
   { wS0P__[i]= *(&(ScalarFFPd)+i);
     wS0N__[i]= *(&(ScalarFFNd)+i);
     wV5P__[i]= *(&(pVectorFFPd)+i);
     wV5N__[i]= *(&(pVectorFFNd)+i);
  }
  
  for(s=0,i=0;i<3;i++) s+= wS0P__[i];
  for(s=2./27.*(1-s),i=3;i<6;i++)wS0P__[i]=s;

  for(s=0,i=0;i<3;i++) s+= wS0N__[i];
  for(s=2./27.*(1-s),i=3;i<6;i++)wS0N__[i]=s;
    
  *pA0=0,*pA5=0,*nA0=0,*nA5=0;  

  if(sortOddParticles(mess)) return 0;
  if(strcmp(mess,"~o1")!=0) 
  { printf("qbox returns 0 because WINP is not ~o1\n"); return 0;} 
/*ccccccccccccccccccc CONSTANTS ccccccc*/   

  ALPE=1/127.994;
  SW=findValW("SW");
  CW=sqrt(1.-SW*SW);
  MZ=findValW("MZ");
  MW=MZ*CW;  
  E=sqrt(4*M_PI*ALPE);
  G =E/SW;
  mne=fabs(findValW("MNE1"));
/*=======*/
  beta=atan(findValW("tB"));
  sb=sin(beta);
  cb=cos(beta);
  mu=findValW("mu");
/*========  Quark,SQUARK masses and mixing  ======*/
  for(IQ=1;IQ<=6;IQ++)
  { 
    mqSM[IQ]= pMass(pdg2name(IQ));
    mq[IQ]= mqSM[IQ];
        
    msq[0][IQ]=findValW(MS1mass[IQ-1]);
    msq[1][IQ]=findValW(MS2mass[IQ-1]);
    for(i1=0;i1<2;i1++) for(i2=0;i2<2;i2++)
    {
       sprintf(buffName,"%s%d%d", ZqNames[IQ-1],i1+1,i2+1);
       MI[i1][i2][IQ]=findValW(buffName);
    }
    Aq[IQ]=findValW(AqNames[IQ-1]);
  }
  
  mq[1]/=1+deltaMd();
  mq[3]/=1+deltaMd();
  mq[5]/=1+deltaMb();
  
  for(i=1;i<=4;i++){sprintf(buffName,"Zn1%d",i); NL[i]=findValW(buffName);}

  T3Q[0]=0.5; EQ[0]=2/3.; T3Q[1]=-0.5; EQ[1]=-1/3.;
  
  for(IQ=1;IQ<=6;IQ++) for( II=0;II<2;II++)
  {  double X,Y,Z,A,B;
     X=-(T3Q[IQ&1]*NL[2]+SW/CW*NL[1]/6);
     Y=SW/CW*EQ[IQ&1]*NL[1];
     Z= -0.5*( (IQ&1)? mq[IQ]*NL[3]/cb: mq[IQ]*NL[4]/sb )/MW;
     A=   G*(MI[II][0][IQ]*(X+Z)+MI[II][1][IQ]*(Y+Z));
     B=   G*(MI[II][0][IQ]*(X-Z)+MI[II][1][IQ]*(-Y+Z));

     ApB[II][IQ]  =(A*A+B*B)/2;        
     AmB[II][IQ]  =(A-B)*(A+B)/2;  /* Normalized like in D&N */ 
  }
/* Higgs sector */ 
  mh=findValW("Mh");
  mH=findValW("MH");
  sa=findValW("sa");
  ca=findValW("ca");
  o1o1h= E*(ca*NL[4]+sa*NL[3])*(CW*NL[2]-SW*NL[1])/CW/SW;
  o1o1H=-E*(ca*NL[3]-sa*NL[4])*(CW*NL[2]-SW*NL[1])/CW/SW;

/*====================================================================== */ 
/*========= STARTING OF SUMMATION OF DIFFERENT CONTRIBUTIONS =========== */

/*================= THE SD AMPLITUDED ================= */
/******  light squarks SD contribution  */

  for(IQ=1;IQ<=3;IQ++) for(II=0;II<2;II++)
  {  double D=SQ(msq[II][IQ])-SQ(mne)-SQ(mqSM[IQ]);
     double D2=D*D-SQ(2*mne*mqSM[IQ]);
     double f=sqrt(3.)*0.25*ApB[II][IQ]*D/D2;
     *pA5+=f*wV5P__[IQ-1];
     *nA5+=f*wV5N__[IQ-1];
  }

/******  Z  SD contribution */
  for(IQ=1;IQ<=3;IQ++)
  { double f=sqrt(3.)*0.5*(SQ(NL[4])-SQ(NL[3]))*SQ(G/2/MW)*T3Q[IQ&1];
    *pA5+=f*wV5P__[IQ-1];  
    *nA5+=f*wV5N__[IQ-1];
  }
  *pA5/=sqrt(3);
  *nA5/=sqrt(3);

/*================= THE SI AMPLITUDED =================*/

/****** light quarks-squarks SI contribution (plus heavy squarks at tree level)*/

  for(IQ=1;IQ<=(loop? 3:6);IQ++) for(II=0;II<2;II++)
  {
    double g,f,D,D2;
    qcdNLO=qcdNLOs=1;
    if(QCDcorrections)
    { double alphaMq;
    
      if(IQ>3)
      { double alphaMq;
        switch(IQ)
        { case 4: alphaMq=0.39;break;
          case 5: alphaMq=0.22;break;
          default:alphaMq=parton_alpha(mqSM[IQ]);
        } 
        qcdNLO=1+(11./4.-16./9.)*alphaMq/M_PI;
      } 
      qcdNLOs=1+(25./6.-16./9.)*parton_alpha(msq[II][IQ])/M_PI;
    }
/* q,~o1 reaction */
    D=SQ(msq[II][IQ])-SQ(mne)-SQ(mqSM[IQ]);
    D2=D*D-SQ(2*mne*mqSM[IQ]);
    g=-0.25*ApB[II][IQ]/D2;
    f=-0.25*AmB[II][IQ]*D/D2;

    if(!Twist2On) g*=4;    
    *pA0+= (f/mqSM[IQ]-g*mne/2)* MN*wS0P__[IQ-1]*qcdNLO;
    *nA0+= (f/mqSM[IQ]-g*mne/2)* MN*wS0N__[IQ-1]*qcdNLO; 

/******  squarks from nucleon   (~q,~o1 reaction)*/
    D=-SQ(msq[II][IQ])-SQ(mne)+SQ(mqSM[IQ]),
    D2=D*D-SQ(2*mne*msq[II][IQ]);

    g=mqSM[IQ]*AmB[II][IQ]*D/D2;  
    f=mne*ApB[II][IQ]*(SQ(msq[II][IQ])-SQ(mne)+SQ(mqSM[IQ]))/D2;
    *pA0+=(f+g)/SQ(msq[II][IQ])*MN*wS0P__[5]/8*qcdNLOs ;
    *nA0+=(f+g)/SQ(msq[II][IQ])*MN*wS0N__[5]/8*qcdNLOs ;

    if(Twist2On && IQ!=6)
    { double D,g;
      int IQn;
      qcdNLO=1;

      switch(IQ)
      { case 1: IQn=2;break;
        case 2: IQn=1;break;
        default: IQn=IQ;
      } 
    
      D=SQ(msq[II][IQ])-SQ(mne)-SQ(mqSM[IQ]);                                                                               
      g=-0.25*ApB[II][IQ]/(D*D-4*mne*mne*mqSM[IQ]*mqSM[IQ]); 
      *pA0-=1.5*g*mne*MN*parton_x(IQ, msq[II][IQ]-mne);
      *nA0-=1.5*g*mne*MN*parton_x(IQn,msq[II][IQ]-mne);
    }  
  }

/****** Heavy squarks in case of loops   */ 
  if(loop)for(IQ=4;IQ<=6;IQ++) for(II=0;II<2;II++)
  {  double f,g,bd,b1d,bs,b1s,b2s; 
     if(QCDcorrections )
     { double alphaMq;
       switch(IQ)
       { case 4: alphaMq=0.39;break;
         case 5: alphaMq=0.22;break;
         default:alphaMq=parton_alpha(mqSM[IQ]);
       }
       qcdNLO=1+(11./4.-16./9.)*alphaMq/M_PI;
     }  
     else qcdNLO=1;
                               
     bd  = AmB[II][IQ]*mqSM[IQ]*LintIk(1,msq[II][IQ],mqSM[IQ],mne)*3/8.;
     b1d = AmB[II][IQ]*mqSM[IQ]*LintIk(3,msq[II][IQ],mqSM[IQ],mne);      
     bs  =ApB[II][IQ]*mne     *LintIk(2,msq[II][IQ],mqSM[IQ],mne)*3/8.;
     b1s =ApB[II][IQ]*mne     *LintIk(4,msq[II][IQ],mqSM[IQ],mne);	
     b2s =ApB[II][IQ]         *LintIk(5,msq[II][IQ],MqPole[IQ],mne)/4.;
     f=-(bd+bs-mne*b2s/2-mne*mne*(b1d+b1s)/4); 
     *pA0+=f*MN*wS0P__[IQ-1]*qcdNLO;
     *nA0+=f*MN*wS0N__[IQ-1]*qcdNLO;

     if(Twist2On) 
     { double Ampl2;
       Ampl2=parton_alpha(mqSM[IQ])/(12*M_PI)*(b2s+mne*(b1s+b1d)/2)*parton_x(21,MqPole[IQ]);   
      *pA0+=1.5*Ampl2*mne*MN;
      *nA0+=1.5*Ampl2*mne*MN;             
     }     
  } 

/******  higgs-quark-anitiquark */
  for(IQ=1;IQ<=6;IQ++)
  { double fh,fH;
    if(QCDcorrections && IQ>3) 
    { double alphaMq;
      switch(IQ)
      { case 4: alphaMq=0.39;break;
        case 5: alphaMq=0.22;break;
        default:alphaMq=parton_alpha(mqSM[IQ]);
      } 
      qcdNLO=1+(11/4.-16./9.)*alphaMq/M_PI;
    }
    else qcdNLO=1;

    if(IQ&1)
    { 
       double dMq=mqSM[IQ]/mq[IQ]-1;
       fh=o1o1h*E*sa*mq[IQ]*(1-dMq*ca*cb/sa/sb)/(2*MW*cb*SW);   
       fH=-o1o1H*E*ca*mq[IQ]*(1+dMq*sa*cb/ca/sb)/(2*MW*cb*SW);
    }
    else 
    {
       fh=-o1o1h*E*ca*mq[IQ]/(2*MW*sb*SW);   
       fH=-o1o1H*E*sa*mq[IQ]/(2*MW*sb*SW);
    }   
    *pA0+=0.5*(fh/(mh*mh)+fH/(mH*mH))/mqSM[IQ]*MN*wS0P__[IQ-1]*qcdNLO;
    *nA0+=0.5*(fh/(mh*mh)+fH/(mH*mH))/mqSM[IQ]*MN*wS0N__[IQ-1]*qcdNLO;
  } 

/******  higgs squark-antisquark */
  capb=ca*cb-sa*sb;
  sapb=sa*cb+ca*sb;
  w4s3=4*SW*SW-3;
  w2s3=2*SW*SW-3;

#define h 0
#define H 1
#define L 0
#define R 1
#define U 0
#define D 1

  SQM[h][L][L][U]= sapb/SW*(-w4s3/2);
  SQM[h][L][L][D]= sapb/SW*( w2s3/2);
  SQM[h][R][R][U]= sapb*SW*( 2);
  SQM[h][R][R][D]= sapb*SW*(-1);
  SQM[H][L][L][U]= capb/SW*( w4s3/2);
  SQM[H][L][L][D]= capb/SW*(-w2s3/2);
  SQM[H][R][R][U]= capb*SW*(-2);
  SQM[H][R][R][D]= capb*SW*( 1);
  
  SQM[h][L][R][U]=SQM[h][R][L][U]=0;
  SQM[h][L][R][D]=SQM[h][R][L][D]=0;
  SQM[H][L][R][U]=SQM[H][R][L][U]=0;
  SQM[H][L][R][D]=SQM[H][R][L][D]=0;
 
  for(IQ=1;IQ<=6;IQ++)for(II=0;II<2;II++)
  { double fh,fH;
    int i,j;

    if(QCDcorrections)qcdNLOs=1+(25./6.-16./9.)*parton_alpha(msq[II][IQ])/M_PI;
    else qcdNLOs=1;

    for(fh=0,fH=0,i=0;i<2;i++)for(j=0;j<2;j++)
    {  double dSQMh,dSQMH;
       double b=-T3Q[IQ&1]+0.5,
              t= T3Q[IQ&1]+0.5;   
       if(i==j) 
       { dSQMh=( ca*t - sa*b )*3*SQ(mq[IQ]*CW/MW)/SW;
         dSQMH=( sa*t + ca*b )*3*SQ(mq[IQ]*CW/MW)/SW;
       }  
       else
       {
         dSQMh=( (ca*Aq[IQ]+mu*sa)*t - (sa*Aq[IQ]+mu*ca)*b )*1.5*mq[IQ]*SQ(CW/MW)/SW;  
         dSQMH=( (sa*Aq[IQ]-mu*ca)*t + (ca*Aq[IQ]-mu*sa)*b )*1.5*mq[IQ]*SQ(CW/MW)/SW;
       }
       
       if(IQ&1) {dSQMh/=cb;dSQMH/=cb;} else {dSQMh/=sb;dSQMH/=sb;} 
       
       fh+=(SQM[h][i][j][IQ&1]-dSQMh)*MI[II][i][IQ]*MI[II][j][IQ];
       fH+=(SQM[H][i][j][IQ&1]-dSQMH)*MI[II][i][IQ]*MI[II][j][IQ];  
    }   
    fh*=o1o1h*E*MW/(3*CW*CW);
    fH*=o1o1H*E*MW/(3*CW*CW);     
    *pA0+=(fh/(mh*mh)+fH/(mH*mH))/(2*msq[II][IQ]*msq[II][IQ])*MN*wS0P__[5]/8*qcdNLOs;
    *nA0+=(fh/(mh*mh)+fH/(mH*mH))/(2*msq[II][IQ]*msq[II][IQ])*MN*wS0N__[5]/8*qcdNLOs;
  } 
}