#include "sopnamsp.h" #include "machdefs.h" #include #include #include #include #include #include #include #include "constcosmo.h" #include "cosmocalc.h" #include "geneutils.h" #include "schechter.h" #include "pkspectrum.h" #include "planckspectra.h" /* --- Check Peterson at al. astro-ph/0606104 v1 (pb facteur sqrt(2) sur S/N !) cmvdefsurv -U 0.75,0.3,0.7,-1,1 -V 300 -z 0.0025,0.2,Z -x 1,90,A -O 400000,6000 -N 75 -M 6.156e9 -F 3 -2 1.5 --- */ //----------------------------------------------------------------------------------------------------------- inline double rad2deg(double trad) {return trad/M_PI*180.;} inline double rad2min(double trad) {return trad/M_PI*180.*60.;} inline double rad2sec(double trad) {return trad/M_PI*180.*3600.;} inline double deg2rad(double tdeg) {return tdeg*M_PI/180.;} inline double min2rad(double tmin) {return tmin*M_PI/(180.*60.);} inline double sec2rad(double tsec) {return tsec*M_PI/(180.*3600.);} inline double sr2deg2(double asr) {return asr*pow(rad2deg(1.),2.);} inline double sr2min2(double asr) {return asr*pow(rad2min(1.),2.);} inline double deg22sr(double adeg) {return adeg*pow(deg2rad(1.),2.);} inline double min22sr(double amin) {return amin*pow(min2rad(1.),2.);} double LargeurDoppler(double v /* km/s */, double nu); double DzFrV(double v /* km/s */, double zred); double DNuFrDz(double dzred,double nu_at_0,double zred); double DzFrDNu(double dnu_at_0,double nu_at_0,double zred); double DzFrDNuApprox(double dnu_at_0,double nu_at_0,double zred); double ZFrLos(double loscom /* Mpc com */,CosmoCalc& univ); double AngsolEqTelescope(double nu /* GHz */,double telsurf /* m^2 */); void usage(void); void usage(void) { cout<<"cmvdefsurv [options] -x dx,txlarg[,unit_x] -y dy,tylarg[,unit_y] -z dz,tzlarg[,unit_z] redshift"< : moyenne du flux AGN en Jy dans le pixel"<=narg) {usage(); return -1;} sscanf(arg[optind],"%lf",&redshift0); if(redshift0<=0.) {cout<<"Redshift "<0"<>>>\n>>>> Geometrie\n>>>>"<>>>\n>>>> Cosmologie generale\n>>>>"<0"< dlosdz= "< dz = "<<1./dlosdz[0]<<" in ["<<1./dlosdz[1]<<","<<1./dlosdz[2]<<"]"< "< "< "< "< dlosdz= "< dz = "<<1./dlosdz[0]<>>>\n>>>> Cosmologie & Geometrie transverse\n>>>>"<1.e-20 && fabs(txlarg-tylarg)>1.e-20) { cout<<"\ndy = "<>>>\n>>>> Cosmologie & Geometrie ligne de visee\n>>>>"<>>>\n>>>> Volumes\n>>>>"< "< pixel volume comoving = vol/Npix = "<>>>\n>>>> Angles solides\n>>>>"<>>>\n>>>> Geometrie dans l'espace de Fourier\n>>>>"<0. && pkcosm>0.) { double pk = pkcosm*pow(growthfac[0],2.); cout<<"\n>>>>\n>>>> variance cosmique pour k="<>>>"< dk; if(dkcosm>0.) dk.push_back(dkcosm); dk.push_back(dk_x); dk.push_back(dk_y); dk.push_back(dk_z); for(int i=0;i<(int)dk.size();i++) { // la variance cosmique pure double vcosm = sqrt( 2.*pow(2.*M_PI,3.)/(4.*M_PI*pow(kcosm,2.)*dk[i]*vol_survey) ); double nmode = 0.5*vol_survey/pow(2.*M_PI,3.) * 4.*M_PI*pow(kcosm,2.)*dk[i]; cout<<" pour dk = "<>>>\n>>>> Mass HI\n>>>>"<10^"<>>>\n>>>> Observations\n>>>>"<>>>\n>>>> Signal Analysis\n>>>>"<dnuhiz[0]) cout<<"Warning: doppler width "< "< Flux en -0.7 dans l'approximation Rayleigh) // --- double tsynch[3]; double psynch_2polar[3], tasynch_2polar[3], ssynch_2polar[3], isynch_2polar[3]; double psynch[3], tasynch[3], ssynch[3], isynch[3]; for(int i=0;i<3;i++) { tsynch[i] = Tsynch408; if(fabs(indnu)>1.e-50) tsynch[i] *= pow(nuhiz[i]/nuhaslam,indnu); planck.SetTemperature(tsynch[i]); psynch_2polar[i] = planck(nuhiz[i]*1.e+9) * surfeff * angsol_pix[i] * (dnuhiz[i]*1e9); tasynch_2polar[i] = psynch_2polar[i] / k_Boltzman_Cst / (dnuhiz[i]*1e9); ssynch_2polar[i] = psynch_2polar[i] / surfeff / (dnuhiz[i]*1e9) / Jansky2Watt_cst; isynch_2polar[i] = ssynch_2polar[i] / angsol_pix[i]; psynch[i] = facpolar * psynch_2polar[i]; tasynch[i] = facpolar * tasynch_2polar[i]; ssynch[i] = facpolar * ssynch_2polar[i]; isynch[i] = ssynch[i] / angsol_pix[i]; } cout<<"\n--- Synchrotron: T="< 2 * k * Tsys / [ Atot * Sqrt(dnu*Tobs) ] // C'est aussi la formule pour un telescope unique de surface Atot // --- On ne mesure qu'une seule polarisation // Ces formules sont valables si on mesure 1 polarisation: // Slim est la densite de flux total "St" (2 polars) d'une source (non-polarisee) // qui donne la meme puissance que le bruit dans un detecteur qui ne // mesure qu'une seule polarisation: // Le rapport S/N pour une source de densite de flux St (totale 2 polars): // S/N = St / Slim // La puissance de bruit est, par definition: // Pb = 1/2 *Slim*Atot*dNu // = k*Tsys*sqrt(2*dNu/Tobs) pour N=2 // = k*Tsys*sqrt(dNu/Tobs) pour N>>grand // La densite de flux d'une source a S/N=1 est: // St = Slim // La puissance d'une source a S/N=1 mesuree par un detecteur // qui ne mesure qu'une polar est: // P1_lim = 1/2 *Slim*Atot*dNu // --- On mesure les 2 polarisations avec deux voies d'electronique distinctes // la puissance du signal mesure est multipliee par 2 // la puissance du bruit est multipliee par sqrt(2) // on a donc un gain d'un facteur sqrt(2) sur le rapport S/N // (cela revient d'ailleur a doubler le temps de pose: Tobs -> 2*Tobs) // En notant arbitrairement: Slim' = Slim / sqrt(2) // ou Slim est defini par les formules ci-dessus // Le rapport S/N pour une source de densite de flux St (totale 2 polars): // (S/N)_2 = (S/N)_1 * sqrt(2) = (St / Slim) * sqrt(2) = St / Slim' // La densite de flux d'une source a S/N=1 est: // St = Slim' = Slim / sqrt(2) // La puissance d'une source a S/N=1 cumulee par les 2 detecteurs est: // P_lim = St*Atot*dNu = Slim'*Atot*dNu = 1/sqrt(2) *Slim*Atot*dNu // = P1_lim * sqrt(2) // La puissance de bruit cumulee par les 2 detecteurs est, par definition: // Pb = P_lim = Slim'*Atot*dNu = P1_lim * sqrt(2) // = 2*k*Tsys*sqrt(dNu/Tobs) pour N=2 // = k*Tsys*sqrt(2*dNu/Tobs) pour N>>grand // ===================================================================== cout<<"\n>>>>\n>>>> Noise analysis\n>>>>"<> telescopes fac = 1.; cout<<"\n...Observation limits for a N (large) telescope interferometer (with complex correlator)"<