/* Writer de table Fits (binaire ou ASCII) */ #include "sopnamsp.h" #include "machdefs.h" #include #include #include "pexceptions.h" #include "fabtwriter.h" ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /*! \class SOPHYA::FitsWriter \ingroup FitsIOServer Class for writing into a FITS file (DO NOT USE) */ /*! Constructor (DO NOT USE). */ FitsWriter::FitsWriter(string fname,int lp) { cr_or_upd_fits(fname.c_str(),false,lp); } /*! Constructor (DO NOT USE). */ FitsWriter::FitsWriter(const char* cfname,int lp) { cr_or_upd_fits(cfname,false,lp); } /*! Constructor (DO NOT USE). */ FitsWriter::FitsWriter(string fname,bool update,int lp) { cr_or_upd_fits(fname.c_str(),update,lp); } /*! Constructor (DO NOT USE). */ FitsWriter::FitsWriter(const char* cfname,bool update,int lp) { cr_or_upd_fits(cfname,update,lp); } /*! See FitsWriter() */ void FitsWriter::cr_or_upd_fits(const char *cfname,bool update,int lp) { FitsPtr = NULL; HduType = 0; SetDebug(lp); FitsFN = cfname; NOverFlow = 0; Update = update; // Init key structure DoubleKey.resize(0); LongKey.resize(0); LongLongKey.resize(0); StringKey.resize(0); if(DbgLevel) cout<<"FitsWriter::cr_or_upd_fits FitsFN="<0) for(unsigned long i=0;i(DoubleKey[i].keyname.c_str()); char* com = const_cast(DoubleKey[i].comment.c_str()); double val = DoubleKey[i].val; if(fits_update_key(FitsPtr,TDOUBLE,key,&val,com,&sta)) printerror(sta); } if(LongKey.size()>0) for(unsigned long i=0;i(LongKey[i].keyname.c_str()); char* com = const_cast(LongKey[i].comment.c_str()); long val = LongKey[i].val; if(fits_update_key(FitsPtr,TLONG,key,&val,com,&sta)) printerror(sta); } if(LongLongKey.size()>0) for(unsigned long i=0;i(LongLongKey[i].keyname.c_str()); char* com = const_cast(LongLongKey[i].comment.c_str()); LONGLONG val = LongLongKey[i].val; if(fits_update_key(FitsPtr,TLONGLONG,key,&val,com,&sta)) printerror(sta); } if(StringKey.size()>0) for(unsigned long i=0;i(StringKey[i].keyname.c_str()); char* com = const_cast(StringKey[i].comment.c_str()); char* val = const_cast(StringKey[i].val.c_str()); if(fits_update_key(FitsPtr,TSTRING,key,val,com,&sta)) printerror(sta); } DoubleKey.resize(0); LongKey.resize(0); LongLongKey.resize(0); StringKey.resize(0); } void FitsWriter::printerrorwrite(const char* type,int col,LONGLONG row,int sta) { if(sta==NUM_OVERFLOW) {NOverFlow++; return;} printerror(sta); char str[256]; sprintf(str,"FitsWriter::Write_%s: Error Writing Fits c=%d r=%ld sta=%d" ,type,col,(long)row,sta); throw NotAvailableOperation(str); } void FitsWriter::printerror(int sta) const { int stat = sta; fits_report_error(stdout,stat); fflush(stdout); return; } ////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// /*! \class SOPHYA::FitsABTWriter \ingroup FitsIOServer Class for writing a FITS ASCII or BINARY table \verbatim //----------------------------------------------------------- OPENING A NEW FILE AND WRITING INTO -- Exemple 1: Writing element by element FitsABTWriter fbtw(fitswrit,BINARY_TBL); fbtw.SetExtName("MY_OWN_EXTENSION"); int c1 = fbtw.AddCol("vars",NULL,"km",TSHORT); // col=0 int c2 = fbtw.AddCol("vars2",NULL,"km",TSHORT); // col=1 int c3 = fbtw.AddCol("varl",NULL,"Degre",TLONG); // col=2 int c4 = fbtw.AddCol("varf",NULL,"",TFLOAT); // col=3 int c5 = fbtw.AddCol("vard","","arcmin",TDOUBLE); // col=4 fbtw.SetDebug(3); for(LONGLONG i=0;i<1000;i++) { double x = i; fbtw.Write(c1,i,1000.*x); // if overflow, managed by cfitsio // Write(int,long,double) is called fbtw.Write(c2,i,(short)(1000.*x)); // if overflow, managed by language // Write(int,long,short) is called fbtw.Write(c3,i,x); fbtw.Write(c4,i,x); fbtw.Write(c5,i,x); } cout<<"Number of Overflows when writing: " < datad(100); TVector dataf(100); TVector datal(100); for(LONGLONG i=0;i<9990;i+=100) { LONGLONG i2=i+100-1; if(i2>=9990) i2=9990-1; for(LONGLONG j=0;j<100;j++) datad(i) = ...; for(LONGLONG j=0;j<100;j++) dataf(i) = ...; for(LONGLONG j=0;j<100;j++) datal(i) = ...; fbtw.Write(1,i,datal); fbtw.Write(2,i,dataf); fbtw.Write(3,i,datad); } \endverbatim \verbatim //----------------------------------------------------------- //----------------------------------------------------------- //----------------------------------------------------------- OPENING A NEW FILE AND WRITING 2 TABLE EXTENSIONS SIMULTANEOUSLY INTO try { cout<<">>>>> Creating a new fits file with FitsABTWriter"<>>>> Another extension fits table with FitsABTWriter"<>>>> Write into the 2 tables simultaneously"<0) { extname = (char *) malloc((strlen(ExtName.c_str())+1)*sizeof(char)); strcpy(extname,ExtName.c_str()); } for(int i=0;i& val) { if(FirstTime) createtbl(); LONGLONG nel = val.Size(); int sta=0; if(fits_write_col(FitsPtr,TUSHORT,col+1,row+1,1,nel,val.Data(),&sta)) printerrorwrite("long",col,row,sta); return row+nel; } /*! Write a vector of long (4 Bytes) data to FITS file (see below) */ LONGLONG FitsABTWriter::Write(int col,LONGLONG row,TVector& val) { if(FirstTime) createtbl(); LONGLONG nel = val.Size(); int sta=0; // Bug ou inconsistence cfitsio sur machine ou long=8Bytes ? int T = (sizeof(long)==4) ? TLONG: TINT; if(fits_write_col(FitsPtr,T,col+1,row+1,1,nel,val.Data(),&sta)) printerrorwrite("long",col,row,sta); return row+nel; } /*! Write a vector of long long (8 Bytes) data to FITS file (see below) */ LONGLONG FitsABTWriter::Write(int col,LONGLONG row,TVector& val) { #ifdef TLONGLONG if(FirstTime) createtbl(); LONGLONG nel = val.Size(); int sta=0; if(fits_write_col(FitsPtr,TLONGLONG,col+1,row+1,1,nel,val.Data(),&sta)) printerrorwrite("long long",col,row,sta); return row+nel; #else throw PException("FitsABTWriter::Write(..,TVector&) Not in that cfitsio version"); #endif } /*! Write a vector of float data to FITS file (see below) */ LONGLONG FitsABTWriter::Write(int col,LONGLONG row,TVector& val) { if(FirstTime) createtbl(); LONGLONG nel = val.Size(); int sta=0; if(fits_write_col(FitsPtr,TFLOAT,col+1,row+1,1,nel,val.Data(),&sta)) printerrorwrite("float",col,row,sta); return row+nel; } /*! Write a vector of double data to FITS file (see below) */ LONGLONG FitsABTWriter::Write(int col,LONGLONG row,TVector& val) { if(FirstTime) createtbl(); LONGLONG nel = val.Size(); int sta=0; if(fits_write_col(FitsPtr,TDOUBLE,col+1,row+1,1,nel,val.Data(),&sta)) printerrorwrite("double",col,row,sta); return row+nel; } ///////////////////////////////////////////////// void FitsABTWriter::Print(ostream& os,int lp) const { os<<"FitsABTWriter::Print: FitsFN "<0 && lp>=1) for(int i=0;i<(int)Label.size();i++) os<& data) { Naxis[0]=data.NCols(); Naxis[1]=data.NRows(); createimg(); uint_1* arr = new uint_1[Naxis[0]]; for(LONGLONG l=0;l): Error Writing Fits file\n"); } } delete [] arr; } /*! Write an unsigned short image to FITS file. \warning TMatrix data(Naxis2,Naxis1) means Data(row,column) */ void FitsImg2DWriter::Write(TMatrix& data) { Naxis[0]=data.NCols(); Naxis[1]=data.NRows(); createimg(); uint_2* arr = new uint_2[Naxis[0]]; for(LONGLONG l=0;l): Error Writing Fits file\n"); } } delete [] arr; } /*! Write a long image to FITS file. */ void FitsImg2DWriter::Write(TMatrix& data) { int T = (sizeof(long)==4) ? TLONG: TINT; Naxis[0]=data.NCols(); Naxis[1]=data.NRows(); createimg(); int_4* arr = new int_4[Naxis[0]]; for(LONGLONG l=0;l): Error Writing Fits file\n"); } } delete [] arr; } /*! Write a float image to FITS file. */ void FitsImg2DWriter::Write(TMatrix& data) { Naxis[0]=data.NCols(); Naxis[1]=data.NRows(); createimg(); float* arr = new float[Naxis[0]]; for(LONGLONG l=0;l): Error Writing Fits file\n"); } } delete [] arr; } /*! Write a double image to FITS file. */ void FitsImg2DWriter::Write(TMatrix& data) { Naxis[0]=data.NCols(); Naxis[1]=data.NRows(); createimg(); double* arr = new double[Naxis[0]]; for(LONGLONG l=0;l): Error Writing Fits file\n"); } } delete [] arr; } /*! Print infos. */ void FitsImg2DWriter::Print(ostream& os) const { os<<"FitsImg2DWriter::Print: FitsFN "<& data) */ void FitsImg3DWriter::CreateImg(LONGLONG naxis1,LONGLONG naxis2,LONGLONG naxis3) { Naxis[0]=naxis1; Naxis[1]=naxis2; Naxis[2]=naxis3; createimg(); } /*! Write an unsigned byte 3D image to FITS file. */ void FitsImg3DWriter::Write(TArray& data) { if(data.Rank()!=3) throw ParmError("FitsImg3DRd::Write(TArray): not a 3D array\n"); Naxis[0]=data.SizeX(); Naxis[1]=data.SizeY(); Naxis[2]=data.SizeZ(); createimg(); uint_1* arr = new uint_1[Naxis[0]]; for(LONGLONG k=0;k): Error Writing Fits file\n"); } } delete [] arr; } /*! Write an unsigned short 3D image to FITS file. */ void FitsImg3DWriter::Write(TArray& data) { if(data.Rank()!=3) throw ParmError("FitsImg3DRd::Write(TArray): not a 3D array\n"); Naxis[0]=data.SizeX(); Naxis[1]=data.SizeY(); Naxis[2]=data.SizeZ(); createimg(); uint_2* arr = new uint_2[Naxis[0]]; for(LONGLONG k=0;k): Error Writing Fits file\n"); } } delete [] arr; } /*! Write a long 3D image to FITS file. */ void FitsImg3DWriter::Write(TArray& data) { if(data.Rank()!=3) throw ParmError("FitsImg3DRd::Write(TArray): not a 3D array\n"); int T = (sizeof(long)==4) ? TLONG: TINT; Naxis[0]=data.SizeX(); Naxis[1]=data.SizeY(); Naxis[2]=data.SizeZ(); createimg(); int_4* arr = new int_4[Naxis[0]]; for(LONGLONG k=0;k): Error Writing Fits file\n"); } } delete [] arr; } /*! Write a float 3D image to FITS file. */ void FitsImg3DWriter::Write(TArray& data) { if(data.Rank()!=3) throw ParmError("FitsImg3DRd::Write(TArray): not a 3D array\n"); Naxis[0]=data.SizeX(); Naxis[1]=data.SizeY(); Naxis[2]=data.SizeZ(); createimg(); float* arr = new float[Naxis[0]]; for(LONGLONG k=0;k): Error Writing Fits file\n"); } } delete [] arr; } /*! Write a double 3D image to FITS file. */ void FitsImg3DWriter::Write(TArray& data) { if(data.Rank()!=3) throw ParmError("FitsImg3DRd::Write(TArray): not a 3D array\n"); Naxis[0]=data.SizeX(); Naxis[1]=data.SizeY(); Naxis[2]=data.SizeZ(); createimg(); double* arr = new double[Naxis[0]]; for(LONGLONG k=0;k): Error Writing Fits file\n"); } } delete [] arr; } /*! Write an unsigned byte Vector<> image to 3D FITS file. Vector is stored in Naxis1, j (resp. k) indicate place within Naxis2 (resp. Naxis3): so IMG(i,j,k) = Vector(i) */ void FitsImg3DWriter::Write(LONGLONG j, LONGLONG k,TVector& data) { if(FirstTime) throw ParmError("FitsImg3DRd::Write(LONGLONG,LONGLONG,TVector&): use CreateImg first !\n"); if(data.Size()!=Naxis[0]) throw ParmError("FitsImg3DRd::Write(LONGLONG,LONGLONG,TVector&): wrong vector size\n"); if(j<0 || j>=Naxis[1] || k<0 || k>=Naxis[2]) throw ParmError("FitsImg3DRd::Write(LONGLONG,LONGLONG,TVector&): j or k out of range\n"); uint_1* arr = const_cast(data.Data()); LONGLONG deb = Naxis[0]*(j+Naxis[1]*k)+1, nel = Naxis[0]; int sta=0; fits_write_img(FitsPtr,TBYTE,deb,nel,arr,&sta); if(sta) { printerrorwrite("uint_1",j,k,sta); delete [] arr; throw NotAvailableOperation("FitsImg3DRd::Write(LONGLONG,LONGLONG,TVector&): Error Writing Fits file\n"); } } /*! Write an unsigned short Vector<> image to 3D FITS file. Vector is stored in Naxis1, j (resp. k) indicate place within Naxis2 (resp. Naxis3): so IMG(i,j,k) = Vector(i) */ void FitsImg3DWriter::Write(LONGLONG j, LONGLONG k,TVector& data) { if(FirstTime) throw ParmError("FitsImg3DRd::Write(LONGLONG,LONGLONG,TVector&): use CreateImg first !\n"); if(data.Size()!=Naxis[0]) throw ParmError("FitsImg3DRd::Write(LONGLONG,LONGLONG,TVector&): wrong vector size\n"); if(j<0 || j>=Naxis[1] || k<0 || k>=Naxis[2]) throw ParmError("FitsImg3DRd::Write(LONGLONG,LONGLONG,TVector&): j or k out of range\n"); uint_2* arr = const_cast(data.Data()); LONGLONG deb = Naxis[0]*(j+Naxis[1]*k)+1, nel = Naxis[0]; int sta=0; fits_write_img(FitsPtr,TUSHORT,deb,nel,arr,&sta); if(sta) { printerrorwrite("uint_2",j,k,sta); delete [] arr; throw NotAvailableOperation("FitsImg3DRd::Write(LONGLONG,LONGLONG,TVector&): Error Writing Fits file\n"); } } /*! Write an long Vector<> image to 3D FITS file. Vector is stored in Naxis1, j (resp. k) indicate place within Naxis2 (resp. Naxis3): so IMG(i,j,k) = Vector(i) */ void FitsImg3DWriter::Write(LONGLONG j, LONGLONG k,TVector& data) { if(FirstTime) throw ParmError("FitsImg3DRd::Write(LONGLONG,LONGLONG,TVector&): use CreateImg first !\n"); if(data.Size()!=Naxis[0]) throw ParmError("FitsImg3DRd::Write(LONGLONG,LONGLONG,TVector&): wrong vector size\n"); if(j<0 || j>=Naxis[1] || k<0 || k>=Naxis[2]) throw ParmError("FitsImg3DRd::Write(LONGLONG,LONGLONG,TVector&): j or k out of range\n"); int T = (sizeof(long)==4) ? TLONG: TINT; int_4* arr = const_cast(data.Data()); LONGLONG deb = Naxis[0]*(j+Naxis[1]*k)+1, nel = Naxis[0]; int sta=0; fits_write_img(FitsPtr,T,deb,nel,arr,&sta); if(sta) { printerrorwrite("int_4",j,k,sta); delete [] arr; throw NotAvailableOperation("FitsImg3DRd::Write(LONGLONG,LONGLONG,TVector&): Error Writing Fits file\n"); } } /*! Write an float Vector<> image to 3D FITS file. Vector is stored in Naxis1, j (resp. k) indicate place within Naxis2 (resp. Naxis3): so IMG(i,j,k) = Vector(i) */ void FitsImg3DWriter::Write(LONGLONG j, LONGLONG k,TVector& data) { if(FirstTime) throw ParmError("FitsImg3DRd::Write(LONGLONG,LONGLONG,TVector&): use CreateImg first !\n"); if(data.Size()!=Naxis[0]) throw ParmError("FitsImg3DRd::Write(LONGLONG,LONGLONG,TVector&): wrong vector size\n"); if(j<0 || j>=Naxis[1] || k<0 || k>=Naxis[2]) throw ParmError("FitsImg3DRd::Write(LONGLONG,LONGLONG,TVector&): j or k out of range\n"); float* arr = const_cast(data.Data()); LONGLONG deb = Naxis[0]*(j+Naxis[1]*k)+1, nel = Naxis[0]; int sta=0; fits_write_img(FitsPtr,TFLOAT,deb,nel,arr,&sta); if(sta) { printerrorwrite("float",j,k,sta); delete [] arr; throw NotAvailableOperation("FitsImg3DRd::Write(LONGLONG,LONGLONG,TVector&): Error Writing Fits file\n"); } } /*! Write an double Vector<> image to 3D FITS file. Vector is stored in Naxis1, j (resp. k) indicate place within Naxis2 (resp. Naxis3): so IMG(i,j,k) = Vector(i) */ void FitsImg3DWriter::Write(LONGLONG j, LONGLONG k,TVector& data) { if(FirstTime) throw ParmError("FitsImg3DRd::Write(LONGLONG,LONGLONG,TVector&): use CreateImg first !\n"); if(data.Size()!=Naxis[0]) throw ParmError("FitsImg3DRd::Write(LONGLONG,LONGLONG,TVector&): wrong vector size\n"); if(j<0 || j>=Naxis[1] || k<0 || k>=Naxis[2]) throw ParmError("FitsImg3DRd::Write(LONGLONG,LONGLONG,TVector&): j or k out of range\n"); double* arr = const_cast(data.Data()); LONGLONG deb = Naxis[0]*(j+Naxis[1]*k)+1, nel = Naxis[0]; int sta=0; fits_write_img(FitsPtr,TDOUBLE,deb,nel,arr,&sta); if(sta) { printerrorwrite("double",j,k,sta); delete [] arr; throw NotAvailableOperation("FitsImg3DRd::Write(LONGLONG,LONGLONG,TVector&): Error Writing Fits file\n"); } } /*! Print infos. */ void FitsImg3DWriter::Print(ostream& os) const { os<<"FitsImg3DWriter::Print: FitsFN "<