source: Sophya/trunk/Cosmo/RadioBeam/lobe.cc@ 3986

Last change on this file since 3986 was 3986, checked in by ansari, 14 years ago

modification rapport maxi a appliquer lors des corrections de beams, Reza 05/05/2011

File size: 5.4 KB
RevLine 
[3787]1
2#include "lobe.h"
3#include "radutil.h"
4#include "randfmt.h"
5typedef FMTRandGen RandomGenerator ;
6
7
[3789]8#include "fftwserver.h"
9#include "matharr.h"
[3787]10#include "ctimer.h"
11
12
13/* --Methode-- */
[3797]14BeamEffect::BeamEffect(Four2DResponse& resp, bool preservefreq0)
15 : fresp_(resp), preservefreq0_(preservefreq0)
[3787]16// resp doit avoir sa longueur d'onde de reference en metres
17{
18}
19
[3973]20/* --Methode-- */
21void BeamEffect::ApplyLobe(TArray< TF >& a, double dx, double dy, double f0)
22// dx, dy en radioans, f0, df en MHz
23{
24 Timer tm("BeamEffect::ApplyLobe");
25 FFTWServer ffts(true);
26 ffts.setNormalize(true);
27
28 H21Conversions conv;
29 conv.setFrequency(f0);
30 fresp_.setLambda(conv.getLambda());
[3788]31
[3973]32 TArray< complex<TF> > fourAmp;
33 double dkx = DeuxPI/(double)a.SizeX()/dx;
34 double dky = DeuxPI/(double)a.SizeY()/dy;
35
36 for(sa_size_t kz=0; kz<a.SizeZ(); kz++) {
37 TArray< TF > slice( a(Range::all(), Range::all(), kz) );
38 ffts.FFTForward(slice, fourAmp);
39 ApplyLobeK2D(fresp_, fourAmp, dkx, dky);
40 ffts.FFTBackward(fourAmp, slice, true);
41 if (kz%20==0) cout << "BeamEffect::ApplyLobe() done kz=" << kz << " / a.SizeZ()=" << a.SizeZ() << endl;
42 }
43 double mean, sigma;
44 TF min, max;
45 a.MinMax(min, max);
46 MeanSigma(a, mean, sigma);
47 cout << " BeamEffect::ApplyLobe() - Result Min=" << min << " Max=" << max
48 << " Mean=" << mean << " Sigma=" << sigma << endl;
49 return;
50}
[3788]51
[3973]52
[3787]53/* --Methode-- */
[3788]54void BeamEffect::ApplyLobe3D(TArray< TF >& a, double dx, double dy, double f0, double df)
55// dx, dy en radioans, f0, df en MHz
[3787]56{
[3788]57 Timer tm("BeamEffect::ApplyLobe3D");
58 FFTWServer ffts(true);
59 ffts.setNormalize(true);
60
61 H21Conversions conv;
62
63 TArray< complex<TF> > fourAmp;
64 double dkx = DeuxPI/(double)a.SizeX()/dx;
65 double dky = DeuxPI/(double)a.SizeY()/dy;
66
67 for(sa_size_t kz=0; kz<a.SizeZ(); kz++) {
68 TArray< TF > slice( a(Range::all(), Range::all(), kz) );
69 ffts.FFTForward(slice, fourAmp);
70 conv.setFrequency(f0+kz*df);
71 fresp_.setLambda(conv.getLambda());
[3789]72 // cout << " DEBUG*" << kz << " lambda=" << conv.getLambda() << " lambda_ratio_=" << fresp_.lambda_ratio_ << endl;
[3788]73 ApplyLobeK2D(fresp_, fourAmp, dkx, dky);
74 ffts.FFTBackward(fourAmp, slice, true);
75 if (kz%20==0) cout << "BeamEffect::ApplyLobe3D() done kz=" << kz << " / a.SizeZ()=" << a.SizeZ() << endl;
[3787]76 }
[3789]77 double mean, sigma;
78 TF min, max;
79 a.MinMax(min, max);
80 MeanSigma(a, mean, sigma);
81 cout << " BeamEffect::ApplyLobe3D() - Result Min=" << min << " Max=" << max
82 << " Mean=" << mean << " Sigma=" << sigma << endl;
[3787]83 return;
84}
85
86/* --Methode-- */
[3986]87void BeamEffect::Correct2RefLobe(Four2DResponse& rep, TArray< TF >& a, double dx, double dy, double f0, double df, double maxratio)
[3787]88// dx, dy en radioans, f0, df en MHz
89{
[3788]90 Timer tm("BeamEffect::Correct2RefLobe");
[3787]91 FFTWServer ffts(true);
92 ffts.setNormalize(true);
93
94 H21Conversions conv;
95
96 TArray< complex<TF> > fourAmp;
97 double dkx = DeuxPI/(double)a.SizeX()/dx;
98 double dky = DeuxPI/(double)a.SizeY()/dy;
99
100 for(sa_size_t kz=0; kz<a.SizeZ(); kz++) {
101 TArray< TF > slice( a(Range::all(), Range::all(), kz) );
102 ffts.FFTForward(slice, fourAmp);
103 conv.setFrequency(f0+kz*df);
[3788]104 fresp_.setLambda(conv.getLambda());
[3986]105 Four2DRespRatio rratio(rep, fresp_, maxratio);
[3788]106 ApplyLobeK2D(rratio, fourAmp, dkx, dky);
[3787]107 ffts.FFTBackward(fourAmp, slice, true);
[3788]108 if (kz%20==0) cout << "BeamEffect::Correct2RefLobe() done kz=" << kz << " / a.SizeZ()=" << a.SizeZ() << endl;
[3787]109 }
[3789]110 double mean, sigma;
111 TF min, max;
112 a.MinMax(min, max);
113 MeanSigma(a, mean, sigma);
114 cout << " BeamEffect::Correct2RefLobe() - Result Min=" << min << " Max=" << max
115 << " Mean=" << mean << " Sigma=" << sigma << endl;
[3787]116 return;
117}
118
119/* --Methode-- */
[3788]120void BeamEffect::ApplyLobeK2D(Four2DResponse& rep, TArray< complex<TF> >& fourAmp, double dkx, double dky)
121{
[3797]122 complex<TF> cf0=fourAmp(0,0);
[3788]123 double kxx, kyy;
124 for(sa_size_t ky=0; ky<fourAmp.SizeY(); ky++) {
125 kyy = (ky>fourAmp.SizeY()/2) ? -(double)(fourAmp.SizeY()-ky)*dky : (double)ky*dky;
126 for(sa_size_t kx=0; kx<fourAmp.SizeX(); kx++) {
127 kxx=(double)kx*dkx;
128 fourAmp(kx, ky) *= complex<TF>(rep(kxx, kyy), 0.);
129 }
130 }
[3797]131 if (preservefreq0_) fourAmp(0, 0)=cf0;
[3788]132 return;
133}
134
135/* --Methode-- */
[3787]136TArray< TF > BeamEffect::ReSample(TArray< TF >& a, double xfac, double yfac, double zfac)
137{
138 Timer tm("BeamEffect::ReSample");
139
140 sa_size_t szx = a.SizeX()*xfac;
141 sa_size_t szy = a.SizeY()*yfac;
142 sa_size_t szz = a.SizeZ()*zfac;
143
144 TArray<TF> rsa(szx, szy, szz);
145 for(sa_size_t kz=0; kz<rsa.SizeZ(); kz++) {
146 sa_size_t kza=kz/zfac;
147 if ((kza<0)||(kza>=a.SizeZ())) continue;
148 for(sa_size_t ky=0; ky<rsa.SizeY(); ky++) {
149 sa_size_t kya=ky/yfac;
150 if ((kya<0)||(kya>=a.SizeY())) continue;
151 for(sa_size_t kx=0; kx<rsa.SizeX(); kx++) {
152 sa_size_t kxa=kx/xfac;
153 if ((kxa<0)||(kxa>=a.SizeX())) continue;
154 rsa(kx,ky,kz)=a(kxa,kya,kza);
155 }
156 }
157 }
158 return rsa;
159}
160
161
162/* --Methode-- */
163void BeamEffect::AddNoise(TArray< TF >& a, double pixsignoise, bool fgcmsig)
164{
165 cout << "BeamEffect::AddNoise() PixelSigmaNoise=" << pixsignoise << endl;
166 RandomGenerator rg;
167 for(sa_size_t kz=0; kz<a.SizeZ(); kz++)
168 for(sa_size_t ky=0; ky<a.SizeY(); ky++)
169 for(sa_size_t kx=0; kx<a.SizeX(); kx++)
170 a(kx,ky,kz) += rg.Gaussian(pixsignoise);
171 if (fgcmsig) {
172 double mean, sigma;
173 MeanSigma(a, mean, sigma);
174 cout << "BeamEffect::AddNoise()-done, Mean=" << mean << " Sigma=" << sigma << endl;
175 }
176 return;
177}
Note: See TracBrowser for help on using the repository browser.