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

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

Corrections diverses, Reza 27/06/2010

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