Changeset 2453 in Sophya for trunk/SophyaExt/FitsIOServer/fabtwriter.cc
- Timestamp:
- Nov 13, 2003, 4:49:45 PM (22 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaExt/FitsIOServer/fabtwriter.cc
r2450 r2453 6 6 #include "fabtwriter.h" 7 7 8 ////////////////////////////////////////////////////////////// 9 ////////////////////////////////////////////////////////////// 10 ////////////////////////////////////////////////////////////// 11 ////////////////////////////////////////////////////////////// 12 /*! 13 \class SOPHYA::FitsWriter 14 \ingroup FitsIOServer 15 Class for writing into a FITS file (DO NOT USE) 16 */ 17 18 /*! Constructor (DO NOT USE). */ 19 FitsWriter::FitsWriter(string fname,int lp) 20 { 21 cr_or_upd_fits(fname.c_str(),false,lp); 22 } 23 24 /*! Constructor (DO NOT USE). */ 25 FitsWriter::FitsWriter(const char* cfname,int lp) 26 { 27 cr_or_upd_fits(cfname,false,lp); 28 } 29 30 /*! Constructor (DO NOT USE). */ 31 FitsWriter::FitsWriter(string fname,bool update,int lp) 32 { 33 cr_or_upd_fits(fname.c_str(),update,lp); 34 } 35 36 /*! Constructor (DO NOT USE). */ 37 FitsWriter::FitsWriter(const char* cfname,bool update,int lp) 38 { 39 cr_or_upd_fits(cfname,update,lp); 40 } 41 42 /*! See FitsWriter() */ 43 void FitsWriter::cr_or_upd_fits(const char *cfname,bool update,int lp) 44 { 45 FitsPtr = NULL; 46 HduType = 0; 47 SetDebug(lp); 48 FitsFN = cfname; 49 NOverFlow = 0; 50 Update = update; 51 // Init key structure 52 DoubleKey.resize(0); 53 LongKey.resize(0); 54 StringKey.resize(0); 55 56 if(DbgLevel) 57 cout<<"FitsWriter::cr_or_upd_fits FitsFN="<<FitsFN<<endl; 58 59 if(FitsFN.size() <= 0 ) 60 throw ParmError("FitsWriter::cr_or_upd_fits: Fits file name error\n"); 61 62 // create or update FITS file 63 int sta=0; 64 if(Update) { 65 if(fits_open_file(&FitsPtr,FitsFN.c_str(),READWRITE,&sta)) { 66 printerror(sta); 67 throw NullPtrError("FitsWriter::cr_or_upd_fits: Error opening Fits file for update\n"); 68 } 69 if(DbgLevel) cout<<"FitsWriter::cr_or_upd_fits: fits file has been opened for update"<<endl; 70 } else { 71 if(fits_create_file(&FitsPtr,FitsFN.c_str(),&sta)) { 72 printerror(sta); 73 throw NullPtrError("FitsWriter::cr_or_upd_fits: Error creating new Fits file\n"); 74 } 75 if(DbgLevel) cout<<"FitsWriter::cr_or_upd_fits: a new fits file has been created"<<endl; 76 } 77 78 // create d'un Primary HDU 79 //long naxes[1] = {0}; 80 //if(fits_create_img(FitsPtr,BYTE_IMG,0,naxes,&sta)) { 81 // printerror(sta); 82 // throw NullPtrError("FitsWriter::cr_or_upd_fits: Error creating Primary extension\n"); 83 //} 84 } 85 86 /*! Destructor */ 87 FitsWriter::~FitsWriter() 88 { 89 int sta = 0; 90 writekeys(); 91 if(fits_close_file(FitsPtr,&sta)) printerror(sta); 92 FitsPtr = NULL; 93 } 94 95 /*! Flush the FitsIO buffer to set good Fits file in case of problems */ 96 void FitsWriter::Flush(void) 97 { 98 if(FitsPtr==NULL) return; 99 int sta = 0; 100 if(fits_flush_file(FitsPtr,&sta)) printerror(sta); 101 } 102 103 104 /*! Write a double value into Fits Header */ 105 void FitsWriter::WriteKey(const char *keyname,double val,char* comment) 106 { 107 if(keyname==NULL || strlen(keyname)<=0) return; 108 KeyDouble k; 109 k.keyname=keyname; 110 k.val=val; 111 if(comment) k.comment=comment; else k.comment=""; 112 DoubleKey.push_back(k); 113 } 114 115 /*! Write a long value into Fits Header */ 116 void FitsWriter::WriteKey(const char *keyname,long val,char* comment) 117 { 118 if(keyname==NULL || strlen(keyname)<=0) return; 119 KeyLong k; 120 k.keyname=keyname; 121 k.val=val; 122 if(comment) k.comment=comment; else k.comment=""; 123 LongKey.push_back(k); 124 } 125 126 /*! Write a string value into Fits Header */ 127 void FitsWriter::WriteKey(const char *keyname,string val,char* comment) 128 { 129 if(keyname==NULL || strlen(keyname)<=0) return; 130 KeyString k; 131 k.keyname=keyname; 132 k.val=val; 133 if(comment) k.comment=comment; else k.comment=""; 134 StringKey.push_back(k); 135 } 136 137 void FitsWriter::writekeys(void) 138 // Ecriture effective des clefs 139 { 140 if(FitsPtr==NULL) return; 141 int sta=0; 142 if(DoubleKey.size()>0) 143 for(unsigned int i=0;i<DoubleKey.size();i++) { 144 char* key = const_cast<char*>(DoubleKey[i].keyname.c_str()); 145 char* com = const_cast<char*>(DoubleKey[i].comment.c_str()); 146 double val = DoubleKey[i].val; 147 if(fits_update_key(FitsPtr,TDOUBLE,key,&val,com,&sta)) 148 printerror(sta); 149 } 150 if(LongKey.size()>0) 151 for(unsigned int i=0;i<LongKey.size();i++) { 152 char* key = const_cast<char*>(LongKey[i].keyname.c_str()); 153 char* com = const_cast<char*>(LongKey[i].comment.c_str()); 154 long val = LongKey[i].val; 155 if(fits_update_key(FitsPtr,TLONG,key,&val,com,&sta)) 156 printerror(sta); 157 } 158 if(StringKey.size()>0) 159 for(unsigned int i=0;i<StringKey.size();i++) { 160 char* key = const_cast<char*>(StringKey[i].keyname.c_str()); 161 char* com = const_cast<char*>(StringKey[i].comment.c_str()); 162 char* val = const_cast<char*>(StringKey[i].val.c_str()); 163 if(fits_update_key(FitsPtr,TSTRING,key,val,com,&sta)) 164 printerror(sta); 165 } 166 DoubleKey.resize(0); 167 LongKey.resize(0); 168 StringKey.resize(0); 169 } 170 171 void FitsWriter::printerrorwrite(const char* type,int col,long row,int sta) 172 { 173 if(sta==NUM_OVERFLOW) {NOverFlow++; return;} 174 printerror(sta); 175 char str[256]; 176 sprintf(str,"FitsWriter::Write_%s: Error Writing Fits c=%d r=%ld sta=%d" 177 ,type,col,row,sta); 178 throw NotAvailableOperation(str); 179 } 180 181 void FitsWriter::printerror(int sta) const 182 { 183 int stat = sta; 184 fits_report_error(stdout,stat); 185 fflush(stdout); 186 return; 187 } 188 189 ////////////////////////////////////////////////////////////////// 190 ////////////////////////////////////////////////////////////////// 191 ////////////////////////////////////////////////////////////////// 192 ////////////////////////////////////////////////////////////////// 8 193 /*! 9 194 \class SOPHYA::FitsABTWriter … … 117 302 */ 118 303 FitsABTWriter::FitsABTWriter(string fname,int hdutype,int lp) 119 { 120 cr_or_upd_fits(fname.c_str(),false,hdutype,lp); 304 : FitsWriter(fname,lp) 305 { 306 FirstTime = true; 307 HduType = hdutype; 308 if(HduType!=BINARY_TBL && HduType!=ASCII_TBL) 309 throw 310 TypeMismatchExc("FitsABTWriter::FitsABTWriter: Only BINARY or ASCII table permitted\n"); 121 311 } 122 312 … … 128 318 */ 129 319 FitsABTWriter::FitsABTWriter(const char* cfname,int hdutype,int lp) 130 { 131 cr_or_upd_fits(cfname,false,hdutype,lp); 320 : FitsWriter(cfname,lp) 321 { 322 FirstTime = true; 323 HduType = hdutype; 324 if(HduType!=BINARY_TBL && HduType!=ASCII_TBL) 325 throw 326 TypeMismatchExc("FitsABTWriter::FitsABTWriter: Only BINARY or ASCII table permitted\n"); 132 327 } 133 328 … … 140 335 */ 141 336 FitsABTWriter::FitsABTWriter(string fname,bool update,int hdutype,int lp) 142 { 143 cr_or_upd_fits(fname.c_str(),update,hdutype,lp); 337 : FitsWriter(fname,update,lp) 338 { 339 FirstTime = true; 340 HduType = hdutype; 341 if(HduType!=BINARY_TBL && HduType!=ASCII_TBL) 342 throw 343 TypeMismatchExc("FitsABTWriter::FitsABTWriter: Only BINARY or ASCII table permitted\n"); 144 344 } 145 345 … … 152 352 */ 153 353 FitsABTWriter::FitsABTWriter(const char* cfname,bool update,int hdutype,int lp) 154 { 155 cr_or_upd_fits(cfname,update,hdutype,lp); 156 } 157 158 /*! See FitsABTWriter() */ 159 void FitsABTWriter::cr_or_upd_fits(const char *cfname,bool update,int hdutype,int lp) 354 : FitsWriter(cfname,update,lp) 160 355 { 161 356 FirstTime = true; 162 FitsPtr = NULL;163 357 HduType = hdutype; 164 SetDebug(lp);165 FitsFN = cfname;166 NOverFlow = 0;167 Update = update;168 169 if(DbgLevel)170 cout<<"FitsABTWriter::cr_or_upd_fits FitsFN="<<FitsFN171 <<" HduType="<<HduType<<endl;172 173 if(FitsFN.size() <= 0 )174 throw ParmError("FitsABTWriter::cr_or_upd_fits: Fits file name error\n");175 176 358 if(HduType!=BINARY_TBL && HduType!=ASCII_TBL) 177 throw TypeMismatchExc("FitsABTWriter::cr_or_upd_fits: Only BINARY or ASCII table permitted\n"); 178 179 // create or update FITS file 180 int sta=0; 181 if(Update) { 182 if(fits_open_file(&FitsPtr,FitsFN.c_str(),READWRITE,&sta)) { 183 printerror(sta); 184 throw NullPtrError("FitsABTWriter::cr_or_upd_fits: Error opening Fits file for update\n"); 185 } 186 if(DbgLevel) cout<<"FitsABTWriter::cr_or_upd_fits: fits file has been opened for update"<<endl; 187 } else { 188 if(fits_create_file(&FitsPtr,FitsFN.c_str(),&sta)) { 189 printerror(sta); 190 throw NullPtrError("FitsABTWriter::cr_or_upd_fits: Error creating new Fits file\n"); 191 } 192 if(DbgLevel) cout<<"FitsABTWriter::cr_or_upd_fits: a new fits file has been created"<<endl; 193 } 194 195 // create d'un Primary HDU 196 //long naxes[1] = {0}; 197 //if(fits_create_img(FitsPtr,BYTE_IMG,0,naxes,&sta)) { 198 // printerror(sta); 199 // throw NullPtrError("FitsABTWriter::cr_or_upd_fits: Error creating Primary extension\n"); 200 //} 201 359 throw 360 TypeMismatchExc("FitsABTWriter::FitsABTWriter: Only BINARY or ASCII table permitted\n"); 202 361 } 203 362 … … 205 364 FitsABTWriter::~FitsABTWriter() 206 365 { 207 int sta = 0;208 writekeys();209 if(fits_close_file(FitsPtr,&sta)) printerror(sta);210 FitsPtr = NULL;211 }212 213 /*! Flush the FitsIO buffer to set good Fits file in case of problems */214 void FitsABTWriter::Flush(void)215 {216 if(FitsPtr==NULL) return;217 int sta = 0;218 if(fits_flush_file(FitsPtr,&sta)) printerror(sta);219 }220 221 /*! Write a double value into Fits Header */222 void FitsABTWriter::WriteKey(const char *keyname,double val,char* comment)223 {224 if(keyname==NULL || strlen(keyname)<=0) return;225 KeyDouble k;226 k.keyname=keyname;227 k.val=val;228 if(comment) k.comment=comment; else k.comment="";229 DoubleKey.push_back(k);230 }231 232 /*! Write a long value into Fits Header */233 void FitsABTWriter::WriteKey(const char *keyname,long val,char* comment)234 {235 if(keyname==NULL || strlen(keyname)<=0) return;236 KeyLong k;237 k.keyname=keyname;238 k.val=val;239 if(comment) k.comment=comment; else k.comment="";240 LongKey.push_back(k);241 }242 243 /*! Write a string value into Fits Header */244 void FitsABTWriter::WriteKey(const char *keyname,string val,char* comment)245 {246 if(keyname==NULL || strlen(keyname)<=0) return;247 KeyString k;248 k.keyname=keyname;249 k.val=val;250 if(comment) k.comment=comment; else k.comment="";251 StringKey.push_back(k);252 }253 254 void FitsABTWriter::writekeys(void)255 // Ecriture effective des clefs256 {257 if(FitsPtr==NULL) return;258 int sta=0;259 if(DoubleKey.size()>0)260 for(unsigned int i=0;i<DoubleKey.size();i++) {261 char* key = const_cast<char*>(DoubleKey[i].keyname.c_str());262 char* com = const_cast<char*>(DoubleKey[i].comment.c_str());263 double val = DoubleKey[i].val;264 if(fits_update_key(FitsPtr,TDOUBLE,key,&val,com,&sta))265 printerror(sta);266 }267 if(LongKey.size()>0)268 for(unsigned int i=0;i<LongKey.size();i++) {269 char* key = const_cast<char*>(LongKey[i].keyname.c_str());270 char* com = const_cast<char*>(LongKey[i].comment.c_str());271 long val = LongKey[i].val;272 if(fits_update_key(FitsPtr,TLONG,key,&val,com,&sta))273 printerror(sta);274 }275 if(StringKey.size()>0)276 for(unsigned int i=0;i<StringKey.size();i++) {277 char* key = const_cast<char*>(StringKey[i].keyname.c_str());278 char* com = const_cast<char*>(StringKey[i].comment.c_str());279 char* val = const_cast<char*>(StringKey[i].val.c_str());280 if(fits_update_key(FitsPtr,TSTRING,key,val,com,&sta))281 printerror(sta);282 }283 DoubleKey.resize(0);284 LongKey.resize(0);285 StringKey.resize(0);286 366 } 287 367 … … 303 383 ,const char* tunit,int datatype) 304 384 { 305 306 385 if(!FirstTime) 386 throw AllocationError("FitsABTWriter::addcol: table already created\n"); 307 387 308 388 // Gestion auto du tform pour les tables binaires avec le datatype (si non-definie) … … 402 482 } 403 483 404 // Append Fits key405 writekeys();406 407 484 // menage 408 485 if(extname) delete [] extname; … … 591 668 } 592 669 593 //////////////////////////////////////////////////////////////594 void FitsABTWriter::printerrorwrite(const char* type,int col,long row,int sta)595 {596 if(sta==NUM_OVERFLOW) {NOverFlow++; return;}597 printerror(sta);598 char str[256];599 sprintf(str,"FitsABTWriter::Write_%s: Error Writing Fits c=%d r=%ld sta=%d"600 ,type,col,row,sta);601 throw NotAvailableOperation(str);602 }603 604 /////////////////////////////////////////////////605 void FitsABTWriter::printerror(int sta) const606 {607 int stat = sta;608 fits_report_error(stdout,stat);609 fflush(stdout);610 return;611 }612 613 670 ///////////////////////////////////////////////// 614 671 void FitsABTWriter::Print(ostream& os,int lp) const … … 621 678 os<<i<<"... Label="<<Label[i]<<" TForm="<<TForm[i]<<" TUnit="<<TUnit[i]<<endl; 622 679 } 680 681 ////////////////////////////////////////////////////////////////// 682 ////////////////////////////////////////////////////////////////// 683 ////////////////////////////////////////////////////////////////// 684 ////////////////////////////////////////////////////////////////// 685 /*! 686 \class SOPHYA::FitsImg2DWriter 687 \ingroup FitsIOServer 688 Class for writing an image into FITS file 689 */ 690 691 /*! 692 Constructor. 693 \param fname : FITS file name to be written (a new fits file is created) 694 \param bitpix : image type (BYTE_IMG,USHORT_IMG,SHORT_IMG,LONG_IMG,FLOAT_IMG,DOUBLE_IMG) 695 \param lp : debug level 696 */ 697 FitsImg2DWriter::FitsImg2DWriter(string fname,int bitpix,int lp) 698 : FitsWriter(fname,lp) 699 { 700 BitPix = bitpix; 701 HduType = IMAGE_HDU; 702 FirstTime = true; 703 Naxis[0] = Naxis[1] = 0; 704 } 705 706 /*! 707 Constructor. 708 \param cfname : FITS file name to be written (a new fits file is created) 709 \param bitpix : image type (BYTE_IMG,USHORT_IMG,SHORT_IMG,LONG_IMG,FLOAT_IMG,DOUBLE_IMG) 710 \param lp : debug level 711 */ 712 FitsImg2DWriter::FitsImg2DWriter(const char* cfname,int bitpix,int lp) 713 : FitsWriter(cfname,lp) 714 { 715 BitPix = bitpix; 716 HduType = IMAGE_HDU; 717 FirstTime = true; 718 Naxis[0] = Naxis[1] = 0; 719 } 720 721 /*! 722 Constructor. 723 \param fname : FITS file name to be written (created or updated) 724 \param update : file is created if FALSE, open for update if TRUE 725 \param bitpix : image type (BYTE_IMG,USHORT_IMG,SHORT_IMG,LONG_IMG,FLOAT_IMG,DOUBLE_IMG) 726 \param lp : debug level 727 */ 728 FitsImg2DWriter::FitsImg2DWriter(string fname,bool update,int bitpix,int lp) 729 : FitsWriter(fname,update,lp) 730 { 731 BitPix = bitpix; 732 HduType = IMAGE_HDU; 733 FirstTime = true; 734 Naxis[0] = Naxis[1] = 0; 735 } 736 737 /*! 738 Constructor. 739 \param cfname : FITS file name to be written (created or updated) 740 \param update : file is created if FALSE, open for update if TRUE 741 \param bitpix : image type (BYTE_IMG,USHORT_IMG,SHORT_IMG,LONG_IMG,FLOAT_IMG,DOUBLE_IMG) 742 \param lp : debug level 743 */ 744 FitsImg2DWriter::FitsImg2DWriter(const char* cfname,bool update,int bitpix,int lp) 745 : FitsWriter(cfname,update,lp) 746 { 747 BitPix = bitpix; 748 HduType = IMAGE_HDU; 749 FirstTime = true; 750 Naxis[0] = Naxis[1] = 0; 751 } 752 753 /*! Destructor */ 754 FitsImg2DWriter::~FitsImg2DWriter() 755 { 756 } 757 758 /*! Create the image. Done at the first write request. */ 759 void FitsImg2DWriter::createimg(void) 760 { 761 if(!FirstTime) 762 throw NotAvailableOperation("FitsImg2DWriter::createimg: already created image\n"); 763 if(Naxis[0]<=0 || Naxis[1]<=0) 764 throw ParmError("FitsImg2DWriter::createimg: bad Naxis 1 or 2 value\n"); 765 766 int sta=0; 767 if(fits_create_img(FitsPtr,BitPix,2,Naxis,&sta)) { 768 printerror(sta); 769 throw NullPtrError("FitsImg2DWriter::createimg: Error creating image extension\n"); 770 } 771 772 FirstTime = false; 773 } 774 775 /*! 776 Write an image to FITS file. 777 \warning TMatrix data(Naxis2,Naxis1) 778 */ 779 void FitsImg2DWriter::Write(TMatrix<uint_2>& data) 780 { 781 Naxis[0]=data.NCols(); Naxis[1]=data.NRows(); createimg(); 782 uint_2* arr = new uint_2[Naxis[0]]; 783 784 for(int j=0;j<Naxis[1];j++) { 785 for(int i=0;i<Naxis[0];i++) arr[i] = data(j,i); 786 long deb = j*Naxis[0]+1, nel = Naxis[0]; int sta=0; 787 fits_write_img(FitsPtr,TUSHORT,deb,nel,arr,&sta); 788 if(sta) { 789 printerror(sta); delete [] arr; 790 throw 791 NotAvailableOperation("FitsImg2DRd::Write(TMatrix<uint_2>): Error Writing Fits file\n"); 792 } 793 } 794 795 delete [] arr; 796 } 797 798 /*! Write an image to FITS file. */ 799 void FitsImg2DWriter::Write(TMatrix<int_4>& data) 800 { 801 int T = (sizeof(long)==4) ? TLONG: TINT; 802 Naxis[0]=data.NCols(); Naxis[1]=data.NRows(); createimg(); 803 int_4* arr = new int_4[Naxis[0]]; 804 805 for(int j=0;j<Naxis[1];j++) { 806 for(int i=0;i<Naxis[0];i++) arr[i] = data(j,i); 807 long deb = j*Naxis[0]+1, nel = Naxis[0]; int sta=0; 808 fits_write_img(FitsPtr,T,deb,nel,arr,&sta); 809 if(sta) { 810 printerror(sta); delete [] arr; 811 throw 812 NotAvailableOperation("FitsImg2DRd::Write(TMatrix<int_4>): Error Writing Fits file\n"); 813 } 814 } 815 816 delete [] arr; 817 } 818 819 /*! Write an image to FITS file. */ 820 void FitsImg2DWriter::Write(TMatrix<float>& data) 821 { 822 Naxis[0]=data.NCols(); Naxis[1]=data.NRows(); createimg(); 823 float* arr = new float[Naxis[0]]; 824 825 for(int j=0;j<Naxis[1];j++) { 826 for(int i=0;i<Naxis[0];i++) arr[i] = data(j,i); 827 long deb = j*Naxis[0]+1, nel = Naxis[0]; int sta=0; 828 fits_write_img(FitsPtr,TFLOAT,deb,nel,arr,&sta); 829 if(sta) { 830 printerror(sta); delete [] arr; 831 throw 832 NotAvailableOperation("FitsImg2DRd::Write(TMatrix<float>): Error Writing Fits file\n"); 833 } 834 } 835 836 delete [] arr; 837 } 838 839 /*! Write an image to FITS file. */ 840 void FitsImg2DWriter::Write(TMatrix<double>& data) 841 { 842 Naxis[0]=data.NCols(); Naxis[1]=data.NRows(); createimg(); 843 double* arr = new double[Naxis[0]]; 844 845 for(int j=0;j<Naxis[1];j++) { 846 for(int i=0;i<Naxis[0];i++) arr[i] = data(j,i); 847 long deb = j*Naxis[0]+1, nel = Naxis[0]; int sta=0; 848 fits_write_img(FitsPtr,TDOUBLE,deb,nel,arr,&sta); 849 if(sta) { 850 printerror(sta); delete [] arr; 851 throw 852 NotAvailableOperation("FitsImg2DRd::Write(TMatrix<double>): Error Writing Fits file\n"); 853 } 854 } 855 856 delete [] arr; 857 } 858 859 /*! Print infos. */ 860 void FitsImg2DWriter::Print(ostream& os) const 861 { 862 os<<"FitsImg2DWriter::Print: FitsFN "<<FitsFN<<endl 863 <<" HduType "<<HduType<<" NOverFlow "<<NOverFlow<<" BitPix "<<BitPix 864 <<" Naxis1 "<<Naxis[0]<<" Naxis2 "<<Naxis[1]<<endl; 865 }
Note:
See TracChangeset
for help on using the changeset viewer.