diff options
Diffstat (limited to 'fitsy++/analysis.C')
-rw-r--r-- | fitsy++/analysis.C | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/fitsy++/analysis.C b/fitsy++/analysis.C new file mode 100644 index 0000000..cf7280a --- /dev/null +++ b/fitsy++/analysis.C @@ -0,0 +1,94 @@ +// Copyright (C) 1999-2018 +// Smithsonian Astrophysical Observatory, Cambridge, MA, USA +// For conditions of distribution and use, see copyright notice in "copyright" + +#include "analysis.h" +#include "util.h" + +FitsAnalysis::FitsAnalysis(FitsFile* src, int bitpix) +{ + primary_ = src->primary(); + managePrimary_ = 0; + + head_ = new FitsHead(*(src->head())); + manageHead_ = 1; + + ext_ = src->ext(); + inherit_ = src->inherit(); + + int width = head_->naxis(0); + int height = head_->naxis(1); + size_t size = (size_t)width*height; + + switch (bitpix) { + case 8: + head_->setInteger("BITPIX", 8, ""); + data_ = new unsigned char[size]; + if (data_) + memset(data_, 0, size*sizeof(unsigned char)); + break; + case 16: + head_->setInteger("BITPIX", 16, ""); + data_ = new short[size]; + if (data_) + memset(data_, 0, size*sizeof(short)); + break; + case -16: + head_->setInteger("BITPIX", -16, ""); + data_ = new unsigned short[size]; + if (data_) + memset(data_, 0, size*sizeof(unsigned short)); + break; + case 32: + head_->setInteger("BITPIX", 32, ""); + data_ = new int[size]; + if (data_) + memset(data_, 0, size*sizeof(int)); + break; + case 64: + head_->setInteger("BITPIX", 64, ""); + data_ = new long long[size]; + if (data_) + memset(data_, 0, size*sizeof(long long)); + break; + case -32: + head_->setInteger("BITPIX", -32, ""); + data_ = new float[size]; + if (data_) + memset(data_, 0, size*sizeof(float)); + break; + case -64: + head_->setInteger("BITPIX", -64, ""); + data_ = new double[size]; + if (data_) + memset(data_, 0, size*sizeof(double)); + break; + } + + // alloc memory + if (!data_) + return; + + // unset BZERO/BSCALE if present + if (head_->find("BZERO")) + head_->setReal("BZERO",0,2,NULL); + + if (head_->find("BSCALE")) + head_->setReal("BSCALE",1,2,NULL); + + head_->updateHDU(); + + // made it this far, must be valid + dataSize_ = size; + dataSkip_ = 0; + byteswap_ = 0; + endian_ = lsb() ? LITTLE : BIG; + valid_ = 1; +} + +FitsAnalysis::~FitsAnalysis() +{ + if (data_) + delete [] (char*)data_; +} + |