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
RevLine 
[860]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;
[1047]17 InitNull();
18 ownobj_ = true;
[860]19}
20
21FITS_NTuple::FITS_NTuple(char inputfile[],int hdunum)
22{
23 dobj_ = new NTuple;
[1047]24 InitNull();
25 ownobj_ = true;
[860]26
27 ReadF(inputfile,hdunum);
28}
29
30
31FITS_NTuple::FITS_NTuple(const NTuple & obj)
32{
33 dobj_ = new NTuple(obj);
[1047]34 InitNull();
35 ownobj_ = true;
[860]36}
[1047]37FITS_NTuple::FITS_NTuple(NTuple* obj)
38{
39 dobj_ = obj;
40 InitNull();
41 ownobj_ = false;
42}
[860]43
44
45FITS_NTuple::~FITS_NTuple()
46{
[1047]47 if (ownobj_ && dobj_ != NULL) delete dobj_;
[860]48 if (column_ != NULL) delete [] column_;
49}
50
[1047]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
[972]64void FITS_NTuple::Write(char outputfile[], bool OldFile)
[860]65{
[972]66 WriteF(outputfile, OldFile);
[860]67}
68
[1047]69void FITS_NTuple::ReadFromFits()
[860]70{
[1047]71 // if (!fn.IsFitsTable())
72 if (!IsFitsTable())
[860]73 {
74 throw PException("ReadFromFits: the fits file seems not to be a bintable nor ASCII table");
75 }
76 int nbcols, nbentries;
[1047]77 // nbcols = fn.NbColsFromFits();
78 nbcols = NbColsFromFits();
[860]79 nbentries = 0;
[923]80 int k;
[1047]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) );
[860]83
84 char ** ColName = new char*[nbcols];
85
[923]86 for (k=0; k<nbcols;k++)
[860]87 {
88 ColName[k] = new char[LONNOM1];
[1047]89 // strncpy(ColName[k], fn.ColNameFromFits(k).c_str(),LONNOM);
90 strncpy(ColName[k], ColNameFromFits(k).c_str(),LONNOM);
[860]91 ColName[k][LONNOM] = '\0';
92 }
[923]93 for (k=0; k<nbcols;k++)
[860]94 {
[1047]95 // char ss= fn.ColTypeFromFits(k);
96 char ss= ColTypeFromFits(k);
[860]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);
[1047]113 ownobj_ = true;
[860]114 }
115 else
116 {
117 dobj_->Clean();
118 (*dobj_) = NTuple(nbcols,ColName);
119 }
[923]120 for (k=0; k<nbcols;k++)
[860]121 {
122 delete [] ColName[k];
123 }
124 delete [] ColName;
[1047]125 // if (column_ != NULL) delete [] column_;
126 // column_ = new float[nbentries];
[860]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];
[1047]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 }
[860]154 delete [] ligne;
[1047]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();
[860]166}
[1047]167void FITS_NTuple::WriteToFits()
[860]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];
[923]188 int k;
189 for (k=0; k< ncols; k++)
[860]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];
[923]196 for (k=0;k<ncols+1;k++) type[k]='E';
[860]197 type[ncols]='\0';
198 vector<int> dummy;
[1047]199 // fn.makeHeaderBntblOnFits(type,Noms, nentries, ncols, dvl, extname, dummy);
200 makeHeaderBntblOnFits(type,Noms, nentries, ncols, dvl, extname, dummy);
[923]201 for (k=0; k< ncols; k++)
[860]202 {
203 delete [] Noms[k];
204 }
205 delete [] Noms;
206 delete [] type;
[923]207 for (k=0; k<ncols;k++) putColToFits(k, nentries, getColFromObj(k));
[860]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.