示例#1
0
static int checkEnergy(void)
{  int i;
   REAL ms,m_;

   for(i=nin_int+1,ms=0; i<=nin_int+nout_int;i++)
   {  
       pinf_int(Nsub,i,&m_,NULL);
       ms+=m_;
   }
 
   if(nin_int==1)
   { 
      pinf_int(Nsub,1,&m_,NULL);
      if(m_<=ms) return 1;
   } else 
   {                                                         
     REAL  S,m1,m2;
     pinf_int(Nsub,1,&m1,NULL);
     pinf_int(Nsub,2,&m2,NULL);
     if(sf_num[0] && sf_mass[0]>m1) m1= sf_mass[0];
     if(sf_num[1] && sf_mass[1]>m2) m2= sf_mass[1];                      
     incomkin(m1,m2,inP1,inP2,&S,NULL,NULL);
     if(S <= ms) return 1;
   }
   return 0;

}
示例#2
0
static void calc_params(void)
{
  double   sqrt_S,Pcm,Q;
/*  vinf_(0,NULL,&sqrt_S); */
  incomkin(0.,0.,inP1,inP2,NULL,&Pcm,NULL);
  sqrt_S=2*Pcm;
   
  if(scale>1.) Q=scale; else Q=scale*sqrt_S;

  beta = ALPHA*(2*log(Q/EM)-1)/M_PI;
  coeff = exp(beta * (.75 - EGAM)- lgamma(1+beta)); 
  if(bOn)
  {
    b_ncl=  25*ALPHA*ALPHA*qTot/(12*EM*(xy_nm*1.E-6)*mmToGeV);
    b_ips=5*ALPHA*qTot*sqrt_S/(12*EM*EM*EM*z_mm*(xy_nm*1.E-6)*mmToGeV*mmToGeV);
  }
}
示例#3
0
int monte_carlo_menu(void)
{
   static int r=0;
   int mode=1;
   void * pscr=NULL;
   void (*quit)(int)=f3_key[7];
   char menutxt[]="\030"
                  " Subprocess             "
                  " IN state               "
                  " Model parameters       "
                  " Constraints            "
                  " QCD  alpha & scales    "
                  " Breit-Wigner           "
	          " Aliases                "
	          " Cuts                   "
	          " Phase space mapping    "
                  " Monte Carlo simulation "
                  " Easy                   ";
                  
   if(nout_int!=2  ) menutxt[menutxt[0]*10+1]=0;
   if(nin_int==1)  improveStr(menutxt,"Easy", "Total width"); 
           else    improveStr(menutxt,"Easy", "1D integration");
 
   wrtprc_();
   for(;;)
   {  
      infor();
      f3_key[7]=quit;
      menu1(54,4,"",menutxt,"n_mc_*",&pscr, &mode);
      if(mode==1||mode==2||mode==3||mode==5||mode==7)f3_key[7]=NULL;

      switch (mode)
      { 
        case  0: return 0;
        case  1: r=r|3*sub_men__(); break;
        case  2: r=r|in_setting(); break;
        case  3: r=r|change_parameter(54,7,0);  break;
        case  4: { int modeC=1;
                   for(;;)
                   { char menuC[]="\030"
                     " All Constraints        " 
                     " Masses,Widths,Branching"; 
                     void * pscrC=NULL;
                     menu1(54,6,"",menuC,"n_constr_*",&pscrC, &modeC);
                     switch(modeC)
                     { case 0: break;
                       case 1: show_depend(54,7); break;
                       case 2: show_spectrum(54,9); break;
                     } 
                     if(!modeC) break;
                   } break;
                 }     
        case  5: r=r|qcdmen_();  break;
        case  6: r=r|w_men__();  break;
        case  7: do r=r|(3*edittable(1,4,&compTab,1,"n_comp",0)); while (fillCompositeArray());
	         break;     
        case  8: do r=r|(3*edittable(1,4,&cutTab,1,"n_cut",0)); while (fillCutArray()); 
                 break;             
        case  9: r=r|mappingMenu(); break;                      
        case  10: 
                 if(nout_int==1 && !sf_num[0] && !sf_num[1]  ) 
                 { if(blind)  return 1;                     
                   messanykey(15,15,"Phase space integration for 2->1 processes\n needs distribution functions.");
                   break;
                 }
                                                                        
                 
                 if(checkEnergy())   
                 { 
                    if(blind==1)
                    { char fname[50];
                     int i,j;
                     sprintf(fname,"events_%d.txt", nSess);
                     FILE * f=fopen(fname,"w");
                     fprintf(f,"#%s\n", VERSION_);
                     fprintf(f,"#Type %d -> %d\n", nin_int,nout_int);
                     fprintf(f,"#Initial_state ");
                     if(nin_int==1) fprintf(f," P1=0\n");
                     else
                     { fprintf(f," P1_3=0  P2_3=0\n");
                       wrt_sf__(f);
                     }  
                     fprintf(f,"#PROCESS  ");
                     for(i=1;i<=nin_int+nout_int; i++)
                     { int pcode;
                       char * pname=pinf_int(Nsub,i,NULL,&pcode);
                       fprintf(f," %d(%s)", pcode, pname);
                       if(i==nin_int)  fprintf(f," ->");
                     } 
                     fprintf(f,"\n");    
                     fprintf(f,"#MASSES ");
                     for(i=0;i<nin_int+nout_int;i++)
                     {  REAL m;
                        pinf_int(Nsub,i+1,&m,NULL); 
                        fprintf(f," %.10E", (double)m);
                     }   
                     fprintf(f,"\n");
  
                     fprintf(f,"#Cross_section(Width) %E\n",0.);
                    
                     fprintf(f,"#Number_of_events %10d\n",0);
                     fprintf(f,"#Sum_of_weights %12.4E %12.4E \n",0.,0.);
                     fprintf(f,"#Events  "); 
                     if(nin_int==2) fprintf(f,"     P1_3 [Gev]        P2_3 [Gev]   ");
                     for(i=1;i<=nout_int; i++) for(j=1;j<=3;j++) 
                          fprintf(f,"     P%d_%d [Gev]   ",i+nin_int,j);
                     integral.old=1;
                     fclose(f); 
                     return 1;
                   }
                            
                   messanykey(15,15,"Energy is too small!");                   
                   break;
                 }

                 if(fillCutArray()) 
                 { if(blind) return 2;
                   messanykey(15,15,"Can not evaluate cut limits"); 
                   break;
                 }  
        case 11:
                if(mode==11) 
                {  void (*f10_tmp)(int);
                   w_sess__(NULL);
                   f10_tmp=f3_key[7];
                   f3_key[7]=f10_key_prog_for22;
                   if(nin_int==1) decay12(); else
                   { REAL m1,m2, Pcm;
                     pinf_int(Nsub,1,&m1,NULL); 
                     pinf_int(Nsub,2,&m2,NULL);  
                     if(sf_num[0] && sf_mass[0]>m1) m1= sf_mass[0];
                     if(sf_num[1] && sf_mass[1]>m2) m2= sf_mass[1];
                     incomkin(m1,m2,inP1,inP2,NULL,&Pcm,NULL); 
                     if(sf_num[0]||sf_num[1]||nCuts)
                      messanykey(10,10,"Structure functions and cuts are ignored\n");                                       
                     cs_numcalc(Pcm);
                   }
                   f3_key[7]= f10_tmp;
                   r_sess__(NULL); 
                   break;
                } else if(fillRegArray()) 
                {  
                  if(blind) return 3;                
                   messanykey(15,15,
                       "Can not evaluate regularization paremeters");
                   break;    
                }
   
                if(mode==10)  runVegas(); 
                r=0;  
                break;
                 
      }
//printf("r=%d\n",r);      
      if(r) clearEventMax();
      if(r&2) clearGrid();
      if(r&1)newSession();
   }
}
示例#4
0
int imkmom(double P1, double P2)
{
    int i, j, k, l,ns;
    char lvbuf[PLISTLEN];
    int ndim;
    physValRec * pList;

    beta[0]=sf_be[0];
    beta[1]=sf_be[1];
    
    if(nin_int==2)  
    {  if(nout_int==1) ndim=1; else
       { 
         ndim = nout_int * 3 - 5;
         if (sf_num[0]) ndim++;
         if (sf_num[1]) ndim++;
         tfact0 = 2*M_PI*389379660.0;
       }  
    }else { tfact0 = 2*M_PI; if(nout_int==2) ndim=1; else ndim = nout_int * 3 - 7;}
    
    for (i=0; i <  nin_int + nout_int; i++) pinf_int(Nsub,i+1,pm+i,NULL);

    nout1 = nout_int - 1;
    if(nout1>DEPTH) return 0;
    nvposx = nin_int + nout_int + 1;
    nvposy = nvposx + 1;
    nvpos0 =  nvposy + 1;

/* *  NVOUT( , ) FILLING */
    for (i = 0; i < nout1; ++i)  for (k = 0; k < 2; ++k) 
    {
       if (kinmtc_1[i].lvout[k][1]) nvout[i][k] = nvpos0++;
       else                         nvout[i][k] = kinmtc_1[i].lvout[k][0];   
    }
    
    nvin[0] = nvpos0++;
    for (i = 1; i < nout1; ++i) 
    {   nvin[i]=0;
	for (j = 0; j < i; ++j) for (k = 0; k < 2; ++k) 
	{
	   if (eqvect_(kinmtc_1[i].lvin, kinmtc_1[j].lvout[k])) 
	   {
               nvin[i] = nvout[j][k];
	       lnkbab[i] = j;
	       lnkleg[i] = k;
	   }
	}
	if(!nvin[i]) { fprintf(stderr,"Error in kinematics \n"); sortie(52); }
    }


    for (i = 0; i < nout1; ++i) for (k = 0; k < 2; ++k) 
    {   
      REAL ss = 0; 
      int pn;
      
      for(j=0; (pn=kinmtc_1[i].lvout[k][j]);j++) ss += pm[pn - 1];
      summas[i][k] = ss;
    }

    if (nin_int == 2) 
    {  REAL m1=sf_num[0]?sf_mass[0]:pm[0];
       REAL m2=sf_num[1]?sf_mass[1]:pm[1];
       
       incomkin(m1, m2, P1, P2,  &sqrt_S, &pcm, &rapidity);

       ssmin=pm[0]+pm[1]; 
       if(ssmin<summas[0][0]+summas[0][1]) ssmin=summas[0][0]+summas[0][1];
       ssmin*=ssmin;      
 
       if( sf_num[0] && sf_num[1] ) {sbot=0;stop=4*pcm*pcm;}
       else if(sf_num[0]){sbot=m2*m2; stop=sbot+2*pcm*(pcm+sqrt(pcm*pcm+sbot));}
       else if(sf_num[1]){sbot=m1*m1; stop=sbot+2*pcm*(pcm+sqrt(pcm*pcm+sbot));} 
       else  stop = sqrt_S*sqrt_S;
       ssmax=stop;
    } else 
    {   REAL m1=pm[0];
        rapidity=log((P1+sqrt(P1*P1+m1*m1))/m1 ) ;
    }
    for(i = 0; i < nout1; ++i) 
    {
       nsph[i] = 0;
       for(k=0;k<2;k++)
       {
          for(ns=0; ns<10;ns++)
          {
             sph_inf[i][ns].ncsreg[k] = 0;
             sph_inf[i][ns].ncscut[k] = 0;
             sph_inf[i][ns].tcscut[k]=0;
          }
	  nmsreg[i][k] = 0;
	  nmscut[i][k] = 0;
       }
    }
    
    nss=0;
    for(l=0; invreg_1[l].lvinvr[0]; l++) 
    {   int orig=1, ll=0;
        for(;ll<l;ll++) {if( invreg_1[ll].nextrg == l+1) { orig=0; break;}}	
	if(orig) 
	{
	   sngpos_(invreg_1[l].lvinvr, &i, &k, lvbuf);
	   if (i==0)  nss = l+1; else
	   {  i--; k--;
	      if (lvbuf[0] == 0)  nmsreg[i][k] = l+1;
	      else 
	      {
		 for (ns = 0; ns <nsph[i]; ++ns) 
                 if (eqvect_(lvbuf,sph_inf[i][ns].lvpole)) 
		 {
		    sph_inf[i][ns].ncsreg[k] = l+1;
		    break;
		 }
		 if(ns==nsph[i] && ns<10)
		 {
		    nsph[i]++;
		    strcpy(sph_inf[i][ns].lvpole,lvbuf);
		    if (spole_(invreg_1[l].lvinvr))sph_inf[i][ns].itypep = -2; 
		    else sph_inf[i][ns].itypep = -1;
		         
	            sph_inf[i][ns].ncsreg[k] = l+1;
	         }
	      }
	   }
	}
    }

    for(l=0;l<nCuts;l++) if( invcut_1[l].key[0] == 'M')
    for(pList=invcut_1[l].pLists;pList;pList=pList->next)
    {   char buff[20];
        strcpy(buff,pList->pstr);
        coninv_(buff);
	sngpos_(buff, &i, &k, lvbuf);
	if (i == 0) rancor_(&ssmin, &ssmax, 0., 1., l+1);
	
	else if (lvbuf[0] == 0)  nmscut[i-1][k-1] = l+1;
	else 
	{   i--; k--;
	    for (ns = 0; ns <  nsph[i ]; ++ns) 
	    {
		if (eqvect_(lvbuf, sph_inf[i][ns].lvpole)) 
		{
		    sph_inf[i][ns].ncscut[k]  = l+1;
		    break;
		}
	    }
	    if(ns==nsph[i] && ns <10 )
	    {
	       nsph[i]++;
	       strcpy(sph_inf[i][ns].lvpole,lvbuf);
	       sph_inf[i][ns].itypep = 2;
               sph_inf[i][ns].ncscut[k] = l+1;
	    }
	}
    }
    if(nin_int==2 && ssmin>=ssmax) return 0;

    if(nin_int==2) for(l=0;l<nCuts;l++)
    {  int m;
       invcut_ tc=invcut_1[l];
/* 
       if( tc.key[0]=='T' && tc.key[1]!='^' && tc.minon 
                          && tc.pLists      && tc.pLists->pstr[1]==0 )  
       for(pList=invcut_1[l].pLists;pList;pList=pList->next)for(m=1;m<=2;m++)
       {  char str[4];
          strcpy(str+1,pList->pstr);
          str[0]=m;
          sngpos_(str, &i, &k, lvbuf);
	  {  i--; k--;
	     for (ns = 0; ns <  nsph[i ]; ++ns) 
	     {
		if(eqvect_(lvbuf, sph_inf[i][ns].lvpole)
                   &&strcmp(kinmtc_1[i].lvout[k],str+1)==0)
		{
		    sph_inf[i][ns].tcscut[k]  = l+1;
		    break;
		}
	     }
	  }
       }
*/ 
    }
        
    for(i = 0; i < nout1; ++i) 
    {
	if (nsph[i] == 0) 
	{
	   nsph[i] = 1;
           sph_inf[i][0].lvpole[0] = (i == 0 && nin_int == 1 )?  nvposx:1;
	   sph_inf[i][0].lvpole[1] = 0;
	   sph_inf[i][0].itypep = 1;
	} else 
	{
	   ns = nsph[i]-1;
	   if(sph_inf[i][ns].ncsreg[0] || sph_inf[i][ns].ncsreg[1])  
	   sph_inf[i][0].itypep *=-1;
	}
    }

    for(i = 0; i<nout1; ++i) 
    {   REAL wesum = 0;
	for (ns = 0; ns<nsph[i]; ++ns) 
	{
	    int   nwe = 0;
	    for (k = 0; k < 2; ++k) 
	    for (l = sph_inf[i][ns].ncsreg[k];l;l=invreg_1[l-1].nextrg) ++nwe;
		    
            if (sph_inf[i][ns].itypep >= 0) ++nwe;
	    sph_inf[i][ns].sph_we = nwe;
	    wesum += nwe;
	}
	for (ns = 0; ns <nsph[i]; ++ns)   sph_inf[i][ns].sph_we /= wesum;
    }

#ifdef DEBUG   
    for (i = 0; i < nout1; ++i) 
    {   
        printf("Decay number %d     nmscut= (%d,%d) nmsreg = (%d,%d)\n",
        i, nmscut[i][0], nmscut[i][1],  nmsreg[i][0], nmsreg[i][1]);
        
        {int  l,c;
          printf("kinematics= (");
          for (l=0;c= kinmtc_1[i].lvin[l];l++) printf("%d",c);
          printf(")->(");
          for (l=0;c=kinmtc_1[i].lvout[0][l];l++)  printf("%d",c);
          printf(")+(");
          for (l=0;c=kinmtc_1[i].lvout[1][l];l++)  printf("%d",c);
          printf(")\n");
        }        
        printf(" summas=(%f,%f)\n",summas[i][0],summas[i][1]);

        for (ns = 0; ns < nsph[i]; ++ns) 
	{   int c;
	    printf("   Sphere number = %d  weight=%f type=%d \n", 
	     ns, sph_inf[i][ns].sph_we, sph_inf[i][ns].itypep);
            printf("     pole vector(");
	    for(k=0; c=sph_inf[i][ns].lvpole[k]; k++) printf("%d",c);
            printf(")\n");
		
	    printf("    ncsreg=(%d,%d) ncscut=(%d,%d) tcscut=(%d,%d) \n",
	    sph_inf[i][ns].ncsreg[0], sph_inf[i][ns].ncsreg[1], 
            sph_inf[i][ns].ncscut[0], sph_inf[i][ns].ncscut[1],
            sph_inf[i][ns].tcscut[0], sph_inf[i][ns].tcscut[1]); 
	}
    }    
#endif 
    return ndim;
} /* mkmom_ */
示例#5
0
文件: mc_menu.c 项目: Omer80/wimps
int monte_carlo_menu(void)
{
   static int r=0;
   int mode=1;
   void * pscr=NULL;
   void * pscr_mem=NULL;
   void (*quit)(int)=f3_key[7];
   char menutxt[]="\030"
                  " Subprocess             "
                  " IN state               "
                  " Model parameters       "
                  " Constraints            "
                  " QCD coupling           "
                  " Breit-Wigner           "
	          " Aliases                "
	          " Cuts                   "
	          " Phase space mapping    "
                  " Monte Carlo simulation "
                  " Easy                   ";
                  
   if(nout_int!=2  ) menutxt[menutxt[0]*10+1]=0;
   if(nin_int==1)  improveStr(menutxt,"Easy", "Total width"); 
           else    improveStr(menutxt,"Easy", "1D intergration");
 
   get_text(1,10,80,24,&pscr_mem);
   wrtprc_();
   for(;;)
   {  
      infor();
      f3_key[7]=quit;
      menu1(54,4,"",menutxt,"n_mc_*",&pscr, &mode);
      if(mode==1||mode==2||mode==3||mode==5||mode==7)f3_key[7]=NULL;

      switch (mode)
      { 
        case  0: put_text(&pscr_mem); return 0;
        case  1: r=r|3*sub_men__(); break;
        case  2: r=r|in_setting(); break;
        case  3: r=r|change_parameter(54,7,0);  break;
        case  4: { int modeC=1;
                   for(;;)
                   { char menuC[]="\030"
                     " All Constraints        " 
                     " Masses,Widths,Branching"; 
                     void * pscrC=NULL;
                     menu1(54,6,"",menuC,"n_constr_*",&pscrC, &modeC);
                     switch(modeC)
                     { case 0: put_text(&pscr_mem); break;
                       case 1: show_depend(54,7); break;
                       case 2: show_spectrum(54,9); break;
                     } 
                     if(!modeC) break;
                   } break;
                 }     
        case  5: r=r|qcdmen_();  break;
        case  6: r=r|w_men__();  break;
        case  7: do r=r|(3*edittable(1,4,&compTab,1,"n_comp",0)); while (fillCompositeArray());
	         break;     
        case  8: do r=r|(3*edittable(1,4,&cutTab,1,"n_cut",0)); while (fillCutArray()); 
                 break;             
        case  9: r=r|mappingMenu(); break;                      
        case  10: 
                 if(nout_int==1 && !sf_num[0] && !sf_num[1]  ) 
                 { if(blind)  return 1;                     
                   messanykey(15,15,"Phase space integration for 2->1 processes\n needs distribution functions.");
                   break;
                 }
                                                                        
                 
                 if(checkEnergy())   
                 { if(blind)  return 1;                  
                   messanykey(15,15,"Energy is too small!");                   
                   break;
                 }

                 if(fillCutArray()) 
                 { if(blind) return 2;
                   messanykey(15,15,"Can not evaluate cuts limlts"); 
                   break;
                 }  
        case 11:
                if(mode==11) 
                {  void (*f10_tmp)(int);
                   w_sess__(NULL);
                   f10_tmp=f3_key[7];
                   f3_key[7]=f10_key_prog_for22;
                   if(nin_int==1) decay12(); else
                   { REAL m1,m2, Pcm;
                     pinf_int(Nsub,1,&m1,NULL); 
                     pinf_int(Nsub,2,&m2,NULL);  
                     incomkin(m1,m2,inP1,inP2,NULL,&Pcm,NULL); 
                     if(sf_num[0]||sf_num[1]||nCuts)
                      messanykey(10,10,"Structure functions and cuts are ignored\n");                                       
                     cs_numcalc(Pcm);
                   }
                   f3_key[7]= f10_tmp;
                   r_sess__(NULL); 
                   break;
                } else if(fillRegArray()) 
                {  
                  if(blind) return 3;                
                   messanykey(15,15,
                       "Can not evaluate regularization paremeters");
                   break;    
                }
   
                if(mode==10)  runVegas(); 
                r=0;  
                break;
                 
      }
      if(r) clearEventMax();
      if(r&2) clearGrid();
      if(r&1)newSession();
   }
}