summaryrefslogtreecommitdiffstats
path: root/fitsy/analysis.C
diff options
context:
space:
mode:
Diffstat (limited to 'fitsy/analysis.C')
-rw-r--r--fitsy/analysis.C94
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_;
+}
+