source: Sophya/trunk/SophyaExt/FitsIOServer/fitsgenedata.cc

Last change on this file was 3237, checked in by ansari, 18 years ago

suppression include sopnamsp.h et mis la declaration namespace SOPHYA ds les fichiers .cc quand DECL_TEMP_SPEC ds le fichier , cmv+reza 27/04/2007

File size: 6.5 KB
Line 
1#include "machdefs.h"
2
3#include <stdio.h>
4#include <string.h>
5#include <iostream>
6#include <typeinfo>
7
8#include "generaldata.h"
9
10#include "fitsblkrw.h"
11#include "fitshandler.h"
12
13namespace SOPHYA {
14
15DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
16int FitsHandler<GeneralFitData>::CheckReadability(FitsInOutFile& is)
17{
18 if (is.CurrentHDUType() == IMAGE_HDU ) return 0;
19 string key = "SOPCLSNM";
20 string clsnm = is.KeyValue(key);
21 if( clsnm == "SOPHYA::GeneralFitData") return 2;
22 return 0;
23}
24
25DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
26int FitsHandler<GeneralFitData>::CheckHandling(AnyDataObj & o)
27{
28 if (typeid(o) == typeid(GeneralFitData)) return 2;
29 GeneralFitData * po = dynamic_cast< GeneralFitData * >(& o);
30 if (po != NULL) return 2;
31 return 0;
32}
33
34DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
35void FitsHandler<GeneralFitData>::Write(FitsInOutFile& os)
36{
37 if(dobj==NULL)
38 throw NullPtrError("FitsHandler<GeneralFitData>::Write() NULL dobj pointer ");
39
40 //--- Le type d'objet et son pointeur
41 GeneralFitData* gd = dynamic_cast< GeneralFitData *> (dobj);
42 long nvar = gd->mNVar;
43 if(nvar<=0)
44 throw NullPtrError("FitsHandler<GeneralFitData>::Write() no variables ");
45
46 //--- Les noms de colonnes
47 int tbltyp = os.GetDef_TableType();
48 vector<string> colnames, tform, tunit;
49 // La variable Y et son Erreur
50 if(tbltyp==ASCII_TBL) tform.push_back("D15.8"); else tform.push_back("D");
51 colnames.push_back("y");
52 tunit.push_back("");
53 if(tbltyp==ASCII_TBL) tform.push_back("D15.8"); else tform.push_back("D");
54 colnames.push_back("ey");
55 tunit.push_back("");
56 // Le flag de validite
57 if(tbltyp==ASCII_TBL) tform.push_back("I9"); else tform.push_back("J");
58 colnames.push_back("ok");
59 tunit.push_back("");
60 // Les variables X
61 for(int i=0;i<nvar;i++) {
62 char str[16]; sprintf(str,"x%d",i);
63 if(tbltyp==ASCII_TBL) tform.push_back("D15.8"); else tform.push_back("D");
64 colnames.push_back(str);
65 tunit.push_back("");
66 }
67 // Les erreurs sur les variables X
68 if(gd->HasXErrors()) {
69 for(int i=0;i<nvar;i++) {
70 char str[16]; sprintf(str,"ex%d",i);
71 if(tbltyp==ASCII_TBL) tform.push_back("D15.8"); else tform.push_back("D");
72 colnames.push_back(str);
73 tunit.push_back("");
74 }
75 }
76
77 //--- On cree la table
78 string extname = os.NextExtensionName();
79 os.CreateTable(os.GetDef_TableType(),extname,colnames,tform,tunit);
80
81 //--- Ecriture des donnees des colonnes
82 long n = gd->mNDataAlloc;
83 if(n>0) {
84 // Y
85 FitsBlockRW<r_8>::WriteColumnData(os,1,1,1,gd->mF,n);
86 // EY
87 FitsBlockRW<r_8>::WriteColumnData(os,2,1,1,gd->mErr,n);
88 // Le flag de validite
89 int_4 *ival = new int_4[n];
90 for(int_4 i=0;i<n;i++) ival[i] = gd->mOK[i];
91 FitsBlockRW<int_4>::WriteColumnData(os,3,1,1,ival,n);
92 delete [] ival;
93 // les variables X
94 r_8 *val = new r_8[n];
95 for(int k=0;k<nvar;k++) {
96 for(int_4 i=0;i<n;i++) val[i] = gd->mXP[nvar*i+k];
97 FitsBlockRW<r_8>::WriteColumnData(os,4+k,1,1,val,n);
98 }
99 // les erreurs sur les variables X
100 if(gd->HasXErrors()) {
101 for(int k=0;k<nvar;k++) {
102 for(int_4 i=0;i<n;i++) val[i] = gd->mErrXP[nvar*i+k];
103 FitsBlockRW<r_8>::WriteColumnData(os,4+nvar+k,1,1,val,n);
104 }
105 }
106 delete [] val;
107 }
108
109 //--- Ecriture des clefs fits
110 MuTyV mtv;
111
112 mtv = "SOPHYA::GeneralFitData";
113 os.WriteKey("SOPCLSNM",mtv," SOPHYA class name");
114
115 mtv = "GeneralFitData";
116 os.WriteKey("CONTENT",mtv," name of SOPHYA object");
117
118 mtv = gd->mNVar;
119 os.WriteKey("NVAR",mtv," number of variables X");
120
121 mtv = gd->mNDataAlloc;
122 os.WriteKey("NALLOC",mtv," number of allocated data");
123 mtv = gd->mNData;
124 os.WriteKey("NDATA",mtv," number of filled data");
125 mtv = gd->mNDataGood;
126 os.WriteKey("NGOOD",mtv," number of good filled data");
127
128 mtv = (int_4)((gd->HasXErrors())? 1: 0);
129 os.WriteKey("HASXERR",mtv," erreurs sur X?");
130
131 return;
132}
133
134DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
135void FitsHandler<GeneralFitData>::Read(FitsInOutFile& is)
136{
137 int hdutyp = is.CurrentHDUType();
138 if( (hdutyp != BINARY_TBL ) && (hdutyp != ASCII_TBL) )
139 throw FitsIOException("FitsHandler<GeneralFitData>::Read() Not a binary or ascii table HDU");
140
141 //--- Nb de lignes et de colonnes
142 vector<string> colnames; vector<int> coltypes; vector<LONGLONG> repcnt, width;
143 is.GetColInfo(colnames,coltypes,repcnt,width);
144 long ncol = colnames.size();
145 if(ncol<=0)
146 throw FitsIOException("FitsHandler<GeneralFitData>::Read() bad number of table columns");
147 int_8 nbrows = is.GetNbRows();
148 if(nbrows<=0)
149 throw FitsIOException("FitsHandler<GeneralFitData>::Read() number of rows is zero, no reading");
150
151 //--- Lecture entete FITS
152 DVList dvl; is.GetHeaderRecords(dvl,true,false);
153
154 int_4 nvar = dvl.GetI("NVAR",-1);
155 if(nvar<=0)
156 throw FitsIOException("FitsHandler<GeneralFitData>::Read() number of variables is zero, no reading");
157
158 int_4 ndatalloc = dvl.GetI("NALLOC",-1);
159 if(ndatalloc<=0)
160 throw FitsIOException("FitsHandler<GeneralFitData>::Read() number of allocated data is zero, no reading");
161 int_4 ndata = dvl.GetI("NDATA",-1);
162 int_8 ndatagood = dvl.GetI("NGOOD",-1);
163
164 int_4 dum = dvl.GetI("HASXERR",0);
165 uint_2 ok_ex = (dum==0) ? 0: 1;
166
167 int mynvar = 3 + nvar + ((ok_ex>0)? nvar: 0);
168 if(ncol!=mynvar)
169 throw FitsIOException("FitsHandler<GeneralFitData>::Read() inconsistent header/mvar, no reading");
170
171 //--- Creation de l'objet
172 if(dobj == NULL) dobj = new GeneralFitData;
173 dobj->Alloc(nvar,ndatalloc,ok_ex);
174
175 //--- remplissage des variables privees restantes
176 dobj->mNData = ndata;
177 dobj->mNDataGood = ndatagood;
178
179 //--- remplissage de la structure de donnees
180 if(ndata>0) {
181 // Y
182 FitsBlockRW<r_8>::ReadColumnData(is,1,1,1,dobj->mF,ndata);
183 // EY
184 FitsBlockRW<r_8>::ReadColumnData(is,2,1,1,dobj->mErr,ndata);
185 // Le flag de validite
186 int_4 *ival = new int_4[ndata];
187 FitsBlockRW<int_4>::ReadColumnData(is,3,1,1,ival,ndata);
188 for(int_4 i=0;i<ndata;i++) dobj->mOK[i] = (uint_2)ival[i];
189 delete [] ival;
190 // les variables X
191 r_8 *val = new r_8[ndata];
192 for(int k=0;k<nvar;k++) {
193 FitsBlockRW<r_8>::ReadColumnData(is,4+k,1,1,val,ndata);
194 for(int_4 i=0;i<ndata;i++) dobj->mXP[nvar*i+k] = val[i];
195 }
196 // les erreurs sur les variables X
197 if(dobj->HasXErrors()) {
198 for(int k=0;k<nvar;k++) {
199 FitsBlockRW<r_8>::ReadColumnData(is,4+nvar+k,1,1,val,ndata);
200 for(int_4 i=0;i<ndata;i++) dobj->mErrXP[nvar*i+k] = val[i];
201 }
202 }
203 delete [] val;
204 }
205
206 return;
207}
208
209} // FIN namespace SOPHYA
Note: See TracBrowser for help on using the repository browser.