#include "machdefs.h" #include "pexceptions.h" #include "fitstarray.h" /////////////////////////////////////////////////////////// // Les objets delegues pour la gestion de persistance sur fichiers fits // pout TArray /////////////////////////////////////////////////////////// using namespace SOPHYA; template FITS_TArray::FITS_TArray() { dobj_=new TArray; ownobj=true; } template FITS_TArray::FITS_TArray(char inputfile[],int hdunum) { dobj_=new TArray; ownobj=true; ReadF(inputfile,hdunum); } template FITS_TArray::FITS_TArray(const TArray & obj) { dobj_ = new TArray(obj); ownobj=true; } template FITS_TArray::FITS_TArray(TArray *obj) { dobj_ = obj; ownobj=false; } template FITS_TArray::~FITS_TArray() { if (ownobj && dobj_) delete dobj_; } template void FITS_TArray::Write(char outputfile[]) { WriteF(outputfile); } template AnyDataObj* FITS_TArray::DataObj() { return(dobj_); } template void FITS_TArray::ReadFromFits(const FitsFile& fn) { if (!fn.IsFitsImage()) { throw PException("ReadFromFits: the fits file seems not to be an image"); } int dimension = fn.nbDimOfImage(); cout << " dimension de l'image a lire: " << dimension << endl; uint_4* siz = new uint_4[dimension]; for (int k=0; k< dimension; k++) siz[k] = fn.dimOfImageAxes()[k]; if(dobj_ == NULL) dobj_ = new TArray(dimension,siz); else dobj_->ReSize(dimension,siz); delete [] siz; if (dobj_->Size() != fn.nbOfImageData() ) { cout << " total size of TArray: " << dobj_->Size() << endl; cout << " total size from fits file: " << fn.nbOfImageData() << endl; throw PException("ReadFromFits: size conflict"); } // On lit le tableau fn.GetSingleColumn( dobj_->Data(),dobj_->Size()); } template void FITS_TArray::WriteToFits(const FitsFile& fn) { if(dobj_ == NULL) return; uint_4 nbdim = dobj_->NbDimensions(); if ( nbdim == 0) { throw PException(" FITS_TARRAY: number of dimensions of the array = 0?"); } cout << "FITS_TARRAY: nombre de dimension du tableau a ecrire: " << nbdim << endl; int* naxisn = new int[nbdim]; int k; for (k=0; k< nbdim; k++) { naxisn[k] = dobj_->Size(k); cout << " nombre de donnees dans la la dimension " << k << " : " << naxisn[k] << endl; } char type; if ( typeid(T) == typeid(r_8) ) type='D'; else if ( typeid(T) == typeid(r_4) ) type='E'; else if ( typeid(T) == typeid(int_4) ) type='I'; else { cout << " type du tableau= " << typeid(T).name() << endl; throw IOExc("FITS_TArray:: unknown type"); } int nbels = 1; for (k=0; k< nbdim; k++) { if (naxisn[k] > 0) nbels *= naxisn[k]; } cout << " nombre total d'elements a copier " << nbels << endl; fn.makeHeaderImageOnFits(type, nbdim, naxisn); if (!dobj_->IsPacked()) { cout << " IsPacked() = " << dobj_->IsPacked() << endl; throw PException(" FITS_TARRAY: this case is not yet programmed"); } if (dobj_->MinStep() != 1) { cout << " MinStep()) = " << dobj_->MinStep() << endl; throw PException(" FITS_TARRAY: this case is not yet programmed"); } fn.putImageToFits(nbels, dobj_->Data()); delete [] naxisn; } #ifdef __CXX_PRAGMA_TEMPLATES__ #pragma define_template FITS_TArray #pragma define_template FITS_TArray #endif #if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES) template class FITS_TArray; template class FITS_TArray; #endif