Gyoto
GyotoScreen.h
Go to the documentation of this file.
1 
7 /*
8  Copyright 2011-2020, 2023-2024 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
43 template <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 
51 namespace 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_;
182  double azimuthal_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:
245  GYOTO_OBJECT;
246  GYOTO_OBJECT_THREAD_SAFETY;
247 
248  // Constructors - Destructor
249  // -------------------------
250  Screen() ;
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 
557  void getRayTriad(double x, double y,
558  double dest[8],
559  bool compute_polar_basis=false,
560  double Ephi[4]=NULL, double Etheta[4]=NULL) const;
561 
563 
574  void getRayTriad(const size_t i, const size_t j,
575  double dest[8],
576  bool compute_polar_basis=false,
577  double Ephi[4]=NULL, double Etheta[4]=NULL) const;
578 
585  void coordToSky(const double pos[4], double dest[3], bool geometrical=false) const;
586 
593  void skyToCoord(const double sky[3], double dest[4], bool geometrical=false) const;
594 
595  void coordToXYZ(const double pos[4], double dest[3]) const;
597 
598  void computeBaseVectors() ;
600 
602  std::ostream& print(std::ostream&) const ;
603  std::ostream& printBaseVectors(std::ostream&) const ;
604 
605  // UDUNITS
606 # ifdef HAVE_UDUNITS
607 
616  void mapPixUnit();
617 
619 
622  void unmapPixUnit();
623 # endif
624 
625 
626 #ifdef GYOTO_USE_XERCES
627  public:
628  void fillProperty(Gyoto::FactoryMessenger *fmp, Property const &p) const;
629 
632 #endif
633 
635  enum CoordType_e {angle, pixel};
636 
638 
645  class Coord1dSet {
646  public:
649  public:
653  virtual ~Coord1dSet();
655  virtual void begin() =0;
657  virtual bool valid() =0;
659  virtual size_t size()=0;
661  virtual size_t operator*() const ;
663  virtual double angle() const ;
665  virtual Coord1dSet& operator++()=0;
667 
672  virtual size_t index() const=0;
673  };
674 
676 
681  class Coord2dSet {
682  public:
688  virtual ~Coord2dSet();
690  virtual Coord2dSet& operator++() =0;
692  virtual GYOTO_ARRAY<size_t, 2> operator* () const;
694  virtual GYOTO_ARRAY<double, 2> angles() const ;
696  virtual void begin() =0;
698  virtual bool valid() =0;
700  virtual size_t size()=0;
701  };
702 
704  class Grid: public Coord2dSet {
705  protected:
706  protected:
708  char * prefix_;
709  Coord1dSet &iset_;
710  Coord1dSet &jset_;
711  public:
712  Grid(Coord1dSet &iset, Coord1dSet &jset, const char * const p=NULL);
713  virtual ~Grid();
714  virtual Coord2dSet& operator++();
715  virtual GYOTO_ARRAY<size_t, 2> operator* () const;
716  virtual void begin();
717  virtual bool valid();
718  virtual size_t size();
719  };
720 
722 
725  class Bucket : public Coord2dSet {
726  protected:
727  Coord1dSet &alpha_;
728  Coord1dSet &delta_;
729  public:
730  Bucket(Coord1dSet &iset, Coord1dSet &jset);
731  virtual Coord2dSet& operator++();
732  virtual GYOTO_ARRAY<double, 2> angles() const;
733  virtual GYOTO_ARRAY<size_t, 2> operator*() const;
734  virtual void begin();
735  virtual bool valid();
736  virtual size_t size();
737  };
738 
740  class Empty: public Coord2dSet {
741  public:
742  Empty();
743  virtual Coord2dSet& operator++();
744  virtual void begin();
745  virtual bool valid();
746  virtual size_t size();
747  };
748 
750  class Range : public Coord1dSet {
751  protected:
752  const size_t mi_, ma_, d_, sz_;
753  size_t cur_;
754  public:
756  Range(size_t mi, size_t ma, size_t d);
757  void begin();
758  bool valid();
759  size_t size();
761  size_t operator*() const ;
762  virtual size_t index() const ;
763  };
764 
766  class Indices : public Coord1dSet {
767  protected:
768  size_t * indices_;
769  size_t const sz_;
770  size_t i_;
771  public:
772  Indices (size_t const*const buf, size_t sz);
773  ~Indices();
774  void begin();
775  bool valid();
776  size_t size();
778  size_t operator*() const ;
779  virtual size_t index() const ;
780  };
781 
783  class Angles : public Coord1dSet {
784  protected:
785  double * buf_;
786  size_t const sz_;
787  size_t i_;
788  public:
789  Angles (double const*const buf, size_t sz);
790  ~Angles();
791  void begin();
792  bool valid();
793  size_t size();
795  double angle() const ;
796  virtual size_t index() const ;
797  };
798 
800  class RepeatAngle : public Coord1dSet {
801  protected:
802  double const val_;
803  size_t const sz_;
804  size_t i_;
805  public:
806  RepeatAngle (double val, size_t sz);
807  void begin();
808  bool valid();
809  size_t size();
811  double angle() const ;
812  virtual size_t index() const ;
813  };
814 };
815 
816 #endif
1D specifier for an angle that is repeated.
Definition: GyotoScreen.h:800
double tobs_
Observing date in s.
Definition: GyotoScreen.h:180
size_t size()
Number of values in this container.
virtual ~Screen()
Destructor.
SmartPointer< Spectrometer::Generic > spectro_
Gyoto::Spectrometer::Generic subclass instance used for quantities Spectrum and BinSpectrum.
Definition: GyotoScreen.h:229
size_t operator*() const
Get size_t value currently pointed to.
double const * mask() const
Retrieve const pointer to mask_.
#define GYOTO_OBJECT
Declare class::properties and class::getProperties()
Definition: GyotoObject.h:84
int coordKind() const
Get coordinate kind.
void unmapPixUnit()
Unmap "pix" and "pixel" from unit system.
virtual GYOTO_ARRAY< size_t, 2 > operator*() const
Get pixel coordinates.
Screen * clone() const
Cloner.
virtual size_t index() const =0
Get index of value currently pointed to.
double ey_[3]
Sky coordinate of base Y vector.
Definition: GyotoScreen.h:214
virtual GYOTO_ARRAY< double, 2 > angles() const
Get angle coordinates.
void setObserverPos(const double pos[4])
Alternative way to set projection.
virtual GYOTO_ARRAY< size_t, 2 > operator*() const
Get pixel coordinates.
size_t operator*() const
Get size_t value currently pointed to.
size_t size()
Number of values in this container.
virtual size_t size()=0
Number of values in this container.
void setScreen1(const double coord[4])
Sets the screen vector e1.
double screen3_[4]
Screen e3 vector (normal)
Definition: GyotoScreen.h:220
double distance_
Distance to the observer in m.
Definition: GyotoScreen.h:199
virtual void begin()
Reset pointer.
void setScreen3(const double coord[4])
Sets the screen vector e3 (normal)
double dangle1() const
Get increment to first position angle.
double fourvel_[4]
Observer&#39;s 4-velocity.
Definition: GyotoScreen.h:217
virtual size_t operator*() const
Get size_t value currently pointed to.
double distance() const
Get distance from observer.
double freq_obs_
Frequency at which the observer observes.
Definition: GyotoScreen.h:236
Reference-counting pointers.
size_t size()
Number of values in this container.
virtual size_t index() const
Get index of value currently pointed to.
virtual GYOTO_ARRAY< double, 2 > angles() const
Get angle coordinates.
obskind_t observerkind_
What kind of observer are we considering? (At infinity, ZAMO...)
Definition: GyotoScreen.h:242
#define obskind_t
Type for observer kind.
Definition: GyotoDefs.h:581
A dummy, empty 2D set.
Definition: GyotoScreen.h:740
bool valid()
True if pointing to something, false if end has been reached.
#define size_t
If not defined in <sys/types.h>.
Definition: GyotoConfig.h:424
virtual size_t size()=0
Number of positions contained.
double dangle1_
Increment to first position angle of Screen; can be typically alpha if in Equatorial Angles...
Definition: GyotoScreen.h:222
double screen2_[4]
Screen e2 vector.
Definition: GyotoScreen.h:219
virtual Coord1dSet & operator++()=0
Increment iterator (point to next value)
Factory / SmartPointee::Subcontractor_t interface.
Definition: GyotoFactoryMessenger.h:92
void anglekind(int)
Set Screen::anglekind_.
double azimuthalFieldOfView() const
Get Screen::azimuthal_fov_.
virtual std::string kind() const
Get kind_.
Coord2dSet(CoordType_e k)
Set kind at initialisation.
virtual size_t size()
Number of positions contained.
virtual Coord2dSet & operator++()
Increment pointer.
1D coordinated specifier for a range
Definition: GyotoScreen.h:750
virtual void begin()
Reset pointer.
std::ostream & print(std::ostream &) const
Display.
double fov_
Field-of-view in rad.
Definition: GyotoScreen.h:181
virtual GYOTO_ARRAY< size_t, 2 > operator*() const
Get pixel coordinates.
double euler_[3]
Euler angles.
Definition: GyotoScreen.h:212
Definition: GyotoScreen.h:43
double argument() const
Get angle between line of nodes and X axis of object.
The camera with which the Astrobj is observed.
Definition: GyotoScreen.h:173
Range(size_t mi, size_t ma, size_t d)
Specify min, max and step of this range.
double dmax_
Maximum distance from which the photons are launched (geometrical units)
Definition: GyotoScreen.h:200
virtual Coord2dSet & operator++()
Increment pointer.
Coord1dSet & operator++()
Increment iterator (point to next value)
void setScreen2(const double coord[4])
Sets the screen vector e2.
virtual size_t index() const
Get index of value currently pointed to.
virtual bool valid()=0
True if pointing to something, false if end has been reached.
virtual ~Coord2dSet()
Virtual destructor.
double fieldOfView() const
Get Screen::fov_ in radians.
void mapPixUnit()
Map "pix" and "pixel" to angular pixel width in unit system.
std::string mask_filename_
Last read or written FITS file.
Definition: GyotoScreen.h:197
size_t npix_
Resolution in pixels.
Definition: GyotoScreen.h:184
void fitsWriteMask(std::string const &fname)
Save mask_ from FITS file.
Coord1dSet & operator++()
Increment iterator (point to next value)
CoordType_e
Enum to specify whether a coordinate set (Coord1dSet or Coord2dSet) holds pixel values or angles...
Definition: GyotoScreen.h:635
Gyoto ubiquitous macros and typedefs.
Base class for metric description.
Coord1dSet & operator++()
Increment iterator (point to next value)
double ez_[3]
Sky coordinate of base Z vector.
Definition: GyotoScreen.h:215
double dangle2() const
Get increment to second position angle.
void setProjection(const double paln, const double inclination, const double argument)
Set inclination etc.
char * prefix_
If non-NULL, cout j each tims it is incremented.
Definition: GyotoScreen.h:708
Property that can be set and got using standard methods.
Definition: GyotoProperty.h:607
void getScreen1(double dest[4]) const
Get copy of Screen::screen1_.
virtual bool valid()
Whether the end has not been passed.
anglekind_t anglekind_
Screen angles kind (0: equatorial, 1: spherical)
Definition: GyotoScreen.h:205
virtual void begin()
Reset pointer.
double azimuthal_fov_
Azimuthal field-of-view for Spherical Angles images. Maximal extent of image in the azimuthal b-angle...
Definition: GyotoScreen.h:182
void getObserverPos(double dest[4]) const
4-Position of the observer relative to the metric
void begin()
Reset specifier to point to the first value.
virtual size_t index() const
Get index of value currently pointed to.
Introspectable objects.
Spectroscopic capabilities of a Screen.
void computeBaseVectors()
Compute base vectors according to projection parameters.
Namespace for the Gyoto library.
Definition: GyotoAstrobj.h:46
virtual void begin()=0
Reset pointer.
double time() const
Get observing date in seconds.
Screen()
Default constructor.
void fitsReadMask(std::string const &fname)
Read mask_ from FITS file.
double angle() const
Get double value currently pointed to.
void getScreen3(double dest[4]) const
Get copy of Screen::screen3_.
1D specifier for an arbitrary pixel coordinate set.
Definition: GyotoScreen.h:766
Class containing arbitrary 2D-points.
Definition: GyotoScreen.h:725
Coord1dSet & operator++()
Increment iterator (point to next value)
Pointers performing reference counting.
Definition: GyotoProperty.h:45
Can be pointed to by a SmartPointer.
Definition: GyotoSmartPointer.h:80
virtual size_t size()
Number of positions contained.
GYOTO utilities.
virtual Coord2dSet & operator++()=0
Increment pointer.
void coordToXYZ(const double pos[4], double dest[3]) const
Convert 4-position to 3-cartesian coordinates.
bool operator()(size_t, size_t)
Whether this pixel should be ray-traced.
void getRayTriad(double x, double y, double dest[8], bool compute_polar_basis=false, double Ephi[4]=NULL, double Etheta[4]=NULL) const
Get 8-coordinate of Photon hitting screen from a given direction and polarization basis if needed...
size_t resolution() const
Get Screen::npix_.
double ex_[3]
Sky coordinate of base X vector.
Definition: GyotoScreen.h:213
virtual ~Coord1dSet()
Virtual destructor.
void begin()
Reset specifier to point to the first value.
void getFourVel(double dest[4]) const
Get copy of Screen::fourvel_.
double screen1_[4]
Screen e1 vector.
Definition: GyotoScreen.h:218
virtual double angle() const
Get double value currently pointed to.
size_t size()
Number of values in this container.
double freqObs() const
Get freq_obs_.
double angle() const
Get double value currently pointed to.
virtual Coord2dSet & operator++()
Increment pointer.
virtual void begin()=0
Reset specifier to point to the first value.
void begin()
Reset specifier to point to the first value.
SmartPointer< Metric::Generic > gg_
The Metric in this end of the Universe.
Definition: GyotoScreen.h:224
virtual bool valid()=0
Whether the end has not been passed.
bool valid()
True if pointing to something, false if end has been reached.
double PALN() const
Get position angle of the line of nodes.
void getScreen2(double dest[4]) const
Get copy of Screen::screen2_.
SmartPointer< Metric::Generic > metric() const
Get Screen::gg_.
virtual size_t size()
Number of positions contained.
Class to specify a set of points on the Screen.
Definition: GyotoScreen.h:681
double inclination() const
Get inclination relative to line-of-sight.
Coord1dSet(CoordType_e k)
Set kind during initialization.
void fillProperty(Gyoto::FactoryMessenger *fmp, Property const &p) const
Output a single Property to XML.
Object with properties.
Definition: GyotoObject.h:151
1D specifier for an arbitrary angle coordinate set.
Definition: GyotoScreen.h:783
const CoordType_e kind
Whether this set holds pixels or angle specifications.
Definition: GyotoScreen.h:684
bool valid()
True if pointing to something, false if end has been reached.
void begin()
Reset specifier to point to the first value.
void setFourVel(const double coord[4])
Sets the observer&#39;s 4-velocity.
virtual bool valid()
Whether the end has not been passed.
void coordToSky(const double pos[4], double dest[3], bool geometrical=false) const
Convert metric 4-position to sky 3-position.
virtual size_t index() const
Get index of value currently pointed to.
static SmartPointer< Screen > Subcontractor(FactoryMessenger *fmp)
Instanciate a Screen from XML entity.
double dangle2_
Increment to second position angle of Screen; can be typically delta if in Equatorial Angles...
Definition: GyotoScreen.h:223
void skyToCoord(const double sky[3], double dest[4], bool geometrical=false) const
Convert sky 3-position to metric 4-position.
Class containing 2D-points organized in a grid.
Definition: GyotoScreen.h:704
virtual bool valid()
Whether the end has not been passed.
SmartPointer< Spectrometer::Generic > spectrometer() const
Get Screen::spectro_.
double * mask_
Mask with 0 where the ray-tracing should not be performed.
Definition: GyotoScreen.h:189
double dMax() const
Get maximum ray-tracing distance.
std::ostream & printBaseVectors(std::ostream &) const
Debug helper.
const CoordType_e kind
Whether this specifier represents angles or pixels.
Definition: GyotoScreen.h:648
Set of 1-d coordinates: indices or angles.
Definition: GyotoScreen.h:645
bool valid()
True if pointing to something, false if end has been reached.