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

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

Ajout de fichiers de calcul de geometrie Vector3d, UnitVector, Circle, de Benoit Revenu Reza 23/04/99

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& 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.