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

Last change on this file since 1047 was 1047, checked in by ansari, 25 years ago

modifs pour introduction lecteur de fits par lignes

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