summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tksao/fitsy++/file.h1
-rw-r--r--tksao/fitsy++/savefits.C146
-rw-r--r--tksao/frame/frsave.C6
3 files changed, 50 insertions, 103 deletions
diff --git a/tksao/fitsy++/file.h b/tksao/fitsy++/file.h
index 674e9cd..e410d92 100644
--- a/tksao/fitsy++/file.h
+++ b/tksao/fitsy++/file.h
@@ -87,6 +87,7 @@ protected:
int validParams();
int findEnd(const char*);
void setByteSwap();
+ int saveFitsHeaderCards(OutFitsStream&, int, int);
public:
FitsFile();
diff --git a/tksao/fitsy++/savefits.C b/tksao/fitsy++/savefits.C
index f539d5e..96870ba 100644
--- a/tksao/fitsy++/savefits.C
+++ b/tksao/fitsy++/savefits.C
@@ -41,19 +41,14 @@ int FitsFile::saveFitsPrimHeader(OutFitsStream& str)
return FTY_BLOCK;
}
-int FitsFile::saveFitsHeader(OutFitsStream& str, int depth)
+int FitsFile::saveFitsHeaderCards(OutFitsStream& str, int depth, int cc)
{
- int cnt =0;
char buf[FTY_CARDLEN];
+ int cnt = 0;
- memset(buf,' ',FTY_CARDLEN);
- memcpy(buf,"SIMPLE = ",10);
- memcpy(buf+32-3,"T /",3);
- str.write(buf, FTY_CARDLEN);
- cnt += FTY_CARDLEN;
-
- char* ptr = head()->cards()+FTY_CARDLEN;
+ char* ptr = head()->cards() + cc;
char* end = head()->cards() + head()->headbytes();
+
while (ptr<end) {
if (!strncmp(ptr,"BITPIX",6) && head()->bitpix() == -16) {
memset(buf,' ',FTY_CARDLEN);
@@ -91,15 +86,15 @@ int FitsFile::saveFitsHeader(OutFitsStream& str, int depth)
}
}
else if (!strncmp(ptr,"NAXIS3",6)) {
- // skip
+ // skip, we already take care of it above
cnt -= FTY_CARDLEN;
}
else if (!strncmp(ptr,"NAXIS4",6)) {
- // skip
+ // skip, better not be here
cnt -= FTY_CARDLEN;
}
else if (!strncmp(ptr,"NAXIS5",6)) {
- // skip
+ // skip, better not be here
cnt -= FTY_CARDLEN;
}
else if (!strncmp(ptr,"PCOUNT",6)) {
@@ -111,13 +106,34 @@ int FitsFile::saveFitsHeader(OutFitsStream& str, int depth)
cnt -= FTY_CARDLEN;
}
else if (!strncmp(ptr,"END ",6)) {
- // skip
+ // skip, will insert at the end
cnt -= FTY_CARDLEN;
}
+ else if (!strncmp(ptr,"CRVAL3",6) && depth==1)
+ // skip
+ cnt -= FTY_CARDLEN;
+ else if (!strncmp(ptr,"CRPIX3",6) && depth==1)
+ // skip
+ cnt -= FTY_CARDLEN;
+ else if (!strncmp(ptr,"CDELT3",6) && depth==1)
+ // skip
+ cnt -= FTY_CARDLEN;
+ else if (!strncmp(ptr,"CTYPE3",6) && depth==1)
+ // skip
+ cnt -= FTY_CARDLEN;
+ else if (!strncmp(ptr,"CUNIT3",6) && depth==1)
+ // skip
+ cnt -= FTY_CARDLEN;
+ else if (!strncmp(ptr,"CD3_",4) && depth==1)
+ // skip
+ cnt -= FTY_CARDLEN;
+ else if (!strncmp(ptr,"PC3_",4) && depth==1)
+ // skip
+ cnt -= FTY_CARDLEN;
else
str.write(ptr, FTY_CARDLEN);
- ptr+=FTY_CARDLEN;
+ ptr += FTY_CARDLEN;
cnt += FTY_CARDLEN;
}
@@ -127,110 +143,40 @@ int FitsFile::saveFitsHeader(OutFitsStream& str, int depth)
str.write(buf, FTY_CARDLEN);
cnt += FTY_CARDLEN;
- cnt += saveFitsPad(str,cnt,' ');
-
return cnt;
}
-int FitsFile::saveFitsXtHeader(OutFitsStream& str, int depth)
+int FitsFile::saveFitsHeader(OutFitsStream& str, int depth)
{
- // write xtension header
- // the header may be an xtension, or primary, so lets force a
- // first line of 'SIMPLE' and then write the rest of the header
int cnt =0;
char buf[FTY_CARDLEN];
memset(buf,' ',FTY_CARDLEN);
- memcpy(buf,"XTENSION= 'IMAGE '",20);
+ memcpy(buf,"SIMPLE = ",10);
+ memcpy(buf+32-3,"T /",3);
str.write(buf, FTY_CARDLEN);
cnt += FTY_CARDLEN;
- char* ptr = head()->cards()+FTY_CARDLEN;
- char* end = head()->cards() + head()->headbytes();
- while (ptr<end) {
- if (!strncmp(ptr,"BITPIX",6) && head()->bitpix() == -16) {
- memset(buf,' ',FTY_CARDLEN);
- memcpy(buf,"BITPIX = ",10);
- memcpy(buf+32-4,"32 /",4);
- str.write(buf, FTY_CARDLEN);
- }
- else if (!strncmp(ptr,"NAXIS ",6)) {
- memset(buf,' ',FTY_CARDLEN);
- memcpy(buf,"NAXIS = ",10);
- if (depth>1)
- memcpy(buf+32-3,"3 /",3);
- else
- if (head()->naxis(1)>1)
- memcpy(buf+32-3,"2 /",3);
- else
- memcpy(buf+32-3,"1 /",3);
- str.write(buf, FTY_CARDLEN);
- }
- else if (!strncmp(ptr,"NAXIS2",6)) {
- str.write(ptr, FTY_CARDLEN);
-
- if (depth>1) {
- ostringstream ddstr;
- ddstr << depth << " /" << ends;
- const char* ddptr = ddstr.str().c_str();
- int ll = strlen(ddptr);
-
- memset(buf,' ',FTY_CARDLEN);
- memcpy(buf,"NAXIS3 = ",10);
- memcpy(buf+32-ll, ddptr, ll);
- str.write(buf, FTY_CARDLEN);
- cnt += FTY_CARDLEN;
- }
-
- memset(buf,' ',FTY_CARDLEN);
- memcpy(buf,"PCOUNT = ",10);
- memcpy(buf+32-3,"0 /",3);
- str.write(buf, FTY_CARDLEN);
- cnt += FTY_CARDLEN;
+ cnt += saveFitsHeaderCards(str,depth,cnt);
+ cnt += saveFitsPad(str,cnt,' ');
- memset(buf,' ',FTY_CARDLEN);
- memcpy(buf,"GCOUNT = ",10);
- memcpy(buf+32-3,"1 /",3);
- str.write(buf, FTY_CARDLEN);
- cnt += FTY_CARDLEN;
- }
- else if (!strncmp(ptr,"NAXIS3",6)) {
- // skip
- cnt -= FTY_CARDLEN;
- }
- else if (!strncmp(ptr,"NAXIS4",6)) {
- // skip
- cnt -= FTY_CARDLEN;
- }
- else if (!strncmp(ptr,"NAXIS5",6)) {
- // skip
- cnt -= FTY_CARDLEN;
- }
- else if (!strncmp(ptr,"PCOUNT",6)) {
- // skip
- cnt -= FTY_CARDLEN;
- }
- else if (!strncmp(ptr,"GCOUNT",6)) {
- // skip
- cnt -= FTY_CARDLEN;
- }
- else if (!strncmp(ptr,"END ",6)) {
- // skip
- cnt -= FTY_CARDLEN;
- }
- else
- str.write(ptr, FTY_CARDLEN);
+ return cnt;
+}
- ptr+=FTY_CARDLEN;
- cnt += FTY_CARDLEN;
- }
+int FitsFile::saveFitsXtHeader(OutFitsStream& str, int depth)
+{
+ // write xtension header
+ // the header may be an xtension, or primary, so lets force a
+ // first line of 'SIMPLE' and then write the rest of the header
+ int cnt =0;
+ char buf[FTY_CARDLEN];
- // final END
memset(buf,' ',FTY_CARDLEN);
- memcpy(buf,"END",3);
+ memcpy(buf,"XTENSION= 'IMAGE '",20);
str.write(buf, FTY_CARDLEN);
cnt += FTY_CARDLEN;
+ cnt += saveFitsHeaderCards(str,depth,cnt);
cnt += saveFitsPad(str,cnt,' ');
return cnt;
diff --git a/tksao/frame/frsave.C b/tksao/frame/frsave.C
index a7b26d4..791d31c 100644
--- a/tksao/frame/frsave.C
+++ b/tksao/frame/frsave.C
@@ -54,7 +54,7 @@ void Base::saveFitsSlice(OutFitsStream& str)
if (!ptr)
return;
- ptr->saveFitsHeader(str,0);
+ ptr->saveFitsHeader(str,1);
size_t cnt = ptr->saveFits(str);
ptr->saveFitsPad(str,cnt,'\0');
}
@@ -67,7 +67,7 @@ void Base::saveFitsExtCube(OutFitsStream& str)
ptr->saveFitsPrimHeader(str);
while (ptr) {
- ptr->saveFitsXtHeader(str, 0);
+ ptr->saveFitsXtHeader(str, 1);
size_t cnt = ptr->saveFits(str);
ptr->saveFitsPad(str,cnt,'\0');
ptr = ptr->nextSlice();
@@ -130,7 +130,7 @@ void FrameRGB::saveFitsRGBImage(OutFitsStream& str)
ptr->saveFitsPrimHeader(str);
for (int ii=0; ii<3; ii++) {
if (context[ii].fits) {
- context[ii].fits->saveFitsXtHeader(str,0);
+ context[ii].fits->saveFitsXtHeader(str,1);
size_t cnt = context[ii].fits->saveFits(str);
context[ii].fits->saveFitsPad(str,cnt,'\0');
}