Changeset 2846 in Sophya for trunk/SophyaExt/FitsIOServer
- Timestamp:
- Nov 21, 2005, 9:32:49 AM (20 years ago)
- Location:
- trunk/SophyaExt/FitsIOServer
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaExt/FitsIOServer/fitsblkrw.h
r2843 r2846 9 9 \ingroup FitsIOServer 10 10 \brief Template class with static methods for handling bloc data 11 read from / write to fits files 11 read from / write to fits filesz 12 12 */ 13 13 … … 114 114 }; 115 115 116 DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */ 117 class FitsBlockRW<std::string> { 118 public: 119 //! Write image HDU with string data type not supported (throws exception) 120 static void WriteImageData(FitsInOutFile& fios, const std::string * d, size_t sz, 121 long * fpixel=NULL) 122 { 123 throw FitsIOException( 124 "FitsBlockRW<string>::WriteImageData() string data type Unsupported for image HDU"); 125 } 126 //! Read image HDU with string data type not supported (throws exception) 127 static void ReadImageData(FitsInOutFile& fios, std::string * d, size_t sz, 128 long * fpixel=NULL) 129 { 130 throw FitsIOException( 131 "FitsBlockRW<string>::ReadImageData() string data type Unsupported for image HDU"); 132 } 116 133 117 /*! 118 Write character string data to binary/ascii HDU data in a fits file. 119 See cfitsio function fits_write_col() for more detail. 120 \param colnum : table column number (starting from 1) 121 \param firstrow : the write operation starting row (starting from 1) 122 \param firstelem : the firstelem (for vector type columns) 123 \param d : pointer to string type array to be written 124 \param sz : number of data elements to be written 125 \param width : column width 126 */ 127 void WriteStringColumnData(FitsInOutFile& fios, int colnum, long firstrow, 128 long firstelem, const string * d, size_t sz, 129 long width=0) 134 //! Write character string data to binary/ascii HDU data in a fits file. 135 static void WriteColumnData(FitsInOutFile& fios, int colnum, long firstrow, 136 long firstelem, const std::string * d, size_t sz) 130 137 { 131 138 int status = 0; 132 if (width < 1) width = 16; 139 char sbuff[1024]; 140 char * cp[4] = {sbuff, sbuff+256, sbuff+512, sbuff+768}; 141 //cout << " --- Getting in WriteColumnData<string>() colnum=" << colnum << endl; 133 142 for(size_t kk=0; kk<sz; kk++) { 134 char * cp = const_cast<char *>(d[kk].c_str()); 143 strncpy(sbuff, d[kk].c_str(), 1023); 144 // char * cp = const_cast<char *>(d[kk].c_str()); 145 sbuff[1023] = '\0'; 135 146 status = 0; 136 fits_write_col(fios.FitsPtr(), FitsTypes::DataType(cp), colnum, 137 firstrow+kk, firstelem, 1, &cp, &status); 147 //cout <<"DBG-Write2Fits : appel a fits_write_col() kk=" << kk << " / sz=" << sz << endl; 148 fits_write_col(fios.FitsPtr(), FitsTypes::DataType(sbuff), colnum, 149 firstrow+kk, firstelem, 1, cp, &status); 138 150 if ( status ) { 139 151 fits_report_error(stderr, status); 140 152 char buff[32]; 141 153 fits_get_errstatus(status, buff); 142 string msg = " WriteStringColumnDataError: " ;154 string msg = "FitsBlockRW<std::string>::WriteColumnData() Error: " ; 143 155 msg += buff; 144 156 sprintf(buff," kk=%ld",kk); msg += buff; … … 149 161 } 150 162 151 /*! 152 Read character string data to binary/ascii HDU data in a fits file. 153 See cfitsio function fits_read_col() for more detail. 154 \param colnum : table column number (starting from 1) 155 \param firstrow : the read operation starting point (row) (starting from 1) 156 \param firstelem : the firstelem (for vector type columns) 157 \param d : pointer to string type array to be read 158 \param sz : number of data elements to be read 159 \param width : column width 160 */ 161 void ReadStringColumnData(FitsInOutFile& fios, int colnum, long firstrow, 162 long firstelem, string * d, size_t sz, long width) 163 164 //! Read character string data to binary/ascii HDU data in a fits file. 165 static void ReadColumnData(FitsInOutFile& fios, int colnum, long firstrow, 166 long firstelem, std::string * d, size_t sz) 163 167 { 164 168 int status = 0; 165 169 int anynul = 0; 166 char buff[1024]; 170 char sbuff[1024]; 171 char * cp[4] = {sbuff, sbuff+256, sbuff+512, sbuff+768}; 172 // cout << " --- Getting in ReadColumnData<string>() colnum=" << colnum << endl; 167 173 for(size_t kk=0; kk<sz; kk++) { 168 fits_read_col(fios.FitsPtr(), FitsTypes::DataType(buff), colnum, 169 firstrow, firstelem+kk, 1, NULL, &buff, &anynul, &status); 170 d[kk] = buff; 174 // cout <<"DBG-ReadFrFits : appel a fits_read_col() kk=" << kk << " / sz=" << sz << endl; 175 fits_read_col(fios.FitsPtr(), FitsTypes::DataType(sbuff), colnum, 176 firstrow+kk, firstelem, 1, NULL, cp, &anynul, &status); 177 sbuff[1023] = '\0'; d[kk] = sbuff; 171 178 if ( status ) { 172 179 fits_report_error(stderr, status); 173 180 char buff[32]; 174 181 fits_get_errstatus(status, buff); 175 string msg = " ReadStringColumnDataError: " ;182 string msg = "FitsBlockRW<std::string>::ReadColumnData() Error: " ; 176 183 msg += buff; 177 184 sprintf(buff," kk=%ld",kk); msg += buff; … … 182 189 } 183 190 191 }; // Fin classe FitsBlockRW<std::string> 192 184 193 } // Fin du namespace 185 194 -
trunk/SophyaExt/FitsIOServer/fitshdtable.cc
r2843 r2846 25 25 26 26 int tbltyp = os.GetDef_TableType(); 27 string strcoltag; 28 long strwidth = os.GetDef_StrColWidth(); 29 if (strwidth < 1) strwidth = 16; 30 char buff[32]; 31 if (tbltyp == ASCII_TBL) 32 sprintf(buff, "A%ld",strwidth); 33 else 34 sprintf(buff, "%ldA",strwidth); 35 strcoltag = buff; 36 27 37 vector<string> colnames, tform, tunit; 28 38 for(sa_size_t k=0; k<dobj->NVar(); k++) { 29 colnames.push_back(dobj->GetColumName(k));30 tunit.push_back("");39 bool fgoknm = true; 40 bool fgoktun = true; 31 41 switch ( dobj->GetColumType(k) ) { 32 42 case BaseDataTable::IntegerField : … … 43 53 break; 44 54 case BaseDataTable::DoubleField : 55 case BaseDataTable::DateTimeField : 45 56 if (tbltyp == ASCII_TBL) tform.push_back("D15.8"); 46 57 else tform.push_back("D"); 58 if (dobj->GetColumType(k) == BaseDataTable::DateTimeField ) { 59 tunit.push_back("Days (DateTimeField)"); 60 fgoktun = false; 61 } 62 break; 63 case BaseDataTable::ComplexField : 64 if (tbltyp == ASCII_TBL) { 65 cout << "FitsHandler<BaseDataTable>::Write()/Warning ComplexField not supported for ASCII_TBL " 66 << endl; 67 fgoknm = false; 68 } 69 else tform.push_back("C"); 70 break; 71 case BaseDataTable::DoubleComplexField : 72 if (tbltyp == ASCII_TBL) { 73 cout << "FitsHandler<BaseDataTable>::Write()/Warning DoubleComplexField not supported for ASCII_TBL " 74 << endl; 75 fgoknm = false; 76 } 77 else tform.push_back("M"); 47 78 break; 48 79 case BaseDataTable::StringField : 49 cout << "FitsHandler<BaseDataTable>::Write() / Warning StringField not yet supported " << endl;80 tform.push_back(strcoltag); 50 81 break; 51 82 default: … … 53 84 break; 54 85 } 86 if (fgoknm) { 87 colnames.push_back(dobj->GetColumName(k)); 88 if (fgoktun) tunit.push_back(""); 89 } 55 90 } 56 91 57 92 // On cree la table 58 string extname = "";93 string extname = os.NextExtensionName(); 59 94 os.CreateTable(os.GetDef_TableType(), extname, colnames, tform, tunit); 60 95 … … 67 102 for(sa_size_t k=0; k<dobj->NVar(); k++) { 68 103 sa_size_t sk = dobj->mNames[k].ser; 104 //DBG cout << "DBG-A k= " << k << " nom=" << dobj->mNames[k].nom << " ser=" << sk 105 //DBG << " type=" << dobj->GetColumType(k) << endl; 69 106 switch ( dobj->GetColumType(k) ) { 70 107 case BaseDataTable::IntegerField : … … 84 121 break; 85 122 case BaseDataTable::DoubleField : 123 case BaseDataTable::DateTimeField : 86 124 icol++; 87 125 FitsBlockRW<r_8>::WriteColumnData(os, icol, l+1, 1, 88 126 dt->mDCols[sk].GetCstSegment(iseg), sz); 89 127 break; 90 // case BaseDataTable::StringField : 128 case BaseDataTable::ComplexField : 129 if (tbltyp == BINARY_TBL) { 130 icol++; 131 FitsBlockRW< complex<r_4> >::WriteColumnData(os, icol, l+1, 1, 132 dt->mYCols[sk].GetCstSegment(iseg), sz); 133 } 134 break; 135 case BaseDataTable::DoubleComplexField : 136 if (tbltyp == BINARY_TBL) { 137 icol++; 138 FitsBlockRW< complex<r_8> >::WriteColumnData(os, icol, l+1, 1, 139 dt->mZCols[sk].GetCstSegment(iseg), sz); 140 } 141 break; 142 case BaseDataTable::StringField : 143 icol++; 144 FitsBlockRW<std::string>::WriteColumnData(os, icol, l+1, 1, 145 dt->mSCols[sk].GetCstSegment(iseg), sz); 146 break; 91 147 default: 92 148 break; … … 99 155 MuTyV mtv = dobj->SegmentSize(); 100 156 os.WriteKey("SEGMSIZE",mtv," SOPHYA::DataTable SegmentSize"); 157 mtv = "SOPHYA::DataTable"; 158 os.WriteKey("SOPCLSNM",mtv," Object class name "); 101 159 } 102 160 … … 114 172 if (segsz > 2048) segsz = 2048; 115 173 string key = "SEGMSIZE"; 116 string ssegsz = is.KeyValue(key); 117 if (ssegsz.length() > 0) segsz = atoi(ssegsz.c_str()); 174 bool knex = false; 175 string ssegsz = is.KeyValue(key, knex); 176 if (!knex && (ssegsz.length() > 0)) segsz = atoi(ssegsz.c_str()); 118 177 if (segsz < 16) segsz = 16; 119 178 … … 163 222 colpos.push_back(k+1); 164 223 break; 224 case TCOMPLEX : 225 dt->AddComplexColumn(colnames[k]); 226 colpos.push_back(k+1); 227 break; 228 case TDBLCOMPLEX : 229 dt->AddDoubleComplexColumn(colnames[k]); 230 colpos.push_back(k+1); 231 break; 232 case TSTRING : 233 dt->AddStringColumn(colnames[k]); 234 colpos.push_back(k+1); 235 break; 165 236 default: 166 237 cout << "FitsHandler<BaseDataTable>::Read() NOT handled field type " … … 174 245 while ((dobj->SegmentSize()*dobj->NbSegments()) < dobj->NEntry()) 175 246 dobj->Extend(); 176 // cout << " DBG2 -- dobj->mNSeg = " << dobj->NbSegments() << " SegSize="177 // << dobj->SegmentSize() << " NEntry=" << dobj->NEntry() << endl;247 //DBG cout << " DBG2 -- dobj->mNSeg = " << dobj->NbSegments() << " SegSize=" 248 //DBG << dobj->SegmentSize() << " NEntry=" << dobj->NEntry() << endl; 178 249 179 250 // Lecture des donnees des colonnes … … 201 272 break; 202 273 case BaseDataTable::DoubleField : 274 case BaseDataTable::DateTimeField : 203 275 FitsBlockRW<r_8>::ReadColumnData(is, icol, l+1, 1, 204 276 dt->mDCols[sk].GetSegment(iseg), sz); 205 277 break; 206 // case BaseDataTable::StringField : 278 case BaseDataTable::ComplexField : 279 FitsBlockRW< complex<r_4> >::ReadColumnData(is, icol, l+1, 1, 280 dt->mYCols[sk].GetSegment(iseg), sz); 281 break; 282 case BaseDataTable::DoubleComplexField : 283 FitsBlockRW< complex<r_8> >::ReadColumnData(is, icol, l+1, 1, 284 dt->mZCols[sk].GetSegment(iseg), sz); 285 break; 286 case BaseDataTable::StringField : 287 FitsBlockRW<std::string>::ReadColumnData(is, icol, l+1, 1, 288 dt->mSCols[sk].GetSegment(iseg), sz); 289 break; 207 290 default: 208 291 break; … … 217 300 218 301 219 /* 220 int toto() 221 { 222 DataTable xx; 223 FitsInOutFile fio("dtoto.fits", FitsInOutFile::Fits_Create); 224 FitsHandler<BaseDataTable> fh(xx); 225 // fio << xx; 226 } 227 */ 228 229 302 303
Note:
See TracChangeset
for help on using the changeset viewer.