COMPASS  5.0.0
End-to-end AO simulation tool using GPU acceleration
sutra_centroider.h
Go to the documentation of this file.
1 // -----------------------------------------------------------------------------
2 // This file is part of COMPASS <https://anr-compass.github.io/compass/>
3 //
4 // Copyright (C) 2011-2019 COMPASS Team <https://github.com/ANR-COMPASS>
5 // All rights reserved.
6 // Distributed under GNU - LGPL
7 //
8 // COMPASS is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser
9 // General Public License as published by the Free Software Foundation, either version 3 of the License,
10 // or any later version.
11 //
12 // COMPASS: End-to-end AO simulation tool using GPU acceleration
13 // The COMPASS platform was designed to meet the need of high-performance for the simulation of AO systems.
14 //
15 // The final product includes a software package for simulating all the critical subcomponents of AO,
16 // particularly in the context of the ELT and a real-time core based on several control approaches,
17 // with performances consistent with its integration into an instrument. Taking advantage of the specific
18 // hardware architecture of the GPU, the COMPASS tool allows to achieve adequate execution speeds to
19 // conduct large simulation campaigns called to the ELT.
20 //
21 // The COMPASS platform can be used to carry a wide variety of simulations to both testspecific components
22 // of AO of the E-ELT (such as wavefront analysis device with a pyramid or elongated Laser star), and
23 // various systems configurations such as multi-conjugate AO.
24 //
25 // COMPASS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
26 // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
27 // See the GNU Lesser General Public License for more details.
28 //
29 // You should have received a copy of the GNU Lesser General Public License along with COMPASS.
30 // If not, see <https://www.gnu.org/licenses/lgpl-3.0.txt>.
31 // -----------------------------------------------------------------------------
32 
41 
42 
43 #ifndef _SUTRA_CENTROIDER_H_
44 #define _SUTRA_CENTROIDER_H_
45 
46 #include <sutra_acquisim.h>
47 #include <sutra_wfs.h>
48 #include <string>
49 
50 template <class Tin, class Tout>
52 public:
53  int device;
55  int nvalid;
56  int nslopes;
57  int npix;
58  int nxsub;
59  bool filter_TT;
60 
61  float offset;
62  float scale;
63 
65 
68  CarmaObj<Tout> *d_centroids_ref; // ref centroids
77 
82 
83 protected:
85  float offset, float scale, bool filter_TT, int device);
86 
87 private:
88  template <typename Q = Tout>
89  typename std::enable_if<std::is_same<Q, float>::value, int>::type
90  apply_TT_filter_impl(Tout *centroids, std::true_type);
91  int apply_TT_filter_impl(Tout *centroids, std::false_type);
92 
93 public:
94  virtual ~SutraCentroider();
95  int set_scale(float scale);
96  int set_offset(float offset);
97  int set_dark(float *dark, int n);
98  int set_flat(float *flat, int n);
99  int set_lutPix(int *lutPix, int n);
100  int init_calib(int n, int m);
101  int init_roi(int N);
102  int set_centroids_ref(float *centroids_ref);
103  int calibrate_img() {return calibrate_img(0);};
104  int calibrate_img(cudaStream_t stream);
105  int load_validpos(int *ivalid, int *jvalid, int N);
106  int set_npix(int npix);
107  int set_nxsub(int nxsub);
108  int load_img(Tin *img, int n);
109  int load_img(Tin *img, int n, int location);
110  int load_img(Tin *img, int m, int n, int location);
112  int init_img_raw(int m, int n);
114  bool is_type(string typec) { return (typec.compare(get_type()) == 0); }
116  int apply_TT_filter(Tout *centroids);
117 
118  virtual string get_type() = 0;
119 
120  virtual int get_cog(float *img, float *intensities, Tout *centroids,
121  int nvalid, int npix, int ntot, cudaStream_t stream=0) = 0;
122  virtual int get_cog(float *intensities, Tout *slopes, bool noise) = 0;
123  virtual int get_cog() = 0;
124 };
125 template <class Tin>
126 int calibration(Tin *img_raw, float *img_cal, float *dark, float *flat, int *lutPix, int N,
127  CarmaDevice *device, cudaStream_t stream=0);
128 
129 template <typename T>
130 int convert_centro(T *d_odata, T *d_idata, float offset, float scale, int N,
131  CarmaDevice *device);
132 int fill_validMask(int size, int npix, int blocks, int *d_validMask,
133  int *validx, int *validy, CarmaDevice *device);
134 
135 #endif // _SUTRA_CENTROIDER_H_
SutraCentroider::set_dark
int set_dark(float *dark, int n)
SutraCentroider::get_cog
virtual int get_cog(float *intensities, Tout *slopes, bool noise)=0
SutraCentroider::apply_TT_filter
int apply_TT_filter(Tout *centroids)
SutraCentroider::d_centro_filtered
CarmaObj< float > * d_centro_filtered
Definition: sutra_centroider.h:78
SutraCentroider::d_validx
CarmaObj< int > * d_validx
Definition: sutra_centroider.h:74
SutraCentroider::SutraCentroider
SutraCentroider(CarmaContext *context, SutraWfs *wfs, long nvalid, float offset, float scale, bool filter_TT, int device)
CarmaDevice
Definition: carma_context.h:57
SutraCentroider::set_npix
int set_npix(int npix)
SutraCentroider::wfs
SutraWfs * wfs
Definition: sutra_centroider.h:54
SutraCentroider::set_scale
int set_scale(float scale)
SutraCentroider::set_offset
int set_offset(float offset)
SutraCentroider::d_dark
CarmaObj< float > * d_dark
Definition: sutra_centroider.h:71
SutraCentroider::filter_TT
bool filter_TT
Definition: sutra_centroider.h:59
SutraCentroider::offset
float offset
Definition: sutra_centroider.h:61
convert_centro
int convert_centro(T *d_odata, T *d_idata, float offset, float scale, int N, CarmaDevice *device)
SutraCentroider::d_ref_Tilt
CarmaObj< float > * d_ref_Tilt
Definition: sutra_centroider.h:80
SutraCentroider::get_cog
virtual int get_cog()=0
SutraCentroider::set_nxsub
int set_nxsub(int nxsub)
SutraCentroider::d_validy
CarmaObj< int > * d_validy
Definition: sutra_centroider.h:75
SutraWfs
this class provides the wfs features to COMPASS
Definition: sutra_wfs.h:60
SutraCentroider::d_centroids_ref
CarmaObj< Tout > * d_centroids_ref
Definition: sutra_centroider.h:68
SutraCentroider::set_lutPix
int set_lutPix(int *lutPix, int n)
SutraCentroider::load_img
int load_img(Tin *img, int m, int n, int location)
SutraCentroider::nxsub
int nxsub
Definition: sutra_centroider.h:58
SutraCentroider::get_validMask
int get_validMask()
SutraCentroider::d_validMask
CarmaObj< int > * d_validMask
Definition: sutra_centroider.h:76
sutra_wfs.h
SutraCentroider::calibrate_img
int calibrate_img()
Definition: sutra_centroider.h:103
SutraCentroider::set_flat
int set_flat(float *flat, int n)
SutraCentroider::npix
int npix
Definition: sutra_centroider.h:57
SutraCentroider::get_cog
virtual int get_cog(float *img, float *intensities, Tout *centroids, int nvalid, int npix, int ntot, cudaStream_t stream=0)=0
SutraCentroider::d_flat
CarmaObj< float > * d_flat
Definition: sutra_centroider.h:72
SutraCentroider::load_img
int load_img(Tin *img, int n, int location)
SutraCentroider::init_img_raw
int init_img_raw(int m, int n)
fill_validMask
int fill_validMask(int size, int npix, int blocks, int *d_validMask, int *validx, int *validy, CarmaDevice *device)
SutraCentroider::init_calib
int init_calib(int n, int m)
SutraCentroider::current_context
CarmaContext * current_context
Definition: sutra_centroider.h:64
SutraCentroider::load_validpos
int load_validpos(int *ivalid, int *jvalid, int N)
CarmaObj< Tout >
CarmaContext
this class provides the context in which CarmaObj are created
Definition: carma_context.h:104
SutraCentroider
this class provides the centroider features to COMPASS
Definition: sutra_centroider.h:51
SutraCentroider::get_type
virtual string get_type()=0
sutra_acquisim.h
SutraCentroider::d_img
CarmaObj< float > * d_img
Definition: sutra_centroider.h:69
SutraCentroider::is_type
bool is_type(string typec)
Definition: sutra_centroider.h:114
SutraCentroider::d_TT_slopes
CarmaObj< float > * d_TT_slopes
Definition: sutra_centroider.h:81
SutraCentroider::scale
float scale
Definition: sutra_centroider.h:62
SutraCentroider::init_TT_filter
int init_TT_filter()
calibration
int calibration(Tin *img_raw, float *img_cal, float *dark, float *flat, int *lutPix, int N, CarmaDevice *device, cudaStream_t stream=0)
SutraCentroider::load_img
int load_img(CarmaObj< Tin > *img)
SutraCentroider::load_img
int load_img(Tin *img, int n)
SutraCentroider::init_roi
int init_roi(int N)
SutraCentroider::nvalid
int nvalid
Definition: sutra_centroider.h:55
SutraCentroider::calibrate_img
int calibrate_img(cudaStream_t stream)
SutraCentroider::d_intensities
CarmaObj< float > * d_intensities
Definition: sutra_centroider.h:67
SutraCentroider::nslopes
int nslopes
Definition: sutra_centroider.h:56
SutraCentroider::d_ref_Tip
CarmaObj< float > * d_ref_Tip
Definition: sutra_centroider.h:79
SutraCentroider::device
int device
Definition: sutra_centroider.h:53
SutraCentroider::set_centroids_ref
int set_centroids_ref(float *centroids_ref)
SutraCentroider::d_bincube
CarmaObj< Tout > * d_bincube
Definition: sutra_centroider.h:66
SutraCentroider::d_lutPix
CarmaObj< int > * d_lutPix
Definition: sutra_centroider.h:73
SutraCentroider::d_img_raw
CarmaObj< Tin > * d_img_raw
Definition: sutra_centroider.h:70
SutraCentroider::~SutraCentroider
virtual ~SutraCentroider()