| [3115] | 1 | #include "sopnamsp.h" | 
|---|
|  | 2 | #include "machdefs.h" | 
|---|
|  | 3 | #include <iostream> | 
|---|
|  | 4 | #include <stdlib.h> | 
|---|
|  | 5 | #include <stdio.h> | 
|---|
|  | 6 | #include <string.h> | 
|---|
|  | 7 | #include <math.h> | 
|---|
|  | 8 | #include <unistd.h> | 
|---|
|  | 9 |  | 
|---|
| [3350] | 10 | #include <vector> | 
|---|
|  | 11 |  | 
|---|
| [3115] | 12 | #include "constcosmo.h" | 
|---|
|  | 13 | #include "cosmocalc.h" | 
|---|
|  | 14 | #include "geneutils.h" | 
|---|
|  | 15 | #include "schechter.h" | 
|---|
| [3350] | 16 | #include "pkspectrum.h" | 
|---|
| [3115] | 17 | #include "planckspectra.h" | 
|---|
|  | 18 |  | 
|---|
| [3336] | 19 | /* --- Check Peterson at al. astro-ph/0606104 v1  (pb facteur sqrt(2) sur S/N !) | 
|---|
| [3288] | 20 | 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 | 
|---|
| [3193] | 21 | --- */ | 
|---|
|  | 22 |  | 
|---|
| [3365] | 23 | //----------------------------------------------------------------------------------------------------------- | 
|---|
| [3115] | 24 | inline double rad2deg(double trad) {return trad/M_PI*180.;} | 
|---|
|  | 25 | inline double rad2min(double trad) {return trad/M_PI*180.*60.;} | 
|---|
|  | 26 | inline double rad2sec(double trad) {return trad/M_PI*180.*3600.;} | 
|---|
|  | 27 | inline double deg2rad(double tdeg) {return tdeg*M_PI/180.;} | 
|---|
|  | 28 | inline double min2rad(double tmin) {return tmin*M_PI/(180.*60.);} | 
|---|
|  | 29 | inline double sec2rad(double tsec) {return tsec*M_PI/(180.*3600.);} | 
|---|
|  | 30 |  | 
|---|
| [3367] | 31 | inline double sr2deg2(double asr) {return asr*pow(rad2deg(1.),2.);} | 
|---|
|  | 32 | inline double sr2min2(double asr) {return asr*pow(rad2min(1.),2.);} | 
|---|
|  | 33 | inline double deg22sr(double adeg) {return adeg*pow(deg2rad(1.),2.);} | 
|---|
|  | 34 | inline double min22sr(double amin) {return amin*pow(min2rad(1.),2.);} | 
|---|
|  | 35 |  | 
|---|
| [3365] | 36 | double AngsolEqTelescope(double nu /* GHz */,double telsurf /* m^2 */); | 
|---|
| [3749] | 37 |  | 
|---|
| [3115] | 38 | void usage(void); | 
|---|
| [3365] | 39 |  | 
|---|
| [3115] | 40 | void usage(void) { | 
|---|
| [3365] | 41 | cout<<"cmvdefsurv [options] -x dx,txlarg[,unit_x] -y dy,tylarg[,unit_y] -z dz,tzlarg[,unit_z] redshift"<<endl | 
|---|
| [3287] | 42 | <<"----------------"<<endl | 
|---|
| [3365] | 43 | <<" -x dx,txlarg[,unit_x] : resolution et largeur dans le plan transverse selon X"<<endl | 
|---|
|  | 44 | <<" -y dy,tylarg[,unit_y] : idem selon Y, si <=0 meme que X"<<endl | 
|---|
|  | 45 | <<" -z dz,tzlarg[,unit_z] : resolution et largeur sur la ligne de visee"<<endl | 
|---|
| [3287] | 46 | <<"-- Unites pour X-Y:"<<endl | 
|---|
| [3365] | 47 | <<"   \'A\' : en angles (pour X-Y)  : resolution=ArcMin, largeur=Degre (defaut)"<<endl | 
|---|
|  | 48 | <<"   \'Z\' : en redshift (pour Z)  : resolution et largeur en redshift (defaut)"<<endl | 
|---|
|  | 49 | <<"   \'F\' : en frequence (pour Z) : resolution et largeur MHz"<<endl | 
|---|
|  | 50 | <<"   \'M\' : en longeur comobile (pour X-Y-Z) : resolution et largeur Mpc"<<endl | 
|---|
| [3287] | 51 | <<"----------------"<<endl | 
|---|
| [3351] | 52 | <<" -K k,dk,pk : k(Mpc^-1) dk(Mpc^-1) pk(a z=0 en Mpc^-3) pour estimer la variance cosmique"<<endl | 
|---|
| [3350] | 53 | <<"----------------"<<endl | 
|---|
| [3352] | 54 | <<" -O surf,tobs,eta : surface effective (m^2), temps d\'observation (s), efficacite d\'ouverture"<<endl | 
|---|
| [3196] | 55 | <<" -N Tsys : temperature du system (K)"<<endl | 
|---|
| [3367] | 56 | <<" -L lobearea,freqlob : angle solide du lobe d\'observation en arcmin^2 (def= celle du pixel)"<<endl | 
|---|
|  | 57 | <<"                       pour la frequence freqlob en MHz"<<endl | 
|---|
|  | 58 | <<"            Si freqlob<=0 : la frequence de reference est celle du redshift etudie (def)"<<endl | 
|---|
| [3287] | 59 | <<" -2 : two polarisations measured"<<endl | 
|---|
| [3193] | 60 | <<" -M  : masse de HI de reference (MSol), si <=0 mean schechter in pixel"<<endl | 
|---|
| [3115] | 61 | <<" -F  : HI flux factor to be applied for our redshift"<<endl | 
|---|
| [3193] | 62 | <<" -V Vrot : largeur en vitesse (km/s) pour l\'elargissement doppler (def=300km/s)"<<endl | 
|---|
| [3287] | 63 | <<"----------------"<<endl | 
|---|
|  | 64 | <<" -S Tsynch,indnu : temperature (K) synch a 408 Mhz, index d\'evolution"<<endl | 
|---|
|  | 65 | <<"                   (indnu==0 no evolution with freq.)"<<endl | 
|---|
|  | 66 | <<"----------------"<<endl | 
|---|
| [3193] | 67 | <<" -U h100,om0,ol0,w0,or0,flat : cosmology"<<endl | 
|---|
| [3287] | 68 | <<"----------------"<<endl | 
|---|
| [3196] | 69 | <<" -A <log10(S_agn)> : moyenne du flux AGN en Jy dans le pixel"<<endl | 
|---|
| [3115] | 70 | <<" redshift : redshift moyen du survey"<<endl | 
|---|
|  | 71 | <<endl; | 
|---|
|  | 72 | } | 
|---|
|  | 73 |  | 
|---|
| [3365] | 74 | //------------------------------------------------------------------------------------------- | 
|---|
| [3115] | 75 | int main(int narg,char *arg[]) | 
|---|
|  | 76 | { | 
|---|
| [3365] | 77 | // --- | 
|---|
|  | 78 | // --- Valeurs fixes ou par defaut | 
|---|
|  | 79 | // --- | 
|---|
|  | 80 |  | 
|---|
|  | 81 | //-- WMAP | 
|---|
| [3115] | 82 | unsigned short flat = 0; | 
|---|
| [3193] | 83 | double h100=0.71, om0=0.267804, or0=7.9e-05*0., ol0=0.73,w0=-1.; | 
|---|
| [3365] | 84 |  | 
|---|
|  | 85 | //-- Schechter HIMASS | 
|---|
| [3115] | 86 | double h75 = h100 / 0.75; | 
|---|
|  | 87 | double nstar = 0.006*pow(h75,3.);  // | 
|---|
| [3343] | 88 | double mstar = pow(10.,9.8);  // MSol | 
|---|
| [3115] | 89 | double alpha = -1.37; | 
|---|
|  | 90 | cout<<"nstar= "<<nstar<<"  mstar="<<mstar<<"  alpha="<<alpha<<endl; | 
|---|
|  | 91 |  | 
|---|
| [3365] | 92 | double hifactor = 1.; | 
|---|
|  | 93 | double vrot = 300.; // largeur en vitesse (km/s) pour elargissement doppler | 
|---|
|  | 94 |  | 
|---|
|  | 95 | //-- CMB , Synchrotron et AGN | 
|---|
|  | 96 | double tcmb = T_CMB_Par; | 
|---|
| [3115] | 97 | // a 408 MHz (Haslam) + evol index a -2.6 | 
|---|
|  | 98 | double Tsynch408=60., nuhaslam=0.408, indnu = -2.6; | 
|---|
| [3365] | 99 | double lflux_agn = -3.; | 
|---|
|  | 100 |  | 
|---|
|  | 101 | //-- Appareillage | 
|---|
| [3339] | 102 | bool ya2polar = false; | 
|---|
| [3336] | 103 | double facpolar = 0.5; // si on mesure les 2 polars -> 1.0 | 
|---|
| [3365] | 104 | double Tsys=75.; | 
|---|
|  | 105 | double tobs = 6000., surftot = 400000., eta_eff  = 1.; | 
|---|
|  | 106 | // taille du lobe d'observation en arcmin pour la frequence | 
|---|
| [3367] | 107 | double lobearea0 = -1., lobefreq0 = -1.; | 
|---|
| [3115] | 108 |  | 
|---|
| [3365] | 109 | //-- Variance cosmique (default = standard SDSSII) | 
|---|
|  | 110 | double kcosm = 0.05, dkcosm = -1., pkcosm = 40000.; | 
|---|
|  | 111 |  | 
|---|
|  | 112 | // --- Pour taille du survey | 
|---|
| [3462] | 113 | double dx=1., dy=-1., dz=0.0007, txlarg=100., tylarg=-1., tzlarg=0.1; | 
|---|
| [3365] | 114 | int nx=0, ny=0, nz=0; | 
|---|
|  | 115 | char unit_x = 'A', unit_y = 'A', unit_z = 'Z'; | 
|---|
|  | 116 | double redshift0 = 0.; | 
|---|
|  | 117 | double mhiref = -1.; // reference Mass en HI (def integ schechter) | 
|---|
|  | 118 |  | 
|---|
|  | 119 | // --- | 
|---|
| [3115] | 120 | // --- Decodage arguments | 
|---|
| [3365] | 121 | // --- | 
|---|
| [3115] | 122 | char c; | 
|---|
| [3350] | 123 | while((c = getopt(narg,arg,"h2x:y:z:N:S:O:M:F:V:U:L:A:K:")) != -1) { | 
|---|
| [3115] | 124 | switch (c) { | 
|---|
|  | 125 | case 'x' : | 
|---|
| [3365] | 126 | sscanf(optarg,"%lf,%lf,%c",&dx,&txlarg,&unit_x); | 
|---|
| [3115] | 127 | break; | 
|---|
|  | 128 | case 'y' : | 
|---|
| [3365] | 129 | sscanf(optarg,"%lf,%lf,%c",&dy,&tylarg,&unit_y); | 
|---|
| [3115] | 130 | break; | 
|---|
|  | 131 | case 'z' : | 
|---|
| [3365] | 132 | sscanf(optarg,"%lf,%lf,%c",&dz,&tzlarg,&unit_z); | 
|---|
| [3115] | 133 | break; | 
|---|
|  | 134 | case 'O' : | 
|---|
| [3352] | 135 | sscanf(optarg,"%lf,%lf,%lf",&surftot,&tobs,&eta_eff); | 
|---|
| [3115] | 136 | break; | 
|---|
| [3193] | 137 | case 'L' : | 
|---|
| [3367] | 138 | sscanf(optarg,"%lf,%lf",&lobearea0,&lobefreq0); | 
|---|
| [3193] | 139 | break; | 
|---|
| [3196] | 140 | case 'N' : | 
|---|
| [3193] | 141 | sscanf(optarg,"%lf",&Tsys); | 
|---|
| [3115] | 142 | break; | 
|---|
|  | 143 | case 'S' : | 
|---|
|  | 144 | sscanf(optarg,"%lf,%lf",&Tsynch408,&indnu); | 
|---|
|  | 145 | break; | 
|---|
|  | 146 | case 'M' : | 
|---|
|  | 147 | sscanf(optarg,"%lf",&mhiref); | 
|---|
|  | 148 | break; | 
|---|
|  | 149 | case 'F' : | 
|---|
|  | 150 | sscanf(optarg,"%lf",&hifactor); | 
|---|
|  | 151 | break; | 
|---|
| [3193] | 152 | case 'V' : | 
|---|
|  | 153 | sscanf(optarg,"%lf",&vrot); | 
|---|
| [3115] | 154 | break; | 
|---|
| [3193] | 155 | case 'U' : | 
|---|
| [3248] | 156 | sscanf(optarg,"%lf,%lf,%lf,%lf,%hu",&h100,&om0,&ol0,&w0,&flat); | 
|---|
| [3193] | 157 | break; | 
|---|
|  | 158 | case '2' : | 
|---|
| [3339] | 159 | ya2polar = true; | 
|---|
| [3193] | 160 | facpolar = 1.0; | 
|---|
|  | 161 | break; | 
|---|
| [3196] | 162 | case 'A' : | 
|---|
|  | 163 | sscanf(optarg,"%lf",&lflux_agn); | 
|---|
|  | 164 | break; | 
|---|
| [3350] | 165 | case 'K' : | 
|---|
| [3351] | 166 | sscanf(optarg,"%lf,%lf,%lf",&kcosm,&dkcosm,&pkcosm); | 
|---|
| [3350] | 167 | break; | 
|---|
| [3115] | 168 | case 'h' : | 
|---|
|  | 169 | default : | 
|---|
|  | 170 | usage(); return -1; | 
|---|
|  | 171 | } | 
|---|
| [3193] | 172 | } | 
|---|
| [3365] | 173 | if(optind>=narg) {usage(); return -1;} | 
|---|
|  | 174 | sscanf(arg[optind],"%lf",&redshift0); | 
|---|
|  | 175 | if(redshift0<=0.) {cout<<"Redshift "<<redshift0<<" should be >0"<<endl; return -2;} | 
|---|
| [3115] | 176 |  | 
|---|
| [3365] | 177 | // --- | 
|---|
| [3115] | 178 | // --- Initialisation de la Cosmologie | 
|---|
| [3365] | 179 | // --- | 
|---|
|  | 180 | CosmoCalc univ(flat,true,2.*redshift0); | 
|---|
|  | 181 | double perc=0.01,dzinc=redshift0/100.,dzmax=dzinc*10.; unsigned short glorder=4; | 
|---|
| [3115] | 182 | univ.SetInteg(perc,dzinc,dzmax,glorder); | 
|---|
|  | 183 | univ.SetDynParam(h100,om0,or0,ol0,w0); | 
|---|
| [3365] | 184 |  | 
|---|
| [3805] | 185 | GrowthEisenstein growth(om0,ol0); | 
|---|
| [3115] | 186 |  | 
|---|
| [3365] | 187 | // --- | 
|---|
| [3115] | 188 | // --- Mise en forme dans les unites appropriees | 
|---|
| [3365] | 189 | // --- | 
|---|
|  | 190 | // ATTENTION: le cube de simulation est en Mpc avec des pixels de taille comobile fixe | 
|---|
| [3287] | 191 | cout<<"\n>>>>\n>>>> Geometrie\n>>>>"<<endl; | 
|---|
| [3365] | 192 | if(dy<=0. || tylarg<=0.) {dy=dx; tylarg=txlarg; unit_y=unit_x;} | 
|---|
|  | 193 | cout<<"X values: resolution="<<dx<<" largeur="<<txlarg<<" unite="<<unit_x<<endl; | 
|---|
| [3287] | 194 | if(unit_x == 'A') { | 
|---|
| [3365] | 195 | nx = int(txlarg*60./dx+0.5); | 
|---|
|  | 196 | dx = min2rad(dx)*univ.Dtrcom(redshift0); | 
|---|
|  | 197 | txlarg = dx*nx; | 
|---|
| [3287] | 198 | } else if(unit_x == 'M') { | 
|---|
| [3365] | 199 | nx = int(txlarg/dx+0.5); | 
|---|
|  | 200 | txlarg = dx*nx; | 
|---|
| [3287] | 201 | } else { | 
|---|
| [3365] | 202 | cout<<"Unknown unit_x = "<<unit_x<<endl; return -2; | 
|---|
| [3287] | 203 | } | 
|---|
| [3365] | 204 | cout<<"Y values: resolution="<<dy<<" largeur="<<tylarg<<" unite="<<unit_y<<endl; | 
|---|
| [3287] | 205 | if(unit_y == 'A') { | 
|---|
| [3365] | 206 | ny = int(tylarg*60./dy+0.5); | 
|---|
|  | 207 | dy = min2rad(dy)*univ.Dtrcom(redshift0); | 
|---|
|  | 208 | tylarg = dy*ny; | 
|---|
| [3287] | 209 | } else if(unit_y == 'M') { | 
|---|
| [3365] | 210 | ny = int(tylarg/dy+0.5); | 
|---|
|  | 211 | tylarg = dy*ny; | 
|---|
| [3115] | 212 | } else { | 
|---|
| [3365] | 213 | cout<<"Unknown unit_y = "<<unit_y<<endl; return -2; | 
|---|
| [3287] | 214 | } | 
|---|
| [3365] | 215 | cout<<"Z values: resolution="<<dz<<" largeur="<<tzlarg<<" unite="<<unit_z<<endl; | 
|---|
| [3287] | 216 | if(unit_z == 'Z') { | 
|---|
| [3365] | 217 | nz = int(tzlarg/dz+0.5); | 
|---|
|  | 218 | dz = dz*univ.Dhubble()/univ.E(redshift0); | 
|---|
|  | 219 | tzlarg = dz*nz; | 
|---|
| [3287] | 220 | } else if(unit_z == 'M') { | 
|---|
| [3365] | 221 | nz = int(tzlarg/dz+0.5); | 
|---|
|  | 222 | tzlarg = dz*nz; | 
|---|
|  | 223 | } else if(unit_z == 'F') { // unite en MHz | 
|---|
|  | 224 | nz = int(tzlarg/dz+0.5); | 
|---|
|  | 225 | dz = DzFrDNu(dz,Fr_HyperFin_Par*1.e3,redshift0);  //dzred | 
|---|
|  | 226 | dz = dz*univ.Dhubble()/univ.E(redshift0); | 
|---|
|  | 227 | tzlarg = dz*nz; | 
|---|
| [3287] | 228 | } else { | 
|---|
| [3365] | 229 | cout<<"Unknown unit_z = "<<unit_z<<endl; return -2; | 
|---|
| [3115] | 230 | } | 
|---|
| [3287] | 231 |  | 
|---|
| [3462] | 232 | // On estime la valeur du redshift le plus grand | 
|---|
|  | 233 | double bigred = redshift0 + dz/univ.Dhubble()*univ.E(redshift0) * nz/2.; | 
|---|
| [3516] | 234 | cout<<"biggest redshift estimated to be "<<bigred<<endl; | 
|---|
| [3462] | 235 | dzinc=bigred/100.; dzmax=dzinc*10.; | 
|---|
|  | 236 | univ.SetInteg(perc,dzinc,dzmax,glorder); | 
|---|
|  | 237 |  | 
|---|
| [3365] | 238 | // --- | 
|---|
|  | 239 | // --- Calcul des valeurs au centre du cube et aux faces limites av/ar | 
|---|
|  | 240 | // --- | 
|---|
|  | 241 | cout<<"\n>>>>\n>>>> Cosmologie generale\n>>>>"<<endl; | 
|---|
|  | 242 | double adtx[3], adty[3], atxlarg[3], atylarg[3]; | 
|---|
|  | 243 | double loscom[3], redshift[3], unplusz[3], dred[3], growthfac[3], rhocz[3]; | 
|---|
|  | 244 | double dang[3], dtrcom[3], dlum[3], dloscom[3], dlosdz[3]; | 
|---|
|  | 245 | double nuhiz[3], lambdahiz[3], dnuhiz[3]; | 
|---|
|  | 246 | double angsol_pix[3], angsol_tot[3]; | 
|---|
| [3115] | 247 |  | 
|---|
| [3365] | 248 | redshift[0] = redshift0; | 
|---|
|  | 249 | loscom[0] = univ.Dloscom(redshift0); | 
|---|
|  | 250 | loscom[1] = loscom[0]-tzlarg/2.; | 
|---|
|  | 251 | loscom[2] = loscom[0]+tzlarg/2.; | 
|---|
|  | 252 | //if(loscom[1]<=0.) {cout<<"Lower distance limit "<<loscom[1]<<" should be >0"<<endl; return -3;} | 
|---|
|  | 253 | for(int i=0;i<3;i++) { | 
|---|
|  | 254 | double l = loscom[i]; if(l<=0.) l = dz/2.; | 
|---|
| [3749] | 255 | redshift[i]  = univ.ZFrLos(l); | 
|---|
| [3365] | 256 | unplusz[i]   = 1. + redshift[i]; | 
|---|
|  | 257 | growthfac[i] = growth(redshift[i]); | 
|---|
|  | 258 | rhocz[i]     = univ.Rhoc(redshift[i])*GCm3toMsolMpc3_Cst;; | 
|---|
|  | 259 | dang[i]      = univ.Dang(redshift[i]); | 
|---|
|  | 260 | dtrcom[i]    = univ.Dtrcom(redshift[i]); | 
|---|
|  | 261 | dlum[i]      = univ.Dlum(redshift[i]); | 
|---|
|  | 262 | dloscom[i]   = univ.Dloscom(redshift[i]); | 
|---|
|  | 263 | dlosdz[i]    = univ.Dhubble()/univ.E(redshift[i]); | 
|---|
|  | 264 | dred[i]      = dz/dlosdz[i]; | 
|---|
|  | 265 | adtx[i]      = dx/dtrcom[i]; | 
|---|
|  | 266 | atxlarg[i]   = adtx[i]*nx; | 
|---|
|  | 267 | adty[i]      = dy/dtrcom[i]; | 
|---|
|  | 268 | atylarg[i]   = adty[i]*ny; | 
|---|
|  | 269 | nuhiz[i]     = Fr_HyperFin_Par / unplusz[i];  // GHz | 
|---|
|  | 270 | lambdahiz[i] = SpeedOfLight_Cst*1000./(nuhiz[i]*1.e9);  // m | 
|---|
|  | 271 | dnuhiz[i]    = DNuFrDz(dred[i],Fr_HyperFin_Par,redshift[i]);  // GHz | 
|---|
|  | 272 | angsol_pix[i] = AngSol(adtx[i]/2.,adty[i]/2.,M_PI/2.); | 
|---|
|  | 273 | angsol_tot[i] = AngSol(atxlarg[i]/2.,atylarg[i]/2.,M_PI/2.); | 
|---|
|  | 274 | } | 
|---|
|  | 275 |  | 
|---|
| [3115] | 276 |  | 
|---|
| [3365] | 277 | cout<<"--- Cosmology for z = "<<0.<<endl; | 
|---|
|  | 278 | univ.Print(0.); | 
|---|
|  | 279 | double rhoc0 = univ.Rhoc(0.)*GCm3toMsolMpc3_Cst; | 
|---|
|  | 280 |  | 
|---|
|  | 281 | for(int i=0;i<3;i++) { | 
|---|
|  | 282 | cout<<"\n--- Cosmology for z = "<<redshift[i]<<endl; | 
|---|
|  | 283 | univ.Print(redshift[i]); | 
|---|
| [3516] | 284 | cout<<"Nu(HI) = "<<Fr_HyperFin_Par*1000./(1.+redshift[i])<<" MHz"<<endl; | 
|---|
| [3365] | 285 | } | 
|---|
|  | 286 |  | 
|---|
|  | 287 | cout<<endl; | 
|---|
| [3483] | 288 | cout<<"--- Resume"<<endl; | 
|---|
| [3365] | 289 | cout<<"Facteur de croissance lineaire = "<<growthfac[0] | 
|---|
|  | 290 | <<" in ["<<growthfac[1]<<","<<growthfac[2]<<"]"<<endl; | 
|---|
|  | 291 | cout<<"                       1/(1+z) = "<<1./(1.+redshift[0]) | 
|---|
|  | 292 | <<" in ["<<1./(1.+redshift[1])<<","<<1./(1.+redshift[2])<<"]"<<endl; | 
|---|
|  | 293 | cout<<"Facteur de croissance lineaire^2 = "<<growthfac[0]*growthfac[0] | 
|---|
|  | 294 | <<" in ["<<growthfac[1]*growthfac[1]<<","<<growthfac[2]*growthfac[2]<<"]"<<endl; | 
|---|
|  | 295 |  | 
|---|
|  | 296 | cout<<"Rho_c (z=0) =  "<<rhoc0<<", a z="<<0<<": "<<rhoc0<<" Msol/Mpc^3"<<endl; | 
|---|
|  | 297 | cout<<"Rho_c a z = "<<rhocz[0] | 
|---|
|  | 298 | <<" Msol/Mpc^3 in ["<<rhocz[1]<<","<<rhocz[2]<<"]"<<endl; | 
|---|
|  | 299 |  | 
|---|
|  | 300 | cout<<endl; | 
|---|
|  | 301 | cout<<"dang= "<<dang[0]<<" Mpc in ["<<dang[1]<<","<<dang[2]<<"]"<<endl; | 
|---|
|  | 302 | cout<<"dtrcom= "<<dtrcom[0]<<" Mpc com in ["<<dtrcom[1]<<","<<dtrcom[2]<<"]"<<endl; | 
|---|
|  | 303 | cout<<"dlum= "<<dlum[0]<<" Mpc in ["<<dlum[1]<<","<<dlum[2]<<"]"<<endl; | 
|---|
|  | 304 | cout<<"dloscom= "<<dloscom[0]<<" Mpc com in ["<<dloscom[1]<<","<<dloscom[2]<<"]"<<endl; | 
|---|
|  | 305 | cout<<"dz=1 -> dlosdz= "<<dlosdz[0]<<" Mpc com in ["<<dlosdz[1]<<","<<dlosdz[2]<<"]"<<endl; | 
|---|
|  | 306 | cout<<"1 Mpc los com -> dz = "<<1./dlosdz[0]<<" in ["<<1./dlosdz[1]<<","<<1./dlosdz[2]<<"]"<<endl; | 
|---|
|  | 307 |  | 
|---|
|  | 308 | cout<<endl; | 
|---|
|  | 309 | for(int i=0;i<3;i++) { | 
|---|
|  | 310 | cout<<"...Redshift="<<redshift[i]<<endl; | 
|---|
|  | 311 | cout<<"1\" -> "<<dang[i]*sec2rad(1.)<<" Mpc = "<<dtrcom[i]*sec2rad(1.)<<" Mpc com"<<endl; | 
|---|
|  | 312 | cout<<"1\' -> "<<dang[i]*min2rad(1.)<<" Mpc = "<<dtrcom[i]*min2rad(1.)<<" Mpc com"<<endl; | 
|---|
|  | 313 | cout<<"1d -> "<<dang[i]*deg2rad(1.)<<" Mpc = "<<dtrcom[i]*deg2rad(1.)<<" Mpc com"<<endl; | 
|---|
|  | 314 | cout<<"1 Mpc transv com -> "<<rad2sec(1./dtrcom[i])<<"\" = " | 
|---|
|  | 315 | <<rad2min(1./dtrcom[i])<<" \' = "<<rad2deg(1./dtrcom[i])<<" d"<<endl; | 
|---|
|  | 316 | cout<<"dz=1 -> dlosdz= "<<dlosdz[i]<<" Mpc com"<<endl; | 
|---|
|  | 317 | cout<<"1 Mpc los com -> dz = "<<1./dlosdz[0]<<endl; | 
|---|
|  | 318 | } | 
|---|
|  | 319 |  | 
|---|
|  | 320 | // --- | 
|---|
| [3115] | 321 | // --- Cosmolographie Transverse | 
|---|
| [3365] | 322 | // --- | 
|---|
| [3287] | 323 | cout<<"\n>>>>\n>>>> Cosmologie & Geometrie transverse\n>>>>"<<endl; | 
|---|
| [3115] | 324 |  | 
|---|
| [3365] | 325 | cout<<"dx = "<<dx<<", txlarg = "<<txlarg<<" Mpc (com), nx="<<nx<<endl; | 
|---|
|  | 326 | cout<<"adtx = "<<adtx[0]<<" rd in ["<<adtx[1]<<","<<adtx[2]<<"]"<<endl; | 
|---|
|  | 327 | cout<<"     = "<<rad2min(adtx[0])<<"\' in ["<<rad2min(adtx[1])<<","<<rad2min(adtx[2])<<"]"<<endl; | 
|---|
|  | 328 | cout<<"atxlarg = "<<atxlarg[0]<<" rd in ["<<atxlarg[1]<<","<<atxlarg[2]<<"]"<<endl; | 
|---|
|  | 329 | cout<<"          "<<rad2deg(atxlarg[0])<<" d in ["<<rad2deg(atxlarg[1])<<","<<rad2deg(atxlarg[2])<<"]"<<endl; | 
|---|
| [3115] | 330 |  | 
|---|
| [3365] | 331 | if(fabs(dx-dy)>1.e-20 && fabs(txlarg-tylarg)>1.e-20) { | 
|---|
|  | 332 | cout<<"\ndy = "<<dy<<", tylarg = "<<tylarg<<" Mpc (com), ny="<<ny<<endl; | 
|---|
|  | 333 | cout<<"adty = "<<adty[0]<<" rd in ["<<adty[1]<<","<<adty[2]<<"]"<<endl; | 
|---|
|  | 334 | cout<<"     = "<<rad2min(adty[0])<<"\' in ["<<rad2min(adty[1])<<","<<rad2min(adty[2])<<"]"<<endl; | 
|---|
|  | 335 | cout<<"atylarg = "<<atylarg[0]<<" rd in ["<<atylarg[1]<<","<<atylarg[2]<<"]"<<endl; | 
|---|
|  | 336 | cout<<"          "<<rad2deg(atylarg[0])<<" d in ["<<rad2deg(atylarg[1])<<","<<rad2deg(atylarg[2])<<"]"<<endl; | 
|---|
|  | 337 | } | 
|---|
| [3115] | 338 |  | 
|---|
| [3365] | 339 | // --- | 
|---|
| [3115] | 340 | // --- Cosmolographie Line of sight | 
|---|
| [3365] | 341 | // --- | 
|---|
| [3287] | 342 | cout<<"\n>>>>\n>>>> Cosmologie & Geometrie ligne de visee\n>>>>"<<endl; | 
|---|
| [3365] | 343 | cout<<"dz = "<<dz<<", tzlarg = "<<tzlarg<<" Mpc (com), nz="<<nz<<endl; | 
|---|
|  | 344 | cout<<"Redshift = "<<redshift[0]<<" in ["<<redshift[1]<<","<<redshift[2]<<"]"<<endl; | 
|---|
|  | 345 | cout<<"dred = "<<dred[0]<<" in ["<<dred[1]<<","<<dred[2]<<"]"<<endl; | 
|---|
|  | 346 | cout<<"nu HI = "<<nuhiz[0]<<" GHz in ["<<nuhiz[1]<<","<<nuhiz[2]<<"]"<<endl; | 
|---|
|  | 347 | cout<<"lambda HI = "<<lambdahiz[0]<<" m in ["<<lambdahiz[1]<<","<<lambdahiz[2]<<"]"<<endl; | 
|---|
|  | 348 | cout<<"dnu HI= "<<dnuhiz[0]*1e3<<" MHz in ["<<dnuhiz[1]*1e3<<","<<dnuhiz[2]*1e3<<"]"<<endl; | 
|---|
| [3115] | 349 |  | 
|---|
| [3365] | 350 | // --- | 
|---|
|  | 351 | // --- Volume | 
|---|
|  | 352 | // --- | 
|---|
|  | 353 | cout<<"\n>>>>\n>>>> Volumes\n>>>>"<<endl; | 
|---|
|  | 354 | double Npix = (double)nx*(double)ny*(double)nz; | 
|---|
|  | 355 | double vol_pixel = dx*dy*dz; | 
|---|
|  | 356 | double vol_survey = vol_pixel*Npix; | 
|---|
|  | 357 | cout<<"Npix total = "<<Npix<<" -> "<<Npix*sizeof(double)/1.e6<<" Mo"<<endl; | 
|---|
|  | 358 | cout<<"Volume pixel = "<<vol_pixel<<" Mpc^3 com"<<endl; | 
|---|
|  | 359 | cout<<"Volume total = "<<vol_survey<<" Mpc^3 com = "<<vol_survey/1.e9<<" Gpc^3"<<endl; | 
|---|
| [3115] | 360 |  | 
|---|
| [3365] | 361 | double vol = univ.Vol4Pi(redshift[1],redshift[2])/(4.*M_PI)*angsol_tot[0]; | 
|---|
|  | 362 | cout<<"Calcul avec angsol et redshift: vol = "<<vol<<" Mpc^3 = "<<vol/1.e9<<" Gpc^3"<<endl | 
|---|
|  | 363 | <<"       -> pixel volume comoving = vol/Npix = "<<vol/Npix<<" Mpc^3"<<endl; | 
|---|
| [3115] | 364 |  | 
|---|
| [3365] | 365 | // --- | 
|---|
|  | 366 | // --- Angles solides | 
|---|
|  | 367 | // --- | 
|---|
|  | 368 | cout<<"\n>>>>\n>>>> Angles solides\n>>>>"<<endl; | 
|---|
|  | 369 | cout<<"Pixel solid angle = "<<angsol_pix[0]<<" sr ("<<angsol_pix[0]/(4.*M_PI)<<" *4Pi)" | 
|---|
|  | 370 | <<" in ["<<angsol_pix[1]<<","<<angsol_pix[2]<<"]"<<endl; | 
|---|
| [3367] | 371 | cout<<"                  = "<<sr2min2(angsol_pix[0])<<"\'^2" | 
|---|
|  | 372 | <<" in ["<<sr2min2(angsol_pix[1])<<","<<sr2min2(angsol_pix[2])<<"]"<<endl; | 
|---|
| [3365] | 373 | cout<<"Total solid angle = "<<angsol_tot[0]<<" sr ("<<angsol_tot[0]/(4.*M_PI)<<" *4Pi)" | 
|---|
|  | 374 | <<" in ["<<angsol_tot[1]<<","<<angsol_tot[2]<<"]"<<endl; | 
|---|
| [3115] | 375 |  | 
|---|
| [3365] | 376 | // --- | 
|---|
|  | 377 | // --- Fourier space: k = omega = 2*Pi*Nu = 2*Pi*C/Lambda | 
|---|
|  | 378 | // --- | 
|---|
| [3287] | 379 | cout<<"\n>>>>\n>>>> Geometrie dans l'espace de Fourier\n>>>>"<<endl; | 
|---|
| [3115] | 380 | cout<<"Array size: nx = "<<nx<<",  ny = "<<ny<<",  nz = "<<nz<<endl; | 
|---|
|  | 381 | double dk_x = 2.*M_PI/(nx*dx), knyq_x = M_PI/dx; | 
|---|
|  | 382 | double dk_y = 2.*M_PI/(nx*dy), knyq_y = M_PI/dy; | 
|---|
|  | 383 | double dk_z = 2.*M_PI/(nz*dz), knyq_z = M_PI/dz; | 
|---|
| [3365] | 384 | cout<<"Transverse:"<<endl | 
|---|
|  | 385 | <<"  Resolution: dk_x = "<<dk_x<<" Mpc^-1  (2Pi/dk_x="<<2.*M_PI/dk_x<<" Mpc)"<<endl | 
|---|
|  | 386 | <<"              dk_y = "<<dk_y<<" Mpc^-1  (2Pi/dk_y="<<2.*M_PI/dk_y<<" Mpc)"<<endl | 
|---|
|  | 387 | <<"  Nyquist:    kx = "<<knyq_x<<" Mpc^-1  (2Pi/knyq_x="<<2.*M_PI/knyq_x<<" Mpc)"<<endl | 
|---|
|  | 388 | <<"              ky = "<<knyq_y<<" Mpc^-1  (2Pi/knyq_y="<<2.*M_PI/knyq_y<<" Mpc)"<<endl; | 
|---|
|  | 389 | cout<<"Line of sight:"<<endl | 
|---|
|  | 390 | <<"  Resolution: dk_z = "<<dk_z<<" Mpc^-1  (2Pi/dk_z="<<2.*M_PI/dk_z<<" Mpc)"<<endl | 
|---|
|  | 391 | <<"  Nyquist:    kz = "<<knyq_z<<" Mpc^-1  (2Pi/knyq_z="<<2.*M_PI/knyq_z<<" Mpc)"<<endl; | 
|---|
| [3115] | 392 |  | 
|---|
| [3365] | 393 | // --- | 
|---|
| [3350] | 394 | // --- Variance cosmique | 
|---|
| [3365] | 395 | // --- | 
|---|
| [3350] | 396 | //                      cosmique                    poisson | 
|---|
| [3351] | 397 | // (sigma/P)^2 = 2*(2Pi)^3 / (4Pi k^2 dk Vsurvey) * [(1+n*P)/(n*P)]^2 | 
|---|
| [3350] | 398 | // nombre de mode = 1/2 * Vsurvey/(2Pi)^3 * 4Pi*k^2*dk | 
|---|
|  | 399 | if(kcosm>0. && pkcosm>0.) { | 
|---|
| [3365] | 400 | double pk = pkcosm*pow(growthfac[0],2.); | 
|---|
| [3350] | 401 | cout<<"\n>>>>\n>>>> variance cosmique pour k="<<kcosm<<" Mpc^-1, pk(z=0)=" | 
|---|
| [3365] | 402 | <<pkcosm<<", pk(z="<<redshift[0]<<")="<<pk<<"\n>>>>"<<endl; | 
|---|
| [3350] | 403 | for(int i=0;i<3;i++) {  // la correction de variance du au bruit de poisson | 
|---|
|  | 404 | double v = 1.1; if(i==1) v=1.5; if(i==2) v=2.0; | 
|---|
|  | 405 | double ngal = 1./(v-1.)/pk; | 
|---|
|  | 406 | cout<<"  pour "<<ngal<<" gal/Mpc^3 on multiplie par "<<v<<" sigma/P"<<endl; | 
|---|
|  | 407 | } | 
|---|
| [3365] | 408 |  | 
|---|
|  | 409 | cout<<endl; | 
|---|
| [3350] | 410 | vector<double> dk; if(dkcosm>0.) dk.push_back(dkcosm); | 
|---|
|  | 411 | dk.push_back(dk_x); dk.push_back(dk_y); dk.push_back(dk_z); | 
|---|
|  | 412 | for(int i=0;i<(int)dk.size();i++) { // la variance cosmique pure | 
|---|
| [3365] | 413 | double vcosm = sqrt( 2.*pow(2.*M_PI,3.)/(4.*M_PI*pow(kcosm,2.)*dk[i]*vol_survey) ); | 
|---|
|  | 414 | double nmode = 0.5*vol_survey/pow(2.*M_PI,3.) * 4.*M_PI*pow(kcosm,2.)*dk[i]; | 
|---|
| [3350] | 415 | cout<<"  pour dk = "<<dk[i]<<" Mpc^-1:  sigma/P = "<<vcosm | 
|---|
|  | 416 | <<" , Nmode = "<<nmode<<endl; | 
|---|
|  | 417 | } | 
|---|
|  | 418 | } | 
|---|
|  | 419 |  | 
|---|
| [3365] | 420 | // --- | 
|---|
| [3115] | 421 | // --- Masse de HI | 
|---|
| [3365] | 422 | // --- | 
|---|
| [3287] | 423 | cout<<"\n>>>>\n>>>> Mass HI\n>>>>"<<endl; | 
|---|
| [3115] | 424 | Schechter sch(nstar,mstar,alpha); | 
|---|
|  | 425 | sch.SetOutValue(1); | 
|---|
|  | 426 | cout<<"nstar= "<<nstar<<"  mstar="<<mstar<<"  alpha="<<alpha<<endl; | 
|---|
|  | 427 | cout<<"mstar*sch(mstar) = "<<sch(mstar)<<" Msol/Mpc^3/Msol"<<endl; | 
|---|
|  | 428 | int npt = 10000; | 
|---|
| [3344] | 429 | double lnx1=log10(1.e+6), lnx2=log10(1.e+13), dlnx=(lnx2-lnx1)/npt; | 
|---|
| [3115] | 430 | double masshimpc3 = IntegrateFuncLog(sch,lnx1,lnx2,0.001,dlnx,10.*dlnx,6); | 
|---|
|  | 431 | cout<<"Mass density: "<<masshimpc3<<" Msol/Mpc^3"<<endl; | 
|---|
|  | 432 |  | 
|---|
| [3365] | 433 | double masshipix = masshimpc3*vol_pixel; | 
|---|
|  | 434 | double masshitot = masshimpc3*vol_survey; | 
|---|
| [3115] | 435 | cout<<"Pixel mass = "<<masshipix<<" Msol"<<endl | 
|---|
|  | 436 | <<"Total mass in survey = "<<masshitot<<" Msol"<<endl; | 
|---|
| [3365] | 437 | cout<<"OmegaHI a z=0: "<<masshimpc3/rhoc0<<endl; | 
|---|
|  | 438 | for(int i=0;i<3;i++) | 
|---|
|  | 439 | cout<<"        a z="<<redshift[i]<<": "<<masshimpc3/rhocz[i]<<endl; | 
|---|
| [3115] | 440 | if(mhiref<=0.)  mhiref = masshipix; | 
|---|
|  | 441 |  | 
|---|
| [3343] | 442 | sch.SetOutValue(0); | 
|---|
|  | 443 | cout<<"\nsch(mstar) = "<<sch(mstar)<<" /Mpc^3/Msol"<<endl; | 
|---|
|  | 444 | cout<<"Galaxy number density:"<<endl; | 
|---|
| [3344] | 445 | for(double x=lnx1; x<lnx2-0.5; x+=1.) { | 
|---|
| [3343] | 446 | double n = IntegrateFuncLog(sch,x,lnx2,0.001,dlnx,10.*dlnx,6); | 
|---|
| [3483] | 447 | cout<<"  m>10^"<<x<<" Msol: "<<n<<" /Mpc^3, "<<n*vol_pixel<<" /pixel, " | 
|---|
| [3365] | 448 | <<n*vol_survey<<" in survey"<<endl; | 
|---|
| [3343] | 449 | } | 
|---|
|  | 450 | sch.SetOutValue(1); | 
|---|
|  | 451 |  | 
|---|
| [3365] | 452 | // --- | 
|---|
| [3115] | 453 | // --- Survey values | 
|---|
| [3365] | 454 | // --- | 
|---|
| [3287] | 455 | cout<<"\n>>>>\n>>>> Observations\n>>>>"<<endl; | 
|---|
| [3352] | 456 | double surfeff = surftot * eta_eff; | 
|---|
| [3365] | 457 | cout<<"surf_tot="<<surftot<<" m^2, eta="<<eta_eff<<"  surf_eff="<<surfeff<<" m^2, tobs="<<tobs<<" s"<<endl; | 
|---|
| [3115] | 458 |  | 
|---|
| [3365] | 459 | // Angles solides pour un telescope plein | 
|---|
|  | 460 | double angSEq[4], angEq[4]; | 
|---|
|  | 461 | for(int i=0;i<4;i++) { | 
|---|
| [3367] | 462 | double nu = Fr_HyperFin_Par; | 
|---|
| [3365] | 463 | if(i<3) nu = nuhiz[i]; | 
|---|
|  | 464 | angSEq[i] = AngsolEqTelescope(nu,surftot); | 
|---|
|  | 465 | angEq[i] = 2.*FrAngSol(angSEq[i]); | 
|---|
|  | 466 | } | 
|---|
|  | 467 | cout<<"\nFor a "<<surftot<<" m^2 telescope:"<<endl | 
|---|
|  | 468 | <<"    equivalent Omega = "<<angSEq[0]<<" sr in ["<<angSEq[1]<<","<<angSEq[2]<<"]"<<endl | 
|---|
|  | 469 | <<"    angular diameter = "<<angEq[0]<<" rd = "<<rad2min(angEq[0]) | 
|---|
|  | 470 | <<"\' in ["<<angEq[2]<<","<<angEq[2]<<"]"<<endl; | 
|---|
|  | 471 | cout<<"At z=0: equivalent Omega = "<<angSEq[3]<<" sr"<<endl | 
|---|
|  | 472 | <<"        angular diameter = "<<angEq[3]<<" rd = "<<rad2min(angEq[3])<<"\'"<<endl; | 
|---|
|  | 473 |  | 
|---|
| [3367] | 474 | // Pour une observation ou le lobe est + petit ou grand que le pixel de simulation | 
|---|
| [3365] | 475 | // La taille angulaire du lobe change avec la frequence donc avec le redshift | 
|---|
| [3367] | 476 | // La taille du lobe "lobearea0" est donnee pour une frequence de reference "lobefreq0" en MHz | 
|---|
| [3365] | 477 | double nlobes[3] = {1.,1.,1.}; | 
|---|
| [3367] | 478 | // Si "lobefreq0" negatif c'est la frequence du centre du cube | 
|---|
|  | 479 | if(lobefreq0<=0.) lobefreq0 = nuhiz[0]*1.e3; | 
|---|
|  | 480 | // Si "lobearea0" negatif c'est la taille du pixel ramenee a lobefreq0 | 
|---|
|  | 481 | if(lobearea0<=0.) lobearea0 = sr2min2(angsol_pix[0])*pow(nuhiz[0]*1.e3/lobefreq0,2.); | 
|---|
|  | 482 | cout<<"\n--- Lobe: angsol="<<lobearea0<<"\'^2 pour "<<lobefreq0<<" MHz"<<endl; | 
|---|
|  | 483 | double lobearea[3]; | 
|---|
|  | 484 | for(int i=0;i<3;i++) { | 
|---|
|  | 485 | lobearea[i] = lobearea0*pow(lobefreq0/(nuhiz[0]*1.e3),2.); | 
|---|
|  | 486 | nlobes[i] = sr2min2(angsol_pix[i])/lobearea[i]; | 
|---|
| [3336] | 487 | } | 
|---|
| [3367] | 488 | cout<<"Lobe cylindrique area "<<lobearea[0]<<"\'^2 in ["<<lobearea[1]<<","<<lobearea[2]<<"]"<<endl; | 
|---|
|  | 489 | cout<<"Number of beams in one transversal pixel "<<nlobes[0]<<" in ["<<nlobes[1]<<","<<nlobes[2]<<"]"<<endl; | 
|---|
| [3193] | 490 |  | 
|---|
| [3365] | 491 | // --- | 
|---|
|  | 492 | // --- Signal analysis | 
|---|
|  | 493 | // --- | 
|---|
|  | 494 | // --- Temperature d'antenne Ta et temperature de brillance Tb | 
|---|
|  | 495 | // La puissance d'une source de brillance I non polarisee est: | 
|---|
|  | 496 | // P = I * S * Omega * dNu | 
|---|
|  | 497 | // La puissance recue pour une seule polarisation est: | 
|---|
|  | 498 | // P = 1/2 * I * S * Omega * dNu | 
|---|
|  | 499 | // La puissance recue pour un telescope (plein) est | 
|---|
|  | 500 | //    en remplacant Omega = lambda^2/S | 
|---|
|  | 501 | // P = 1/2 * I * lambda^2 * dNu | 
|---|
|  | 502 | // En appliquant la loi de Rayleigh: I = 2*k*Tb/lambda^2 | 
|---|
|  | 503 | //   on obtient | 
|---|
|  | 504 | // P = 1/2 * 2*k*Tb * dNu = k * Tb * dNu | 
|---|
|  | 505 | // La temperature d'antenne est definie comme | 
|---|
|  | 506 | // P = k * Ta * dNu | 
|---|
|  | 507 | // Donc pour un ciel de temperature de brillance Tb | 
|---|
|  | 508 | //   et pour une antenne qui mesure une seule polarisation | 
|---|
|  | 509 | // on a: Ta = Tb | 
|---|
| [3115] | 510 |  | 
|---|
| [3365] | 511 | cout<<"\n>>>>\n>>>> Signal Analysis\n>>>>"<<endl; | 
|---|
| [3193] | 512 | cout<<"Facteur polar = "<<facpolar<<endl; | 
|---|
|  | 513 |  | 
|---|
| [3115] | 514 | PlanckSpectra planck(T_CMB_Par); | 
|---|
| [3347] | 515 | planck.SetSpectraApprox(PlanckSpectra::RAYLEIGH);  // Rayleigh spectra | 
|---|
|  | 516 | planck.SetSpectraVar(PlanckSpectra::NU); // frequency | 
|---|
|  | 517 | planck.SetSpectraPower(PlanckSpectra::POWER); // output en W/.... | 
|---|
|  | 518 | planck.SetSpectraUnit(PlanckSpectra::ANGSFLUX); // radiance W/m^2/Sr/Hz | 
|---|
| [3115] | 519 |  | 
|---|
| [3365] | 520 | // --- | 
|---|
|  | 521 | // --- Signal HI | 
|---|
|  | 522 | // --- | 
|---|
|  | 523 | // Power emitted by HI | 
|---|
|  | 524 | cout<<"--- Power from HI for M = "<<mhiref<<" Msol"<<endl; | 
|---|
|  | 525 | cout<<"Flux factor = "<<hifactor<<" at redshift = "<<redshift[0]<<endl; | 
|---|
|  | 526 | cout<<"Luminosite = "<<hifactor*Msol2LumiHI(mhiref)<<" W"<<endl; | 
|---|
| [3115] | 527 |  | 
|---|
| [3365] | 528 | double fhi_ref[3], sfhi_ref[3]; | 
|---|
|  | 529 | for(int i=0;i<3;i++) { | 
|---|
|  | 530 | fhi_ref[i] = hifactor*Msol2FluxHI(mhiref,dlum[i]); | 
|---|
|  | 531 | sfhi_ref[i] = fhi_ref[i] / (dnuhiz[i]*1e9) / Jansky2Watt_cst; | 
|---|
|  | 532 | } | 
|---|
|  | 533 | cout<<"FluxHI("<<dlum[0]<<" Mpc) all polar: "<<fhi_ref[0]<<" W/m^2 = " | 
|---|
|  | 534 | <<fhi_ref[0]/Jansky2Watt_cst<<" Jy.Hz" | 
|---|
|  | 535 | <<" in ["<<fhi_ref[1]/Jansky2Watt_cst<<","<<fhi_ref[2]/Jansky2Watt_cst<<"]"<<endl; | 
|---|
|  | 536 | cout<<"If spread over pixel depth ("<<dnuhiz[0]<<" GHz):"<<endl | 
|---|
|  | 537 | <<"  flux density = "<<sfhi_ref[0]*1.e6<<" mu_Jy" | 
|---|
|  | 538 | <<" in ["<<sfhi_ref[1]<<","<<sfhi_ref[2]<<"]"<<endl; | 
|---|
|  | 539 |  | 
|---|
|  | 540 | // Signal HI | 
|---|
|  | 541 | double psig_2polar[3], tasig_2polar[3], ssig_2polar[3], isig_2polar[3], tsig_2polar[3]; | 
|---|
|  | 542 | double psig[3], tasig[3], ssig[3], isig[3], tsig[3]; | 
|---|
|  | 543 | double doplarge[3], dzvrot[3]; | 
|---|
|  | 544 |  | 
|---|
|  | 545 | for(int i=0;i<3;i++) { | 
|---|
|  | 546 | psig_2polar[i] = fhi_ref[i] * surfeff; | 
|---|
|  | 547 | tasig_2polar[i] = psig_2polar[i] / k_Boltzman_Cst / (dnuhiz[i]*1e9); | 
|---|
|  | 548 | ssig_2polar[i] = psig_2polar[i] / surfeff / (dnuhiz[i]*1e9) / Jansky2Watt_cst; | 
|---|
|  | 549 | isig_2polar[i] = ssig_2polar[i] / angsol_pix[i]; | 
|---|
|  | 550 | tsig_2polar[i] = isig_2polar[i]*Jansky2Watt_cst | 
|---|
|  | 551 | / (2.*pow(nuhiz[i]*1e9/(SpeedOfLight_Cst*1000.),2.)*k_Boltzman_Cst); | 
|---|
|  | 552 | psig[i] = facpolar * psig_2polar[i]; | 
|---|
|  | 553 | tasig[i] = facpolar * tasig_2polar[i]; | 
|---|
|  | 554 | ssig[i] = facpolar * ssig_2polar[i]; | 
|---|
|  | 555 | isig[i] = facpolar * isig_2polar[i]; | 
|---|
|  | 556 | tsig[i] = facpolar * tsig_2polar[i]; | 
|---|
|  | 557 | doplarge[i] = LargeurDoppler(vrot,nuhiz[i]); | 
|---|
|  | 558 | dzvrot[i] = DzFrV(vrot,redshift[i]); | 
|---|
|  | 559 | } | 
|---|
|  | 560 | cout<<"\n--- Signal HI("<<mhiref<<" Msol) for Dnu="<<dnuhiz[0]<<" GHz :"<<endl | 
|---|
|  | 561 | <<" Observation:"<<endl | 
|---|
|  | 562 | <<"    Power="<<psig[0]<<" W in ["<<psig[1]<<","<<psig[2]<<"]"<<endl | 
|---|
|  | 563 | <<"    Flux density = "<<ssig[0]*1.e6<<" mu_Jy in ["<<ssig[1]*1.e6<<","<<ssig[2]*1.e6<<"]"<<endl | 
|---|
|  | 564 | <<"    Intensity = "<<isig[0]<<" Jy/sr in ["<<isig[1]<<","<<isig[2]<<"]"<<endl | 
|---|
|  | 565 | <<"    Antenna temperature = "<<tasig[0]<<" K in ["<<tasig[1]<<","<<tasig[2]<<"]"<<endl | 
|---|
|  | 566 | <<"    Brightness temperature = "<<tsig[0]<<" K in ["<<tsig[1]<<","<<tsig[2]<<"]"<<endl | 
|---|
|  | 567 | <<" 2 polars:"<<endl | 
|---|
|  | 568 | <<"    Power="<<psig_2polar[0]<<" W in ["<<psig_2polar[1]<<","<<psig_2polar[2]<<"]"<<endl | 
|---|
|  | 569 | <<"    Flux density = "<<ssig_2polar[0]*1.e6<<" mu_Jy in ["<<ssig_2polar[1]*1.e6<<","<<ssig_2polar[2]*1.e6<<"]"<<endl | 
|---|
|  | 570 | <<"    Intensity = "<<isig_2polar[0]<<" Jy/sr in ["<<isig_2polar[1]<<","<<isig_2polar[2]<<"]"<<endl | 
|---|
|  | 571 | <<"    Antenna temperature = "<<tasig_2polar[0]<<" K in ["<<tasig_2polar[1]<<","<<tasig_2polar[2]<<"]"<<endl | 
|---|
|  | 572 | <<"    Brightness temperature = "<<tsig_2polar[0]<<" K in ["<<tsig_2polar[1]<<","<<tsig_2polar[2]<<"]"<<endl; | 
|---|
|  | 573 |  | 
|---|
| [3193] | 574 | // Elargissement doppler de la raie a 21cm: dNu = vrot/C * Nu(21cm) / (1+z) | 
|---|
| [3365] | 575 | cout<<"    Doppler for rotation width of "<<vrot<<" km/s"<<endl | 
|---|
|  | 576 | <<"            width="<<doplarge[0]*1.e3<<" MHz  in ["<<doplarge[1]*1.e3<<","<<doplarge[2]*1.e3<<"]"<<endl | 
|---|
|  | 577 | <<"            dzvrot= "<<dzvrot[0]<<" in ["<<dzvrot[1]<<","<<dzvrot[2]<<"]"<<endl; | 
|---|
|  | 578 | if(doplarge[0]>dnuhiz[0]) | 
|---|
|  | 579 | cout<<"Warning: doppler width "<<doplarge[0]<<" GHz > "<<dnuhiz[0]<<" GHz redshift bin width"<<endl; | 
|---|
| [3115] | 580 |  | 
|---|
| [3365] | 581 | // --- | 
|---|
|  | 582 | // --- Synchrotron  (T en -2.7  -> Flux en -0.7  dans l'approximation Rayleigh) | 
|---|
|  | 583 | // --- | 
|---|
|  | 584 | double tsynch[3]; | 
|---|
|  | 585 | double psynch_2polar[3], tasynch_2polar[3], ssynch_2polar[3], isynch_2polar[3]; | 
|---|
|  | 586 | double psynch[3], tasynch[3], ssynch[3], isynch[3]; | 
|---|
| [3115] | 587 |  | 
|---|
| [3365] | 588 | for(int i=0;i<3;i++) { | 
|---|
|  | 589 | tsynch[i] = Tsynch408; | 
|---|
|  | 590 | if(fabs(indnu)>1.e-50) tsynch[i] *= pow(nuhiz[i]/nuhaslam,indnu); | 
|---|
|  | 591 | planck.SetTemperature(tsynch[i]); | 
|---|
|  | 592 | psynch_2polar[i] = planck(nuhiz[i]*1.e+9) * surfeff * angsol_pix[i] * (dnuhiz[i]*1e9); | 
|---|
|  | 593 | tasynch_2polar[i] = psynch_2polar[i] / k_Boltzman_Cst / (dnuhiz[i]*1e9); | 
|---|
|  | 594 | ssynch_2polar[i] = psynch_2polar[i] / surfeff / (dnuhiz[i]*1e9) / Jansky2Watt_cst; | 
|---|
|  | 595 | isynch_2polar[i] = ssynch_2polar[i] / angsol_pix[i]; | 
|---|
|  | 596 | psynch[i] = facpolar * psynch_2polar[i]; | 
|---|
|  | 597 | tasynch[i] = facpolar * tasynch_2polar[i]; | 
|---|
|  | 598 | ssynch[i] = facpolar * ssynch_2polar[i]; | 
|---|
|  | 599 | isynch[i] = ssynch[i] / angsol_pix[i]; | 
|---|
|  | 600 | } | 
|---|
|  | 601 | cout<<"\n--- Synchrotron: T="<<Tsynch408<<" K ("<<nuhaslam<<" GHz), "<<endl | 
|---|
|  | 602 | <<"    tsynch="<<tsynch[0]<<" K ("<<nuhiz[0]<<" GHz) in ["<<tsynch[1]<<","<<tsynch[2]<<"]"<<endl | 
|---|
|  | 603 | <<" Observation:"<<endl | 
|---|
|  | 604 | <<"    Power="<<psynch[0]<<" W for pixel in ["<<psynch[1]<<","<<psynch[2]<<"]"<<endl | 
|---|
|  | 605 | <<"    Flux density = "<<ssynch[0]<<" Jy for pixel solid angle in ["<<ssynch[1]<<","<<ssynch[2]<<"]"<<endl | 
|---|
|  | 606 | <<"    Intensity = "<<isynch[0]<<" Jy/sr in ["<<isynch[1]<<","<<isynch[2]<<"]"<<endl | 
|---|
|  | 607 | <<"    Antenna temperature = "<<tasynch[0]<<" K in ["<<tasynch[1]<<","<<tasynch[2]<<"]"<<endl | 
|---|
|  | 608 | <<" 2 polars:"<<endl | 
|---|
|  | 609 | <<"    Power="<<psynch_2polar[0]<<" W for pixel in ["<<psynch_2polar[1]<<","<<psynch_2polar[2]<<"]"<<endl | 
|---|
|  | 610 | <<"    Flux density = "<<ssynch_2polar[0]<<" Jy for pixel solid angle in ["<<ssynch_2polar[1]<<","<<ssynch_2polar[2]<<"]"<<endl | 
|---|
|  | 611 | <<"    Intensity = "<<isynch_2polar[0]<<" Jy/sr in ["<<isynch_2polar[1]<<","<<isynch_2polar[2]<<"]"<<endl | 
|---|
|  | 612 | <<"    Antenna temperature = "<<tasynch_2polar[0]<<" K in ["<<tasynch_2polar[1]<<","<<tasynch_2polar[2]<<"]"<<endl; | 
|---|
|  | 613 |  | 
|---|
|  | 614 | // --- | 
|---|
|  | 615 | // --- CMB | 
|---|
|  | 616 | // --- | 
|---|
| [3115] | 617 | planck.SetTemperature(tcmb); | 
|---|
| [3365] | 618 | double pcmb_2polar[3], tacmb_2polar[3], scmb_2polar[3], icmb_2polar[3]; | 
|---|
|  | 619 | double pcmb[3], tacmb[3], scmb[3], icmb[3]; | 
|---|
| [3115] | 620 |  | 
|---|
| [3365] | 621 | for(int i=0;i<3;i++) { | 
|---|
|  | 622 | pcmb_2polar[i] = planck(nuhiz[i]*1.e+9) * surfeff * angsol_pix[i] * (dnuhiz[i]*1e9); | 
|---|
|  | 623 | tacmb_2polar[i] = pcmb_2polar[i] / k_Boltzman_Cst / (dnuhiz[i]*1e9); | 
|---|
|  | 624 | scmb_2polar[i] = pcmb_2polar[i] / surfeff / (dnuhiz[i]*1e9) / Jansky2Watt_cst; | 
|---|
|  | 625 | icmb_2polar[i] = scmb_2polar[i] / angsol_pix[i]; | 
|---|
|  | 626 | pcmb[i] = facpolar * pcmb_2polar[i]; | 
|---|
|  | 627 | tacmb[i] = facpolar * tacmb_2polar[i]; | 
|---|
|  | 628 | scmb[i] = facpolar * scmb_2polar[i]; | 
|---|
|  | 629 | icmb[i] = scmb[i] / angsol_pix[i]; | 
|---|
|  | 630 | } | 
|---|
|  | 631 | cout<<"\n--- CMB: T="<<tcmb<<" K"<<endl | 
|---|
|  | 632 | <<" Observation:"<<endl | 
|---|
|  | 633 | <<"    Power="<<pcmb[0]<<" W for pixel in ["<<pcmb[1]<<","<<pcmb[2]<<"]"<<endl | 
|---|
|  | 634 | <<"    Flux density = "<<scmb[0]<<" Jy for pixel solid angle in ["<<scmb[1]<<","<<scmb[2]<<"]"<<endl | 
|---|
|  | 635 | <<"    Intensity = "<<icmb[0]<<" Jy/sr in ["<<icmb[1]<<","<<icmb[2]<<"]"<<endl | 
|---|
|  | 636 | <<"    Antenna temperature = "<<tacmb[0]<<" K in ["<<tacmb[1]<<","<<tacmb[2]<<"]"<<endl | 
|---|
|  | 637 | <<" 2 polars:"<<endl | 
|---|
|  | 638 | <<"    Power="<<pcmb_2polar[0]<<" W for pixel in ["<<pcmb_2polar[1]<<","<<pcmb_2polar[2]<<"]"<<endl | 
|---|
|  | 639 | <<"    Flux density = "<<scmb_2polar[0]<<" Jy for pixel solid angle in ["<<scmb_2polar[1]<<","<<scmb_2polar[2]<<"]"<<endl | 
|---|
|  | 640 | <<"    Intensity = "<<icmb_2polar[0]<<" Jy/sr in ["<<icmb_2polar[1]<<","<<icmb_2polar[2]<<"]"<<endl | 
|---|
|  | 641 | <<"    Antenna temperature = "<<tacmb_2polar[0]<<" K in ["<<tacmb_2polar[1]<<","<<tacmb_2polar[2]<<"]"<<endl; | 
|---|
|  | 642 |  | 
|---|
|  | 643 | // --- | 
|---|
|  | 644 | // --- AGN | 
|---|
|  | 645 | // --- | 
|---|
| [3196] | 646 | double flux_agn = pow(10.,lflux_agn); | 
|---|
| [3365] | 647 | double mass_agn[3], flux_agn_pix[3], mass_agn_pix[3], lmass_agn_pix[3]; | 
|---|
|  | 648 | for(int i=0;i<3;i++) { | 
|---|
|  | 649 | mass_agn[i] = FluxHI2Msol(flux_agn*Jansky2Watt_cst,dlum[i]); | 
|---|
|  | 650 | flux_agn_pix[i] = flux_agn*(dnuhiz[i]*1e9); | 
|---|
|  | 651 | mass_agn_pix[i] = FluxHI2Msol(flux_agn_pix[i]*Jansky2Watt_cst,dlum[i]); | 
|---|
|  | 652 | lmass_agn_pix[i] = log10(mass_agn_pix[i]); | 
|---|
|  | 653 | } | 
|---|
|  | 654 | cout<<"\n--- AGN: log10(S_agn)="<<lflux_agn<<"   S_agn="<<flux_agn<<" Jy :"<<endl | 
|---|
|  | 655 | <<"  mass_agn = "<<mass_agn[0]<<" equiv. Msol/Hz in ["<<mass_agn[1]<<","<<mass_agn[2]<<"]"<<endl | 
|---|
|  | 656 | <<"  flux_agn_pix = "<<flux_agn_pix[0]<<" 10^-26 W/m^2 in ["<<flux_agn_pix[1]<<","<<flux_agn_pix[2]<<"]"<<endl | 
|---|
|  | 657 | <<"  mass_agn_pix = "<<mass_agn_pix[0]<<" Msol in ["<<mass_agn_pix[1]<<","<<mass_agn_pix[2]<<"]"<<endl | 
|---|
|  | 658 | <<"  log10(mass_agn_pix) = "<<lmass_agn_pix[0]<<"  in ["<<lmass_agn_pix[1]<<","<<lmass_agn_pix[2]<<"]"<<endl; | 
|---|
| [3196] | 659 |  | 
|---|
| [3339] | 660 | // ===================================================================== | 
|---|
| [3336] | 661 | // --- | 
|---|
| [3115] | 662 | // --- Noise analysis | 
|---|
| [3336] | 663 | // --- | 
|---|
| [3339] | 664 | // --- Puissance du bruit pour un telescope de surface Ae et de BW dNu | 
|---|
|  | 665 | // Par definition la puissance du bruit est: | 
|---|
|  | 666 | //     Pb = k * Tsys * dNu  (W) | 
|---|
|  | 667 | // Pour une source (non-polarisee) de densite de flux (totale 2 polars) | 
|---|
| [3352] | 668 | //     St (exprimee en Jy = 10^-26 W/m^2/Hz) | 
|---|
| [3339] | 669 | //     Pt = St * Ae * dNu   (puissance totale emise en W pour 2 polars) | 
|---|
|  | 670 | //     P1 = 1/2 * St * Ae * dNu   (puissance emise en W pour une polar) | 
|---|
|  | 671 | // la SEFD (system equivalent flux density en Jy) est definie comme | 
|---|
|  | 672 | //   la densite de flux total (2 polars) "St" d'une source (non-polarisee) | 
|---|
|  | 673 | //   dont la puissance P1 mesuree pour une seule polarisation | 
|---|
|  | 674 | //   serait egale a la puissance du bruit. De P1 = Pb on deduit: | 
|---|
|  | 675 | //   SEFD = 2 * k * Tsys / Ae    (en Jy) | 
|---|
|  | 676 | //   la puissance du bruit est: Pb = 1/2 * SEFD * Ae * dNu  (en W) | 
|---|
|  | 677 | // la sensibilite Slim tient compte du temps d'integration et de la BW: | 
|---|
|  | 678 | //   le nombre de mesures independantes est "2*dNu*Tobs" donc | 
|---|
|  | 679 | //   Slim = SEFD / sqrt(2*dNu*Tobs) =  2*k*Tsys/[Ae*sqrt(2*dNu*Tobs) (en Jy) | 
|---|
|  | 680 | // --- Puissance du bruit pour un interferometre | 
|---|
| [3336] | 681 | // Ae = surface d'un telescope elementaire | 
|---|
|  | 682 | // N  = nombre de telescopes dans l'interferometre (Atot = N*Ae) | 
|---|
| [3339] | 683 | // La sensibilite Slim en Jy est: | 
|---|
| [3336] | 684 | // Slim = 2 * k * Tsys / [ Ae * Sqrt(2*N(N-1)/2 *dnu*Tobs) ] | 
|---|
|  | 685 | //      = 2 * k * Tsys / [ Atot/N * Sqrt(2*N(N-1)/2*dnu*Tobs) ] | 
|---|
|  | 686 | //      = 2 * k * Tsys / [ Atot * Sqrt((N-1)/N *dnu*Tobs) ] | 
|---|
| [3339] | 687 | // - Interferometre a deux antennes: | 
|---|
| [3336] | 688 | // Slim =  2 * k * Tsys / [ Atot * Sqrt(1/2 *dnu*Tobs) ] | 
|---|
| [3339] | 689 | // - Interferometre a N antennes (N grand): | 
|---|
| [3336] | 690 | // Slim ->  2 * k * Tsys / [ Atot * Sqrt(dnu*Tobs) ] | 
|---|
| [3341] | 691 | //      C'est aussi la formule pour un telescope unique de surface Atot | 
|---|
| [3339] | 692 | // --- On ne mesure qu'une seule polarisation | 
|---|
|  | 693 | // Ces formules sont valables si on mesure 1 polarisation: | 
|---|
|  | 694 | // Slim est la densite de flux total "St" (2 polars) d'une source (non-polarisee) | 
|---|
|  | 695 | //   qui donne la meme puissance que le bruit dans un detecteur qui ne | 
|---|
|  | 696 | //   mesure qu'une seule polarisation: | 
|---|
|  | 697 | // Le rapport S/N pour une source de densite de flux St (totale 2 polars): | 
|---|
|  | 698 | //    S/N = St / Slim | 
|---|
|  | 699 | // La puissance de bruit est, par definition: | 
|---|
|  | 700 | //    Pb = 1/2 *Slim*Atot*dNu | 
|---|
|  | 701 | //         = k*Tsys*sqrt(2*dNu/Tobs)  pour N=2 | 
|---|
|  | 702 | //         = k*Tsys*sqrt(dNu/Tobs)    pour N>>grand | 
|---|
|  | 703 | // La densite de flux d'une source a S/N=1 est: | 
|---|
|  | 704 | //    St = Slim | 
|---|
|  | 705 | // La puissance d'une source a S/N=1 mesuree par un detecteur | 
|---|
|  | 706 | //    qui ne mesure qu'une polar est: | 
|---|
|  | 707 | //    P1_lim = 1/2 *Slim*Atot*dNu | 
|---|
|  | 708 | // --- On mesure les 2 polarisations avec deux voies d'electronique distinctes | 
|---|
|  | 709 | // la puissance du signal mesure est multipliee par 2 | 
|---|
|  | 710 | // la puissance du bruit est multipliee par sqrt(2) | 
|---|
|  | 711 | // on a donc un gain d'un facteur sqrt(2) sur le rapport S/N | 
|---|
|  | 712 | // (cela revient d'ailleur a doubler le temps de pose: Tobs -> 2*Tobs) | 
|---|
|  | 713 | // En notant arbitrairement: Slim' = Slim / sqrt(2) | 
|---|
|  | 714 | //    ou Slim est defini par les formules ci-dessus | 
|---|
|  | 715 | // Le rapport S/N pour une source de densite de flux St (totale 2 polars): | 
|---|
|  | 716 | //   (S/N)_2 = (S/N)_1 * sqrt(2) = (St / Slim) * sqrt(2) = St / Slim' | 
|---|
|  | 717 | // La densite de flux d'une source a S/N=1 est: | 
|---|
|  | 718 | //    St = Slim' = Slim / sqrt(2) | 
|---|
|  | 719 | // La puissance d'une source a S/N=1 cumulee par les 2 detecteurs est: | 
|---|
|  | 720 | //    P_lim = St*Atot*dNu = Slim'*Atot*dNu = 1/sqrt(2) *Slim*Atot*dNu | 
|---|
|  | 721 | //          = P1_lim * sqrt(2) | 
|---|
|  | 722 | // La puissance de bruit cumulee par les 2 detecteurs est, par definition: | 
|---|
|  | 723 | //    Pb = P_lim = Slim'*Atot*dNu = P1_lim * sqrt(2) | 
|---|
|  | 724 | //               = 2*k*Tsys*sqrt(dNu/Tobs)   pour N=2 | 
|---|
|  | 725 | //               = k*Tsys*sqrt(2*dNu/Tobs)   pour N>>grand | 
|---|
|  | 726 | // ===================================================================== | 
|---|
|  | 727 |  | 
|---|
| [3365] | 728 | cout<<"\n>>>>\n>>>> Noise analysis\n>>>>"<<endl; | 
|---|
|  | 729 | double psys[3]; | 
|---|
|  | 730 | for(int i=0;i<3;i++) psys[i] = k_Boltzman_Cst * Tsys * (dnuhiz[i]*1.e+9); | 
|---|
|  | 731 | cout<<"Noise: T="<<Tsys<<" K"<<endl | 
|---|
|  | 732 | <<"       P="<<psys[0]<<" W in ["<<psys[1]<<","<<psys[2]<<"]"<<endl; | 
|---|
| [3115] | 733 |  | 
|---|
| [3336] | 734 | cout<<"...Computation assume that noise dominate the signal."<<endl; | 
|---|
| [3339] | 735 | if(ya2polar) | 
|---|
| [3336] | 736 | cout<<"...Assuming 2 polarisations measurements with 2 different electronics."<<endl; | 
|---|
| [3115] | 737 |  | 
|---|
|  | 738 |  | 
|---|
| [3336] | 739 | //--- | 
|---|
| [3339] | 740 | for(unsigned short it=0;it<2;it++) { | 
|---|
| [3115] | 741 |  | 
|---|
| [3339] | 742 | double fac = 1.; | 
|---|
|  | 743 | if(it==0) { // Interferometre a 2 telescopes | 
|---|
|  | 744 | fac = 0.5; | 
|---|
|  | 745 | cout<<"\n...Observation limits for a 2 telescope interferometer (with complex correlator)"<<endl | 
|---|
|  | 746 | <<"   (sensitivity is given for real or complex correlator output)"<<endl; | 
|---|
|  | 747 | } else if (it==1) { // Interferometre a N>> telescopes | 
|---|
|  | 748 | fac = 1.; | 
|---|
|  | 749 | cout<<"\n...Observation limits for a N (large) telescope interferometer (with complex correlator)"<<endl | 
|---|
| [3341] | 750 | <<"     (weak source limit sensitivity in a synthetised image)"<<endl | 
|---|
| [3557] | 751 | <<"     Also valid for a single dish telescope(with collecting area N*A)"<<endl | 
|---|
| [3462] | 752 | <<"          (add factor sqrt(2) if ON-OFF with T_ON=t_OFF)"<<endl; | 
|---|
| [3339] | 753 | } else continue; | 
|---|
|  | 754 |  | 
|---|
| [3365] | 755 | double slim[3], SsN[3], smass[3], pkbruit[3]; | 
|---|
|  | 756 | for(int i=0;i<3;i++) { | 
|---|
|  | 757 | slim[i] = 2. * k_Boltzman_Cst * Tsys / surfeff | 
|---|
|  | 758 | / sqrt(fac*(dnuhiz[i]*1.e+9)*tobs) /Jansky2Watt_cst; | 
|---|
|  | 759 | if(ya2polar) slim[i] /= sqrt(2.); | 
|---|
|  | 760 | SsN[i] = ssig_2polar[i] / slim[i];  // independant de  angsol_pix*surfeff | 
|---|
|  | 761 | smass[i] = mhiref / ssig_2polar[i] * slim[i]; | 
|---|
|  | 762 | pkbruit[i] = pow(smass[i]/mhiref,2.)*vol_pixel; | 
|---|
|  | 763 | } | 
|---|
| [3339] | 764 | cout<<"for 1 lobe:"<<endl | 
|---|
| [3365] | 765 | <<"   Slim    = "<<slim[0]*1.e6<<" mu_Jy in ["<<slim[1]*1.e6<<","<<slim[2]*1.e6<<"]"<<endl | 
|---|
|  | 766 | <<"   S/N     = "<<SsN[0]<<" in ["<<SsN[1]<<","<<SsN[2]<<"]"<<endl | 
|---|
|  | 767 | <<"   Mass HI = "<<smass[0]<<" Msol in ["<<smass[1]<<","<<smass[2]<<"]"<<endl | 
|---|
|  | 768 | <<"   Pk      = "<<pkbruit[0]<<" Mpc^3 in ["<<pkbruit[1]<<","<<pkbruit[2]<<"]"<<endl; | 
|---|
| [3341] | 769 |  | 
|---|
| [3367] | 770 | double slim_nl[3], SsN_nl[3], smass_nl[3], pkbruit_nl[3]; | 
|---|
|  | 771 | for(int i=0;i<3;i++) { | 
|---|
|  | 772 | slim_nl[i] = slim[i] * sqrt(nlobes[i]); | 
|---|
|  | 773 | SsN_nl[i] = ssig_2polar[i] / slim_nl[i]; | 
|---|
|  | 774 | smass_nl[i] = mhiref / ssig_2polar[i] * slim_nl[i]; | 
|---|
|  | 775 | pkbruit_nl[i] = pow(smass_nl[i]/mhiref,2.)*vol_pixel; | 
|---|
|  | 776 | } | 
|---|
|  | 777 | cout<<"for "<<nlobes[0]<<" lobes[i] in ["<<nlobes[1]<<","<<nlobes[2]<<"] :"<<endl | 
|---|
| [3365] | 778 | <<"   Slim    = "<<slim_nl[0]*1.e6<<" mu_Jy in ["<<slim_nl[1]*1.e6<<","<<slim_nl[2]*1.e6<<"]"<<endl | 
|---|
|  | 779 | <<"   S/N     = "<<SsN_nl[0]<<" in ["<<SsN_nl[1]<<","<<SsN_nl[2]<<"]"<<endl | 
|---|
|  | 780 | <<"   Mass HI = "<<smass_nl[0]<<" Msol in ["<<smass_nl[1]<<","<<smass_nl[2]<<"]"<<endl | 
|---|
|  | 781 | <<"   Pk      = "<<pkbruit_nl[0]<<" Mpc^3 in ["<<pkbruit_nl[1]<<","<<pkbruit_nl[2]<<"]"<<endl; | 
|---|
| [3339] | 782 |  | 
|---|
|  | 783 | } | 
|---|
|  | 784 |  | 
|---|
| [3115] | 785 | return 0; | 
|---|
| [3365] | 786 | } | 
|---|
|  | 787 |  | 
|---|
|  | 788 |  | 
|---|
| [3749] | 789 | //----------------------------------------------------------------------------------- | 
|---|
| [3365] | 790 | double AngsolEqTelescope(double nu /* GHz */,double telsurf /* m^2 */) | 
|---|
|  | 791 | /* | 
|---|
|  | 792 | Calcul de l'angle solide (sr) equivalent pour un telescope | 
|---|
|  | 793 | de surface totale "telsurf" (m^2) a la frequence "nu" (GHz) | 
|---|
|  | 794 | - Soit D(t) la figure de diffraction du telescope telle que D(t=0)=1 | 
|---|
|  | 795 | (t = angle depuis l'axe optique) | 
|---|
|  | 796 | telescope circulaire de diametre D: | 
|---|
|  | 797 | D(t) = [2J1(Pi*D*t/l)/(Pi*D*t/l)] | 
|---|
|  | 798 | telescope rectangulaire axb: | 
|---|
|  | 799 | D(t) = [sin(Pi*a*t/l)/(Pi*a*t/l)]*[sin(Pi*b*t/l)/(Pi*b*t/l)] | 
|---|
|  | 800 | - On cherche l'angle solide equivalent (par ex d'un cylindre de hauteur 1) | 
|---|
|  | 801 | Int[ D(t)^2 dOmega ] =  Int[ D(t)^2 2Pi t dt ] = Lambda^2/S | 
|---|
|  | 802 | - En conclusion, pour un ciel d'intensite uniforme I, on a: | 
|---|
|  | 803 | P = I * S * Omega * dNu = I * S * (Lambda^2/S) * dNu | 
|---|
|  | 804 | */ | 
|---|
|  | 805 | { | 
|---|
|  | 806 | double lambda = SpeedOfLight_Cst*1000./(nu*1.e9); | 
|---|
|  | 807 | return lambda*lambda / telsurf; | 
|---|
|  | 808 | } | 
|---|