Changeset 2889 in Sophya for trunk/SophyaExt/FitsIOServer/fitshdtable.cc
- Timestamp:
- Jan 9, 2006, 6:32:37 PM (20 years ago)
- File:
-
- 1 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
Note:
See TracChangeset
for help on using the changeset viewer.