Gyoto
GyotoScreen.h
Go to the documentation of this file.
1
7/*
8 Copyright 2011-2019 Thibaut Paumard, Frederic Vincent
9
10 This file is part of Gyoto.
11
12 Gyoto is free software: you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation, either version 3 of the License, or
15 (at your option) any later version.
16
17 Gyoto is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
21
22 You should have received a copy of the GNU General Public License
23 along with Gyoto. If not, see <http://www.gnu.org/licenses/>.
24 */
25
26#ifndef __GyotoScreen_H_
27#define __GyotoScreen_H_
28
29#include <iostream>
30#include <fstream>
31#include <string>
32#if defined HAVE_BOOST_ARRAY_HPP
33# include <boost/array.hpp>
34# define GYOTO_ARRAY boost::array
35# if defined HAVE_MPI
36# include <boost/version.hpp>
37# if BOOST_VERSION >= 106400
38# include <boost/serialization/boost_array.hpp>
39# include <boost/serialization/array_wrapper.hpp>
40# endif
41# endif
42#else
43template <typename T, size_t sz> class GYOTO_ARRAY {
44 private:
45 T buf[sz];
46 public:
47 T& operator[](size_t c) { return buf[c] ; }
48};
49#endif
50
51namespace Gyoto {
52 class Screen;
53}
54
55#include <GyotoDefs.h>
56#include <GyotoUtils.h>
57#include <GyotoSmartPointer.h>
58#include <GyotoObject.h>
59#include <GyotoMetric.h>
60#include <GyotoSpectrometer.h>
61
174: public Gyoto::SmartPointee,
175 public Gyoto::Object
176{
177 friend class Gyoto::SmartPointer<Gyoto::Screen>;
178
179 private:
180 double tobs_;
181 double fov_;
183 // double tmin_;
185
189 double * mask_;
190
197 std::string mask_filename_;
198
199 double distance_;
200 double dmax_;
201
202 enum anglekind_e { equatorial_angles=0, rectilinear=1, spherical_angles=2};
203 typedef int anglekind_t;
204
205 anglekind_t anglekind_;
206
212 double euler_[3];
213 double ex_[3];
214 double ey_[3];
215 double ez_[3];
216
217 double fourvel_[4];
218 double screen1_[4];
219 double screen2_[4];
220 double screen3_[4];
221
222 double dangle1_;
223 double dangle2_;
225
230
236 double freq_obs_;
237
243
244 public:
246 GYOTO_OBJECT_THREAD_SAFETY;
247
248 // Constructors - Destructor
249 // -------------------------
251 Screen(const Screen& ) ;
252 Screen * clone() const;
253
254 virtual ~Screen() ;
255
256 // Mutators / assignment
257 // ---------------------
258
260 void setProjection(const double paln,
261 const double inclination,
262 const double argument);
264 void setProjection(const double distance,
265 const double paln,
266 const double inclination,
267 const double argument);
268
270
273 void distance(double dist);
274
276
279 void dMax(double dist);
280
282
286 void distance(double dist, const std::string &unit);
287
289
293 void inclination(double);
294
296
300 void inclination(double, const std::string &unit);
301
302 void PALN(double);
304 void PALN(double, const std::string &unit);
306 void argument(double);
308 void argument(double, const std::string &unit);
314
319 void freqObs(double fo);
320
321
328 void freqObs(double fo, const std::string &unit);
329
333 double freqObs() const ;
334
340 double freqObs(const std::string &unit) const;
341
343
351 void setObserverPos(const double pos[4]);
352 void observerKind(const std::string &kind);
353 std::string observerKind() const;
354 void setFourVel(const double coord[4]);
356 void setScreen1(const double coord[4]);
358 void setScreen2(const double coord[4]);
360 void setScreen3(const double coord[4]);
362
363 // Accessors
364 // ---------
365
367
370 int coordKind() const;
371
373
376 double distance() const;
377
379
382 double distance(const std::string&) const;
383
385
388 double dMax() const;
389
391
395 double inclination() const;
396
398
402 double inclination(const std::string&) const;
403
404 double PALN() const;
405 double PALN(const std::string&) const;
406 double argument() const;
407 double argument(const std::string&) const;
408
411
413 double time() const;
414
416 double time(const std::string &) const;
417
419 void time(double, const std::string &);
420
422 void time(double);
423
425 double fieldOfView() const;
426
428 double fieldOfView(std::string const &unit) const;
429
431 void fieldOfView(double);
432
434 void fieldOfView(double, const std::string &unit);
435
437 double azimuthalFieldOfView() const;
438
440 void azimuthalFieldOfView(double ff);
441
443 void dangle1(double);
445 void dangle1(double, const std::string &unit);
447 double dangle1() const;
449 double dangle1(std::string const &unit)const;
451 void dangle2(double);
453 void dangle2(double, const std::string &unit);
455 double dangle2() const;
457 double dangle2(std::string const &unit)const;
458
460 void anglekind(int);
461 void anglekind(std::string const&);
462 std::string anglekind() const;
463
465 size_t resolution() const;
467 void resolution(size_t);
468
470
474 void mask(double const * const mm, size_t resolution=0);
475
477 double const * mask() const ;
478 void maskFile(std::string const &fname);
479 std::string maskFile() const;
480# ifdef GYOTO_USE_CFITSIO
481
483 void fitsReadMask(std::string const &fname);
484
486 void fitsWriteMask(std::string const &fname);
487# endif
488
490
494 bool operator()(size_t, size_t);
495
496
498
509 void getObserverPos(double dest[4]) const;
510
512
515 void getFourVel(double dest[4]) const;
516
517 void fourVel(std::vector<double> const &);
518 std::vector<double> fourVel() const;
519 void screenVector1(std::vector<double> const &);
520 std::vector<double> screenVector1() const;
521 void screenVector2(std::vector<double> const &);
522 std::vector<double> screenVector2() const;
523 void screenVector3(std::vector<double> const &);
524 std::vector<double> screenVector3() const;
525
527
530 void getScreen1(double dest[4]) const;
531
533
536 void getScreen2(double dest[4]) const;
537
539
542 void getScreen3(double dest[4]) const;
543
545
554 void getRayCoord(double x, double y, double dest[8]) const;
555
557
565 void getRayTriad(double coord[8],
566 double Ephi[4], double Etheta[4]) const;
567
569
577 void getRayCoord(const size_t i, const size_t j, double dest[8]) const;
578
579 void coordToSky(const double pos[4], double dest[3]) const;
581
582 void coordToXYZ(const double pos[4], double dest[3]) const;
584
587
589 // friend std::ostream& operator<<(std::ostream& , const Screen& ) ;
590 std::ostream& print(std::ostream&) const ;
591 std::ostream& printBaseVectors(std::ostream&) const ;
592
593 // UDUNITS
594# ifdef HAVE_UDUNITS
596
604 void mapPixUnit();
605
607
610 void unmapPixUnit();
611# endif
612
613
614#ifdef GYOTO_USE_XERCES
615 public:
617
620#endif
621
623 enum CoordType_e {angle, pixel};
624
626
634 public:
637 public:
641 virtual ~Coord1dSet();
643 virtual void begin() =0;
645 virtual bool valid() =0;
647 virtual size_t size()=0;
649 virtual size_t operator*() const ;
651 virtual double angle() const ;
653 virtual Coord1dSet& operator++()=0;
655
660 virtual size_t index() const=0;
661 };
662
664
670 public:
676 virtual ~Coord2dSet();
678 virtual Coord2dSet& operator++() =0;
684 virtual void begin() =0;
686 virtual bool valid() =0;
688 virtual size_t size()=0;
689 };
690
692 class Grid: public Coord2dSet {
693 protected:
694 protected:
696 char * prefix_;
697 Coord1dSet &iset_;
698 Coord1dSet &jset_;
699 public:
700 Grid(Coord1dSet &iset, Coord1dSet &jset, const char * const p=NULL);
701 virtual ~Grid();
704 virtual void begin();
705 virtual bool valid();
706 virtual size_t size();
707 };
708
710
713 class Bucket : public Coord2dSet {
714 protected:
715 Coord1dSet &alpha_;
716 Coord1dSet &delta_;
717 public:
718 Bucket(Coord1dSet &iset, Coord1dSet &jset);
722 virtual void begin();
723 virtual bool valid();
724 virtual size_t size();
725 };
726
728 class Empty: public Coord2dSet {
729 public:
730 Empty();
732 virtual void begin();
733 virtual bool valid();
734 virtual size_t size();
735 };
736
738 class Range : public Coord1dSet {
739 protected:
740 const size_t mi_, ma_, d_, sz_;
741 size_t cur_;
742 public:
744 Range(size_t mi, size_t ma, size_t d);
745 void begin();
746 bool valid();
747 size_t size();
749 size_t operator*() const ;
750 virtual size_t index() const ;
751 };
752
754 class Indices : public Coord1dSet {
755 protected:
756 size_t * indices_;
757 size_t const sz_;
758 size_t i_;
759 public:
760 Indices (size_t const*const buf, size_t sz);
761 ~Indices();
762 void begin();
763 bool valid();
764 size_t size();
766 size_t operator*() const ;
767 virtual size_t index() const ;
768 };
769
771 class Angles : public Coord1dSet {
772 protected:
773 double * buf_;
774 size_t const sz_;
775 size_t i_;
776 public:
777 Angles (double const*const buf, size_t sz);
778 ~Angles();
779 void begin();
780 bool valid();
781 size_t size();
783 double angle() const ;
784 virtual size_t index() const ;
785 };
786
788 class RepeatAngle : public Coord1dSet {
789 protected:
790 double const val_;
791 size_t const sz_;
792 size_t i_;
793 public:
794 RepeatAngle (double val, size_t sz);
795 void begin();
796 bool valid();
797 size_t size();
799 double angle() const ;
800 virtual size_t index() const ;
801 };
802};
803
804#endif
#define size_t
If not defined in <sys/types.h>.
Definition: GyotoConfig.h:390
Gyoto ubiquitous macros and typedefs.
#define obskind_t
Type for observer kind.
Definition: GyotoDefs.h:552
Base class for metric description.
Introspectable objects.
#define GYOTO_OBJECT
Declare class::properties and class::getProperties()
Definition: GyotoObject.h:84
Reference-counting pointers.
Spectroscopic capabilities of a Screen.
GYOTO utilities.
Definition: GyotoScreen.h:43
Factory / SmartPointee::Subcontractor_t interface.
Definition: GyotoFactoryMessenger.h:92
Object with properties.
Definition: GyotoObject.h:152
Property that can be set and got using standard methods.
Definition: GyotoProperty.h:608
1D specifier for an arbitrary angle coordinate set.
Definition: GyotoScreen.h:771
void begin()
Reset specifier to point to the first value.
virtual size_t index() const
Get index of value currently pointed to.
double angle() const
Get double value currently pointed to.
Coord1dSet & operator++()
Increment iterator (point to next value)
size_t size()
Number of values in this container.
bool valid()
True if pointing to something, false if end has been reached.
Class containing arbitrary 2D-points.
Definition: GyotoScreen.h:713
virtual GYOTO_ARRAY< size_t, 2 > operator*() const
Get pixel coordinates.
virtual Coord2dSet & operator++()
Increment pointer.
virtual size_t size()
Number of positions contained.
virtual GYOTO_ARRAY< double, 2 > angles() const
Get angle coordinates.
virtual void begin()
Reset pointer.
virtual bool valid()
Whether the end has not been passed.
Set of 1-d coordinates: indices or angles.
Definition: GyotoScreen.h:633
const CoordType_e kind
Whether this specifier represents angles or pixels.
Definition: GyotoScreen.h:636
virtual void begin()=0
Reset specifier to point to the first value.
virtual size_t index() const =0
Get index of value currently pointed to.
virtual Coord1dSet & operator++()=0
Increment iterator (point to next value)
virtual size_t size()=0
Number of values in this container.
virtual bool valid()=0
True if pointing to something, false if end has been reached.
virtual double angle() const
Get double value currently pointed to.
Coord1dSet(CoordType_e k)
Set kind during initialization.
virtual ~Coord1dSet()
Virtual destructor.
virtual size_t operator*() const
Get size_t value currently pointed to.
Class to specify a set of points on the Screen.
Definition: GyotoScreen.h:669
virtual void begin()=0
Reset pointer.
virtual Coord2dSet & operator++()=0
Increment pointer.
virtual size_t size()=0
Number of positions contained.
const CoordType_e kind
Whether this set holds pixels or angle specifications.
Definition: GyotoScreen.h:672
virtual bool valid()=0
Whether the end has not been passed.
virtual GYOTO_ARRAY< double, 2 > angles() const
Get angle coordinates.
virtual ~Coord2dSet()
Virtual destructor.
virtual GYOTO_ARRAY< size_t, 2 > operator*() const
Get pixel coordinates.
Coord2dSet(CoordType_e k)
Set kind at initialisation.
A dummy, empty 2D set.
Definition: GyotoScreen.h:728
virtual void begin()
Reset pointer.
virtual size_t size()
Number of positions contained.
virtual Coord2dSet & operator++()
Increment pointer.
virtual bool valid()
Whether the end has not been passed.
Class containing 2D-points organized in a grid.
Definition: GyotoScreen.h:692
virtual size_t size()
Number of positions contained.
virtual bool valid()
Whether the end has not been passed.
char * prefix_
If non-NULL, cout j each tims it is incremented.
Definition: GyotoScreen.h:696
virtual void begin()
Reset pointer.
virtual Coord2dSet & operator++()
Increment pointer.
virtual GYOTO_ARRAY< size_t, 2 > operator*() const
Get pixel coordinates.
1D specifier for an arbitrary pixel coordinate set.
Definition: GyotoScreen.h:754
bool valid()
True if pointing to something, false if end has been reached.
size_t size()
Number of values in this container.
void begin()
Reset specifier to point to the first value.
virtual size_t index() const
Get index of value currently pointed to.
Coord1dSet & operator++()
Increment iterator (point to next value)
size_t operator*() const
Get size_t value currently pointed to.
1D coordinated specifier for a range
Definition: GyotoScreen.h:738
Range(size_t mi, size_t ma, size_t d)
Specify min, max and step of this range.
bool valid()
True if pointing to something, false if end has been reached.
virtual size_t index() const
Get index of value currently pointed to.
void begin()
Reset specifier to point to the first value.
size_t size()
Number of values in this container.
size_t operator*() const
Get size_t value currently pointed to.
Coord1dSet & operator++()
Increment iterator (point to next value)
1D specifier for an angle that is repeated.
Definition: GyotoScreen.h:788
double angle() const
Get double value currently pointed to.
virtual size_t index() const
Get index of value currently pointed to.
void begin()
Reset specifier to point to the first value.
size_t size()
Number of values in this container.
Coord1dSet & operator++()
Increment iterator (point to next value)
bool valid()
True if pointing to something, false if end has been reached.
The camera with which the Astrobj is observed.
Definition: GyotoScreen.h:176
SmartPointer< Metric::Generic > gg_
The Metric in this end of the Universe.
Definition: GyotoScreen.h:224
double freq_obs_
Frequency at which the observer observes.
Definition: GyotoScreen.h:236
double PALN(const std::string &) const
Get position angle of the line of nodes.
double fov_
Field-of-view in rad.
Definition: GyotoScreen.h:181
double screen3_[4]
Screen e3 vector (normal)
Definition: GyotoScreen.h:220
double ex_[3]
Sky coordinate of base X vector.
Definition: GyotoScreen.h:213
double ez_[3]
Sky coordinate of base Z vector.
Definition: GyotoScreen.h:215
double azimuthalFieldOfView() const
Get Screen::azimuthal_fov_.
size_t npix_
Resolution in pixels.
Definition: GyotoScreen.h:184
void getScreen2(double dest[4]) const
Get copy of Screen::screen2_.
Screen(const Screen &)
Copy constructor.
double dangle1(std::string const &unit) const
Get increment to first position angle in specified unit.
void freqObs(double fo, const std::string &unit)
Set freq_obs_.
double ey_[3]
Sky coordinate of base Y vector.
Definition: GyotoScreen.h:214
virtual ~Screen()
Destructor.
void getRayCoord(const size_t i, const size_t j, double dest[8]) const
Get 8-coordinate of Photon hitting screen pixel.
double distance_
Distance to the observer in m.
Definition: GyotoScreen.h:199
double argument() const
Get angle between line of nodes and X axis of object.
void PALN(double)
Set position angle of the line of nodes.
double const * mask() const
Retrieve const pointer to mask_.
double azimuthal_fov_
Azimuthal field-of-view for Spherical Angles images. Maximal extent of image in the azimuthal b-angle...
Definition: GyotoScreen.h:182
CoordType_e
Enum to specify whether a coordinate set (Coord1dSet or Coord2dSet) holds pixel values or angles.
Definition: GyotoScreen.h:623
Screen()
Default constructor.
double freqObs(const std::string &unit) const
Get freq_obs_.
void PALN(double, const std::string &unit)
Set position angle of the line of nodes.
void fieldOfView(double)
Set Screen::fov_ in radians.
void setScreen2(const double coord[4])
Sets the screen vector e2.
SmartPointer< Metric::Generic > metric() const
Get Screen::gg_.
std::string mask_filename_
Last read or written FITS file.
Definition: GyotoScreen.h:197
double time(const std::string &) const
Get observing date in seconds.
double freqObs() const
Get freq_obs_.
double distance() const
Get distance from observer.
void fillProperty(Gyoto::FactoryMessenger *fmp, Property const &p) const
Output a single Property to XML.
void argument(double)
Set angle beetwen line of nodes and X axis of object.
void argument(double, const std::string &unit)
Set angle beetwen line of nodes and X axis of object.
void time(double, const std::string &)
Set observing date in specified unit.
double distance(const std::string &) const
Get distance from observer.
double inclination() const
Get inclination relative to line-of-sight.
double time() const
Get observing date in seconds.
void getScreen1(double dest[4]) const
Get copy of Screen::screen1_.
anglekind_t anglekind_
Screen angles kind (0: equatorial, 1: spherical)
Definition: GyotoScreen.h:205
void freqObs(double fo)
Set freq_obs_.
void dangle2(double)
Set increment to second position angle.
obskind_t observerkind_
What kind of observer are we considering? (At infinity, ZAMO...)
Definition: GyotoScreen.h:242
void dangle1(double, const std::string &unit)
Set increment to first position angle in specified unit.
void getRayTriad(double coord[8], double Ephi[4], double Etheta[4]) const
Get polarization triad.
void setFourVel(const double coord[4])
Sets the observer's 4-velocity.
double argument(const std::string &) const
Get angle between line of nodes and X axis of object.
static SmartPointer< Screen > Subcontractor(FactoryMessenger *fmp)
Instanciate a Screen from XML entity.
void inclination(double)
Set inclination relative to line-of-sight.
double euler_[3]
Euler angles.
Definition: GyotoScreen.h:212
void time(double)
Set observing date in seconds.
int coordKind() const
Get coordinate kind.
void dMax(double dist)
Set ray-tracing maximum distance.
void coordToSky(const double pos[4], double dest[3]) const
Convert 4-position to 3-sky position.
double PALN() const
Get position angle of the line of nodes.
void dangle2(double, const std::string &unit)
Set increment to second position angle in specified unit.
double screen1_[4]
Screen e1 vector.
Definition: GyotoScreen.h:218
std::ostream & printBaseVectors(std::ostream &) const
Debug helper.
double tobs_
Observing date in s.
Definition: GyotoScreen.h:180
void getFourVel(double dest[4]) const
Get copy of Screen::fourvel_.
void getObserverPos(double dest[4]) const
4-Position of the observer relative to the metric
void distance(double dist, const std::string &unit)
Set distance from observer.
void getScreen3(double dest[4]) const
Get copy of Screen::screen3_.
double fieldOfView() const
Get Screen::fov_ in radians.
void getRayCoord(double x, double y, double dest[8]) const
Get 8-coordinate of Photon hitting screen from a given direction.
void inclination(double, const std::string &unit)
Set inclination relative to line-of-sight.
double fieldOfView(std::string const &unit) const
Get Screen::fov_ in specified unit.
double dangle2_
Increment to second position angle of Screen; can be typically delta if in Equatorial Angles,...
Definition: GyotoScreen.h:223
double dangle1() const
Get increment to first position angle.
void setProjection(const double paln, const double inclination, const double argument)
Set inclination etc.
void azimuthalFieldOfView(double ff)
Set Screen::azimuthal_fov_.
double dangle2(std::string const &unit) const
Get increment to second position angle in specified unit.
double fourvel_[4]
Observer's 4-velocity.
Definition: GyotoScreen.h:217
bool operator()(size_t, size_t)
Whether this pixel should be ray-traced.
void setScreen3(const double coord[4])
Sets the screen vector e3 (normal)
double dMax() const
Get maximum ray-tracing distance.
void anglekind(int)
Set Screen::anglekind_.
double dangle1_
Increment to first position angle of Screen; can be typically alpha if in Equatorial Angles,...
Definition: GyotoScreen.h:222
void dangle1(double)
Set increment to first position angle.
double * mask_
Mask with 0 where the ray-tracing should not be performed.
Definition: GyotoScreen.h:189
void spectrometer(SmartPointer< Spectrometer::Generic > spectro)
Set Screen::spectro_.
void setObserverPos(const double pos[4])
Alternative way to set projection.
SmartPointer< Spectrometer::Generic > spectro_
Gyoto::Spectrometer::Generic subclass instance used for quantities Spectrum and BinSpectrum.
Definition: GyotoScreen.h:229
void coordToXYZ(const double pos[4], double dest[3]) const
Convert 4-position to 3-cartesian coordinates.
Screen * clone() const
Cloner.
void setScreen1(const double coord[4])
Sets the screen vector e1.
void setProjection(const double distance, const double paln, const double inclination, const double argument)
Set distance, inclination etc.
double dangle2() const
Get increment to second position angle.
SmartPointer< Spectrometer::Generic > spectrometer() const
Get Screen::spectro_.
double dmax_
Maximum distance from which the photons are launched (geometrical units)
Definition: GyotoScreen.h:200
double screen2_[4]
Screen e2 vector.
Definition: GyotoScreen.h:219
void fieldOfView(double, const std::string &unit)
Set Screen::fov_ in specified unit.
void mask(double const *const mm, size_t resolution=0)
Set mask_ from array.
void distance(double dist)
Set distance from observer.
void metric(SmartPointer< Metric::Generic > gg)
Set Screen::gg_.
void resolution(size_t)
Set Screen::npix_.
void computeBaseVectors()
Compute base vectors according to projection parameters.
std::ostream & print(std::ostream &) const
Display.
double inclination(const std::string &) const
Get inclination relative to line-of-sight.
size_t resolution() const
Get Screen::npix_.
Can be pointed to by a SmartPointer.
Definition: GyotoSmartPointer.h:81
Pointers performing reference counting.
Definition: GyotoSmartPointer.h:135
Namespace for the Gyoto library.
Definition: GyotoAstrobj.h:43