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

Last change on this file since 2901 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
Line 
1#include "sopnamsp.h"
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
14/*!
15 \class SOPHYA::FITS_NTuple
16 \ingroup FitsIOServer
17 FITS format I/O handler for SOPHYA::NTuple objects.
18*/
19
20FITS_NTuple::FITS_NTuple()
21{
22 dobj_ = new NTuple;
23 InitNull();
24 ownobj_ = true;
25}
26
27FITS_NTuple::FITS_NTuple(char inputfile[],int hdunum)
28{
29 dobj_ = new NTuple;
30 InitNull();
31 ownobj_ = true;
32
33 Read(inputfile,hdunum);
34}
35
36
37FITS_NTuple::FITS_NTuple(const NTuple & obj)
38{
39 dobj_ = new NTuple(obj);
40 InitNull();
41 ownobj_ = true;
42}
43FITS_NTuple::FITS_NTuple(NTuple* obj)
44{
45 dobj_ = obj;
46 InitNull();
47 ownobj_ = false;
48}
49
50
51FITS_NTuple::~FITS_NTuple()
52{
53 if (ownobj_ && dobj_ != NULL) delete dobj_;
54 // if (column_ != NULL) delete [] column_;
55}
56
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;
63 key = "Content";
64 if (is.KeyValue(key) == "NTuple") return 2;
65 else return 1;
66}
67
68//void FITS_NTuple::Read(char inputfile[],int hdunum)
69//{
70// ReadF(inputfile,hdunum);
71//}
72void FITS_NTuple::ReadLines(char inputfile[],int firstLine, int numberOfLines,int hdunum)
73{
74 fistLineToBeRead_ = firstLine;
75 numberOfLinesToBeRead_ = numberOfLines;
76 Read(inputfile,hdunum);
77}
78
79
80
81//void FITS_NTuple::Write(char outputfile[], bool OldFile)
82//{
83// WriteF(outputfile, OldFile);
84//}
85
86void FITS_NTuple::ReadFromFits(FitsInFile& is)
87{
88 if (!is.IsFitsTable())
89 {
90 throw PException("ReadFromFits: the fits file seems not to be a bintable nor ASCII table");
91 }
92 int nbcols, nbentries;
93 nbcols = is.NbColsFromFits();
94 nbentries = 0;
95 int k;
96 for (k=0; k<nbcols; k++) nbentries=max( nbentries, is.NentriesFromFits(k) );
97
98 char ** ColName = new char*[nbcols];
99
100 for (k=0; k<nbcols;k++)
101 {
102 ColName[k] = new char[LONNOM1];
103 strncpy(ColName[k], is.ColNameFromFits(k).c_str(),LONNOM);
104 ColName[k][LONNOM] = '\0';
105 }
106 for (k=0; k<nbcols;k++)
107 {
108 FitsFile::FitsDataType ss= is.ColTypeFromFits(k);
109 string type;
110 if (ss != FitsFile::FitsDataType_float)
111 {
112 if (ss == FitsFile::FitsDataType_double) type= string("double");
113 else
114 if (ss == FitsFile::FitsDataType_int) type= string("integer");
115 else
116 if (ss == FitsFile::FitsDataType_char) type = string("char*");
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);
125 ownobj_ = true;
126 }
127 else
128 {
129 dobj_->Clean();
130 (*dobj_) = NTuple(nbcols,ColName);
131 }
132 for (k=0; k<nbcols;k++)
133 {
134 delete [] ColName[k];
135 }
136 delete [] ColName;
137
138 float* ligne = new float[nbcols];
139
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);
155 dobj_->Fill((r_4*)ligne);
156 }
157 delete [] ligne;
158
159 dobj_->Info()=is.DVListFromFits();
160}
161
162void FITS_NTuple::WriteToFits(FitsOutFile& os)
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();
178 dvl["Content"]= "NTuple";
179 dvl.SetComment("Content", "name of SOPHYA object");
180 dvl["SOPCLSNM"]= "SOPHYA::NTuple";
181 dvl.SetComment("SOPCLSNM", "SOPHYA class name");
182 // extension name
183 // string extname("NTuple_Binary_tbl");
184 string extname = os.NextExtensionName();
185
186 vector<string> Noms(ncols);
187 int k;
188 for (k=0; k< ncols; k++)
189 {
190 Noms[k]= dobj_->NomIndex(k);
191 }
192
193 string type(ncols, 'E');
194 vector<int> dummy;
195
196 os.makeHeaderBntblOnFits(type,Noms, nentries, ncols, &dvl, extname, dummy);
197 float* column = new float[nentries];
198 for (k=0; k<ncols;k++)
199 {
200 int j;
201 for(j = 0; j < nentries; j++) column[j]= dobj_->GetVal(j,k);
202 os.PutColToFits(k, nentries, column);
203 }
204 delete [] column;
205
206}
207
Note: See TracBrowser for help on using the repository browser.