| [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 | //----------------------------------------------------------------------------- | 
|---|
| [3572] | 35 | MultiCylinders::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] | 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 | } | 
|---|