Changeset 2889 in Sophya for trunk/SophyaExt/FitsIOServer
- Timestamp:
- Jan 9, 2006, 6:32:37 PM (20 years ago)
- Location:
- trunk/SophyaExt/FitsIOServer
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaExt/FitsIOServer/fitshdtable.cc
r2864 r2889 10 10 #include "fitsblkrw.h" 11 11 #include "fitshandler.h" 12 13 // #include "fitshdtable.h" 12 #include "swfitsdtable.h" 14 13 15 14 DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */ … … 18 17 if (is.CurrentHDUType() == IMAGE_HDU ) return 0; 19 18 string key = "SOPCLSNM"; 20 if (is.KeyValue(key) == "SOPHYA::DataTable") return 2; 19 string clsnm = is.KeyValue(key); 20 if ( (clsnm == "SOPHYA::DataTable") || (clsnm == "SOPHYA::SwFitsDataTable") ) 21 return 2; 21 22 else return 1; 22 23 } … … 30 31 31 32 DataTable* dt = dynamic_cast< DataTable *> (dobj); 32 if (dt == NULL) 33 throw FitsIOException("FitsHandler<DataTable>::Write() Not a DataTable object"); 34 33 SwFitsDataTable* swfdt = dynamic_cast< SwFitsDataTable *> (dobj); 34 35 35 int tbltyp = os.GetDef_TableType(); 36 if ( swfdt && (tbltyp == ASCII_TBL) ) 37 throw FitsIOException("FitsHandler<DataTable>::Write() ASCII_TBL not supported for SwFitsDataTable"); 38 39 // On ne reecrit pas la definition d'une SwFitsDataTable dans son fichier de swap 40 if (swfdt && (swfdt->mSwF.FitsPtr()==os.FitsPtr()) && swfdt->NRows() ) return; 41 36 42 string strcoltag; 37 43 long strwidth = os.GetDef_StrColWidth(); … … 102 108 string extname = os.NextExtensionName(); 103 109 os.CreateTable(os.GetDef_TableType(), extname, colnames, tform, tunit); 110 111 // On n'ecrit pas les donnees d'une table SwFitsDataTable ds son fichier de swap 112 if (swfdt && (swfdt->mSwF.FitsPtr()==os.FitsPtr()) ) return; 104 113 105 114 // Ecriture des donnees des colonnes … … 117 126 icol++; 118 127 FitsBlockRW<int_4>::WriteColumnData(os, icol, l+1, 1, 119 d t->mICols[sk].GetCstSegment(iseg), sz);128 dobj->mIColsP[sk]->GetCstSegment(iseg), sz); 120 129 break; 121 130 case BaseDataTable::LongField : 122 131 icol++; 123 132 FitsBlockRW<int_8>::WriteColumnData(os, icol, l+1, 1, 124 d t->mLCols[sk].GetCstSegment(iseg), sz);133 dobj->mLColsP[sk]->GetCstSegment(iseg), sz); 125 134 break; 126 135 case BaseDataTable::FloatField : 127 136 icol++; 128 137 FitsBlockRW<r_4>::WriteColumnData(os, icol, l+1, 1, 129 d t->mFCols[sk].GetCstSegment(iseg), sz);138 dobj->mFColsP[sk]->GetCstSegment(iseg), sz); 130 139 break; 131 140 case BaseDataTable::DoubleField : … … 133 142 icol++; 134 143 FitsBlockRW<r_8>::WriteColumnData(os, icol, l+1, 1, 135 d t->mDCols[sk].GetCstSegment(iseg), sz);144 dobj->mDColsP[sk]->GetCstSegment(iseg), sz); 136 145 break; 137 146 case BaseDataTable::ComplexField : … … 139 148 icol++; 140 149 FitsBlockRW< complex<r_4> >::WriteColumnData(os, icol, l+1, 1, 141 d t->mYCols[sk].GetCstSegment(iseg), sz);150 dobj->mYColsP[sk]->GetCstSegment(iseg), sz); 142 151 } 143 152 break; … … 146 155 icol++; 147 156 FitsBlockRW< complex<r_8> >::WriteColumnData(os, icol, l+1, 1, 148 d t->mZCols[sk].GetCstSegment(iseg), sz);157 dobj->mZColsP[sk]->GetCstSegment(iseg), sz); 149 158 } 150 159 break; … … 152 161 icol++; 153 162 FitsBlockRW<std::string>::WriteColumnData(os, icol, l+1, 1, 154 d t->mSCols[sk].GetCstSegment(iseg), sz);163 dobj->mSColsP[sk]->GetCstSegment(iseg), sz); 155 164 break; 156 165 default: … … 159 168 } 160 169 } 161 // Ecriture de SegmentSize et autre elements de DVList 162 170 171 // Ecriture de SegmentSize et autre elements de DVList 163 172 os.WriteHeaderRecords(dobj->Info()); 164 173 MuTyV mtv = dobj->SegmentSize(); … … 178 187 throw FitsIOException("FitsHandler<DataTable>::Read() Not a binary or ascii table HDU"); 179 188 189 // Determination de la taille de segment 180 190 sa_size_t segsz = is.GetNbRows() / 16; // Taille de segment par defaut 181 191 if (segsz > 2048) segsz = 2048; … … 186 196 if (segsz < 16) segsz = 16; 187 197 188 if (dobj == NULL) { // On cree la table si besoin 189 dobj = new DataTable(segsz); 190 } 191 else { 192 dobj->Clear(); // On efface la table sinon 193 dobj->mSegSz = segsz; 194 } 195 196 // On gere les DataTable pour le moment ... 197 DataTable* dt = dynamic_cast< DataTable *> (dobj); 198 if (dt == NULL) 199 throw FitsIOException("FitsHandler<DataTable>::Read() Not a DataTable object"); 200 198 // Nb de lignes et de colonnes 201 199 vector<string> colnames; 202 200 vector<int> coltypes; … … 204 202 vector<long> colpos; 205 203 is.GetColInfo(colnames, coltypes, repcnt, width); 204 long nbrows = is.GetNbRows(); 205 206 if (dobj == NULL) { // On cree la table si besoin 207 string key = "SOPCLSNM"; 208 string clsnm = is.KeyValue(key); 209 if ( (clsnm == "SOPHYA::SwFitsDataTable") || (nbrows*colnames.size() < 10000000) ) 210 dobj = new DataTable(segsz); 211 else dobj = new SwFitsDataTable(is, segsz, false); 212 } 213 else { 214 dobj->Clear(); // On efface la table sinon 215 dobj->mSegSz = segsz; 216 } 217 218 // Type reel de table 219 DataTable* dt = dynamic_cast< DataTable *> (dobj); 220 SwFitsDataTable* swfdt = dynamic_cast< SwFitsDataTable *> (dobj); 221 222 vector<int_8> swpos; 223 // Initialize the fits swap stream for SwFitsDataTable if necessary 224 if (swfdt) { 225 if ( swfdt->FitsSwapFile().FitsPtr() != is.FitsPtr() ) 226 swfdt->FitsSwapFile().ShareFitsPtr(is); 227 int_8 swp = 1; 228 229 while (swp < nbrows) { 230 swpos.push_back(swp); swp += segsz; 231 } 232 } 233 206 234 // --ATTENTION-- repcnt (contenu=vecteur) pas pris en compte pour le moment 207 235 for(sa_size_t k=0; k<colnames.size(); k++) { … … 211 239 case TUSHORT : 212 240 case TINT : 213 dt->AddIntegerColumn(colnames[k]); 241 if (swfdt) 242 swfdt->AddColRd(BaseDataTable::IntegerField, colnames[k], k+1, &swpos); 243 else dobj->AddIntegerColumn(colnames[k]); 214 244 colpos.push_back(k+1); 215 245 break; … … 219 249 #ifdef TLONGLONG 220 250 case TLONGLONG : 221 #endif 222 dt->AddLongColumn(colnames[k]); 251 #endif 252 if (swfdt) 253 swfdt->AddColRd(BaseDataTable::LongField, colnames[k], k+1, &swpos); 254 else dobj->AddLongColumn(colnames[k]); 223 255 colpos.push_back(k+1); 224 256 break; 225 257 case TFLOAT : 226 dt->AddFloatColumn(colnames[k]); 258 if (swfdt) 259 swfdt->AddColRd(BaseDataTable::FloatField, colnames[k], k+1, &swpos); 260 else dobj->AddFloatColumn(colnames[k]); 227 261 colpos.push_back(k+1); 228 262 break; 229 263 case TDOUBLE : 230 dt->AddDoubleColumn(colnames[k]); 264 if (swfdt) 265 swfdt->AddColRd(BaseDataTable::DoubleField, colnames[k], k+1, &swpos); 266 else dobj->AddDoubleColumn(colnames[k]); 231 267 colpos.push_back(k+1); 232 268 break; 233 269 case TCOMPLEX : 234 dt->AddComplexColumn(colnames[k]); 270 if (swfdt) 271 swfdt->AddColRd(BaseDataTable::ComplexField, colnames[k], k+1, &swpos); 272 else dobj->AddComplexColumn(colnames[k]); 235 273 colpos.push_back(k+1); 236 274 break; 237 275 case TDBLCOMPLEX : 238 dt->AddDoubleComplexColumn(colnames[k]); 276 if (swfdt) 277 swfdt->AddColRd(BaseDataTable::DoubleComplexField, colnames[k], k+1, &swpos); 278 else dobj->AddDoubleComplexColumn(colnames[k]); 239 279 colpos.push_back(k+1); 240 280 break; 241 281 case TSTRING : 242 dt->AddStringColumn(colnames[k]); 282 if (swfdt) 283 swfdt->AddColRd(BaseDataTable::StringField, colnames[k], k+1, &swpos); 284 else dobj->AddStringColumn(colnames[k]); 243 285 colpos.push_back(k+1); 244 286 break; … … 252 294 // ------- Mise a jour des champs Nb d'entrees, nb segments ... 253 295 dobj->mNEnt = is.GetNbRows(); 296 // Lecture DVList (=entete FITS) 297 is.GetHeaderRecords(dobj->Info()); 298 299 // On ne doit pas lire les donnees de la table pour un SwFitsDataTable 300 if (swfdt) return; 301 254 302 while ((dobj->SegmentSize()*dobj->NbSegments()) < dobj->NEntry()) 255 303 dobj->Extend(); … … 270 318 case BaseDataTable::IntegerField : 271 319 FitsBlockRW<int_4>::ReadColumnData(is, icol, l+1, 1, 272 d t->mICols[sk].GetSegment(iseg), sz);320 dobj->mIColsP[sk]->GetSegment(iseg), sz); 273 321 break; 274 322 case BaseDataTable::LongField : 275 323 FitsBlockRW<int_8>::ReadColumnData(is, icol, l+1, 1, 276 d t->mLCols[sk].GetSegment(iseg), sz);324 dobj->mLColsP[sk]->GetSegment(iseg), sz); 277 325 break; 278 326 case BaseDataTable::FloatField : 279 327 FitsBlockRW<r_4>::ReadColumnData(is, icol, l+1, 1, 280 d t->mFCols[sk].GetSegment(iseg), sz);328 dobj->mFColsP[sk]->GetSegment(iseg), sz); 281 329 break; 282 330 case BaseDataTable::DoubleField : 283 331 case BaseDataTable::DateTimeField : 284 332 FitsBlockRW<r_8>::ReadColumnData(is, icol, l+1, 1, 285 d t->mDCols[sk].GetSegment(iseg), sz);333 dobj->mDColsP[sk]->GetSegment(iseg), sz); 286 334 break; 287 335 case BaseDataTable::ComplexField : 288 336 FitsBlockRW< complex<r_4> >::ReadColumnData(is, icol, l+1, 1, 289 d t->mYCols[sk].GetSegment(iseg), sz);337 dobj->mYColsP[sk]->GetSegment(iseg), sz); 290 338 break; 291 339 case BaseDataTable::DoubleComplexField : 292 340 FitsBlockRW< complex<r_8> >::ReadColumnData(is, icol, l+1, 1, 293 d t->mZCols[sk].GetSegment(iseg), sz);341 dobj->mZColsP[sk]->GetSegment(iseg), sz); 294 342 break; 295 343 case BaseDataTable::StringField : 296 344 FitsBlockRW<std::string>::ReadColumnData(is, icol, l+1, 1, 297 d t->mSCols[sk].GetSegment(iseg), sz);345 dobj->mSColsP[sk]->GetSegment(iseg), sz); 298 346 break; 299 347 default: … … 303 351 } 304 352 305 // Mise a jour nombre d'entree306 // Lecture DVList307 is.GetHeaderRecords(dobj->Info());308 353 } 309 354 -
trunk/SophyaExt/FitsIOServer/swfitsdtable.cc
r2865 r2889 1 1 #include "swfitsdtable.h" 2 #include "fitshdtable.h" 2 3 #include "sopnamsp.h" 3 4 #include "pexceptions.h" … … 19 20 - It is not possible to make a complete (deep) copy of a SwFitsDataTable 20 21 Copy constructor and equal operator shares the data. 22 - The min/max values for column data are not updated when reading from a fits file. 23 In this case, the Show() method (or ostream& << operator) will compute min/max 24 values. This operation will take some time for large tables. 21 25 22 26 \sa SOPHYA::MuTyV … … 26 30 27 31 \code 28 #include "sw ppfdtable.h"32 #include "swfitsdtable.h" 29 33 // ... 30 34 { 31 35 // ---- Creation of the table 32 36 // Create the swap stream 33 POutPersist so("myswtable.ppf");34 SwFitsDataTable dt(so, 64);37 FitsInOutFile so("myswtable.fits", FitsInOutFile::Fits_Create); 38 SwFitsDataTable dt(so, 16); 35 39 // define table columns 36 40 dt.AddFloatColumn("X0_f"); … … 38 42 dt.AddDoubleColumn("X0X0pX1X1_d"); 39 43 // Fill the table 40 MuTyVx[5];44 r_8 x[5]; 41 45 for(int i=0; i<63; i++) { 42 46 x[0] = (i%9)-4.; x[1] = (i/9)-3.; x[2] = x[0]*x[0]+x[1]*x[1]; … … 45 49 // Printing table info 46 50 cout << dt ; 47 // Swap out all data and write the table structure to the PPF stream 48 so << dt ; 49 // .... 51 // The destructor will Swap out data still in memory 50 52 } 51 53 { 52 54 // ---- Accessing information from a previously created table 53 55 SwFitsDataTable dt; 54 PInPersist si("myswtable.ppf"); 56 FitsInOutFile si("myswtable.fits", FitsInOutFile::Fits_ReadOnly); 57 // Position the fits file on the first extension (BinTable) 58 si.MoveAbsToHDU(2); 59 // Reading in the table (initialisation) 55 60 si >> dt; 56 // Printing table info 61 // Printing table info 57 62 cout << dt ; 58 63 } … … 72 77 mSwF(os) , mFgCreate(fgcreate) 73 78 { 79 if (!fgcreate) { // Lecture de la table 80 FitsHandler<BaseDataTable> fio(*this); 81 fio.Read(os); 82 } 74 83 } 75 84 //! copy constructor - shares the data … … 83 92 SwFitsDataTable::~SwFitsDataTable() 84 93 { 85 if (mFgCreate) SwapOutAll(); 94 if (mFgCreate) { 95 SwapOutAll(); 96 // Ecriture de SegmentSize et autre elements de DVList 97 mSwF.WriteHeaderRecords(Info()); 98 MuTyV mtv = SegmentSize(); 99 mSwF.WriteKey("SEGMSIZE",mtv," SOPHYA::DataTable SegmentSize"); 100 mtv = "SOPHYA::SwFitsDataTable"; 101 mSwF.WriteKey("SOPCLSNM",mtv," Object class name "); 102 } 86 103 } 87 104 … … 213 230 mSCols.clear(); 214 231 215 /*216 mISwapper.clear();217 mLSwapper.clear();218 mFSwapper.clear();219 mDSwapper.clear();220 mYSwapper.clear();221 mZSwapper.clear();222 mSSwapper.clear();223 */224 232 } 225 233 … … 232 240 sa_size_t SwFitsDataTable::AddColumn(FieldType ft, string const & cnom) 233 241 { 234 return AddColRd(ft, cnom, NULL);242 return AddColRd(ft, cnom, -1, NULL); 235 243 } 236 244 /*! … … 240 248 */ 241 249 sa_size_t SwFitsDataTable::AddColRd(FieldType ft, string const & cnom, 242 vector<int_8> const * swpos)250 int colidx, vector<int_8> const * swpos) 243 251 { 244 252 if (NEntry() > 0) … … 247 255 sa_size_t ser; 248 256 sa_size_t idx = NVar(); 257 if (colidx < 1) colidx = idx+1; 258 249 259 switch (ft) { 250 260 case IntegerField : 251 261 { 252 262 ser = mICols.size(); 253 FITSDataSwapper<int_4> ISwapper(mSwF, idx+1);263 FITSDataSwapper<int_4> ISwapper(mSwF, colidx); 254 264 if (swpos) 255 265 mICols.push_back(SwSegDataBlock<int_4>(ISwapper, *swpos, mSegSz)); … … 265 275 { 266 276 ser = mLCols.size(); 267 FITSDataSwapper<int_8> LSwapper(mSwF, idx+1);277 FITSDataSwapper<int_8> LSwapper(mSwF, colidx); 268 278 if (swpos) 269 279 mLCols.push_back(SwSegDataBlock<int_8>(LSwapper, *swpos, mSegSz)); … … 279 289 { 280 290 ser = mFCols.size(); 281 FITSDataSwapper<r_4> FSwapper(mSwF, idx+1);291 FITSDataSwapper<r_4> FSwapper(mSwF, colidx); 282 292 if (swpos) 283 293 mFCols.push_back(SwSegDataBlock<r_4>(FSwapper, *swpos, mSegSz)); … … 294 304 { 295 305 ser = mDCols.size(); 296 FITSDataSwapper<r_8> DSwapper(mSwF, idx+1);306 FITSDataSwapper<r_8> DSwapper(mSwF, colidx); 297 307 if (swpos) 298 308 mDCols.push_back(SwSegDataBlock<r_8>(DSwapper, *swpos, mSegSz)); … … 308 318 { 309 319 ser = mYCols.size(); 310 FITSDataSwapper< complex<r_4> > YSwapper(mSwF, idx+1);320 FITSDataSwapper< complex<r_4> > YSwapper(mSwF, colidx); 311 321 if (swpos) 312 322 mYCols.push_back(SwSegDataBlock< complex<r_4> >(YSwapper, *swpos, mSegSz)); … … 322 332 { 323 333 ser = mZCols.size(); 324 FITSDataSwapper< complex<r_8> > ZSwapper(mSwF, idx+1);334 FITSDataSwapper< complex<r_8> > ZSwapper(mSwF, colidx); 325 335 if (swpos) 326 336 mZCols.push_back(SwSegDataBlock< complex<r_8> >(ZSwapper, *swpos, mSegSz)); … … 336 346 { 337 347 ser = mSCols.size(); 338 FITSDataSwapper< string > SSwapper(mSwF, idx+1);348 FITSDataSwapper< string > SSwapper(mSwF, colidx); 339 349 if (swpos) 340 350 mSCols.push_back(SwSegDataBlock< string >(SSwapper, *swpos, mSegSz)); … … 368 378 /*! 369 379 The min/max values for each column is updated, in addition 370 to the actions performed by the base class AddLine() 371 */ 372 sa_size_t SwFitsDataTable::AddLine(const r_8* data) 373 { 380 to the actions performed by the base class AddRow() 381 */ 382 sa_size_t SwFitsDataTable::AddRow(const r_8* data) 383 { 384 if (NRows() == 0) { // On cree la definition de la table FITS au premier appel 385 FitsHandler<BaseDataTable> fio(*this); 386 fio.Write(mSwF); 387 } 374 388 // On est oblige de calculer les min-max lors du remplissage 375 389 // On ne peut pas en effet 'relire' le swap pendant l'ecriture … … 380 394 mMinMaxNEnt[k]++; 381 395 } 382 return BaseDataTable::Add Line(data);383 } 384 385 //! Adds a line (or rowto the table) with input data as an array of MuTyV396 return BaseDataTable::AddRow(data); 397 } 398 399 //! Adds a row (or line to the table) with input data as an array of MuTyV 386 400 /*! 387 401 The min/max values for each column is updated, in addition 388 to the actions performed by the base class AddLine() 389 */ 390 sa_size_t SwFitsDataTable::AddLine(const MuTyV * data) 391 { 402 to the actions performed by the base class AddRow() 403 */ 404 sa_size_t SwFitsDataTable::AddRow(const MuTyV * data) 405 { 406 if (NRows() == 0) { // On cree la definition de la table FITS au premier appel 407 FitsHandler<BaseDataTable> fio(*this); 408 fio.Write(mSwF); 409 } 392 410 // On est oblige de calculer les min-max lors du remplissage 393 411 // On ne peut pas en effet 'relire' le swap pendant l'ecriture … … 398 416 mMinMaxNEnt[k]++; 399 417 } 400 return BaseDataTable::Add Line(data);401 } 402 418 return BaseDataTable::AddRow(data); 419 } 420 -
trunk/SophyaExt/FitsIOServer/swfitsdtable.h
r2865 r2889 26 26 27 27 // Filling data structures (adding lines) 28 virtual sa_size_t Add Line(const r_8* data);29 virtual sa_size_t Add Line(const MuTyV * data);28 virtual sa_size_t AddRow(const r_8* data); 29 virtual sa_size_t AddRow(const MuTyV * data); 30 30 31 //! Equal (copy) operator - Copies the structure and shares the data \b a 31 //! Equal (copy) operator - Copies the data and the structure from \b a 32 inline SwFitsDataTable& operator = (BaseDataTable const& a) 33 { CopyMerge(a, true) ; return *this ; } 34 //! Equal (copy) operator - Copies the structure and shares the data \b a 32 35 inline SwFitsDataTable& operator = (SwFitsDataTable const& a) 33 36 { Clear(); Share(a); return *this ; } 34 37 38 //! Acces the FitsInOutFile swap stream 39 inline FitsInOutFile& FitsSwapFile() { return mSwF; } 35 40 36 41 //! Reset(Clear) the table content and structure … … 47 52 void Share(SwFitsDataTable const & a); 48 53 // Methode pour utilisation par FitsHandler<BaseDataTable> 49 sa_size_t AddColRd(FieldType ft, string const & cnom, vector<int_8> const * swpos=NULL); 54 sa_size_t AddColRd(FieldType ft, string const & cnom, int colidx=-1, 55 vector<int_8> const * swpos=NULL); 50 56 51 57
Note:
See TracChangeset
for help on using the changeset viewer.