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

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

Ajout classe de soustraction d'avant plans, Reza 25/06/2010

File size: 4.1 KB
RevLine 
[3788]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::CleanPointSources(double nsigmas)
39{
40 Timer tm("ForegroundCleaner::CleanPointSources");
41 TArray< TF > sky2d(skycube_.SizeX(), skycube_.SizeY());
42 for(sa_size_t ky=0; ky<sky2d.SizeY(); ky++)
43 for(sa_size_t kx=0; kx<sky2d.SizeX(); kx++)
44 sky2d(kx, ky) = skycube_(Range(kx), Range(ky), Range::all()).Sum();
45
46
47 double mean, sigma;
48
49
50 TArray< TF > amz(1,1,skycube_.SizeZ()), asz(1,1,skycube_.SizeZ());
51 for(sa_size_t kz=0; kz<skycube_.SizeZ(); kz++) {
52 TArray< TF > slice = skycube_(Range::all() , Range::all(), Range(kz));
53 MeanSigma(slice, mean, sigma);
54 amz(0,0,kz)=mean; asz(0,0,kz)=sigma;
55 }
56
57 MeanSigma(sky2d, mean, sigma);
58 cout << " ForegroundCleaner::CleanPointSources 2D Sky projection, mean=" << mean << " sigma=" << sigma << endl;
59
60 TF seuil = (TF)(mean+nsigmas*sigma);
61
62 sa_size_t srccnt=0;
63 for(sa_size_t ky=0; ky<skycube_.SizeY(); ky++)
64 for(sa_size_t kx=0; kx<skycube_.SizeX(); kx++) {
65 if (sky2d(kx,ky)>seuil) {
66 srccnt++;
67 skycube_(Range(kx), Range(ky), Range::all()) = amz;
68 }
69 }
70
71 cout << " Cleaned NSrc= " << srccnt << " 2D source/pixels (TotNPix=" << sky2d.Size()
72 << ")-> " << 100.*srccnt/sky2d.Size() << "% with S>" << seuil << " NSigmas=" << nsigmas << endl;
73 return (int)srccnt;
74}
75
76
77/* --Methode-- */
78TArray< TF > ForegroundCleaner::extractLSSCube(TArray< TF >& synctemp, TArray< TF >& specidx)
79{
80 Timer tm("ForegroundCleaner::extractLSSCube");
81// Inputs : maplss, mapsyc, freq0, dfreq
82// Outputs : synctemp, specidx (reconstructed foreground temperature and spectral index
83// Return_Array : foreground subtracted LSS signal
84{
85 sa_size_t sz[5]; sz[0]=skycube_.SizeX(); sz[1]=skycube_.SizeY();
86 synctemp.SetSize(2, sz);
87 specidx.SetSize(2, sz);
88 TArray<r_4> omap;
89 omap.SetSize(skycube_, true);
90 Vector vlnf(skycube_.SizeZ());
91 int nprt = 0;
92 // double freq0 : Frequence premier index en k (MHz)
93 // double dfreq : // largeur en frequence de chaque plan (Mhz)
94 for(sa_size_t i=0; i<skycube_.SizeX(); i++)
95 for(sa_size_t j=0; j<skycube_.SizeY(); j++) {
96 r_8 s1, sx, sx2, sy, sxy;
97 s1=sx=sx2=sy=sxy=0.;
98 for(sa_size_t k=0; k<skycube_.SizeZ(); k++) {
99 double lnf=log((double)k*dfreq_+freq0_);
100 vlnf(k)=lnf;
101 double ttot=(r_8)(skycube_(i,j,k));
102 if (ttot < 1.e-5) continue;
103 double lntt=log(ttot);
104 s1+=1.; sx+=lnf; sx2+=(lnf*lnf);
105 sy+=lntt; sxy+=(lnf*lntt);
106 }
107 double beta = (sx*sxy-sx2*sy)/(sx*sx-s1*sx2);
108 double alpha = (s1*sxy-sx*sy)/(s1*sx2-sx*sx);
109 double T0 = exp(beta+alpha*vlnf(0));
110 if ((i%16==0)&&(j%27==0))
111 cout << "extractLSSCube[" << i << "," << j << "]: T0=" << T0 << " alpha=" << alpha
112 << " (mapsync=" << skycube_(i,j,0) << " ... " << skycube_(i,j,125) << ")" << endl;
113 synctemp(i,j) = T0;
114 specidx(i,j) = alpha;
115 for(sa_size_t k=0; k<skycube_.SizeZ(); k++) {
116 r_4 fittedtemp = (r_4)(exp(beta+alpha*vlnf(k)));
117 omap(i,j,k) = skycube_(i,j,k)-fittedtemp;
118 }
119 }
120 return omap;
121}
122
123}
Note: See TracBrowser for help on using the repository browser.