| [3160] | 1 | #include "mbeamcyl.h"
 | 
|---|
 | 2 | #include "fftpserver.h"
 | 
|---|
 | 3 | #include "vector3d.h"
 | 
|---|
 | 4 | #include "matharr.h"
 | 
|---|
 | 5 | #include "srandgen.h"
 | 
|---|
 | 6 | 
 | 
|---|
| [3192] | 7 | static double cLight=0.3;       // in 1E9 m/s
 | 
|---|
 | 8 | static double tClock = 2.; // should come from param file !!!!
 | 
|---|
 | 9 | //static double cLight=1;       
 | 
|---|
 | 10 | //static double tClock = 1.; 
 | 
|---|
 | 11 | 
 | 
|---|
| [3160] | 12 | //=================================================
 | 
|---|
 | 13 | 
 | 
|---|
| [3191] | 14 | MultiBeamCyl::MultiBeamCyl(int nr, int ns, double posx, double posy)
 | 
|---|
| [3192] | 15 |   : texact_(ns) , tjitt_(ns) , toffset_(nr) ,
 | 
|---|
 | 16 |     gain_(nr), signal_(ns), sigjitt_(ns) 
 | 
|---|
| [3160] | 17 | {
 | 
|---|
| [3192] | 18 |   NR_ = nr;
 | 
|---|
 | 19 |   NS_ = ns;
 | 
|---|
 | 20 |   posY_ = posy;
 | 
|---|
 | 21 |   posX_ = posx;
 | 
|---|
| [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 | //-----------------------------------------------------------------------------
 | 
|---|
| [3160] | 35 | MultiBeamCyl::~MultiBeamCyl()
 | 
|---|
 | 36 | {
 | 
|---|
| [3192] | 37 |   if (adfg_ && src_) delete src_;
 | 
|---|
| [3160] | 38 | }
 | 
|---|
 | 39 | 
 | 
|---|
| [3192] | 40 | //-----------------------------------------------------------------------------
 | 
|---|
| [3160] | 41 | void MultiBeamCyl::SetSources(BRSourceGen* brs, bool ad)
 | 
|---|
 | 42 | {
 | 
|---|
 | 43 |   if (brs == NULL) return;
 | 
|---|
| [3192] | 44 |   if (adfg_ && src_) delete src_;
 | 
|---|
 | 45 |   src_ = brs;  adfg_=ad;
 | 
|---|
 | 46 |   if (PrtLev_ > 1) 
 | 
|---|
| [3160] | 47 |     cout << " MultiBeamCyl::SetSources(brs=" << brs <<" ,bool) NbSrc=" 
 | 
|---|
| [3192] | 48 |          << src_->NbSources() << endl;
 | 
|---|
| [3160] | 49 | 
 | 
|---|
 | 50 | }
 | 
|---|
 | 51 | 
 | 
|---|
| [3192] | 52 | //-----------------------------------------------------------------------------
 | 
|---|
| [3160] | 53 | void MultiBeamCyl::SetGains(double g, double sigg, int nzerogain)
 | 
|---|
 | 54 | {
 | 
|---|
| [3192] | 55 |   if (sigg < 1.e-6)  gain_ = g;
 | 
|---|
 | 56 |   else gain_ = RandomSequence(RandomSequence::Gaussian, g, sigg);
 | 
|---|
| [3160] | 57 |   int k;
 | 
|---|
| [3192] | 58 |   for (k=0; k<NR_; k++) if (gain_(k) < 0) gain_(k) = 0.;
 | 
|---|
| [3160] | 59 |   for(k=0; k<nzerogain; k++) {
 | 
|---|
| [3192] | 60 |     int zg = random()%NR_;
 | 
|---|
 | 61 |     if ((zg >=0) && (zg < NR_))  gain_(zg) = 0.; 
 | 
|---|
| [3160] | 62 |   }
 | 
|---|
| [3192] | 63 |   if (PrtLev_ > 1) 
 | 
|---|
| [3160] | 64 |     cout << " MultiBeamCyl::SetGains(g=" << g <<" ,sigg=" << sigg 
 | 
|---|
 | 65 |          << " ,nzg=" << nzerogain << " )" << endl;
 | 
|---|
 | 66 | }
 | 
|---|
 | 67 | 
 | 
|---|
| [3192] | 68 | //-----------------------------------------------------------------------------
 | 
|---|
| [3160] | 69 | void MultiBeamCyl::ComputeTimeVectors()
 | 
|---|
 | 70 | {
 | 
|---|
| [3192] | 71 |   texact_ = RegularSequence(0., tClock);        // 0, tClock, 2*tClock, ...
 | 
|---|
 | 72 | //  for (int i=0;i<1024;i++) {cout << texact(i)<< endl;};
 | 
|---|
 | 73 |   toffset_ = RandomSequence(RandomSequence::Gaussian, 0., toffsig_);
 | 
|---|
| [3160] | 74 |   NewTJitVector();
 | 
|---|
 | 75 | }
 | 
|---|
 | 76 | 
 | 
|---|
| [3192] | 77 | //-----------------------------------------------------------------------------
 | 
|---|
| [3160] | 78 | void MultiBeamCyl::NewTJitVector(int num)
 | 
|---|
 | 79 | {
 | 
|---|
| [3192] | 80 |   if (timejitter_ > 1.e-19) {
 | 
|---|
 | 81 |     tjitt_ = RandomSequence(RandomSequence::Gaussian, 0., timejitter_);
 | 
|---|
 | 82 |     tjitt_ += texact_;  
 | 
|---|
| [3160] | 83 |   }
 | 
|---|
| [3192] | 84 |   else tjitt_ = texact_;  
 | 
|---|
 | 85 |   if (num >= 0) tjitt_ += toffset_(num);
 | 
|---|
| [3160] | 86 |   
 | 
|---|
 | 87 | }
 | 
|---|
 | 88 | 
 | 
|---|
| [3192] | 89 | //-----------------------------------------------------------------------------
 | 
|---|
| [3160] | 90 | int MultiBeamCyl::ComputeSignalVector(int num, bool fgsignojit)
 | 
|---|
 | 91 | {
 | 
|---|
 | 92 |   int nok = 0;
 | 
|---|
| [3192] | 93 |   signal_ = 0.;
 | 
|---|
 | 94 |   sigjitt_ = 0.;
 | 
|---|
 | 95 |   for(int is=0; is<src_->freq.Size(); is++) {
 | 
|---|
 | 96 |     double fr = src_->freq(is);
 | 
|---|
| [3160] | 97 |     if ((fr < 0.) || (fr > 0.5)) continue;
 | 
|---|
 | 98 |     nok++;
 | 
|---|
 | 99 |     // Pour le dephasage entre recepteurs, on doit utiliser la frequence vraie,
 | 
|---|
 | 100 |     // pas celle apres shift (freq-reduite)
 | 
|---|
 | 101 |     // lambda = c T = c/freq avec c = 1, dephasage = 2*pi*num*Da*sin(ang)/lambda
 | 
|---|
| [3192] | 102 |     double dephasage = (posX_+num*Da_)*sin(src_->angX(is)) 
 | 
|---|
 | 103 |                                 + posY_*sin(src_->angY(is)) ;
 | 
|---|
 | 104 |     dephasage *= 2*M_PI*(fr+freq0_)/cLight;
 | 
|---|
| [3160] | 105 |     // On ajoute alors la phase propre de chaque source
 | 
|---|
| [3192] | 106 |     dephasage += src_->phase(is);
 | 
|---|
 | 107 |     double amprep = src_->amp(is)*AngResponse(src_->angX(is), src_->angY(is));
 | 
|---|
 | 108 |     for(int k=0; k<NS_; k++) {
 | 
|---|
 | 109 |       sigjitt_(k) += amprep*sin(2.*M_PI*fr*tjitt_(k)+dephasage);
 | 
|---|
| [3160] | 110 |       if (fgsignojit) 
 | 
|---|
| [3192] | 111 |         signal_(k) += amprep*sin(2.*M_PI*fr*texact_(k)+dephasage);
 | 
|---|
| [3160] | 112 |     }
 | 
|---|
 | 113 |   }
 | 
|---|
 | 114 |   // Application du gain du detecteur 
 | 
|---|
| [3192] | 115 |   r_4 ga = gain_(num);
 | 
|---|
| [3160] | 116 |   if (fabs(ga-1.) > 1.e-9) {
 | 
|---|
| [3192] | 117 |     signal_ *= ga;
 | 
|---|
 | 118 |     sigjitt_ *= ga;
 | 
|---|
| [3160] | 119 |   }
 | 
|---|
 | 120 |   // Ajout de bruit (ampli ...) 
 | 
|---|
| [3192] | 121 |   if (signoise_ > 1.e-18) {
 | 
|---|
 | 122 |     for(int k=0; k<NS_; k++) {
 | 
|---|
 | 123 |       sigjitt_(k) += GauRnd(0., signoise_);
 | 
|---|
 | 124 |       if (fgsignojit) signal_(k) += GauRnd(0., signoise_);
 | 
|---|
| [3160] | 125 |     }
 | 
|---|
 | 126 |   }
 | 
|---|
| [3192] | 127 | //............      FFT in time
 | 
|---|
| [3160] | 128 |   FFTPackServer ffts;
 | 
|---|
| [3192] | 129 |   ffts.FFTForward(sigjitt_, f_sigjit_);
 | 
|---|
 | 130 |   if (fgsignojit) ffts.FFTForward(signal_, f_sig_);
 | 
|---|
| [3160] | 131 | 
 | 
|---|
 | 132 |   return nok;
 | 
|---|
 | 133 | }
 | 
|---|
 | 134 | 
 | 
|---|
 | 135 | 
 | 
|---|
| [3192] | 136 | //-----------------------------------------------------------------------------
 | 
|---|
| [3160] | 137 | /*  --- a supprimer ?
 | 
|---|
 | 138 | inline float myZmodule(complex<r_4>& z) 
 | 
|---|
 | 139 | {
 | 
|---|
 | 140 |   return (float)sqrt((double)(z.real()*z.real()+z.imag()*z.imag()));
 | 
|---|
 | 141 | }
 | 
|---|
 | 142 | ----- */
 | 
|---|
 | 143 | 
 | 
|---|
| [3192] | 144 | //-----------------------------------------------------------------------------
 | 
|---|
| [3160] | 145 | void MultiBeamCyl::ReconstructSourcePlane(bool fgzerocentre)
 | 
|---|
 | 146 | {
 | 
|---|
 | 147 |   ComputeTimeVectors();
 | 
|---|
 | 148 |   int noksrc = ComputeSignalVector(0, false);
 | 
|---|
 | 149 |   vector<TVector< complex<r_4> > >  vvfc;
 | 
|---|
| [3192] | 150 |   cout << "MultiBeamCyl::ReconstructSourcePlane() NR=" << NR_ 
 | 
|---|
 | 151 |        << " PosY=" << posY_ << " NFreq=" << f_sigjit_.Size()-1 << " NOkSrc=" << noksrc << endl;
 | 
|---|
 | 152 |   if (PrtLev_ > 0) {
 | 
|---|
 | 153 |     cout << " ... posY= " << posY_ << " MeanGain=" << Mean(gain_) << " MeanAmpSrc=" 
 | 
|---|
 | 154 |          << Mean(src_->amp) << endl;
 | 
|---|
 | 155 |     cout << " ...SigNoise=" << signoise_ << " TimeJitter=" << timejitter_ 
 | 
|---|
 | 156 |          << " TOffSig=" << toffsig_ << " Da=" << Da_ << " Freq0=" << freq0_ << endl;
 | 
|---|
| [3160] | 157 |   }
 | 
|---|
 | 158 |   // On ne s'occupe pas de la composante continue
 | 
|---|
| [3192] | 159 |   for(int jf=1; jf<f_sigjit_.Size(); jf++) {
 | 
|---|
 | 160 |     TVector<complex<r_4> > cf(NR_);
 | 
|---|
| [3160] | 161 |     vvfc.push_back(cf);
 | 
|---|
 | 162 |   }
 | 
|---|
 | 163 |   cout << "ReconstructSourcePlane()/Info: computing s(t) for each receptor ..." << endl;
 | 
|---|
| [3192] | 164 |   int pmod = NR_/10;
 | 
|---|
 | 165 |   for(int ir=0; ir<NR_; ir++) {
 | 
|---|
 | 166 |     if (timejitter_ > 1.e-19) NewTJitVector(ir);
 | 
|---|
| [3160] | 167 |     noksrc = ComputeSignalVector(ir, false);
 | 
|---|
| [3192] | 168 |     for(int jf=1; jf<f_sigjit_.Size(); jf++)
 | 
|---|
 | 169 |       vvfc[jf-1](ir) = f_sigjit_(jf);
 | 
|---|
 | 170 |     if ( (PrtLev_>0) && (ir%pmod == 0) )
 | 
|---|
 | 171 |       cout << " OK s(t) for ir=" << ir << " / NR=" << NR_ << " NOkSrc=" << noksrc << endl;
 | 
|---|
| [3160] | 172 |   }
 | 
|---|
 | 173 | 
 | 
|---|
 | 174 |   cout << "ReconstructSourcePlane()/Info: computing s(ang) for each freq by FFT" << endl;
 | 
|---|
| [3192] | 175 |   cmplx_srcplane_.SetSize(f_sigjit_.Size()-1, NR_);
 | 
|---|
 | 176 |   // rec_srcplane.SetSize(f_sigjit_.Size()-1, NR_);
 | 
|---|
| [3160] | 177 |   FFTPackServer ffts;
 | 
|---|
 | 178 |   TVector<complex<r_4> > fcf;
 | 
|---|
 | 179 |   pmod = vvfc.size()/10;
 | 
|---|
| [3192] | 180 |   for(int jf=0; jf<(int)vvfc.size(); jf++) {            // loop over frequencies
 | 
|---|
 | 181 |     ffts.FFTForward(vvfc[jf], fcf);     // FFT alomg cylinder
 | 
|---|
 | 182 |     if (fcf.Size() != NR_) {
 | 
|---|
| [3160] | 183 |       cout << "ReconstructSourcePlane()/BUG jf=" << jf << " fcf.Size() != NR "
 | 
|---|
| [3192] | 184 |            << fcf.Size() << " != " << NR_ << endl;
 | 
|---|
| [3160] | 185 |       continue;
 | 
|---|
 | 186 |     }
 | 
|---|
 | 187 |     if (fgzerocentre) {  // On veut avoir la direction angle=0 au milieu de la matrice
 | 
|---|
| [3192] | 188 |       int milieu = (NR_-1)/2;
 | 
|---|
 | 189 |       if (NR_%2 == 0) milieu++;
 | 
|---|
 | 190 |       int decal = NR_ - milieu - 1;
 | 
|---|
| [3160] | 191 |       for (int ir=0; ir<=milieu; ir++) 
 | 
|---|
| [3192] | 192 |         cmplx_srcplane_(jf, ir+decal) = fcf(ir);
 | 
|---|
| [3160] | 193 |       //        rec_srcplane(jf, ir+decal) = myZmodule(fcf(ir));
 | 
|---|
 | 194 | 
 | 
|---|
| [3192] | 195 |       for (int ir=milieu+1; ir<NR_; ir++) 
 | 
|---|
 | 196 |         cmplx_srcplane_(jf, decal-(NR_-ir)) = fcf(ir);
 | 
|---|
 | 197 |       //        rec_srcplane_(jf, decal-(NR_-ir)) = myZmodule(fcf(ir));
 | 
|---|
| [3160] | 198 |       
 | 
|---|
 | 199 |     }
 | 
|---|
| [3192] | 200 |     else for (int ir=0; ir<NR_; ir++) 
 | 
|---|
 | 201 |       cmplx_srcplane_(jf, ir) = fcf(ir);
 | 
|---|
| [3160] | 202 |     //      rec_srcplane(jf, ir) = myZmodule(fcf(ir));
 | 
|---|
 | 203 | 
 | 
|---|
| [3192] | 204 |     if ( (PrtLev_ > 0) && (jf%pmod == 0)) 
 | 
|---|
| [3160] | 205 |       cout << " OK rec_srcplane(jf, ir) for jf=" << jf << endl;
 | 
|---|
 | 206 |   }
 | 
|---|
 | 207 | 
 | 
|---|
 | 208 |   
 | 
|---|
 | 209 |   cout << "ReconstructSourcePlane()/Info: rec_srcplane computed OK" << endl;
 | 
|---|
 | 210 | }
 | 
|---|
 | 211 | 
 | 
|---|
 | 212 | 
 | 
|---|