Beispiel #1
0
void drg_model()
{
  int k,i,n=40,j,i1,i2,ngal;
  double dlogr,r,mass,xk,pnorm,psp,rm,sig,t0,t1,pnorm1,mp,mlo,mhi,dr,
    slo,shi,dsdM,rlo,rhi,dlogm,f1,f2,fac,cvir,rvir,rs,r1,r2,mtot=0,m,
    chi2lf,chi2w,x0,mlow;
  FILE *fp,*fp2;
  float x1,x2,x3,x4;
  char aa[1000],fname[1000],**argv;

  float *xx,*yy,*zz,*vx,*vy,*vz;
  float *wdata,*rdata,*edata,*lfdata,*lferr,*lfmag,*wmodel;
  int magcnt[100];
  int nwdata, nlf, j1, ngrid = 10, ingal;

  double tmin, tmax, dtheta, theta, delta_mag, maglo;

  /* FITTING RIK'S DATA
   */
  rlo = log(1.0);
  rhi = log(1000);
  dtheta = (rhi-rlo)/(19);
  for(i=0;i<20;++i)
    {
      theta = exp(rlo+i*dtheta);
      printf("ALL %e %e\n",theta,wtheta(theta));
      fflush(stdout);
    }

  sprintf(Task.root_filename,"all");
  tasks(ARGC,ARGV);

  RESET_FLAG_1H++;
  RESET_FLAG_2H++;

  GALAXY_DENSITY = 4.9e-4;
  NGAL_DRG = 4.9e-4;
  HOD.pdfc = 10; // set up centrals for RED
  HOD.freds = 0.3; // for RED
  HOD.fredc = 1;
  HOD.mass_shift = zbrent(func_findmshift2,0.0,2.434682,1.0E-4); //spaced in fcen0
  fprintf(stdout,"fsat = %.2f fcen = %.2f mu = %.2f ngal= %e %e\n",HOD.freds,HOD.fredc, HOD.mass_shift,GALAXY_DENSITY,qromo(func_galaxy_density,log(HOD.M_low),log(HOD.M_max),midpnt));

  for(i=0;i<20;++i)
    {
      theta = exp(rlo+i*dtheta);
      printf("RED %e %e\n",theta,wtheta(theta));
      fflush(stdout);
    }

  sprintf(Task.root_filename,"red");
  tasks(ARGC,ARGV);

  RESET_FLAG_1H++;
  RESET_FLAG_2H++;

  GALAXY_DENSITY = 1.9e-3;
  HOD.pdfc = 11; // set up centrals for BLUE
  HOD.freds = 1 - HOD.freds; // for BLUE
  printf("ngal = %e\n",qromo(func_galaxy_density,log(HOD.M_low),log(HOD.M_max),midpnt));

  for(i=0;i<20;++i)
    {
      theta = exp(rlo+i*dtheta);
      printf("BLUE %e %e\n",theta,wtheta(theta));
      fflush(stdout);
    }

  sprintf(Task.root_filename,"blue");
  tasks(ARGC,ARGV);

  exit(0);



  BOX_SIZE = 160.;

  fp = openfile("wtheta_corrected.data");
  nwdata = filesize(fp);
  wdata = vector(1,nwdata);
  rdata = vector(1,nwdata);
  edata = vector(1,nwdata);
  wmodel = vector(1,nwdata);

  for(i=1;i<=nwdata;++i)
    fscanf(fp,"%f %f %f",&rdata[i],&wdata[i],&edata[i]);
  fclose(fp);

  fp = openfile("LF_DRG.data");
  nlf = filesize(fp);
  lfmag = vector(1,nlf);
  lfdata = vector(1,nlf);
  lferr = vector(1,nlf);
  for(i=1;i<=nlf;++i)
    fscanf(fp,"%f %f %f",&lfmag[i],&lfdata[i],&lferr[i]);
  fclose(fp);
  delta_mag = 0.45;
  maglo = -23.86-delta_mag/2;

  MSTAR = mstar();

  tmin = log(1.0);
  tmax = log(1000);
  dtheta = (tmax-tmin)/(19);

  //HOD.M_min *= 1.5;
  //HOD.M_low *= 1.5;

  // get mean mass of centrals (ALL)
  MALL = qromo(func_drg1,log(HOD.M_low),log(HOD.M_max),midpnt)/
    qromo(func_drg1a,log(HOD.M_low),log(HOD.M_max),midpnt);

  //new model
  HOD.mass_shift = 0.5;
  HOD.pdfc = 10;
  //HOD.shift_alpha = 1;

  mlow = 1;
  mhi = 2;
  dlogm = log(mhi/mlow)/ngrid;

  //analytic_sham();

  /**********************************
   */
  // let's do the prediction for the blue galaxies.
  // best-fit model (alpha=1) fit10 is 12 28
  // best-fit model (alpha=1) fit9 is 30 19

  j1 = 12;
  j = 19;

  // set up HOD as DRGs
  // for stepping in mshift
  ERROR_FLAG = 0;
  MSHIFT = exp((j1-0.5)*dlogm)*mlow;
  HOD.fredc = 1;
  HOD.mass_shift = zbrent(func_findmshift,0.0,10.0,1.0E-4);
  HOD.freds = (j-0.5)/ngrid;
  HOD.fredc = zbrent(func_findfredc,0.0,1.0,1.0E-4);

  // for stepping in fsat0
  HOD.fredc = (j1-0.5)/ngrid;
  HOD.freds = (j-0.5)/ngrid;
  HOD.mass_shift = zbrent(func_findmshift2,0.0,1.434682,1.0E-4); //spaced in fcen0

  // 9panel c2 5.9
  //CHI 993 0.978682 0.660204 0.181224 2.119014e-01 8.793237e+00 1.237535 6.664499e-04
  HOD.mass_shift = 0.181;
  HOD.fredc = 0.66;
  HOD.freds = 0.3;//0.979;


  HOD.freds = 1 - HOD.freds; // for NON-DRGs
  HOD.pdfc = 11; // set up centrals as 1-f(DRG)

  //HOD.pdfc = 7; // square-well blues at low-mass end
  //HOD.M_min = 7e11;
  //HOD.M_cen_max = 1.5e12;
  //HOD.M_low = 7e11;
 
  GALAXY_DENSITY = qromo(func_galaxy_density,log(HOD.M_low),log(HOD.M_max),midpnt);
 fprintf(stdout,"fsat = %.2f fcen = %.2f ngal= %e\n",HOD.freds,HOD.fredc, GALAXY_DENSITY);
  RESET_FLAG_1H++;
  RESET_FLAG_2H++;

  for(i=0;i<20;++i)
    {
      theta = exp(tmin+i*dtheta);
      fprintf(stdout,"WTH %e %e\n",theta,wtheta(theta));
    }
  sprintf(Task.root_filename,"BX");
  //tasks(2,argv);
  exit(0);
  /*
  ****************************************/

  if(ARGC>3)
    ingal = atoi(ARGV[3]);
  else
    ingal = 1;
      
  NGAL_DRG = 6.5e-4;//*(1+(ingal-5)/2.5*0.13);


  // do an outer loop of the mass shifts
  for(j1=1;j1<=ngrid;++j1)
    {
      // go in steps of mean mass shift from 1 to 2.
      MSHIFT = exp((j1-0.5)*dlogm)*mlow;
      HOD.fredc = 1;
      HOD.mass_shift = zbrent(func_findmshift,0.0,10.0,1.0E-4);

      //HOD.mass_shift = 1.116703; //figure 3

      // doing equally spaced in fcen0
      //HOD.fredc = (j1-0.5)/ngrid;

      for(j=1;j<=ngrid;++j)
	{
	  ERROR_FLAG = 0;
	  HOD.freds = (j-0.5)/ngrid;
	  HOD.fredc = zbrent(func_findfredc,0.0,1.0,1.0E-4);
	  if(ERROR_FLAG)
	    HOD.fredc = 1.0;
	  ERROR_FLAG = 0;

	  /*
	  HOD.mass_shift = zbrent(func_findmshift2,0.0,1.434682,1.0E-4); //spaced in fcen0
	  if(ERROR_FLAG)
	    {
	      chi2lf = chi2w = 1.0e6;
	      printf("CHI %d %d %f %f %f %e %e %f\n",j1,j,HOD.freds,HOD.fredc,HOD.mass_shift,chi2lf,chi2w,MSHIFT);
	      fflush(stdout);
	      continue;
	    }
	  */


	  //best fit model from chains (wth+n only)
	  //1.648589e-01 7.732068e-01 9.796977e-01
	  MSHIFT = pow(10.0,0.164);
	  HOD.freds = 0.7732;
	  HOD.fredc = 0.977;
	  HOD.mass_shift = zbrent(func_findmshift,0.0,10.0,1.0E-4);
	  
	  // third column 7.10
	  //CHI 7 10 0.950000 1.000000 0.661607 9.897945e+00 1.109673e+01 1.569168 6.500000e-04 5.905374e-04
	  HOD.mass_shift = 0.6616;
	  HOD.fredc = 1.00;
	  HOD.freds = 0.95;
	  j1 = 7;
	  j = 10;

	  // 9panel c2 5.9
	  //CHI 993 0.978682 0.660204 0.181224 2.119014e-01 8.793237e+00 1.237535 6.664499e-04
	  j1 = 5;
	  j = 9;
	  HOD.mass_shift = 0.181;
	  HOD.fredc = 0.66;
	  HOD.freds = 0.979;

	  //for 9panel c1 1.1
	  j1 = 1;
	  j = 1;
	  HOD.mass_shift = 0;
	  HOD.fredc = NGAL_DRG/GALAXY_DENSITY;
	  HOD.freds = NGAL_DRG/GALAXY_DENSITY;

	  //best-fit model without LF
	  HOD.mass_shift = 0.48;
	  HOD.fredc = 0.99;
	  HOD.freds = 0.69;

	  //best-fit model with LF (bottom row of 6panel)
	  //8.234815e-02 9.011035e-01 6.467542e-01 
	  j1 = 7;
	  j = 10;
	  HOD.mass_shift = 1.505979e-01 ;
	  HOD.fredc = 6.467542e-01 ;
	  HOD.freds = 9.011035e-01 ;

	  GALAXY_DENSITY = qromo(func_galaxy_density,log(HOD.M_low),log(HOD.M_max),midpnt);
	  fprintf(stdout,"fsat = %.1f fcen = %f ngal= %e\n",HOD.freds,HOD.fredc, GALAXY_DENSITY);
	  RESET_FLAG_1H++;
	  RESET_FLAG_2H++;

	  /*
	  for(i=0;i<20;++i)
	    {
	      theta = exp(tmin+i*dtheta);
	      fprintf(stdout,"WTH %e %e\n",theta,wtheta(theta));
	    }
	  exit(0);
	  */

	  //populate_simulation();
	  //exit(0);

	  // get qudari model points
	  //fp = openfile("q8m.dat");
	  

	  // calculate the chi^2 for the wtheta values.
	  chi2w = 0;
	  for(i=1;i<=nwdata;++i)
	    {
	      x0 = wtheta(rdata[i]);
	      wmodel[i] = x0;
	      //q8 model
	      //fscanf(fp,"%f %f",&x1,&wmodel[i]);
	      //x0 = wmodel[i];
	      printf("XX %e %e %e %e\n",rdata[i],wdata[i],x0,edata[i]);
	      chi2w += (wdata[i]-x0)*(wdata[i]-x0)/(edata[i]*edata[i]);
	    }
	  //fclose(fp);

	  fmuh(chi2w);
	  if(USE_COVAR)
	    chi2w = chi2wtheta_covar(wdata,wmodel);
	  fmuh(chi2w);
	  //exit(0);
	  
	  sprintf(fname,"wth_mshift_%d.%d",j1,j);
	  fp = fopen(fname,"w");
	  for(i=0;i<20;++i)
	    {
	      theta = exp(tmin+i*dtheta);
	      fprintf(fp,"%e %e\n",theta,wtheta(theta));
	    }
	  fclose(fp);
	  //continue;
	  
	  // do the real-space clustering and HOD
	  sprintf(Task.root_filename,"mshift_%d.%d",j1,j);
	  tasks(2,argv);
	  
	  // now make the luminosity function for this model
	  //output_drg_lf(j);      
	  sprintf(fname,"sham ../../SHAM/halosub_0.284 hod_mshift_%d.%d %f %f %f %f > gal_mshift_%d.%d",j1,j,HOD.freds,HOD.fredc,HOD.mass_shift,GALAXY_DENSITY,j1,j);
	  //sprintf(fname,"sham ../SHAM_120/halosub_0.3323.dat hod_mshift_%.1f.%d %f %f %f > gal_mshift_%.1f.%d",HOD.mass_shift,j,HOD.freds,HOD.fredc,HOD.mass_shift,HOD.mass_shift,j);
	  fprintf(stderr,"[%s]\n",fname);
	  system(fname);
	  
	  // calculate the clustering of this drg sample
	  sprintf(fname,"covar3 0.1 15 12 160 0 160 1 gal_mshift_%d.%d a 0 1 auto > xi.mshift_%d.%d",j1,j,j1,j);
	  //fprintf(stderr,"[%s]\n",fname);
	  //system(fname);
	  

	  // calculate the luminosity function
	  sprintf(fname,"gal_mshift_%d.%d",j1,j);
	  fp = openfile(fname);
	  n = filesize(fp);
	  for(i=1;i<=nlf;++i)
	    magcnt[i] = 0;
	  for(i=1;i<=n;++i)
	    {
	      for(k=1;k<=10;++k) fscanf(fp,"%f",&x1);// printf("%e\n",x1); }
	      k = (x1-maglo)/delta_mag + 1;
	      if(k>=1 && k<=nlf)magcnt[k]+=1;
	      //printf("%d %d %f %f %f\n",i,k,x1,maglo,delta_mag);
	      fscanf(fp,"%f",&x1);
	    }
	  fclose(fp);
	  
	  // calculate the chi^2 for the luminosity function
	  chi2lf = 0;
	  for(i=1;i<=nlf;++i)
	    {
	      if(i==nlf)
		x0 = log10(magcnt[i]/pow(BOX_SIZE/0.7,3.0)/delta_mag);
	      else
		x0 = log10(magcnt[i]/pow(BOX_SIZE/0.7,3.0)/delta_mag);
	      printf("LF %d %d %f %f %f\n",j1,j,x0,lfdata[i],lferr[i]);
	      chi2lf += (x0 - lfdata[i])*(x0 - lfdata[i])/(lferr[i]*lferr[i]);
	    }
	  
	  printf("CHI %d %d %f %f %f %e %e %f %e %e\n",j1,j,HOD.freds,HOD.fredc,HOD.mass_shift,chi2lf,chi2w,MSHIFT,NGAL_DRG,GALAXY_DENSITY);
	  fflush(stdout);
	  exit(0);
	}
    }

  exit(0);
}
void populate_simulation()
{
  FILE *fp,*fpa[9],*fp2,*fp3,*fpb[9],*fpc[9],*fps[9],*fpt,*fpblue, *fpsub,*fp2r,*fp3r;
  int i,j,k,n,imass,n1,j_start=0,i1,galcnt[1000],halocnt[1000];
  double mass,xg[3],vg[3],nsat,nc[10],ncen,mlo,mag,err1,err2,r,fac,sigv;
  char aa[1000];
  float x1,xh[3],vh[3],vgf[3];
  long IDUM3 = -445;

  float **galarr;
  int *galid,id1=0,id2=0,j1,*ibluecen,nhalo;
  float dx,dy,dz,dr,drh,rv1,rv2,rmin,rmax, fred,p;
  float **haloarr;
  int ngal,nsati[9],ALL_FILES=0,TRACK_GALAXIES=0,WARREN_MASS_CORRECTION=0,haloid;

  float *xt,*yt,*zt,*vxt,*vyt,*vzt;

  //static int nhalo, *used_halo, iuse_flag = 1;
  int ihalo=0, ii;

  int SO_FILE = 0,
    JEANS_DISPERSION = 0;
  
  // new for mcmc_lensing;
  double m1, m2, mfslope, rad, mstar, rproj, xs[20], vhalo, imag, minimum_halo_mass, 
    minimum_mstar, minimum_lgmstar;
  long IDUM=-555;
  float xx[20], xd[3], xv[3], *subi, *submass, *temp;


  fprintf(stderr,"\n\nPOPULATING SIMULATION WITH SHMR.\n");
  fprintf(stderr,    "--------------------------------\n\n");

  fp=openfile(Files.HaloFile);
  fprintf(stderr,"opening file: [%s]\n",Files.HaloFile);
  nhalo = filesize(fp);
  fprintf(stderr,"number of lines: [%d]\n",nhalo);

  ibluecen = ivector(1,nhalo);

  if(Files.UseStellarMassBinsClustering)
    input_stellar_mass_bins();
  minimum_mstar = pow(10.0,wpl.mstar_wplo[0][1]);
  minimum_lgmstar = wpl.mstar_wplo[0][1];
  fmuh(minimum_lgmstar);

  if(!COLOR)
    {
      sprintf(aa,"%s.shmr_mock",Task.root_filename);      
      fp2 = fopen(aa,"w");
      fprintf(stderr,"outfile: [%s]\n",aa);
      sprintf(aa,"%s.shmr_mock_haloid",Task.root_filename);      
      fp3 = fopen(aa,"w");
    }
  else
    {
      sprintf(aa,"%s.shmr_mock_blue",Task.root_filename);      
      fp2 = fopen(aa,"w");
      fprintf(stderr,"outfile: [%s]\n",aa);
      sprintf(aa,"%s.shmr_mock_haloid_blue",Task.root_filename);      
      fp3 = fopen(aa,"w");
    }

  BLUE_FLAG = 1;
  wpl.reset_inversion = 1;
  set_up_hod_for_shmr(minimum_mstar,5.0E12,wpl.a);
  minimum_halo_mass = HOD.M_low; 
  generate_satellite_galaxy_tab(1.0E12,minimum_lgmstar,1);
  fprintf(stderr,"Expected number density of galaxies N(>%.2f Msol)= %e\n",log10(minimum_mstar),GALAXY_DENSITY);
  fprintf(stderr,"Minimum halo mass (M_low) required= %e\n",minimum_halo_mass);

  haloid = 0;
  for(ii=1;ii<=nhalo;++ii)
    {
      ibluecen[ii] = 0;
      fscanf(fp,"%d %lf %f %f %f %f %f %f %f %f",
	     &i,&mass,&x1,&x1,&xh[0],&xh[1],&xh[2],&vh[0],&vh[1],&vh[2]);

      // output the central with probability given by red_central_fraction
      fred = red_central_fraction(mass,wpl.a);
      p = drand48();
      if(p>fred)ibluecen[ii] = 1; // mark as blue or red before cutting for min halo mass
      if(mass<minimum_halo_mass)continue;
      haloid++;

      // decide whether this halo's center is red or blue
      if(p>fred) 
	{
	  // get the mass of the central galaxy
	  mstar = log10(ms_to_mhalo_inversion(mass));
	  m1 = gasdev(&IDUM)*wpl.a[6+(1-BLUE_FLAG)*11]+(mstar);
	  if(m1>minimum_lgmstar) {
	    fprintf(fp2,"%e %e %e %e %e %e %d %e %e\n",xh[0],xh[1],xh[2],vh[0],vh[1],vh[2],1,m1,mass);
	    fprintf(fp3,"%d\n",haloid);
	  }
	}

      // tabulate the CLF for this halo mass
      //nsat = generate_satellite_galaxy(-mass,9.0);
      nsat = generate_satellite_galaxy_tab(-mass,minimum_lgmstar,0);
      //printf("nsat check> %e\n",nsat);
      n1 = poisson_deviate(nsat);

      for(i=1;i<=n1;++i)
	{
	  //m1 = generate_satellite_galaxy(mass,9.0);
	  m1 = generate_satellite_galaxy_tab(mass,minimum_lgmstar,0);
	  r = NFW_position(mass,xg);
	  NFW_velocity(mass,vg,mag);
	  boxwrap_galaxy(xh,xg);
	  fprintf(fp2,"%e %e %e %e %e %e %d %e %e\n",
		  xg[0],xg[1],xg[2],vh[0]+vg[0],vh[1]+vg[1],vh[2]+vg[2],0,m1,mass);
	  fprintf(fp3,"%d\n",haloid);
	}	
      fflush(fp2);
      fflush(fp3);
    }
  fclose(fp2);
  fclose(fp3);

  /* ---------------------------------------------
   *  now got back and do the REDS, if required
   * ---------------------------------------------
   */
  if(!COLOR)return;

  sprintf(aa,"%s.shmr_mock_red",Task.root_filename);      
  fp2 = fopen(aa,"w");
  fprintf(stderr,"outfile: [%s]\n",aa);
  sprintf(aa,"%s.shmr_mock_haloid_red",Task.root_filename);      
  fp3 = fopen(aa,"w");
  
  rewind(fp);
  BLUE_FLAG = 0;
  wpl.reset_inversion = 1;
  set_up_hod_for_shmr(2.0E9,5.0E12,wpl.a);
  set_up_hod_for_shmr(1.0E9,5.0E12,wpl.a);
  minimum_halo_mass = HOD.M_low;
  fprintf(stderr,"Expected number density of red galaxies N(>10^9 Msol)= %e\n",GALAXY_DENSITY);
  fprintf(stderr,"Minimum halo mass (M_low) required= %e\n",minimum_halo_mass);

  generate_satellite_galaxy_tab(1.0E12,minimum_lgmstar,1);
  haloid = 0;
  for(ii=1;ii<=nhalo;++ii)
    {
      fscanf(fp,"%d %lf %f %f %f %f %f %f %f %f",
	     &i,&mass,&x1,&x1,&xh[0],&xh[1],&xh[2],&vh[0],&vh[1],&vh[2]);
      if(mass<minimum_halo_mass)continue;
      haloid++;

      // we already know whether this halo is blue central
      if(ibluecen[ii])goto POP_SATS;

      // get the mass of the central galaxy
      mstar = log10(ms_to_mhalo_inversion(mass));
      m1 = gasdev(&IDUM)*wpl.a[6+(1-BLUE_FLAG)*11]+(mstar);
      if(m1>minimum_lgmstar) {
	fprintf(fp2,"%e %e %e %e %e %e %d %e %e\n",xh[0],xh[1],xh[2],vh[0],vh[1],vh[2],1,m1,mass);
	fprintf(fp3,"%d\n",haloid);
      }

    POP_SATS:
      // tabulate the CLF for this halo mass
      nsat = generate_satellite_galaxy_tab(-mass,minimum_lgmstar,0);
      n1 = poisson_deviate(nsat);

      for(i=1;i<=n1;++i)
	{
	  m1 = generate_satellite_galaxy_tab(mass,minimum_lgmstar,0);
	  r = NFW_position(mass,xg);
	  NFW_velocity(mass,vg,mag);	
	  boxwrap_galaxy(xh,xg);
	  fprintf(fp2,"%e %e %e %e %e %e %d %e %e\n",
		  xg[0],xg[1],xg[2],vh[0]+vg[0],vh[1]+vg[1],vh[2]+vg[2],0,m1,mass);
	  fprintf(fp3,"%d\n",haloid);
	}	
      fflush(fp2);
      fflush(fp3);
    }

  fclose(fp);

  return ;
  
}