NCFS-Pack
A generic (astro)particle physics analysis framework
 
Loading...
Searching...
No Matches
NcStokes.cxx
Go to the documentation of this file.
1
31
33
149
150#include "NcStokes.h"
151#include "Riostream.h"
152
153ClassImp(NcStokes); // Class implementation to enable ROOT I/O
154
157{
163
164 fI=0;
165 fQ=0;
166 fU=0;
167 fV=0;
168}
169
178
180{
186
187 fI=q.fI;
188 fQ=q.fQ;
189 fU=q.fU;
190 fV=q.fV;
191}
192
193void NcStokes::SetStokesParameters(Double_t I,Double_t Q,Double_t U,Double_t V)
194{
201
202 if (I<=0)
203 {
204 cout << " *NcStokes::SetStokesParameters* Inconsistent data." << endl;
205 cout << " I=" << fI << " Q=" << fQ << " U=" << fU << " V=" << fV << endl;
206 return;
207 }
208
209 fI=I;
210 fQ=Q;
211 fU=U;
212 fV=V;
213}
214
215void NcStokes::SetEllipseParameters(Double_t a,Double_t b,Double_t theta,TString u,Int_t h,Double_t p)
216{
234
235 fI=0;
236 fQ=0;
237 fU=0;
238 fV=0;
239
240 if (a<0 || b<0 || p<=0)
241 {
242 cout << " *NcStokes::SetEllipseParameters* Inconsistent input." << endl;
243 cout << " a:" << a << " b:" << b << " theta:" << theta << " " << u << ". h:" << h << " p:" << p << endl;
244 return;
245 }
246
247 Double_t pi=acos(-1.);
248
249 if (u=="deg") theta*=pi/180.;
250
251 Double_t a2=a*a;
252 Double_t b2=b*b;
253
254 fI=(a2+b2)/p;
255 fQ=(a2-b2)*cos(2.*theta);
256 fU=(a2-b2)*sin(2.*theta);
257 fV=2.*a*b;
258 if (h<0) fV=-fV;
259}
260
261void NcStokes::SetJonesVector(Double_t A1,Double_t A2,Double_t phi,TString u,Double_t p)
262{
275
276 fI=0;
277 fQ=0;
278 fU=0;
279 fV=0;
280
281 if (A1<0 || A2<0 || A1*A2==0 || p<=0)
282 {
283 cout << " *NcStokes::SetJonesVector* Inconsistent input." << endl;
284 cout << " A1:" << A1 << " A2:" << A2 << " phi:" << phi << " " << u << "." << " p:" << p << endl;
285 return;
286 }
287
288 Double_t pi=acos(-1.);
289
290 if (u=="deg") phi*=pi/180.;
291
292 fI=(A1*A1+A2*A2)/p;
293 fQ=A1*A1-A2*A2;
294 fU=2.*A1*A2*cos(phi);
295 fV=2.*A1*A2*sin(phi);
296}
297
298Double_t NcStokes::GetParameter(TString name,TString u)
299{
331
332 Double_t value=0;
333
334 if (fI<=0)
335 {
336 cout << endl;
337 cout << " *NcStokes::GetParameter* Inconsistent data encountered : I=" << fI << endl;
338 cout << " --- The Stokes vector (I,Q,U,V) is also known as (S0,S1,S2,S3)." << endl;
339 return 0;
340 }
341
342 Double_t pi=acos(-1.);
343
344 Double_t P=sqrt(fQ*fQ+fU*fU+fV*fV);
345 Double_t L=sqrt(fQ*fQ+fU*fU);
346 Double_t a=sqrt(0.5*(P+L));
347 Double_t b=sqrt(0.5*(P-L));
348 Double_t A1=sqrt(0.5*(P+fQ));
349 Double_t A2=sqrt(0.5*(P-fQ));
350
351 if (name=="I" || name=="S0") value=fI;
352 if (name=="Q" || name=="S1") value=fQ;
353 if (name=="U" || name=="S2") value=fU;
354 if (name=="V" || name=="S3") value=fV;
355 if (name=="P") value=P;
356 if (name=="L") value=L;
357 if (name=="C") value=fabs(fV);
358 if (name=="a") value=a;
359 if (name=="b") value=b;
360 if (name=="e" && P) value=sqrt(1.-(b*b)/(a*a));
361 if (name=="A1") value=A1;
362 if (name=="A2") value=A2;
363 if (name=="theta" && L)
364 {
365 value=0.5*atan2(fU,fQ);
366 if (u=="deg") value*=180./pi;
367 }
368 if (name=="beta" && P)
369 {
370 value=atan2(b,a);
371 if (u=="deg") value*=180./pi;
372 }
373 if (name=="helicity" && fV)
374 {
375 value=1;
376 if (fV<0) value=-1;
377 }
378 if (name=="phi" && (fV || fU))
379 {
380 value=atan2(fV,fU);
381 if (u=="deg") value*=180./pi;
382 }
383
384 return value;
385}
386
387void NcStokes::Data(TString u)
388{
403
404 if (fI<=0)
405 {
406 cout << endl;
407 cout << " *NcStokes::Data* Inconsistent data encountered : I=" << fI << endl;
408 cout << " --- The Stokes vector (I,Q,U,V) is also known as (S0,S1,S2,S3)." << endl;
409 return;
410 }
411
412 Double_t P=GetParameter("P");
413 Double_t L=GetParameter("L");
414 Int_t h=TMath::Nint(GetParameter("helicity"));
415 Double_t A1=GetParameter("A1");
416 Double_t A2=GetParameter("A2");
417 Double_t phi=GetParameter("phi",u);
418 Double_t a=GetParameter("a");
419 Double_t b=GetParameter("b");
420 Double_t e=GetParameter("e");
421 Double_t beta=GetParameter("beta",u);
422 Double_t theta=GetParameter("theta",u);
423
424 cout << " *NcStokes::Data* Listing of all polarisation information." << endl;
425 cout << " --- The Stokes vector (I,Q,U,V) is also known as (S0,S1,S2,S3)." << endl;
426 cout << " Stokes parameters....................: I=" << fI << " Q=" << fQ << " U=" << fU << " V=" << fV << endl;
427 cout << " Total beam intensity.................: I=" << fI << endl;
428 cout << " Total polarisation intensity.........: P=" << P << endl;
429 cout << " Linear polarisation intensity........: L=" << L << endl;
430 cout << " Circular polarisation intensity......: C=" << fabs(fV) << endl;
431 cout << " Fractional polarisation intensities..: P/I=" << P/fI << " L/I=" << L/fI << " C/I=" << fabs(fV/fI) << endl;
432 if (P)
433 {
434 cout << " Jones (x,y) field vector (E1,E2).....: |E1|=" << A1 << " |E2|=" << A2 << " (phi1-phi2)=" << phi << " " << u << "." << endl;
435 cout << " Polarisation ellipse (semi axes a,b) : a=" << a << " b=" << b << " eccentricity=" << e << " arctan(b/a)=" << beta << " " << u << "." << endl;
436 if (L) cout << " Ellipse orientation angle............: " << theta << " " << u << "." << endl;
437 if (fV) cout << " Polarisation helicity................: " << h << endl;
438 }
439}
440
ClassImp(NcStokes)
Treatment of Stokes parameters for EM polarisation studies.
Definition NcStokes.h:13
void SetStokesParameters(Double_t I, Double_t Q, Double_t U, Double_t V)
Definition NcStokes.cxx:193
Double_t GetParameter(TString name, TString u="rad")
Definition NcStokes.cxx:298
void SetEllipseParameters(Double_t a, Double_t b, Double_t theta, TString u, Int_t h, Double_t p=1)
Definition NcStokes.cxx:215
Double_t fV
Definition NcStokes.h:28
Double_t fI
Definition NcStokes.h:25
Double_t fU
Definition NcStokes.h:27
void Data(TString u="rad")
Definition NcStokes.cxx:387
virtual ~NcStokes()
Definition NcStokes.cxx:170
void SetJonesVector(Double_t A1, Double_t A2, Double_t phi, TString u, Double_t p=1)
Definition NcStokes.cxx:261
Double_t fQ
Definition NcStokes.h:26