| [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] | 10 | static double cLight=0.3;       // in 1E9 m/s
 | 
|---|
 | 11 | static 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 | 
 | 
|---|
 | 18 | MultiCylinders::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 | //-----------------------------------------------------------------------------
 | 
|---|
 | 35 | MultiCylinders::MultiCylinders(char* fileName)
 | 
|---|
 | 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] | 79 | MultiCylinders::~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] | 86 | MultiBeamCyl& 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] | 96 | void 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] | 105 | void 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] | 121 | void 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 | //-----------------------------------------------------------------------------
 | 
|---|
 | 142 | void 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] | 207 | inline 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] | 213 | TMatrix< 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 | //-----------------------------------------------------------------------------
 | 
|---|
 | 227 | TMatrix< 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 | }
 | 
|---|