| [3123] | 1 | #include "machdefs.h" | 
|---|
|  | 2 |  | 
|---|
|  | 3 | #include <stdio.h> | 
|---|
|  | 4 | #include <string.h> | 
|---|
|  | 5 | #include <iostream> | 
|---|
|  | 6 | #include <typeinfo> | 
|---|
|  | 7 |  | 
|---|
|  | 8 | #include "histerr.h" | 
|---|
|  | 9 | #include "hist2err.h" | 
|---|
|  | 10 |  | 
|---|
|  | 11 | #include "fitsblkrw.h" | 
|---|
|  | 12 | #include "fitshandler.h" | 
|---|
|  | 13 |  | 
|---|
| [3237] | 14 | namespace SOPHYA { | 
|---|
| [3123] | 15 |  | 
|---|
|  | 16 | /////////////////////////////////////////////////////////////////////////// | 
|---|
|  | 17 | ///////////////////////// Histo , HProf , HistoErr //////////////////////// | 
|---|
|  | 18 | /////////////////////////////////////////////////////////////////////////// | 
|---|
|  | 19 |  | 
|---|
|  | 20 | DECL_TEMP_SPEC  /* equivalent a template <> , pour SGI-CC en particulier */ | 
|---|
|  | 21 | int FitsHandler<HistoErr>::CheckReadability(FitsInOutFile& is) | 
|---|
|  | 22 | { | 
|---|
|  | 23 | if (is.CurrentHDUType() == IMAGE_HDU ) return 0; | 
|---|
|  | 24 | string key = "SOPCLSNM"; | 
|---|
|  | 25 | string clsnm = is.KeyValue(key); | 
|---|
|  | 26 | if(clsnm == "SOPHYA::HistoErr") return 2; | 
|---|
|  | 27 | return 0; | 
|---|
|  | 28 | } | 
|---|
|  | 29 |  | 
|---|
|  | 30 | DECL_TEMP_SPEC  /* equivalent a template <> , pour SGI-CC en particulier */ | 
|---|
|  | 31 | int FitsHandler<HistoErr>::CheckHandling(AnyDataObj & o) | 
|---|
|  | 32 | { | 
|---|
|  | 33 | if (typeid(o) == typeid(HistoErr)) return 2; | 
|---|
|  | 34 | HistoErr * po = dynamic_cast< HistoErr * >(& o); | 
|---|
|  | 35 | if (po != NULL) return 2; | 
|---|
|  | 36 | return 0; | 
|---|
|  | 37 | } | 
|---|
|  | 38 |  | 
|---|
|  | 39 | DECL_TEMP_SPEC  /* equivalent a template <> , pour SGI-CC en particulier */ | 
|---|
|  | 40 | void FitsHandler<HistoErr>::Write(FitsInOutFile& os) | 
|---|
|  | 41 | { | 
|---|
|  | 42 | if(dobj==NULL) | 
|---|
|  | 43 | throw NullPtrError("FitsHandler<HistoErr>::Write() NULL dobj pointer "); | 
|---|
|  | 44 |  | 
|---|
|  | 45 | //--- Le type d'objet et son pointeur | 
|---|
|  | 46 | HistoErr* he = dynamic_cast< HistoErr *> (dobj); | 
|---|
|  | 47 |  | 
|---|
|  | 48 | //--- Les noms de colonnes | 
|---|
|  | 49 | int tbltyp = os.GetDef_TableType(); | 
|---|
|  | 50 | vector<string> colnames, tform, tunit; | 
|---|
|  | 51 | // les valeurs du bin | 
|---|
|  | 52 | if(tbltyp==ASCII_TBL) tform.push_back("D15.8"); else tform.push_back("D"); | 
|---|
|  | 53 | colnames.push_back("val"); | 
|---|
|  | 54 | tunit.push_back(""); | 
|---|
|  | 55 | // Les erreurs | 
|---|
|  | 56 | if(tbltyp==ASCII_TBL) tform.push_back("D15.8"); else tform.push_back("D"); | 
|---|
|  | 57 | colnames.push_back("e2"); | 
|---|
|  | 58 | tunit.push_back(""); | 
|---|
|  | 59 | // Le nombre d'entrees dans le bin | 
|---|
|  | 60 | if(tbltyp==ASCII_TBL) tform.push_back("D15.8"); else tform.push_back("D"); | 
|---|
|  | 61 | colnames.push_back("nb"); | 
|---|
|  | 62 | tunit.push_back(""); | 
|---|
|  | 63 |  | 
|---|
|  | 64 | //--- On cree la table | 
|---|
|  | 65 | string extname = os.NextExtensionName(); | 
|---|
|  | 66 | os.CreateTable(os.GetDef_TableType(),extname,colnames,tform, tunit); | 
|---|
|  | 67 |  | 
|---|
|  | 68 | // Ecriture des donnees des colonnes | 
|---|
|  | 69 | int n = he->NBins(); | 
|---|
|  | 70 | if(n>0) { | 
|---|
|  | 71 | FitsBlockRW<r_8>::WriteColumnData(os,1,1,1,&(he->data_(0)),n); | 
|---|
|  | 72 | FitsBlockRW<r_8>::WriteColumnData(os,2,1,1,&(he->err2_(0)),n); | 
|---|
|  | 73 | FitsBlockRW<r_8>::WriteColumnData(os,3,1,1,&(he->ndata_(0)),n); | 
|---|
|  | 74 | } | 
|---|
|  | 75 |  | 
|---|
|  | 76 | // Ecriture des clefs fits | 
|---|
|  | 77 | MuTyV mtv; | 
|---|
|  | 78 |  | 
|---|
|  | 79 | mtv = "SOPHYA::HistoErr"; | 
|---|
|  | 80 | os.WriteKey("SOPCLSNM",mtv," SOPHYA class name"); | 
|---|
|  | 81 |  | 
|---|
|  | 82 | mtv = "HistoErr"; | 
|---|
|  | 83 | os.WriteKey("CONTENT",mtv," name of SOPHYA object"); | 
|---|
|  | 84 |  | 
|---|
|  | 85 | mtv = he->NBins(); | 
|---|
|  | 86 | os.WriteKey("NBIN",mtv," number of bins"); | 
|---|
|  | 87 |  | 
|---|
|  | 88 | mtv = he->XMin(); | 
|---|
|  | 89 | os.WriteKey("XMIN",mtv," absc of beginning of 1srt bin"); | 
|---|
|  | 90 |  | 
|---|
|  | 91 | mtv = he->XMax(); | 
|---|
|  | 92 | os.WriteKey("XMAX",mtv," absc of end of last bin"); | 
|---|
|  | 93 |  | 
|---|
|  | 94 | mtv = he->BinWidth(); | 
|---|
|  | 95 | os.WriteKey("WBIN",mtv," bin width"); | 
|---|
|  | 96 |  | 
|---|
| [3148] | 97 | mtv = he->mMean; | 
|---|
|  | 98 | os.WriteKey("NMEAN",mtv," number of Mean/Variance calls"); | 
|---|
| [3123] | 99 |  | 
|---|
|  | 100 | return; | 
|---|
|  | 101 | } | 
|---|
|  | 102 |  | 
|---|
|  | 103 |  | 
|---|
|  | 104 | DECL_TEMP_SPEC  /* equivalent a template <> , pour SGI-CC en particulier */ | 
|---|
|  | 105 | void FitsHandler<HistoErr>::Read(FitsInOutFile& is) | 
|---|
|  | 106 | { | 
|---|
|  | 107 | int hdutyp = is.CurrentHDUType(); | 
|---|
|  | 108 | if( (hdutyp != BINARY_TBL ) && (hdutyp != ASCII_TBL) ) | 
|---|
|  | 109 | throw FitsIOException("FitsHandler<HistoErr>::Read() Not a binary or ascii table HDU"); | 
|---|
|  | 110 |  | 
|---|
|  | 111 | //--- Nb de lignes et de colonnes | 
|---|
|  | 112 | vector<string> colnames; | 
|---|
|  | 113 | vector<int> coltypes; | 
|---|
| [3167] | 114 | vector<LONGLONG> repcnt, width; | 
|---|
| [3123] | 115 | is.GetColInfo(colnames,coltypes,repcnt,width); | 
|---|
|  | 116 | long ncol = colnames.size(); | 
|---|
|  | 117 | if(ncol<=0) | 
|---|
|  | 118 | throw FitsIOException("FitsHandler<HistoErr>::Read() bad number of table columns"); | 
|---|
|  | 119 | long nbrows = is.GetNbRows(); | 
|---|
|  | 120 | if(nbrows<=0) | 
|---|
|  | 121 | throw FitsIOException("FitsHandler<HistoErr>::Read() number of rows is zero, no reading"); | 
|---|
|  | 122 |  | 
|---|
|  | 123 | //--- Lecture entete FITS | 
|---|
|  | 124 | string key = "SOPCLSNM"; string clsnm = is.KeyValue(key); | 
|---|
|  | 125 | DVList dvl; is.GetHeaderRecords(dvl,true,false); | 
|---|
|  | 126 |  | 
|---|
|  | 127 | int_4 nbin = dvl.GetI("NBIN",-1); | 
|---|
|  | 128 | if(nbin<=0 && nbin!=nbrows) | 
|---|
|  | 129 | throw FitsIOException("FitsHandler<HistoErr>::Read() number of bins is zero or bad, no reading"); | 
|---|
|  | 130 |  | 
|---|
|  | 131 | r_8 xmin = dvl.GetD("XMIN",-1.); | 
|---|
|  | 132 | r_8 xmax = dvl.GetD("XMAX",+1.); | 
|---|
|  | 133 |  | 
|---|
|  | 134 | //--- Creation de l'objet si necessaire | 
|---|
|  | 135 | if(dobj == NULL) { | 
|---|
|  | 136 | if(clsnm == "SOPHYA::HistoErr") dobj = new HistoErr; | 
|---|
|  | 137 | } | 
|---|
|  | 138 |  | 
|---|
|  | 139 | //--- Type de l'histo | 
|---|
|  | 140 | HistoErr* he = dynamic_cast< HistoErr *> (dobj); | 
|---|
|  | 141 |  | 
|---|
|  | 142 | //--- Allocation pour histo | 
|---|
|  | 143 | if(he && (clsnm=="SOPHYA::HistoErr")) { | 
|---|
|  | 144 | if(ncol<3) | 
|---|
|  | 145 | throw FitsIOException("FitsHandler<HistoErr>::Read() wrong number of columns for HistoErr"); | 
|---|
|  | 146 | he->CreateOrResize(xmin,xmax,nbin); | 
|---|
|  | 147 | } else { | 
|---|
|  | 148 | throw FitsIOException("FitsHandler<HistoErr>::Read() No assocaition classe/fits_header"); | 
|---|
|  | 149 | } | 
|---|
|  | 150 |  | 
|---|
|  | 151 | //--- remplissage des variables d'entete | 
|---|
| [3148] | 152 | he->mMean = dvl.GetI("NMEAN",0); | 
|---|
| [3123] | 153 |  | 
|---|
|  | 154 | //--- remplissage de l'histo | 
|---|
|  | 155 | FitsBlockRW<r_8>::ReadColumnData(is,1,1,1,&(he->data_(0)),nbin); | 
|---|
|  | 156 | FitsBlockRW<r_8>::ReadColumnData(is,2,1,1,&(he->err2_(0)),nbin); | 
|---|
|  | 157 | FitsBlockRW<r_8>::ReadColumnData(is,3,1,1,&(he->ndata_(0)),nbin); | 
|---|
|  | 158 |  | 
|---|
|  | 159 | return; | 
|---|
|  | 160 | } | 
|---|
|  | 161 |  | 
|---|
|  | 162 |  | 
|---|
|  | 163 | /////////////////////////////////////////////////////////////////////////// | 
|---|
|  | 164 | /////////////////////////////// Histo2DErr //////////////////////////////// | 
|---|
|  | 165 | /////////////////////////////////////////////////////////////////////////// | 
|---|
|  | 166 |  | 
|---|
|  | 167 | DECL_TEMP_SPEC  /* equivalent a template <> , pour SGI-CC en particulier */ | 
|---|
|  | 168 | int FitsHandler<Histo2DErr>::CheckReadability(FitsInOutFile& is) | 
|---|
|  | 169 | { | 
|---|
|  | 170 | if (is.CurrentHDUType() == IMAGE_HDU ) return 0; | 
|---|
|  | 171 | string key = "SOPCLSNM"; | 
|---|
|  | 172 | string clsnm = is.KeyValue(key); | 
|---|
|  | 173 | if( clsnm == "SOPHYA::Histo2DErr") return 2; | 
|---|
|  | 174 | return 0; | 
|---|
|  | 175 | } | 
|---|
|  | 176 |  | 
|---|
|  | 177 | DECL_TEMP_SPEC  /* equivalent a template <> , pour SGI-CC en particulier */ | 
|---|
|  | 178 | int FitsHandler<Histo2DErr>::CheckHandling(AnyDataObj & o) | 
|---|
|  | 179 | { | 
|---|
|  | 180 | if (typeid(o) == typeid(Histo2DErr)) return 2; | 
|---|
|  | 181 | Histo2DErr * po = dynamic_cast< Histo2DErr * >(& o); | 
|---|
|  | 182 | if (po != NULL) return 2; | 
|---|
|  | 183 | return 0; | 
|---|
|  | 184 | } | 
|---|
|  | 185 |  | 
|---|
|  | 186 | DECL_TEMP_SPEC  /* equivalent a template <> , pour SGI-CC en particulier */ | 
|---|
|  | 187 | void FitsHandler<Histo2DErr>::Write(FitsInOutFile& os) | 
|---|
|  | 188 | { | 
|---|
|  | 189 | if(dobj==NULL) | 
|---|
|  | 190 | throw NullPtrError("FitsHandler<Histo2DErr>::Write() NULL dobj pointer "); | 
|---|
|  | 191 |  | 
|---|
|  | 192 | //--- Le type d'objet et son pointeur | 
|---|
|  | 193 | Histo2DErr* he2 = dynamic_cast< Histo2DErr *> (dobj); | 
|---|
|  | 194 |  | 
|---|
|  | 195 | //--- Les noms de colonnes | 
|---|
|  | 196 | int tbltyp = os.GetDef_TableType(); | 
|---|
|  | 197 | vector<string> colnames, tform, tunit; | 
|---|
|  | 198 | // les valeurs du bin | 
|---|
|  | 199 | if(tbltyp==ASCII_TBL) tform.push_back("D15.8"); else tform.push_back("D"); | 
|---|
|  | 200 | colnames.push_back("val"); | 
|---|
|  | 201 | tunit.push_back(""); | 
|---|
|  | 202 | // Les erreurs | 
|---|
|  | 203 | if(tbltyp==ASCII_TBL) tform.push_back("D15.8"); else tform.push_back("D"); | 
|---|
|  | 204 | colnames.push_back("e2"); | 
|---|
|  | 205 | tunit.push_back(""); | 
|---|
|  | 206 | // Les nombres d'entrees | 
|---|
|  | 207 | if(tbltyp==ASCII_TBL) tform.push_back("D15.8"); else tform.push_back("D"); | 
|---|
|  | 208 | colnames.push_back("nb"); | 
|---|
|  | 209 | tunit.push_back(""); | 
|---|
|  | 210 |  | 
|---|
|  | 211 | //--- On cree la table | 
|---|
|  | 212 | string extname = os.NextExtensionName(); | 
|---|
|  | 213 | os.CreateTable(os.GetDef_TableType(),extname,colnames,tform, tunit); | 
|---|
|  | 214 |  | 
|---|
|  | 215 | // Ecriture des donnees des colonnes | 
|---|
|  | 216 | long n = he2->NBinX()*he2->NBinY(); | 
|---|
|  | 217 | if(n>0) { | 
|---|
|  | 218 | FitsBlockRW<r_8>::WriteColumnData(os,1,1,1,&(he2->data_(0,0)),n); | 
|---|
|  | 219 | FitsBlockRW<r_8>::WriteColumnData(os,2,1,1,&(he2->err2_(0,0)),n); | 
|---|
|  | 220 | FitsBlockRW<r_8>::WriteColumnData(os,3,1,1,&(he2->ndata_(0,0)),n); | 
|---|
|  | 221 | } | 
|---|
|  | 222 |  | 
|---|
|  | 223 | // Ecriture des clefs fits | 
|---|
|  | 224 | MuTyV mtv; | 
|---|
|  | 225 |  | 
|---|
|  | 226 | mtv = "SOPHYA::Histo2DErr"; | 
|---|
|  | 227 | os.WriteKey("SOPCLSNM",mtv," SOPHYA class name"); | 
|---|
|  | 228 |  | 
|---|
|  | 229 | mtv = "Histo2DErr"; | 
|---|
|  | 230 | os.WriteKey("CONTENT",mtv," name of SOPHYA object"); | 
|---|
|  | 231 |  | 
|---|
|  | 232 | mtv = he2->NBinX(); | 
|---|
|  | 233 | os.WriteKey("NBINX",mtv," number of bins in X"); | 
|---|
|  | 234 | mtv = he2->NBinY(); | 
|---|
|  | 235 | os.WriteKey("NBINY",mtv," number of bins in Y"); | 
|---|
|  | 236 | mtv = he2->NBinX()*he2->NBinY(); | 
|---|
| [3183] | 237 | os.WriteKey("NBINXY",mtv," (i,j): fits_row=i*NY+j 0<=i<NX 0<=j<NY"); | 
|---|
| [3123] | 238 |  | 
|---|
|  | 239 | mtv = he2->XMin(); | 
|---|
|  | 240 | os.WriteKey("XMIN",mtv," absc of beginning of 1srt bin in X"); | 
|---|
|  | 241 | mtv = he2->XMax(); | 
|---|
|  | 242 | os.WriteKey("XMAX",mtv," absc of end of last bin in X"); | 
|---|
|  | 243 | mtv = he2->YMin(); | 
|---|
|  | 244 | os.WriteKey("YMIN",mtv," absc of beginning of 1srt bin in Y"); | 
|---|
|  | 245 | mtv = he2->YMax(); | 
|---|
|  | 246 | os.WriteKey("YMAX",mtv," absc of end of last bin in Y"); | 
|---|
|  | 247 |  | 
|---|
|  | 248 | mtv = he2->WBinX(); | 
|---|
|  | 249 | os.WriteKey("WBINX",mtv," bin width in X"); | 
|---|
|  | 250 | mtv = he2->WBinY(); | 
|---|
|  | 251 | os.WriteKey("WBINY",mtv," bin width in Y"); | 
|---|
|  | 252 |  | 
|---|
| [3148] | 253 | mtv = he2->mMean; | 
|---|
|  | 254 | os.WriteKey("NMEAN",mtv," number of Mean/Variance calls"); | 
|---|
| [3123] | 255 |  | 
|---|
|  | 256 | return; | 
|---|
|  | 257 | } | 
|---|
|  | 258 |  | 
|---|
|  | 259 | DECL_TEMP_SPEC  /* equivalent a template <> , pour SGI-CC en particulier */ | 
|---|
|  | 260 | void FitsHandler<Histo2DErr>::Read(FitsInOutFile& is) | 
|---|
|  | 261 | { | 
|---|
|  | 262 | int hdutyp = is.CurrentHDUType(); | 
|---|
|  | 263 | if( (hdutyp != BINARY_TBL ) && (hdutyp != ASCII_TBL) ) | 
|---|
|  | 264 | throw FitsIOException("FitsHandler<Histo2DErr>::Read() Not a binary or ascii table HDU"); | 
|---|
|  | 265 |  | 
|---|
|  | 266 | //--- Nb de lignes et de colonnes | 
|---|
| [3167] | 267 | vector<string> colnames; vector<int> coltypes; vector<LONGLONG> repcnt, width; | 
|---|
| [3123] | 268 | is.GetColInfo(colnames,coltypes,repcnt,width); | 
|---|
|  | 269 | long ncol = colnames.size(); | 
|---|
|  | 270 | if(ncol<=0) | 
|---|
|  | 271 | throw FitsIOException("FitsHandler<Histo2DErr>::Read() bad number of table columns"); | 
|---|
|  | 272 | long nbrows = is.GetNbRows(); | 
|---|
|  | 273 | if(nbrows<=0) | 
|---|
|  | 274 | throw FitsIOException("FitsHandler<Histo2DErr>::Read() number of rows is zero, no reading"); | 
|---|
|  | 275 |  | 
|---|
|  | 276 | //--- Lecture entete FITS | 
|---|
|  | 277 | DVList dvl; is.GetHeaderRecords(dvl,true,false); | 
|---|
|  | 278 |  | 
|---|
|  | 279 | int_4 nbinx = dvl.GetI("NBINX",-1); | 
|---|
|  | 280 | int_4 nbiny = dvl.GetI("NBINY",-1); | 
|---|
|  | 281 | int_8 nbinxy = nbinx*nbiny; | 
|---|
|  | 282 | if(nbinx<=0 || nbiny<=0 || nbinxy!=nbrows) | 
|---|
|  | 283 | throw FitsIOException("FitsHandler<Histo2DErr>::Read() number of bins is zero or bad, no reading"); | 
|---|
|  | 284 |  | 
|---|
|  | 285 | r_8 xmin = dvl.GetD("XMIN",-1.); | 
|---|
|  | 286 | r_8 xmax = dvl.GetD("XMAX",1.); | 
|---|
|  | 287 | r_8 ymin = dvl.GetD("YMIN",-1.); | 
|---|
|  | 288 | r_8 ymax = dvl.GetD("YMAX",1.); | 
|---|
|  | 289 |  | 
|---|
|  | 290 | //--- Creation de l'objet | 
|---|
|  | 291 | if(dobj == NULL) dobj = new Histo2DErr; | 
|---|
|  | 292 | dobj->CreateOrResize(xmin,xmax,nbinx,ymin,ymax,nbiny); | 
|---|
|  | 293 |  | 
|---|
|  | 294 | //--- remplissage des variables d'entete | 
|---|
| [3148] | 295 | dobj->mMean = dvl.GetI("NMEAN",0); | 
|---|
| [3123] | 296 |  | 
|---|
|  | 297 | //--- remplissage de l'histo | 
|---|
|  | 298 | FitsBlockRW<r_8>::ReadColumnData(is,1,1,1,&(dobj->data_(0,0)),nbinxy); | 
|---|
|  | 299 | FitsBlockRW<r_8>::ReadColumnData(is,2,1,1,&(dobj->err2_(0,0)),nbinxy); | 
|---|
|  | 300 | FitsBlockRW<r_8>::ReadColumnData(is,3,1,1,&(dobj->ndata_(0,0)),nbinxy); | 
|---|
|  | 301 |  | 
|---|
|  | 302 | return; | 
|---|
|  | 303 | } | 
|---|
| [3237] | 304 |  | 
|---|
|  | 305 | } // FIN namespace SOPHYA | 
|---|