GRALE
projectedimagesinterface.h
Go to the documentation of this file.
1 /*
2 
3  This file is a part of GRALE, a library to facilitate the simulation
4  and inversion of gravitational lenses.
5 
6  Copyright (C) 2008-2012 Jori Liesenborgs
7 
8  Contact: jori.liesenborgs@gmail.com
9 
10  This program is free software; you can redistribute it and/or modify
11  it under the terms of the GNU General Public License as published by
12  the Free Software Foundation; either version 2 of the License, or
13  (at your option) any later version.
14 
15  This program is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  GNU General Public License for more details.
19 
20  You should have received a copy of the GNU General Public License
21  along with this program; if not, write to the Free Software
22  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23 
24 */
25 
30 #ifndef GRALE_PROJECTEDIMAGESINTERFACE_H
31 
32 #define GRALE_PROJECTEDIMAGESINTERFACE_H
33 
34 #include "graleconfig.h"
35 #include "vector2d.h"
36 #include "constants.h"
37 #include <stdio.h>
38 #include <vector>
39 #include <list>
40 
41 namespace grale
42 {
43 
44 class ImagesDataExtended;
45 
69 class GRALE_IMPORTEXPORT ProjectedImagesInterface
70 {
71 protected:
73 public:
74  virtual ~ProjectedImagesInterface() { }
75 
79  int getNumberOfSources() const { return m_offsets.size(); }
80 
82  int getNumberOfImages(int sourceNumber) const { return m_offsets[sourceNumber].size(); }
83 
85  int getNumberOfImagePoints(int sourceNumber) const { return m_numTotalPoints[sourceNumber]; }
86 
88  int getNumberOfImagePoints(int sourceNumber, int imageNumber) const { return m_numPoints[sourceNumber][imageNumber]; }
89 
91  bool hasOriginalIntensities(int sourceNumber) const { return m_originalIntensityFlags[sourceNumber]; }
92 
94  bool hasOriginalShearInfo(int sourceNumber) const { return m_originalShearInfoFlags[sourceNumber]; }
95 
98  const float *getOriginalIntensities(int sourceNumber) const { return &(m_originalIntensities[sourceNumber][0]); }
99 
102  const float *getOriginalIntensities(int sourceNumber, int imageNumber) const { return &(m_originalIntensities[sourceNumber][m_offsets[sourceNumber][imageNumber]]); }
103 
105  const float *getOriginalShearComponent1s(int sourceNumber) const { return &(m_originalShearComponent1s[sourceNumber][0]); }
106 
108  const float *getOriginalShearComponent1s(int sourceNumber, int imageNumber) const { return &(m_originalShearComponent1s[sourceNumber][m_offsets[sourceNumber][imageNumber]]); }
109 
111  const float *getOriginalShearComponent2s(int sourceNumber) const { return &(m_originalShearComponent2s[sourceNumber][0]); }
112 
114  const float *getOriginalShearComponent2s(int sourceNumber, int imageNumber) const { return &(m_originalShearComponent2s[sourceNumber][m_offsets[sourceNumber][imageNumber]]); }
115 
117  int getOriginalNumberOfTimeDelays(int sourceNumber) const { return m_originalTimeDelayInfo[sourceNumber].size(); }
118 
122  void getOriginalTimeDelay(int sourceNumber, int index, int *pImg, int *pPoint, float *pDelay) const { *pImg = m_originalTimeDelayInfo[sourceNumber][index].getImageIndex(); *pPoint = m_originalTimeDelayInfo[sourceNumber][index].getPointIndex(); *pDelay = m_originalTimeDelayInfo[sourceNumber][index].getTimeDelay(); }
123 
125  double getIntensityScale() const { return m_intensityScale; }
126 
127  // For internal use only
128  bool setDistanceFractions(const std::vector<float> &fractions);
129 
131  virtual double getAngularScale() const = 0;
132 
134  virtual const Vector2D<float> *getBetas(int sourcenum) const = 0;
135 
137  virtual const Vector2D<float> *getBetas(int sourcenum, int imagenum) const = 0;
138 
140  virtual const Vector2D<float> *getThetas(int sourcenum) const = 0;
141 
143  virtual const Vector2D<float> *getThetas(int sourcenum, int imagenum) const = 0;
144 
146  virtual const float *getDerivativesXX(int sourceNumber) const = 0;
147 
149  virtual const float *getDerivativesXX(int sourceNumber, int imageNumber) const = 0;
150 
152  virtual const float *getDerivativesYY(int sourceNumber) const = 0;
153 
155  virtual const float *getDerivativesYY(int sourceNumber, int imageNumber) const = 0;
156 
158  virtual const float *getDerivativesXY(int sourceNumber) const = 0;
159 
161  virtual const float *getDerivativesXY(int sourceNumber, int imageNumber) const = 0;
162 
165  virtual const float *getInverseMagnifications(int sourcenum) const = 0;
166 
169  virtual const float *getInverseMagnifications(int sourcenum, int imagenum) const = 0;
170 
172  virtual const float *getShearComponents1(int sourceNumber) const = 0;
173 
175  virtual const float *getShearComponents1(int sourceNumber, int imageNumber) const = 0;
176 
178  virtual const float *getShearComponents2(int sourceNumber) const = 0;
179 
181  virtual const float *getShearComponents2(int sourceNumber, int imageNumber) const = 0;
182 
184  virtual const float *getConvergence(int sourceNumber) const = 0;
185 
187  virtual const float *getConvergence(int sourceNumber, int imageNumber) const = 0;
188 
191  virtual float getTimeDelay(int sourceNumber, int imageNumber, int pointNumber, Vector2D<float> beta) const = 0; // in days!
192 
193  void dump(bool magnifyFlux) const
194  {
195  int numSources = getNumberOfSources();
196 
197  for (int s = 0 ; s < numSources ; s++)
198  {
199  int numImages = getNumberOfImages(s);
200 
201  for (int i = 0 ; i < numImages ; i++)
202  {
203  int numPoints = getNumberOfImagePoints(s, i);
204 
205  for (int p = 0 ; p < numPoints ; p++)
206  {
207  Vector2D<float> beta = getBetas(s, i)[p];
208  Vector2D<double> beta2(beta.getX(), beta.getY());
209  double intens = getOriginalIntensities(s, i)[p];
210 
211  if (magnifyFlux)
212  intens *= getInverseMagnifications(s, i)[p];
213 
214  beta2 *= getAngularScale();
215  intens *= getIntensityScale();
216 
217  printf("%10.10g %10.10g %10.10g\n",(double)(beta2.getX()/ANGLE_ARCSEC),(double)(beta2.getY()/ANGLE_ARCSEC),intens);
218  }
219  }
220  }
221  }
222 protected:
223  void storeOriginalData(const std::vector<ImagesDataExtended *> &images,
224  bool storeOriginalIntensities, bool storeOriginalTimeDelays, bool storeOriginalShearInfo);
225 
226  class TimeDelayPoint
227  {
228  public:
229  TimeDelayPoint(int imageIndex, int pointIndex, float timeDelay)
230  {
231  m_imageIndex = imageIndex;
232  m_pointIndex = pointIndex;
233  m_timeDelay = timeDelay;
234  }
235 
236  int getImageIndex() const { return m_imageIndex; }
237  int getPointIndex() const { return m_pointIndex; }
238  float getTimeDelay() const { return m_timeDelay; }
239  private:
240  int m_imageIndex;
241  int m_pointIndex;
242  float m_timeDelay;
243  };
244 
245  std::vector<std::vector<int> > m_offsets;
246  std::vector<std::vector<int> > m_numPoints;
247  std::vector<int> m_numTotalPoints;
248 
249  double m_intensityScale;
250  std::vector<float> m_distanceFractions;
251  std::vector<bool> m_originalIntensityFlags;
252  std::vector<bool> m_originalShearInfoFlags;
253  std::vector<std::vector<float> > m_originalIntensities;
254  std::vector<std::vector<float> > m_originalShearComponent1s;
255  std::vector<std::vector<float> > m_originalShearComponent2s;
256  std::vector<std::vector<TimeDelayPoint> > m_originalTimeDelayInfo;
257 };
258 
259 } // end namespace
260 
261 #endif // GRALE_PROJECTEDIMAGESINTERFACE_H
262