source: Sophya/trunk/SophyaExt/FitsIOServer/fitsntuple.cc@ 2903

Last change on this file since 2903 was 2898, checked in by ansari, 20 years ago

Ajout methode FitsManager::ScanFile() et corrections diverses - Reza 13/01/2006

File size: 4.6 KB
RevLine 
[2615]1#include "sopnamsp.h"
[860]2#include "pexceptions.h"
3#include "fitsntuple.h"
4///////////////////////////////////////////////////////////
5// Les objets delegues pour la gestion de persistance sur fichiers fits
6// pout NTuple
7///////////////////////////////////////////////////////////
8
9
10#define LONNOM 8
11#define LONNOM1 (LONNOM+1)
12
13
[1371]14/*!
15 \class SOPHYA::FITS_NTuple
16 \ingroup FitsIOServer
17 FITS format I/O handler for SOPHYA::NTuple objects.
18*/
[860]19
20FITS_NTuple::FITS_NTuple()
21{
22 dobj_ = new NTuple;
[1047]23 InitNull();
24 ownobj_ = true;
[860]25}
26
27FITS_NTuple::FITS_NTuple(char inputfile[],int hdunum)
28{
29 dobj_ = new NTuple;
[1047]30 InitNull();
31 ownobj_ = true;
[860]32
[1136]33 Read(inputfile,hdunum);
[860]34}
35
36
37FITS_NTuple::FITS_NTuple(const NTuple & obj)
38{
39 dobj_ = new NTuple(obj);
[1047]40 InitNull();
41 ownobj_ = true;
[860]42}
[1047]43FITS_NTuple::FITS_NTuple(NTuple* obj)
44{
45 dobj_ = obj;
46 InitNull();
47 ownobj_ = false;
48}
[860]49
50
51FITS_NTuple::~FITS_NTuple()
52{
[1047]53 if (ownobj_ && dobj_ != NULL) delete dobj_;
[1136]54 // if (column_ != NULL) delete [] column_;
[860]55}
56
[2897]57int FITS_NTuple::CheckReadability(FitsInOutFile& is)
58{
59 if (is.CurrentHDUType() == IMAGE_HDU ) return 0;
60 string key = "SOPCLSNM";
61 string clsnm = is.KeyValue(key);
62 if (clsnm == "SOPHYA::NTuple") return 2;
[2898]63 key = "Content";
64 if (is.KeyValue(key) == "NTuple") return 2;
[2897]65 else return 1;
66}
67
[1136]68//void FITS_NTuple::Read(char inputfile[],int hdunum)
69//{
70// ReadF(inputfile,hdunum);
71//}
[1047]72void FITS_NTuple::ReadLines(char inputfile[],int firstLine, int numberOfLines,int hdunum)
73{
74 fistLineToBeRead_ = firstLine;
75 numberOfLinesToBeRead_ = numberOfLines;
[1136]76 Read(inputfile,hdunum);
[1047]77}
78
79
80
[1136]81//void FITS_NTuple::Write(char outputfile[], bool OldFile)
82//{
83// WriteF(outputfile, OldFile);
84//}
[860]85
[1136]86void FITS_NTuple::ReadFromFits(FitsInFile& is)
[860]87{
[1136]88 if (!is.IsFitsTable())
[860]89 {
90 throw PException("ReadFromFits: the fits file seems not to be a bintable nor ASCII table");
91 }
92 int nbcols, nbentries;
[1136]93 nbcols = is.NbColsFromFits();
[860]94 nbentries = 0;
[923]95 int k;
[1136]96 for (k=0; k<nbcols; k++) nbentries=max( nbentries, is.NentriesFromFits(k) );
[860]97
98 char ** ColName = new char*[nbcols];
99
[923]100 for (k=0; k<nbcols;k++)
[860]101 {
102 ColName[k] = new char[LONNOM1];
[1136]103 strncpy(ColName[k], is.ColNameFromFits(k).c_str(),LONNOM);
[860]104 ColName[k][LONNOM] = '\0';
105 }
[923]106 for (k=0; k<nbcols;k++)
[860]107 {
[1300]108 FitsFile::FitsDataType ss= is.ColTypeFromFits(k);
[860]109 string type;
[1300]110 if (ss != FitsFile::FitsDataType_float)
[860]111 {
[1300]112 if (ss == FitsFile::FitsDataType_double) type= string("double");
[860]113 else
[1300]114 if (ss == FitsFile::FitsDataType_int) type= string("integer");
[860]115 else
[1300]116 if (ss == FitsFile::FitsDataType_char) type = string("char*");
[860]117 else
118 type = string("unknown");
119 cout << " WARNING: the column " << k << " on fits file is not float but : " << type << endl;
120 }
121 }
122 if(dobj_ == NULL)
123 {
124 dobj_= new NTuple(nbcols,ColName);
[1047]125 ownobj_ = true;
[860]126 }
127 else
128 {
129 dobj_->Clean();
130 (*dobj_) = NTuple(nbcols,ColName);
131 }
[923]132 for (k=0; k<nbcols;k++)
[860]133 {
134 delete [] ColName[k];
135 }
136 delete [] ColName;
137
[1143]138 float* ligne = new float[nbcols];
[1047]139
[1136]140 int firstln, lastln;
141 if (numberOfLinesToBeRead_ > 0)
142 {
143 firstln = fistLineToBeRead_;
144 lastln = firstln + numberOfLinesToBeRead_;
145 }
146 else
147 {
148 firstln = 0;
149 lastln = nbentries;
150 }
151 int numLigne;
152 for (numLigne=firstln; numLigne < lastln; numLigne++)
153 {
154 is.GetBinTabLine(numLigne, ligne);
[1143]155 dobj_->Fill((r_4*)ligne);
[1136]156 }
157 delete [] ligne;
[1047]158
[1136]159 dobj_->Info()=is.DVListFromFits();
160}
[1047]161
[1136]162void FITS_NTuple::WriteToFits(FitsOutFile& os)
[860]163{
164 if(dobj_ == NULL)
165 {
166 cout << " WriteToFits:: dobj_= null " << endl;
167 return;
168 }
169
170 // table will have 'ncols' columns
171 int ncols = dobj_->NVar();
172
173 // table will have 'nrows' rows
174 int nentries = dobj_->NEntry();
175
176 // get names and values from the join DVList object
177 DVList dvl= dobj_->Info();
[1300]178 dvl["Content"]= "NTuple";
179 dvl.SetComment("Content", "name of SOPHYA object");
[2897]180 dvl["SOPCLSNM"]= "SOPHYA::NTuple";
181 dvl.SetComment("SOPCLSNM", "SOPHYA class name");
[860]182 // extension name
[2897]183 // string extname("NTuple_Binary_tbl");
184 string extname = os.NextExtensionName();
[860]185
[1194]186 vector<string> Noms(ncols);
[923]187 int k;
188 for (k=0; k< ncols; k++)
[860]189 {
[1194]190 Noms[k]= dobj_->NomIndex(k);
[860]191 }
[1136]192
[1194]193 string type(ncols, 'E');
[860]194 vector<int> dummy;
[1136]195
[1221]196 os.makeHeaderBntblOnFits(type,Noms, nentries, ncols, &dvl, extname, dummy);
[1136]197 float* column = new float[nentries];
198 for (k=0; k<ncols;k++)
199 {
[2209]200 int j;
201 for(j = 0; j < nentries; j++) column[j]= dobj_->GetVal(j,k);
[1210]202 os.PutColToFits(k, nentries, column);
[1136]203 }
204 delete [] column;
[860]205
206}
207
Note: See TracBrowser for help on using the repository browser.