source: Sophya/trunk/SigPredictor/lightgalaxresol.cc@ 800

Last change on this file since 800 was 798, checked in by ansari, 25 years ago

Creation du module SigPredictor (Simulation de signal Archeops/Planck)

de Dominique Yvon - Reza 30/3/2000

File size: 5.1 KB
Line 
1 // Dominique YVON, CEA/DAPNIA/SPP 02/2000
2
3#include <stdio.h>
4#include <stdlib.h>
5
6#include <math.h>
7#include <iostream>
8#include <fstream>
9
10#ifdef __MWERKS__
11 #include "mwerksmath.h"
12 #include "unixmac.h"
13 #include "macenvvariables.h"
14#endif
15
16#include "nbrandom.h"
17#include "lightgalaxresol.h"
18#include "numrecipes.h"
19#include "integ.h"
20
21
22LightGalaxResol::LightGalaxResol(int_4 nside) {
23 sprintf(Name, "Galaxies Resolues");
24 nlat=nside;
25 resolution=2*M_PI/4./nlat; // Radians
26 nbFreq=31;
27 nbPointSource=2711;
28 PtSourceS=true;
29
30 pNR=new NumRecipes;
31 LastFreqIndex=1;
32
33// Calcul des frŽquences des cartes guiderdonni
34 dataFreq=new r_8[nbFreq];
35 dataFreqDegueux= new float[nbFreq];
36
37 double fmin=15.e9;
38 double fmax=15.e12;
39 double dLogFreq=log10(fmax/fmin)/(nbFreq-1);
40
41 for(int i=0; i<nbFreq; i++)
42 {
43 dataFreq[i]=fmin*pow(10,i*dLogFreq);
44 dataFreqDegueux[i]=(float)dataFreq[i]; // Pour la NR
45 }
46
47// Booking of skymap of index
48 try { pLightMap= new SphereGorski<uint_2> (nlat); }
49 catch(bad_alloc){
50 cerr<<"Erreur Reservation de memoire classe LightGalacResol, nlat= "<<nlat<<endl;
51 exit(-1);
52 }
53
54 nbPixelLight=pLightMap->NbPixels();
55 int size=sizeof(uint_2)*nbPixelLight;
56 cout<<"Objet LightGalaxResol: "<<endl;
57 cout<<"Vous avez reservŽ: "<<size<<"Octets de mŽmoire vive"<<endl;
58
59
60// La sphere est initialisŽe ˆ nbPointSource+1, cad pas de sources
61 int_2 bidon=nbPointSource+1;
62 for(int i=0; i<nbPixelLight; i++) (*pLightMap)(i)=bidon;
63
64// On distribue les sources uniformement sur le ciel
65 int_4 skyIndex;
66 for(int_2 i=0; i<nbPointSource; i++)
67 {
68 skyIndex=(int)(MyRan()*nbPixelLight);
69 if ( (*pLightMap)(skyIndex)==(nbPointSource+1)) (*pLightMap)(skyIndex)=i;
70 else
71 {
72 while(! ((*pLightMap)(skyIndex) == (nbPointSource+1)) )
73 {
74// float test;
75// test= MyRan(); // frand01() ne fonctionne pas au 05/12/99 sur Mac
76 skyIndex=(int)(MyRan()*nbPixelLight);
77 }
78 (*pLightMap)(skyIndex)=i;
79 }
80 }
81
82
83// _____________ On lit les parametres des sources _______________________________________
84
85 // Reservation de l'espace memoire de stockage
86 try {
87 ppPointSourceData= new float* [nbPointSource];
88 for(int i=0; i<nbPointSource; i++) ppPointSourceData[i]= new float[nbFreq];
89 }
90 catch(bad_alloc) {
91 cerr<<" Memory booking error in LightGalaxResol: ppskyData "<<endl;
92 exit(-1);
93 }
94
95 // Lecture des fichiers
96 char filename[150];
97 double DumStarNb;
98 char DumChaine[20];
99 r_4 thisdata;
100
101
102#ifndef __MWERKS__
103 char* PATHDataLScr=getenv("PATHDataLScr");
104#endif
105
106 for(int NoFreq=0; NoFreq<nbFreq; NoFreq++)
107 {
108 // cout<<"NoFreq :"<<NoFreq<<"Frequence: "<<dataFreq[NoFreq]<<endl;
109 // On genere le bon nom de fichier
110 sprintf(filename,"%seran102_441_%08imhz.s_rare",PATHDataLScr,(int)(dataFreq[NoFreq]/1.e6+.5));
111
112 ifstream InFile(filename,ios::in); // Fichier Ouvert!
113
114#ifdef __MWERKS__
115 if (!InFile.is_open()) // cxx DEC est trop con pour comprendre is_open()
116#else
117 if (!InFile)
118#endif
119 { cerr<<"erreur a l'ouverture du fichier de donnees: "<<filename<<endl;
120 exit(-1);
121 }
122
123
124 InFile>>DumStarNb;
125 if(DumStarNb!=nbPointSource) {
126 cerr<<"ya une bogue dans le nb de galaxptsources."<<endl;
127 cerr<<"fichier: "<< filename<<"nb sources annoncees:"<< DumStarNb<<endl;
128 }
129 InFile>>DumChaine;
130
131 for(long noPtSource=0; noPtSource<nbPointSource; noPtSource++)
132 {
133 InFile>> thisdata;
134 ppPointSourceData [noPtSource] [NoFreq] =thisdata;
135// cout<<noPtSource<<'\t'<<ppPointSourceData [noPtSource] [NoFreq]<<endl;
136 }
137 InFile.close();
138 }
139/* for (int NoFreq=0; NoFreq<nbFreq; NoFreq ++)
140 cout<< NoFreq <<'\t'<< ppPointSourceData [] [NoFreq]<< endl;
141*/
142}
143
144
145LightGalaxResol::~LightGalaxResol()
146{
147 // LibŽrons la mŽmoire!! Bient™t mai!
148 for(int i=0; i<nbPointSource; i++) delete[] ppPointSourceData[i];
149 delete[] ppPointSourceData;
150 delete pLightMap;
151 delete[] dataFreqDegueux;
152 delete[] dataFreq;
153 delete pNR;
154}
155
156double LightGalaxResol::powSpecDens(double theta, double phi, double freq)
157 //(Watt/m2/Hz)
158{
159 long pixelNo= pLightMap->PixIndexSph(theta, phi);
160 int_2 NoSource=(*pLightMap)(pixelNo);
161
162 if ( NoSource==(nbPointSource+1)) return 0.; // Pas de source
163 else
164 {
165 float* binSpectre=(ppPointSourceData[NoSource]);
166 float InterpRes;
167 float InterpResErr;
168
169 float thisFreq=freq;
170
171 //Ou est la frequence dans le tableau?
172 pNR->hunt(dataFreqDegueux-1,(unsigned long) nbFreq, thisFreq, &LastFreqIndex);
173 if((LastFreqIndex==0)||(LastFreqIndex==nbFreq))
174 { cerr<<"Appel a powSpecDens dans LightGalaxResol hors limites de frequence"<<endl;
175 LastFreqIndex=1;
176 return 0;
177 }
178
179
180 // On interpole 3 eme ordre. Num Reciepies fonction.
181 pNR->polint(dataFreqDegueux-1+LastFreqIndex,binSpectre-1+LastFreqIndex,
182 2,thisFreq,&InterpRes,&InterpResErr);
183 // InterpRes en Jansky:10-26 W/m2/Hz
184 return (double) (InterpRes*10.e-26); // W/m2/Hz
185 // RMQ: Le Jansky est une unite de source ponctuelle !
186 // Pas de steradian dans les homogeneites.
187 }
188}
189
190static double randMax=RAND_MAX;
191double LightGalaxResol::MyRan() {
192 return rand()/randMax;
193}
194
Note: See TracBrowser for help on using the repository browser.