source: Sophya/trunk/Cosmo/RadioBeam/fgndsub.cc@ 3789

Last change on this file since 3789 was 3789, checked in by ansari, 15 years ago

Corrections diverses, Reza 27/06/2010

File size: 5.7 KB
Line 
1/* ------------------------ Projet BAORadio --------------------
2 Classe ForegroundCleaner
3 R. Ansari , C. Magneville - Juin 2010
4--------------------------------------------------------------- */
5
6#include "fgndsub.h"
7#include "lobe.h"
8
9#include "cubedef.h"
10#include "matharr.h"
11
12#include "ctimer.h"
13
14/* --Methode-- */
15ForegroundCleaner::ForegroundCleaner(Four2DResponse& arrep, Four2DResponse& tbeam, TArray< TF >& skycube)
16 : arrep_(arrep) , tbeam_(tbeam), skycube_(skycube)
17{
18 double dxdeg = ThetaSizeDegre/(double)NTheta;
19 double dydeg = PhiSizeDegre/(double)NPhi;
20 dx_ = DegreeToRadian(dxdeg);
21 dy_ = DegreeToRadian(dydeg);
22 freq0_ = Freq0MHz;
23 dfreq_ = FreqSizeMHz/(double)NFreq;
24 cout << " ForegroundCleaner: " << " dx=" << dxdeg << " dy=" << dydeg << " degres ( dx_rad=" << dx_ << " dy_rad=" << dy_ << ")"
25 << " Freq0=" << freq0_ << " deltaFreq=" << dfreq_ << " MHz" << endl;
26 skycube.Show();
27}
28
29/* --Methode-- */
30void ForegroundCleaner::BeamCorrections()
31{
32 BeamEffect beam(arrep_);
33 beam.Correct2RefLobe(tbeam_, skycube_, dx_, dy_, freq0_, dfreq_);
34 cout << " ForegroundCleaner::BeamCorrections() done " << endl;
35}
36
37/* --Methode-- */
38int ForegroundCleaner::CleanNegatives(TF seuil)
39{
40 sa_size_t nneg = 0.;
41 for(sa_size_t kz=0; kz<skycube_.SizeZ(); kz++)
42 for(sa_size_t ky=0; ky<skycube_.SizeY(); ky++)
43 for(sa_size_t kx=0; kx<skycube_.SizeX(); kx++)
44 if (skycube_(kx, ky, kz) < seuil) {
45 nneg++; skycube_(kx, ky, kz)=seuil;
46 }
47 cout << " ForegroundCleaner::CleanNegatives " << nneg << " sky-pixels <" << seuil << " changed to" << seuil << endl;
48 return (int)nneg;
49}
50
51/* --Methode-- */
52int ForegroundCleaner::CleanPointSources(double nsigmas)
53{
54 Timer tm("ForegroundCleaner::CleanPointSources");
55 TArray< TF > sky2d(skycube_.SizeX(), skycube_.SizeY());
56 for(sa_size_t ky=0; ky<sky2d.SizeY(); ky++)
57 for(sa_size_t kx=0; kx<sky2d.SizeX(); kx++)
58 sky2d(kx, ky) = skycube_(Range(kx), Range(ky), Range::all()).Sum();
59
60
61 double mean, sigma;
62
63
64 TArray< TF > amz(1,1,skycube_.SizeZ()), asz(1,1,skycube_.SizeZ());
65 for(sa_size_t kz=0; kz<skycube_.SizeZ(); kz++) {
66 TArray< TF > slice = skycube_(Range::all() , Range::all(), Range(kz));
67 MeanSigma(slice, mean, sigma);
68 amz(0,0,kz)=mean; asz(0,0,kz)=sigma;
69 }
70
71 MeanSigma(sky2d, mean, sigma);
72 cout << " ForegroundCleaner::CleanPointSources 2D Sky projection, mean=" << mean << " sigma=" << sigma << endl;
73
74 TF seuil = (TF)(mean+nsigmas*sigma);
75
76 sa_size_t srccnt=0;
77 for(sa_size_t ky=0; ky<skycube_.SizeY(); ky++)
78 for(sa_size_t kx=0; kx<skycube_.SizeX(); kx++) {
79 if (sky2d(kx,ky)>seuil) {
80 srccnt++;
81 skycube_(Range(kx), Range(ky), Range::all()) = amz;
82 }
83 }
84
85 cout << " Cleaned NSrc= " << srccnt << " 2D source/pixels (TotNPix=" << sky2d.Size()
86 << ")-> " << 100.*srccnt/sky2d.Size() << "% with S>" << seuil << " NSigmas=" << nsigmas << endl;
87 return (int)srccnt;
88}
89
90
91/* --Methode-- */
92TArray< TF > ForegroundCleaner::extractLSSCube(TArray< TF >& synctemp, TArray< TF >& specidx)
93{
94 Timer tm("ForegroundCleaner::extractLSSCube");
95// Inputs : maplss, mapsyc, freq0, dfreq
96// Outputs : synctemp, specidx (reconstructed foreground temperature and spectral index
97// Return_Array : foreground subtracted LSS signal
98 sa_size_t sz[5]; sz[0]=skycube_.SizeX(); sz[1]=skycube_.SizeY();
99 synctemp.SetSize(2, sz);
100 specidx.SetSize(2, sz);
101 TArray<r_4> omap;
102 omap.SetSize(skycube_, true);
103 Vector vlnf(skycube_.SizeZ());
104 int nprt = 0;
105 // double freq0 : Frequence premier index en k (MHz)
106 // double dfreq : // largeur en frequence de chaque plan (Mhz)
107 for(sa_size_t k=0; k<skycube_.SizeZ(); k++)
108 vlnf(k)=log((double)k*dfreq_+freq0_);
109
110 sa_size_t nbinfini=0;
111 sa_size_t nbbad=0;
112 sa_size_t imodprt=skycube_.SizeX()/6;
113 sa_size_t jmodprt=skycube_.SizeY()/6;
114 for(sa_size_t i=0; i<skycube_.SizeX(); i++)
115 for(sa_size_t j=0; j<skycube_.SizeY(); j++) {
116 r_8 s1, sx, sx2, sy, sxy;
117 s1=sx=sx2=sy=sxy=0.;
118 for(sa_size_t k=0; k<skycube_.SizeZ(); k++) {
119 double lnf = vlnf(k);
120 double ttot=(r_8)(skycube_(i,j,k));
121 if (ttot < 1.e-5) continue;
122 double lntt=log(ttot);
123 s1+=1.; sx+=lnf; sx2+=(lnf*lnf);
124 sy+=lntt; sxy+=(lnf*lntt);
125 }
126 double beta = (sx*sxy-sx2*sy)/(sx*sx-s1*sx2);
127 double alpha = (s1*sxy-sx*sy)/(s1*sx2-sx*sx);
128 double T0 = exp(beta+alpha*vlnf(0));
129
130 bool fgnan = false;
131 if (!isfinite(alpha)||(!isfinite(beta))) {
132 cout << "extractLSSCube[" << i << "," << j << "]/ Not finite alpha, beta - (mapsync="
133 << skycube_(i,j,0) << " ... " << skycube_(i,j,skycube_.SizeZ()-1) << ")" << endl;
134 alpha=beta=-999.;
135 fgnan = true; nbinfini++;
136 }
137 else {
138 double axp1 = beta+alpha*vlnf(0);
139 double axp2 = beta+alpha*vlnf(vlnf.Size()-1);
140
141 if ((axp1<-70.)||(axp1>70.)||(axp2<-70.)||(axp2>70.)) {
142 cout << "extractLSSCube[" << i << "," << j << "] BAD alpha=" << alpha
143 << " beta=" << beta << " T0=" << T0 << " - (mapsync="
144 << skycube_(i,j,0) << " ... " << skycube_(i,j,skycube_.SizeZ()-1) << ")" << endl;
145 fgnan = true; nbbad++;
146 }
147 }
148 if ((i%imodprt==0)&&(j%jmodprt==0))
149 cout << "extractLSSCube[" << i << "," << j << "]: T0=" << T0 << " alpha=" << alpha
150 << " (mapsync=" << skycube_(i,j,0) << " ... " << skycube_(i,j,skycube_.SizeZ()-1) << ")" << endl;
151 synctemp(i,j) = T0;
152 specidx(i,j) = alpha;
153 if (fgnan) {
154 for(sa_size_t k=0; k<skycube_.SizeZ(); k++) omap(i,j,k) = 0.;
155 }
156 else {
157 for(sa_size_t k=0; k<skycube_.SizeZ(); k++) {
158 r_4 fittedtemp = (r_4)(exp(beta+alpha*vlnf(k)));
159 omap(i,j,k) = skycube_(i,j,k)-fittedtemp;
160 }
161 }
162 }
163 cout << " ForegroundCleaner::extractLSSCube() - NbNan alpha/beta=" << nbinfini << " NbBAD =" << nbbad << endl;
164 return omap;
165}
166
Note: See TracBrowser for help on using the repository browser.