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

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

Ajout classes / programmes de calcul d'effet de lobe sur les radio-sources, Reza 25/06/2010

File size: 2.8 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 "ctimer.h"
10
11
12/* --Methode-- */
13BeamEffect::BeamEffect(Four2DResponse& resp)
14 : fresp_(resp)
15// resp doit avoir sa longueur d'onde de reference en metres
16{
17}
18
19/* --Methode-- */
20void BeamEffect::ApplyLobeK2D(TArray< complex<TF> >& fourAmp, double dkx, double dky, double lambda)
21// dx, dy en radians, lambda en metres
22{
23 fresp_.setLambda(lambda);
24 double kxx, kyy;
25 for(sa_size_t ky=0; ky<fourAmp.SizeY(); ky++) {
26 kyy = (ky>fourAmp.SizeY()/2) ? -(double)(fourAmp.SizeY()-ky)*dky : (double)ky*dky;
27 for(sa_size_t kx=0; kx<fourAmp.SizeX(); kx++) {
28 kxx=(double)kx*dkx;
29 fourAmp(kx, ky) *= complex<TF>(fresp_(kxx, kyy), 0.);
30 }
31 }
32 return;
33}
34
35
36/* --Methode-- */
37void BeamEffect::ApplyLobe3D(TArray< TF >& a, double dx, double dy, double f0, double df)
38// dx, dy en radioans, f0, df en MHz
39{
40 Timer tm("BeamEffect::ApplyLobe3D");
41 FFTWServer ffts(true);
42 ffts.setNormalize(true);
43
44 H21Conversions conv;
45
46 TArray< complex<TF> > fourAmp;
47 double dkx = DeuxPI/(double)a.SizeX()/dx;
48 double dky = DeuxPI/(double)a.SizeY()/dy;
49
50 for(sa_size_t kz=0; kz<a.SizeZ(); kz++) {
51 TArray< TF > slice( a(Range::all(), Range::all(), kz) );
52 ffts.FFTForward(slice, fourAmp);
53 conv.setFrequency(f0+kz*df);
54 ApplyLobeK2D(fourAmp, dkx, dky, conv.getLambda());
55 ffts.FFTBackward(fourAmp, slice, true);
56 if (kz%10==0) cout << "BeamEffect::ApplyLobe3D() done kz=" << kz << " / a.SizeZ()=" << a.SizeZ() << endl;
57 }
58 return;
59}
60
61/* --Methode-- */
62TArray< TF > BeamEffect::ReSample(TArray< TF >& a, double xfac, double yfac, double zfac)
63{
64 Timer tm("BeamEffect::ReSample");
65
66 sa_size_t szx = a.SizeX()*xfac;
67 sa_size_t szy = a.SizeY()*yfac;
68 sa_size_t szz = a.SizeZ()*zfac;
69
70 TArray<TF> rsa(szx, szy, szz);
71 for(sa_size_t kz=0; kz<rsa.SizeZ(); kz++) {
72 sa_size_t kza=kz/zfac;
73 if ((kza<0)||(kza>=a.SizeZ())) continue;
74 for(sa_size_t ky=0; ky<rsa.SizeY(); ky++) {
75 sa_size_t kya=ky/yfac;
76 if ((kya<0)||(kya>=a.SizeY())) continue;
77 for(sa_size_t kx=0; kx<rsa.SizeX(); kx++) {
78 sa_size_t kxa=kx/xfac;
79 if ((kxa<0)||(kxa>=a.SizeX())) continue;
80 rsa(kx,ky,kz)=a(kxa,kya,kza);
81 }
82 }
83 }
84 return rsa;
85}
86
87
88/* --Methode-- */
89void BeamEffect::AddNoise(TArray< TF >& a, double pixsignoise, bool fgcmsig)
90{
91 cout << "BeamEffect::AddNoise() PixelSigmaNoise=" << pixsignoise << endl;
92 RandomGenerator rg;
93 for(sa_size_t kz=0; kz<a.SizeZ(); kz++)
94 for(sa_size_t ky=0; ky<a.SizeY(); ky++)
95 for(sa_size_t kx=0; kx<a.SizeX(); kx++)
96 a(kx,ky,kz) += rg.Gaussian(pixsignoise);
97 if (fgcmsig) {
98 double mean, sigma;
99 MeanSigma(a, mean, sigma);
100 cout << "BeamEffect::AddNoise()-done, Mean=" << mean << " Sigma=" << sigma << endl;
101 }
102 return;
103}
Note: See TracBrowser for help on using the repository browser.