#include "machdefs.h" #include "sopnamsp.h" #include #include #include #include #include "datatable.h" #include "fitsblkrw.h" #include "fitshandler.h" // #include "fitshdtable.h" DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */ void FitsHandler::Write(FitsInOutFile& os) { if (dobj == NULL) throw NullPtrError("FitsHandler::Write() NULL dobj pointer "); DataTable* dt = dynamic_cast< DataTable *> (dobj); if (dt == NULL) throw FitsIOException("FitsHandler::Write() Not a DataTable object"); int tbltyp = os.GetDef_TableType(); vector colnames, tform, tunit; for(sa_size_t k=0; kNVar(); k++) { colnames.push_back(dobj->GetColumName(k)); tunit.push_back(""); switch ( dobj->GetColumType(k) ) { case BaseDataTable::IntegerField : if (tbltyp == ASCII_TBL) tform.push_back("I9"); else tform.push_back("J"); break; case BaseDataTable::LongField : if (tbltyp == ASCII_TBL) tform.push_back("I12"); else tform.push_back("K"); break; case BaseDataTable::FloatField : if (tbltyp == ASCII_TBL) tform.push_back("E12.5"); else tform.push_back("E"); break; case BaseDataTable::DoubleField : if (tbltyp == ASCII_TBL) tform.push_back("D15.8"); else tform.push_back("D"); break; case BaseDataTable::StringField : cout << "FitsHandler::Write() / Warning StringField not yet supported " << endl; break; default: throw IOExc("FitsHandler::Write() unknown column type "); break; } } // On cree la table string extname = ""; os.CreateTable(os.GetDef_TableType(), extname, colnames, tform, tunit); // Ecriture des donnees des colonnes for(sa_size_t l=0; lNEntry(); l+=dobj->SegmentSize()) { sa_size_t icol = 0; sa_size_t sz = dobj->SegmentSize(); sa_size_t iseg = l/sz; if ((l+sz) > dobj->NEntry()) sz = dobj->NEntry()-l; for(sa_size_t k=0; kNVar(); k++) { sa_size_t sk = dobj->mNames[k].ser; switch ( dobj->GetColumType(k) ) { case BaseDataTable::IntegerField : icol++; FitsBlockRW::WriteColumnData(os, icol, l+1, 1, dt->mICols[sk].GetCstSegment(iseg), sz); break; case BaseDataTable::LongField : icol++; FitsBlockRW::WriteColumnData(os, icol, l+1, 1, dt->mLCols[sk].GetCstSegment(iseg), sz); break; case BaseDataTable::FloatField : icol++; FitsBlockRW::WriteColumnData(os, icol, l+1, 1, dt->mFCols[sk].GetCstSegment(iseg), sz); break; case BaseDataTable::DoubleField : icol++; FitsBlockRW::WriteColumnData(os, icol, l+1, 1, dt->mDCols[sk].GetCstSegment(iseg), sz); break; // case BaseDataTable::StringField : default: break; } } } // Ecriture de SegmentSize et autre elements de DVList os.WriteHeaderRecords(dobj->Info()); MuTyV mtv = dobj->SegmentSize(); os.WriteKey("SEGMSIZE",mtv," SOPHYA::DataTable SegmentSize"); } DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */ void FitsHandler::Read(FitsInOutFile& is) { int hdutyp = is.CurrentHDUType(); if ( (hdutyp != BINARY_TBL ) && (hdutyp != ASCII_TBL) ) throw FitsIOException("FitsHandler::Read() Not a binary or ascii table HDU"); sa_size_t segsz = is.GetNbRows() / 16; // Taille de segment par defaut if (segsz > 2048) segsz = 2048; string key = "SEGMSIZE"; string ssegsz = is.KeyValue(key); if (ssegsz.length() > 0) segsz = atoi(ssegsz.c_str()); if (segsz < 16) segsz = 16; if (dobj == NULL) { // On cree la table si besoin dobj = new DataTable(segsz); } else { dobj->Clear(); // On efface la table sinon dobj->mSegSz = segsz; } // On gere les DataTable pour le moment ... DataTable* dt = dynamic_cast< DataTable *> (dobj); if (dt == NULL) throw FitsIOException("FitsHandler::Read() Not a DataTable object"); vector colnames; vector coltypes; vector repcnt, width; vector colpos; is.GetColInfo(colnames, coltypes, repcnt, width); // --ATTENTION-- repcnt (contenu=vecteur) pas pris en compte pour le moment for(sa_size_t k=0; kAddIntegerColumn(colnames[k]); colpos.push_back(k+1); break; case TUINT: case TLONG : case TULONG : #ifdef TLONGLONG case TLONGLONG : #endif dt->AddLongColumn(colnames[k]); colpos.push_back(k+1); break; case TFLOAT : dt->AddFloatColumn(colnames[k]); colpos.push_back(k+1); break; case TDOUBLE : dt->AddDoubleColumn(colnames[k]); colpos.push_back(k+1); break; default: cout << "FitsHandler::Read() NOT handled field type " << coltypes[k] << endl; break; } } // ------- Mise a jour des champs Nb d'entrees, nb segments ... dobj->mNEnt = is.GetNbRows(); while ((dobj->SegmentSize()*dobj->NbSegments()) < dobj->NEntry()) dobj->Extend(); // cout << " DBG2 -- dobj->mNSeg = " << dobj->NbSegments() << " SegSize=" // << dobj->SegmentSize() << " NEntry=" << dobj->NEntry() << endl; // Lecture des donnees des colonnes for(sa_size_t l=0; lNEntry(); l+=dobj->SegmentSize()) { sa_size_t icol = 0; sa_size_t sz = dobj->SegmentSize(); sa_size_t iseg = l/sz; if ((l+sz) > dobj->NEntry()) sz = dobj->NEntry()-l; for(sa_size_t k=0; kNVar(); k++) { sa_size_t sk = dobj->mNames[k].ser; icol = colpos[k]; // cout << " DBG-3 , k=" << k << " icol=" << icol << endl; switch ( dobj->GetColumType(k) ) { case BaseDataTable::IntegerField : FitsBlockRW::ReadColumnData(is, icol, l+1, 1, dt->mICols[sk].GetSegment(iseg), sz); break; case BaseDataTable::LongField : FitsBlockRW::ReadColumnData(is, icol, l+1, 1, dt->mLCols[sk].GetSegment(iseg), sz); break; case BaseDataTable::FloatField : FitsBlockRW::ReadColumnData(is, icol, l+1, 1, dt->mFCols[sk].GetSegment(iseg), sz); break; case BaseDataTable::DoubleField : FitsBlockRW::ReadColumnData(is, icol, l+1, 1, dt->mDCols[sk].GetSegment(iseg), sz); break; // case BaseDataTable::StringField : default: break; } } } // Mise a jour nombre d'entree // Lecture DVList is.GetHeaderRecords(dobj->Info()); } int toto() { DataTable xx; FitsInOutFile fio("dtoto.fits", FitsInOutFile::Fits_Create); FitsHandler fh(xx); // fio << xx; }