source: Sophya/trunk/Cosmo/RadioBeam/multicyl.cc@ 3825

Last change on this file since 3825 was 3572, checked in by cmv, 17 years ago

char* -> const char* pour regler les problemes de deprecated string const... + comparaison unsigned signed + suppression EVOL_PLANCK rz+cmv 07/02/2009

File size: 8.1 KB
RevLine 
[3160]1#include "multicyl.h"
2#include "fftpserver.h"
3#include "vector3d.h"
4#include "matharr.h"
5#include "srandgen.h"
6#include "ctimer.h"
7#include "resusage.h"
[3192]8#include "datacards.h"
[3160]9
[3192]10static double cLight=0.3; // in 1E9 m/s
11static double tClock = 2.; // should come from param file !!!!
12//static double cLight=1;
13//static double tClock = 1.;
[3160]14
[3192]15
[3160]16//=================================================
17
18MultiCylinders::MultiCylinders(int nr, int ns)
19{
[3192]20 NR_ = nr;
21 NS_ = ns;
[3160]22
23 SetPrintLevel(0);
24
25 SetBaseFreqDa(2., 0.25);
26 SetNoiseSigma(0.);
27 SetTimeJitter(0.);
28 SetTimeOffsetSigma(0.);
29 SetGains(1., 0., 0);
[3192]30 adfg_ = false; src_ = NULL;
[3160]31 SetSources(new BRSourceGen, true);
32}
33
[3192]34//-----------------------------------------------------------------------------
[3572]35MultiCylinders::MultiCylinders(const char* fileName)
[3192]36{
37 adfg_ = false; src_ = NULL;
38 SetSources(new BRSourceGen, true);
39
40// read telescope parameters and fill variable members
41 DataCards dc;
42 dc.ReadFile(fileName);
43// in old versions frequences were in units of 1/T = 0.5 GHz
44// and distances in units of cT =3E8 * 2E-9=0.60 m
45// double fUnit=0.5; // 0.5 GHz <=> T = 2 ns
46// double dUnit=0.6; // distance unit in m.
47// now f and d in real units
48 double fUnit=1.; // 0.5 GHz <=> T = 2 ns
49 double dUnit=1.; // distance unit in m.
50
51 NR_=dc.IParam("nAntenna");
52 NS_=dc.IParam("nSample");
53 PrtLev_=dc.IParam("printLevel");
54 Da_=dc.DParam("dAntenna")/dUnit;
55 freq0_=dc.DParam("freq0")/fUnit;
56 timejitter_=dc.DParam("sigmaTimeJitt");
57 toffsig_=dc.DParam("sigmaClockJitt");
58 signoise_=dc.DParam("noiseSigma");
59 gain_=dc.DParam("meanGain");
60 siggain_=dc.DParam("sigmaGain");
61 ngainzero_=dc.IParam("nDeadAntenna");
62
63// tClock=dc.DParam("tClock");
64 int nCyl=dc.IParam("nCyl");
65 for (int i=0; i<nCyl; i++){
66 double xCyl=dc.DParam("xCyl",i)/dUnit;
67 double yCyl=dc.DParam("yCyl",i)/dUnit;
68 AddCylinder(xCyl,yCyl);
69 }
70// maxangX=dc.DParam("angMaxX");
71// double cylDiam=dc.DParam("cylinderDiam")/dUnit;
72//// thetaMax = lambda_M/d = c/freq_min/d; freq_min = freq0 + 1/2T
73// maxangY=cLight/(freq0+1./2./tClock)/cylDiam;
74// halfNY=dc.IParam("halfNY");
75// NX=dc.IParam("NX");
76}
77
78//-----------------------------------------------------------------------------
[3160]79MultiCylinders::~MultiCylinders()
80{
[3192]81 if (adfg_ && src_) delete src_;
82 for(int k=0; k<(int)mCyl_.size(); k++) delete mCyl_[k];
[3160]83}
84
[3192]85//-----------------------------------------------------------------------------
[3160]86MultiBeamCyl& MultiCylinders::GetCylinder(int k)
87{
[3192]88 if ((k < 0) || (k >= (int)mCyl_.size())) {
89 cout <<"******************************************* k="<<k<<endl;
[3160]90 throw RangeCheckError("MultiCylinders::GetCylinder(k) k<0 OR k>=NCyl");
[3192]91 }
92 return (*mCyl_[k]);
[3160]93}
94
[3192]95//-----------------------------------------------------------------------------
[3160]96void MultiCylinders::SetSources(BRSourceGen* brs, bool ad)
97{
98 if (brs == NULL) return;
[3192]99 if (adfg_ && src_) delete src_;
100 src_ = brs; adfg_=ad;
[3160]101}
102
103
[3192]104//-----------------------------------------------------------------------------
[3160]105void MultiCylinders::ConfigureCylinders()
106{
[3192]107 cout << " MultiCylinders::ConfigureCylinders() with NCyl= " << mCyl_.size() << endl;
108 for(int k=0; k<(int)mCyl_.size(); k++) {
109 mCyl_[k]->SetPrintLevel(PrtLev_);
110 mCyl_[k]->SetBaseFreqDa(freq0_, Da_);
111 mCyl_[k]->SetNoiseSigma(signoise_);
112 mCyl_[k]->SetTimeJitter(timejitter_);
113 mCyl_[k]->SetTimeOffsetSigma(toffsig_);
114 mCyl_[k]->SetGains(gain_, siggain_, ngainzero_);
115 mCyl_[k]->SetSources(src_, false);
[3160]116 }
117}
118
119
[3192]120//-----------------------------------------------------------------------------
[3160]121void MultiCylinders::ReconstructCylinderPlaneS(bool fgzerocentre)
122{
123 Timer tm("RecCylPlaneS");
124 ResourceUsage resu;
[3192]125 cout << " MultiCylinders::ReconstructCylinderPlaneS()/Info - NCyl= " << mCyl_.size()
[3160]126 << " MemSize=" << resu.getMemorySize() << " kb" << endl;
127 ConfigureCylinders();
128
129 char buff[128];
[3192]130 for(int k=0; k<(int)mCyl_.size(); k++) {
[3160]131 cout << "---- Cyl[" << k << "] Calling MultiBeamCyl.ReconstructSourcePlane() ..." << endl;
[3192]132 mCyl_[k]->ReconstructSourcePlane(fgzerocentre);
[3160]133 sprintf(buff,"Cyl[%d].RecSrcPlane()",k);
134 tm.Split(buff);
135 }
136 resu.Update();
137 cout << " MultiCylinders::ReconstructCylinderPlaneS()/Info - Done "
138 << " MemSize=" << resu.getMemorySize() << " kb" << endl;
139}
140
[3192]141//-----------------------------------------------------------------------------
142void MultiCylinders::ReconstructSourceBox(int halfny, double stepangy,
143 int nx, double stepangx)
[3160]144{
[3192]145 nx=256;
[3160]146 ReconstructCylinderPlaneS(true);
147 TMatrix< complex<r_4> > & mtx = GetCylinder(0).getRecSrcPlane();
[3192]148// boite 3D X:angX, Y:angY , Z: freq
149// if all cylinders at same x position NX is set to zero
150// => x-size = mtx.NCols() = numbers of receptors per cylinders
151// move that to readParam() ?
[3160]152 sa_size_t sz[5] = {0,0,0,0,0};
[3191]153 sz[0] = nx;
[3160]154 sz[1] = halfny*2+1;
155 sz[2] = mtx.NRows();
156 TArray< complex<r_4> > & box = getRecSrcBox();
[3192]157 box.ReSize(3, sz); // values initialized to zero ?
[3160]158 cout << " MultiCylinders::ReconstructSourceBox(" << halfny << "," << stepangy
159 << "=" << Angle(stepangy).ToArcMin() << " ) srcbox:" << endl;
[3163]160 Timer tm("RecSrcBox");
[3160]161 box.Show(cout);
162
163
[3192]164// int pmod = mtx.NRows()/10;
[3160]165
[3192]166 double fstep = 1.0/(double)NS_/tClock; // pas en frequence,
167 // attention, on a vire la composante continu
168// bool first=true;
[3160]169 for(int kf=0; kf<mtx.NRows(); kf++) { // Loop over frequencies
[3192]170 double frq = (double)(kf+1.)*fstep + freq0_; // + 1 car f=0 a ete vire
171// then up to frq = (mtx.NRows() +1 ) * fstep !!?
172// cout<<"************"<<mCyl.size()
173 for(int lc=0; lc<(int)mCyl_.size(); lc++) { // Loop over cylinders
[3160]174 MultiBeamCyl& cyl = GetCylinder(lc);
175
176 TMatrix< complex<r_4> > & recp = cyl.getRecSrcPlane();
177
[3192]178 double facl_y = - 2*M_PI*frq*cyl.getCylinderYPos()/cLight; // attention signe -
179 double facl_x = - 2*M_PI*cyl.getCylinderXPos()/cyl.Da_;
[3160]180 complex< r_4 > phasefactor;
181 int jyy = 0;
[3192]182
[3160]183 for(int jy=-halfny; jy<=halfny; jy++) { // Loop over Y angular steps
[3192]184 for(int ix=0; ix<nx; ix++) { // Loop over AngX directions
185 double dphi = facl_y * sin( (double)jy*stepangy )
186 + facl_x*(double(ix)/double(nx)-1./2.);
187 phasefactor = complex< r_4 > ((r_4) cos(dphi) , (r_4) sin(dphi));
188 // sur recp : index ligne -> frequence , index colonne -> angX ,
189 int ixx=(int)(ix*(double)cyl.NR_/double(nx));
190 box(ix, jyy, kf) += recp(kf, ixx)*phasefactor;
191 } //
192 jyy++;
[3160]193 } // End of Loop over Y angles
194 } // End of loop over cylinders
[3192]195
[3160]196 tm.Nop();
[3192]197// if ( (PrtLev_>0) && (kf%pmod == 0) )
198 if ( (PrtLev_>0) && (kf%(mtx.NRows()/10) == 0) )
[3160]199 cout << " OK box(angx,angy, freq=kf) done for kf=" << kf
[3192]200 << " / Max_kf=" << mtx.NRows() << endl;
[3160]201 } // End of loop over over frequencies
202
203 cout << " MultiCylinders::ReconstructSourceBox() done " << endl;
204}
205
[3192]206//-----------------------------------------------------------------------------
[3160]207inline float myZmodule(complex<r_4>& z)
208{
209 return (float)sqrt((double)(z.real()*z.real()+z.imag()*z.imag()));
210}
211
[3192]212//-----------------------------------------------------------------------------
[3160]213TMatrix< r_4 > MultiCylinders::getRecXYSlice(int kfmin, int kfmax)
214{
215 TArray< complex<r_4> > & box = getRecSrcBox();
216 if ((kfmin < 0) || (kfmin >= box.SizeZ()) || (kfmax < kfmin) || (kfmax >= box.SizeZ()) )
217 throw RangeCheckError("MultiCylinders::getRecXYSlice(kfmin, kfmax)");
218 TMatrix< r_4> rmtx(box.SizeY(), box.SizeX());
219 for(int kf=kfmin; kf<=kfmax; kf++) {
220 for(int jy=0; jy<box.SizeY(); jy++)
221 for(int ix=0; ix<box.SizeX(); ix++)
222 rmtx(jy, ix) += myZmodule(box(ix, jy, kf));
223 }
224 return(rmtx);
225}
[3192]226//-----------------------------------------------------------------------------
227TMatrix< r_4 > MultiCylinders::getRecYXSlice(int kfmin, int kfmax)
228{
229 TArray< complex<r_4> > & box = getRecSrcBox();
230 if ((kfmin < 0) || (kfmin >= box.SizeZ()) || (kfmax < kfmin) || (kfmax >= box.SizeZ()) )
231 throw RangeCheckError("MultiCylinders::getRecXYSlice(kfmin, kfmax)");
232 TMatrix< r_4> rmtx(box.SizeX(), box.SizeY());
233 for(int kf=kfmin; kf<=kfmax; kf++) {
234 for(int jy=0; jy<box.SizeY(); jy++)
235 for(int ix=0; ix<box.SizeX(); ix++)
236 rmtx(ix, jy) += myZmodule(box(ix, jy, kf));
237 }
238 return(rmtx);
239}
Note: See TracBrowser for help on using the repository browser.