Program Listing for File CCD.cpp¶
↰ Return to documentation for file (src/CCD.cpp)
#include "CCD.h"
#include <CCfits/CCfits>
#include "helper.h"
CCD::CCD(int Nx, int Ny, double pixelsize) : Nx(Nx), Ny(Ny), pixel_size(pixelsize) {
{
this->data = std::vector<int>(Ny * Nx, 0);
}
}
double *CCD::get_pixelsize() {
return &this->pixel_size;
}
void CCD::save_to_hdf(std::string filename, bool bleed, bool overwrite) {
// cv::Mat res = this->get_image(down_sample, bleed);
// hdf5opencv::hdf5save(filename.c_str(), "image", res, overwrite);
// MatToFile(res, filename);
}
void CCD::save_to_fits(std::string filename, bool overwrite) {
int n_axis = 2;
long n_axes[2] = {Nx, Ny};
std::unique_ptr<CCfits::FITS> pFits;
// Try to read in old image
long old_img_ax1 = 0;
long old_img_ax2 = 0;
std::valarray<int> contents;
try {
pFits.reset(new CCfits::FITS(filename, CCfits::Read));
CCfits::PHDU &image = pFits->pHDU();
image.readAllKeys();
image.read(contents);
old_img_ax1 = image.axis(0);
old_img_ax2 = image.axis(1);
pFits->destroy();
std::cout << "Old data found" << std::endl;
}
catch (...) {
// no old data
std::cout << "No old data found" << std::endl;;
pFits.reset(new CCfits::FITS(filename, LONG_IMG, n_axis, n_axes));
pFits->flush();
pFits->destroy();
}
try {
pFits.reset(new CCfits::FITS(filename, CCfits::Write));
}
catch (CCfits::FITS::CantCreate) {
// ... or not, as the case may be.
std::cout << "Can't create FITS file." << std::endl;
}
long n_elements(1);
n_elements = std::accumulate(&n_axes[0], &n_axes[n_axis], 1, std::multiplies<long>());
long f_pixel(1);
std::valarray<int> data_array(Nx * Ny);
if ((old_img_ax1 > 0) & (old_img_ax2 > 0) & !overwrite) {
for (int i = 0; i < Nx * Ny; ++i) {
data_array[i] = (int) this->data[i] + contents[i];
}
} else {
for (int i = 0; i < Nx * Ny; ++i) {
data_array[i] = (int) this->data[i];
}
}
pFits->pHDU().write(f_pixel, n_elements, data_array);
pFits->flush();
}
CCD::~CCD() = default;
//cv::Mat CCD::get_image(bool down_sample, bool bleed) {
// cv::Mat result;
// cv::Mat initial(Ny,Nx, CV_16UC1);
// for(int i=0; i<Ny; ++i){
// for (int j = 0; j < Nx; ++j) {
// initial.at<unsigned short>(j, i) = (unsigned short) this->data[j*Nx+i];
// }
// }
// if (down_sample){
// #ifdef USE_GPU
// {
// this->data.download(result)
// };
// #else
// {
// result = cv::Mat(Ny, Nx, initial.type());
// }
// #endif
// cv::resize(initial, result, result.size(), cv::INTER_NEAREST);
// }
// else {
// result = initial;
// }
//
// if (bleed){
// this->do_bleed(result, 650000.);
// }
//
// return result;
//}
//void do_bleed_up_down(cv::Mat &input, double & limit, int i, int j){
// //find limit
// int k = i;
// while ((k>1) && (k<input.rows-1) && (input.at<unsigned short>(k, j)))
// {
// k++;
// }
//
// if(i>0)
// {
// if (input.at<unsigned short>(i-1,j) > limit)
// do_bleed_up_down(input, limit, i-1, j);
// }
// double diff = input.at<double>(i, j) - limit;
// if ((diff > 0) && (i + 2 < input.rows) && (i - 2 > 0)) {
// std::cout<< i << "\t" << j << std::endl;
// input.at<double>(i + 1, j) += diff/2.;
// input.at<double>(i - 1, j) += diff/2.;
// input.at<double>(i, j) -= diff;
// do_bleed_up_down(input, limit, i - 1, j);
// do_bleed_up_down(input, limit, i + 1, j);
// }
//}
//void do_bleed_down(cv::Mat &input, double limit, int i, int j){
// double diff = input.at<double>(i,j) - limit;
// if ((diff>0) && (i+1 < input.rows) && (i-1 >0)) {
// input.at<double>(i - 1, j) += diff / 2.;
// do_bleed_down(input, limit, i - 1, j);
// }
//
//}
//void CCD::do_bleed(cv::Mat &input, double limit) {
//
// for(int i=0; i<input.cols; ++i) {
// for (int j = 0; j < input.rows; ++j) {
// if(input.at<unsigned short>(j,i) > limit){
// do_bleed_up_down(input, limit, j, i);
// }
// }
// }
//}
//