source: Sophya/trunk/SophyaLib/Samba/mlobe.cc@ 470

Last change on this file since 470 was 470, checked in by ansari, 26 years ago

versions templatees, NdataBlocks etc. 15-OCT-99-GLM

File size: 3.9 KB
Line 
1#include "mlobe.h"
2#include "unitvector.h"
3
4#include "timing.h"
5// #include "nbrandom.h"
6
7/* --Methode-- */
8MainLobe::MainLobe(float sig, float dels, int nc)
9{
10if (sig < 1.e-9) sig = M_PI/100.; // Sigma du lobe gaussien (radians)
11mSigma = sig;
12mDels = (dels < 1.e-5) ? 0.5 : dels; // Epaisseur de chaque couche en unite de sigma
13mNC = (nc < 1) ? 1 : nc;
14mNpix = 1; // Nb total de pixels du lobe
15
16int i,j,k;
17for(i=1; i<=mNC; i++) mNpix += 6*i;
18// mT0 , mP0 Teta et Phi des pixels, Pixel 0 oriente vers (0, 0)
19mT0 = new float[mNpix];
20mP0 = new float[mNpix];
21// mTC , mPC Teta et Phi des pixels, Pixel 0 oriente vers (Teta, phi)
22mTC = new float[mNpix];
23mPC = new float[mNpix];
24mDx = new float[mNpix];
25mDy = new float[mNpix];
26mDr = new float[mNpix];
27// Valeurs des pixels
28mVal = new double[mNpix];
29
30
31double teta,phi,dphi;
32double val;
33mT0[0] = mP0[0] = mTC[0] = mPC[0] = 0.;
34mVal[0] = 1.; mDx[0] = mDy[0] = 0.;
35k = 1; mTotVal = 1.;
36for(i=1; i<=mNC; i++) {
37 teta = (double)i*mDels;
38 val = exp(-teta*teta);
39 teta *= mSigma;
40 if (i%2) phi = M_PI/6.;
41 else phi = 0.;
42 dphi = M_PI/(3.*i);
43 for(j=0; j<6*i; j++) {
44 mT0[k] = mTC[k] = teta;
45 phi += dphi;
46 mP0[k] = mPC[k] = phi;
47 mVal[k] = val;
48 mTotVal += val;
49 mDx[k] = teta*cos(phi);
50 mDy[k] = teta*sin(phi);
51 mDr[k] = teta;
52 k++;
53 }
54 }
55mDirTet = mDirPhi = 0.;
56return;
57}
58
59
60/* --Methode-- */
61MainLobe::~MainLobe()
62{
63delete mT0;
64delete mP0;
65delete mTC;
66delete mPC;
67delete mDx;
68delete mDy;
69delete mDr;
70delete mVal;
71}
72
73/* --Methode-- */
74void MainLobe::SetDirection(float teta, float phi)
75{
76int k;
77
78mDirTet = teta;
79mDirPhi = phi;
80
81if (teta < 0.1*mDels*mSigma) {
82 for(k=0; k<mNpix; k++) {
83 mTC[k] = mT0[k]; mPC[k] = mP0[k];
84 }
85 return;
86 }
87
88
89/*
90if (teta > 10.*mSigma*mDels*mNC) { // On utilise des formules approchees
91 float stet = sin((double)teta);
92 float ctet = cos((double)teta);
93 for(k=0; k<mNpix; k++) {
94 mTC[k] = teta - mDy[k]*stet - mDr[k]*ctet;
95 mPC[k] = phi + mDx[k];
96 }
97 return;
98 }
99 */
100
101// Formules compliquees
102
103double dx,dy,dz;
104double sphi = sin((double)phi);
105double cphi = cos((double)phi);
106double stet = sin((double)teta);
107double ctet = cos((double)teta);
108
109UnitVector pd((double)teta, (double)phi);
110UnitVector vc;
111for(k=0; k<mNpix; k++) {
112 dz = mDy[k]*stet;
113 dx = -(mDx[k]*sphi+mDy[k]*ctet*cphi);
114 dy = mDx[k]*cphi-mDy[k]*ctet*sphi;
115 vc.Setxyz(pd.X()+dx, pd.Y()+dy, pd.Z()+dz);
116 mTC[k] = vc.Theta();
117 mPC[k] = vc.Phi();
118 if (mTC[k] < 0.) printf("ERREUR !!!! mTC[%d] = %g \n", k, mTC[k]);
119 if (mPC[k] < 0.) mPC[k] += M_PI*2.;
120 if (mPC[k] >= M_PI*2.) mPC[k] -= M_PI*2.;
121 }
122return;
123}
124
125/* --Methode-- */
126double MainLobe::Value(int kpx, float& teta, float& phi)
127{
128if ( (kpx < 0) || (kpx >= mNpix) ) { teta = phi = 0.; return(0.); }
129teta = mTC[kpx];
130phi = mPC[kpx];
131return(mVal[kpx]);
132}
133
134/* --Methode-- */
135double MainLobe::Convol(SphericalMap<double>& sph)
136{
137double ret=0.;
138int k;
139for(k=0; k<mNpix; k++) ret += mVal[k]*sph(mTC[k], mPC[k]);
140/*
141if( (dbg > 0) && (k%dbg) )
142 printf("MainLobe::Convol k= %d T,P= %g %g , Lobe=%g Sph= %g Ret=%g\n",
143 k, mTC[k], mPC[k], mVal[k], sph(mTC[k], mPC[k]), ret );
144*/
145return(ret/mTotVal);
146}
147
148/* --Methode-- */
149ostream& operator << (ostream& s, MainLobe const& lob)
150{
151s << "MainLobe_Info() : Sigma= " << lob.mSigma << " Dels= " << lob.mDels << " NC= "
152 << lob.mNC << " NTotPix= " << lob.mNpix << " Integ= " << lob.mTotVal << endl;
153
154int i,j,k;
155cout << " Direction Teta,Phi = " << lob.mDirTet << " , " << lob.mDirPhi << endl;
156cout << " Pixel 0 , Teta= " << lob.mT0[0] << " Phi= " << lob.mP0[0]
157 << " Val= " << lob.mVal[0] << endl;
158k = 1;
159for(i=1; i<lob.mNC; i++) {
160 cout << " Couche # " << i << " NPix= " << i*6 << endl;
161 for(j=0;j<6*i;j++) {
162 cout << "K= " << k << "Teta,Phi= " << lob.mTC[k] << ", " << lob.mPC[k]
163 << " (" << lob.mT0[k] << ", " << lob.mP0[k] << ") "
164 << " Val= " << lob.mVal[k] << endl;
165 k++;
166 }
167 }
168
169
170return s;
171}
172
Note: See TracBrowser for help on using the repository browser.