| 1 | #include <stdio.h> | 
|---|
| 2 | #include <stdlib.h> | 
|---|
| 3 | #include <math.h> | 
|---|
| 4 | #include <iostream> | 
|---|
| 5 |  | 
|---|
| 6 | #include "sopnamsp.h" | 
|---|
| 7 | #include "histinit.h" | 
|---|
| 8 | #include "datatable.h" | 
|---|
| 9 | #include "fitshdtable.h" | 
|---|
| 10 | #include "swfitsdtable.h" | 
|---|
| 11 | #include "swppfdtable.h" | 
|---|
| 12 | #include "ctimer.h" | 
|---|
| 13 |  | 
|---|
| 14 | /* ---------------------------------------------------------- | 
|---|
| 15 | Programme de test lecture-ecriture FITS de DataTable | 
|---|
| 16 | + test classe SwFitsDataTable | 
|---|
| 17 | Oct 2005 - Jan 2006 | 
|---|
| 18 |  | 
|---|
| 19 | --- This code is part of the SOPHYA library --- | 
|---|
| 20 | (C) Univ. Paris-Sud   (C) LAL-IN2P3/CNRS   (C) IRFU-CEA | 
|---|
| 21 | (C) R. Ansari, C.Magneville    2005 - 2010 | 
|---|
| 22 |  | 
|---|
| 23 | ----------------------------------------------------------    */ | 
|---|
| 24 |  | 
|---|
| 25 | //----------------------------------------------------------- | 
|---|
| 26 | int test_fdtable() ; | 
|---|
| 27 | void tdfill_dtable(BaseDataTable& dtr, uint_8 sz); | 
|---|
| 28 | void tdcheck_dtable(BaseDataTable& dtr, uint_8& errcntI, uint_8& errcntF); | 
|---|
| 29 | int test_memdtable(uint_8 sz, bool fgppf=true) ; | 
|---|
| 30 | int test_swppfdtable(uint_8 sz) ; | 
|---|
| 31 | int test_swfitsdtable(uint_8 sz) ; | 
|---|
| 32 | #define _TDTSEGSIZ_  8192 | 
|---|
| 33 | //------------------------------------------------------------ | 
|---|
| 34 |  | 
|---|
| 35 | //--------------   MAIN PROGRAM  ------------ | 
|---|
| 36 | int main(int narg, char *arg[]) | 
|---|
| 37 | { | 
|---|
| 38 | SophyaInit(); | 
|---|
| 39 | // 0 -> test_fdtable , 1 -> test_memdtable/PPF , 2 ->  test_memdtable/FITS | 
|---|
| 40 | // 3 -> test_swppfdtable , 4 -> test_swfitsdtable | 
|---|
| 41 | int opt = 0; | 
|---|
| 42 | if (narg<2) { | 
|---|
| 43 | cout << " Usage: tfitsdt OPT=0/1/2/3/4 [ Size=NRows in units of 1000] \n" | 
|---|
| 44 | << "  0 -> test_fdtable \n  1 -> test_memdtable/PPF , 2 ->  test_memdtable/FITS \n" | 
|---|
| 45 | << "  3 -> test_swppfdtable , 4 -> test_swfitsdtable \n" | 
|---|
| 46 | << "  Rc=0 OK for 1/2/3/4 , Def.Size=2048 (*1000) " << endl; | 
|---|
| 47 | return 1; | 
|---|
| 48 | } | 
|---|
| 49 | opt = atoi(arg[1]); | 
|---|
| 50 | uint_8 sz = 2048*1000; | 
|---|
| 51 | if (narg>2)  sz = (uint_8)(atof(arg[2])*1000.); | 
|---|
| 52 | int rc=0; | 
|---|
| 53 | try { | 
|---|
| 54 | if (opt==1) rc=test_memdtable(sz,true); | 
|---|
| 55 | else if (opt==2) rc=test_memdtable(sz,false); | 
|---|
| 56 | else if (opt==3) rc=test_swppfdtable(sz); | 
|---|
| 57 | else if (opt==4) rc=test_swfitsdtable(sz); | 
|---|
| 58 | else test_fdtable(); | 
|---|
| 59 | } | 
|---|
| 60 | catch(PThrowable exc ) { | 
|---|
| 61 | cerr << "tfitsdt-main() , Catched exception: \n" << exc.Msg() << endl; | 
|---|
| 62 | } | 
|---|
| 63 | catch(std::exception ex) { | 
|---|
| 64 | cerr << "tfitsdt-main() , Catched exception ! " << (string)(ex.what()) << endl; | 
|---|
| 65 | } | 
|---|
| 66 | catch(...) { | 
|---|
| 67 | cerr << "tfitsdt-main() , Catched ... ! " << endl; | 
|---|
| 68 | } | 
|---|
| 69 | cout << " ========== End of tfitsdt.cc , Rc= " << rc << " ============= " << endl; | 
|---|
| 70 | return rc; | 
|---|
| 71 | } | 
|---|
| 72 |  | 
|---|
| 73 |  | 
|---|
| 74 | /* --Nouvelle-Fonction-- */ | 
|---|
| 75 | int test_fdtable() | 
|---|
| 76 | { | 
|---|
| 77 | int NL = 600; | 
|---|
| 78 | DataTable refdt(100); // Reference DataTable - for tests | 
|---|
| 79 |  | 
|---|
| 80 | cout << "======= test_fdtable: Simple DataTable+FITS test ======= " << endl; | 
|---|
| 81 | { | 
|---|
| 82 | cout << "1/ Creating DataTable / Writing to FITS " << endl; | 
|---|
| 83 | DataTable dt(64); | 
|---|
| 84 | dt.AddIntegerColumn("line"); | 
|---|
| 85 | dt.AddDoubleColumn("x"); | 
|---|
| 86 | dt.AddFloatColumn("f_sin"); | 
|---|
| 87 | dt.AddDoubleColumn("f_x2"); | 
|---|
| 88 | dt.AddStringColumn("str_line"); | 
|---|
| 89 | dt.AddComplexColumn("cmplx_cos_sin"); | 
|---|
| 90 | MuTyV rec[10]; | 
|---|
| 91 | char sbuff[32]; | 
|---|
| 92 | cout << " Filling ... (NLines=" << NL << ")" << endl; | 
|---|
| 93 | for(int k = 0; k<NL; k++) { | 
|---|
| 94 | rec[0] = k; | 
|---|
| 95 | double x = M_PI*k/100.; | 
|---|
| 96 | double fx = sin(x)*cos(x); | 
|---|
| 97 | rec[1] = x+1; | 
|---|
| 98 | rec[2] = sin(x); | 
|---|
| 99 | rec[3] = x*x; | 
|---|
| 100 | sprintf(sbuff, "SL-%d", k); | 
|---|
| 101 | rec[4] = sbuff; | 
|---|
| 102 | double sx = sin(x); | 
|---|
| 103 | double cx = cos(x); | 
|---|
| 104 | rec[5] = complex<r_4>(cx, sx); | 
|---|
| 105 | dt.AddLine(rec); | 
|---|
| 106 | } | 
|---|
| 107 | cout << dt; | 
|---|
| 108 | cout << " Copying dt to refdt (refdt = dt) " << endl; | 
|---|
| 109 | refdt = dt; | 
|---|
| 110 | cout << " Writing dt to fits file dtable.fits ... " << endl; | 
|---|
| 111 | FitsInOutFile fios("!dtable.fits", FitsInOutFile::Fits_Create); | 
|---|
| 112 | fios << dt; | 
|---|
| 113 | cout << " Writing dt to fits as ASCII table with extname= ASC_DTable ... " << endl; | 
|---|
| 114 | fios.SetDef_AscTable(); | 
|---|
| 115 | fios.SetNextExtensionName("ASC_DTable"); | 
|---|
| 116 | fios << dt; | 
|---|
| 117 | cout << "1.b/ Creating SwFitsDataTable (file swdtable.fits) " << endl; | 
|---|
| 118 | FitsInOutFile swf("!swdtable.fits", FitsInOutFile::Fits_Create); | 
|---|
| 119 | SwFitsDataTable swdt(swf, 64); | 
|---|
| 120 | cout << " Copying from DataTable dt ..." << endl; | 
|---|
| 121 | swdt = dt; | 
|---|
| 122 | cout << swdt; | 
|---|
| 123 | } | 
|---|
| 124 | { | 
|---|
| 125 | cout << "2/ Reading DataTable from FITS " << endl; | 
|---|
| 126 | FitsInOutFile fios("dtable.fits", FitsInOutFile::Fits_RO); | 
|---|
| 127 | cout << fios ; | 
|---|
| 128 | fios.MoveToNextHDU(); | 
|---|
| 129 | DataTable dtr; | 
|---|
| 130 | fios >> dtr; | 
|---|
| 131 | cout << dtr; | 
|---|
| 132 | cout << "2.b/  dtr.LineHeaderToString() dtr.LineToString(k)   : " << endl; | 
|---|
| 133 | cout << dtr.LineHeaderToString() << endl; | 
|---|
| 134 | for(int k = 0; k<NL; k+=NL/12) | 
|---|
| 135 | cout << "Line[" << k << "] " << dtr.LineToString(k) << endl ; | 
|---|
| 136 | cout << "2.b/  Reading from ASCII table   " << endl; | 
|---|
| 137 | DataTable dtra; | 
|---|
| 138 | fios >> dtra; | 
|---|
| 139 | cout << dtra; | 
|---|
| 140 | cout << dtra.LineHeaderToString() << endl; | 
|---|
| 141 | for(int k = 0; k<NL; k+=NL/12) | 
|---|
| 142 | cout << "Line[" << k << "] " << dtra.LineToString(k) << endl ; | 
|---|
| 143 |  | 
|---|
| 144 | cout << "2.c/  Reading SwFitsDataTable from  swdtable.fits  " << endl; | 
|---|
| 145 | SwFitsDataTable swdtr; | 
|---|
| 146 | FitsInOutFile swf("swdtable.fits", FitsInOutFile::Fits_RO); | 
|---|
| 147 | swf.MoveAbsToHDU(2); | 
|---|
| 148 | swf >> swdtr; | 
|---|
| 149 | cout << swdtr; | 
|---|
| 150 | cout << swdtr.LineHeaderToString() << endl; | 
|---|
| 151 | for(int k = 0; k<NL; k+=NL/12) | 
|---|
| 152 | cout << "Line[" << k << "] " << swdtr.LineToString(k) << endl ; | 
|---|
| 153 | } | 
|---|
| 154 | cout << "============ FIN  test_fdtable =============== " << endl; | 
|---|
| 155 | return 0; | 
|---|
| 156 | } | 
|---|
| 157 |  | 
|---|
| 158 |  | 
|---|
| 159 |  | 
|---|
| 160 | /* --Nouvelle-Fonction-- */ | 
|---|
| 161 | void tdfill_dtable(BaseDataTable& dt, uint_8 sz) | 
|---|
| 162 | { | 
|---|
| 163 | dt.AddIntegerColumn("ic1"); | 
|---|
| 164 | dt.AddFloatColumn("fc2"); | 
|---|
| 165 | int ic1,ric1; | 
|---|
| 166 | float fc2,rfc2; | 
|---|
| 167 | MuTyV rec[5]; | 
|---|
| 168 | uint_8 modprt=sz/10; | 
|---|
| 169 | for(uint_8 k=0; k<sz; k++) { | 
|---|
| 170 | ic1 = (int)(k%1000000000LL); | 
|---|
| 171 | fc2 = (float)ic1+0.5;  fc2 *= (fc2+0.2); | 
|---|
| 172 | rec[0]=ic1;  rec[1]=fc2; | 
|---|
| 173 | dt.AddLine(rec); | 
|---|
| 174 | if (k%modprt==0)  cout << " tdfill_dtable/ done k=" << k << " : max=" << sz << endl; | 
|---|
| 175 | } | 
|---|
| 176 | return; | 
|---|
| 177 | } | 
|---|
| 178 |  | 
|---|
| 179 | /* --Nouvelle-Fonction-- */ | 
|---|
| 180 | void tdcheck_dtable(BaseDataTable& dtr, uint_8& errcntI, uint_8& errcntF) | 
|---|
| 181 | { | 
|---|
| 182 | errcntI=0; | 
|---|
| 183 | errcntF=0; | 
|---|
| 184 | int ic1,ric1; | 
|---|
| 185 | float fc2,rfc2; | 
|---|
| 186 | MuTyV rec[5]; | 
|---|
| 187 | uint_8 modprt=dtr.NRows()/10; | 
|---|
| 188 |  | 
|---|
| 189 | for(sa_size_t k=0; k<dtr.NRows(); k++) { | 
|---|
| 190 | ic1 = (int)(k%1000000000LL); | 
|---|
| 191 | fc2 = (float)ic1+0.5;  fc2 *= (fc2+0.2); | 
|---|
| 192 | dtr.GetRow(k,rec); | 
|---|
| 193 | ric1=rec[0];  rfc2=rec[1]; | 
|---|
| 194 | if (ric1!=ic1)  errcntI++; | 
|---|
| 195 | if (fabs(fc2-rfc2)>1.e-9) errcntF++; | 
|---|
| 196 | if (k%modprt==0) | 
|---|
| 197 | cout << " tdcheck_dtable/ done k=" << k << " : max=" << dtr.NRows() | 
|---|
| 198 | << " ErrCntI=" << errcntI << " ErrCntF=" << errcntF << endl; | 
|---|
| 199 | } | 
|---|
| 200 | return; | 
|---|
| 201 | } | 
|---|
| 202 |  | 
|---|
| 203 | /* --Nouvelle-Fonction-- */ | 
|---|
| 204 | int test_memdtable(uint_8 sz, bool fgppf) | 
|---|
| 205 | { | 
|---|
| 206 | Timer tm("Tst_MEM_DataTable"); | 
|---|
| 207 | cout << " ------------------- Tst_MEM_DataTable -------------------------- " << endl; | 
|---|
| 208 | cout << " --- test_memdtable[1]: creating DataTable with " << sz << " rows (=" << sz/1000 << " kilo) ... " << endl; | 
|---|
| 209 | string dtfilename="tstmemdtable.ppf"; | 
|---|
| 210 | { | 
|---|
| 211 | DataTable dt(_TDTSEGSIZ_); | 
|---|
| 212 | tdfill_dtable(dt, sz); | 
|---|
| 213 | cout << dt; | 
|---|
| 214 | tm.Split(); | 
|---|
| 215 | if (fgppf)   { | 
|---|
| 216 | POutPersist po(dtfilename); | 
|---|
| 217 | po << dt; | 
|---|
| 218 | cout << " --- test_memdtable[2]: datatable written to PPF file " << dtfilename << endl; | 
|---|
| 219 | } | 
|---|
| 220 | else { | 
|---|
| 221 | dtfilename="!tstmemdtable.fits"; | 
|---|
| 222 | FitsInOutFile fios(dtfilename, FitsInOutFile::Fits_Create); | 
|---|
| 223 | fios << dt; | 
|---|
| 224 | cout << " --- test_memdtable[2]: datatable written to FITS file " << dtfilename << endl; | 
|---|
| 225 | } | 
|---|
| 226 | } | 
|---|
| 227 |  | 
|---|
| 228 | uint_8 errcntI=0; | 
|---|
| 229 | uint_8 errcntF=0; | 
|---|
| 230 | { | 
|---|
| 231 | DataTable dtr; | 
|---|
| 232 | if (fgppf)   { | 
|---|
| 233 | cout << " --- test_memdtable[3]: reading DataTable from PPF file " << dtfilename << endl; | 
|---|
| 234 | PInPersist pin(dtfilename); | 
|---|
| 235 | pin >> dtr; | 
|---|
| 236 | } | 
|---|
| 237 | else { | 
|---|
| 238 | dtfilename="tstmemdtable.fits"; | 
|---|
| 239 | FitsInOutFile fios(dtfilename, FitsInOutFile::Fits_RO); | 
|---|
| 240 | fios.MoveToNextHDU(); | 
|---|
| 241 | cout << " --- test_memdtable[3]: reading DataTable from FITS file " << dtfilename << endl; | 
|---|
| 242 | fios >> dtr; | 
|---|
| 243 | } | 
|---|
| 244 | tm.Split(); | 
|---|
| 245 | tdcheck_dtable(dtr, errcntI, errcntF); | 
|---|
| 246 | } | 
|---|
| 247 | cout << " --- test_memdtable[4]: End Read/Check ErrCntI=" << errcntI << " ErrCntF=" << errcntF << endl; | 
|---|
| 248 | if ((errcntI==0)&&(errcntF==0))  return 0; | 
|---|
| 249 | else if (errcntI==0)  return 5; | 
|---|
| 250 | else return 9; | 
|---|
| 251 | } | 
|---|
| 252 |  | 
|---|
| 253 | /* --Nouvelle-Fonction-- */ | 
|---|
| 254 | int test_swppfdtable(uint_8 sz) | 
|---|
| 255 | { | 
|---|
| 256 | Timer tm("Tst_SwPPF_DataTable"); | 
|---|
| 257 | cout << " ------------------- Tst_SwPPF_DataTable ------------------------- " << endl; | 
|---|
| 258 | cout << " --- test_swppfdtable[1]: creating DataTable with " << sz << " rows (=" << sz/1000 << " kilo) ... " << endl; | 
|---|
| 259 | string dtswfilename="tstswppfdtable.ppf"; | 
|---|
| 260 | { | 
|---|
| 261 | POutPersist po(dtswfilename); | 
|---|
| 262 | SwPPFDataTable dt(po, _TDTSEGSIZ_); | 
|---|
| 263 | tdfill_dtable(dt, sz); | 
|---|
| 264 | po << dt; | 
|---|
| 265 | cout << " --- test_swppfdtable[2]: SwPPFDataTable written to PPF file " << dtswfilename << endl; | 
|---|
| 266 | tm.Split(); | 
|---|
| 267 | } | 
|---|
| 268 |  | 
|---|
| 269 | uint_8 errcntI=0; | 
|---|
| 270 | uint_8 errcntF=0; | 
|---|
| 271 | { | 
|---|
| 272 | PInPersist pin(dtswfilename); | 
|---|
| 273 | SwPPFDataTable dtr; | 
|---|
| 274 | cout << " --- test_swppfdtable[3]: reading SwPPFDataTable from PPF file " << dtswfilename << endl; | 
|---|
| 275 | pin >> dtr; | 
|---|
| 276 | tdcheck_dtable(dtr, errcntI, errcntF); | 
|---|
| 277 | } | 
|---|
| 278 | cout << " --- test_swppfdtable[4]: End Read/Check ErrCntI=" << errcntI << " ErrCntF=" << errcntF << endl; | 
|---|
| 279 | if ((errcntI==0)&&(errcntF==0))  return 0; | 
|---|
| 280 | else if (errcntI==0)  return 5; | 
|---|
| 281 | else return 9; | 
|---|
| 282 | } | 
|---|
| 283 |  | 
|---|
| 284 | /* --Nouvelle-Fonction-- */ | 
|---|
| 285 | int test_swfitsdtable(uint_8 sz) | 
|---|
| 286 | { | 
|---|
| 287 | Timer tm("Tst_SwFITS_DataTable"); | 
|---|
| 288 | cout << " ------------------- Tst_SwFITS_DataTable ----------------------- " << endl; | 
|---|
| 289 | cout << " --- test_swfitstable[1]: creating SwFitsDataTable with " << sz << " rows (=" << sz/1000 << " kilo) ... " << endl; | 
|---|
| 290 | string dtswfilename="!tstswfitsdtable.fits"; | 
|---|
| 291 | { | 
|---|
| 292 | FitsInOutFile swf(dtswfilename, FitsInOutFile::Fits_Create); | 
|---|
| 293 | SwFitsDataTable swdt(swf, _TDTSEGSIZ_); | 
|---|
| 294 | tdfill_dtable(swdt, sz); | 
|---|
| 295 | swf << swdt; | 
|---|
| 296 | cout << " --- test_swfitstable[2]: SwFitsDataTable written to FITS file " << dtswfilename << endl; | 
|---|
| 297 | tm.Split(); | 
|---|
| 298 | } | 
|---|
| 299 |  | 
|---|
| 300 | uint_8 errcntI=0; | 
|---|
| 301 | uint_8 errcntF=0; | 
|---|
| 302 | { | 
|---|
| 303 | dtswfilename="tstswfitsdtable.fits"; | 
|---|
| 304 | SwFitsDataTable swdtr; | 
|---|
| 305 | FitsInOutFile swif(dtswfilename, FitsInOutFile::Fits_RO); | 
|---|
| 306 | swif.MoveAbsToHDU(2); | 
|---|
| 307 | cout << " --- test_swfitstable[3]: reading SwFitsDataTable from FITS file " << dtswfilename << endl; | 
|---|
| 308 | swif >> swdtr; | 
|---|
| 309 | tdcheck_dtable(swdtr, errcntI, errcntF); | 
|---|
| 310 | } | 
|---|
| 311 | cout << " --- test_swfitstable[4]: End Read/Check ErrCntI=" << errcntI << " ErrCntF=" << errcntF << endl; | 
|---|
| 312 | if ((errcntI==0)&&(errcntF==0))  return 0; | 
|---|
| 313 | else if (errcntI==0)  return 5; | 
|---|
| 314 | else return 9; | 
|---|
| 315 | } | 
|---|
| 316 |  | 
|---|
| 317 |  | 
|---|
| 318 |  | 
|---|