Changeset 2197 in Sophya for trunk/SophyaExt/FitsIOServer/fitsfile.cc
- Timestamp:
- Sep 24, 2002, 4:03:36 PM (23 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaExt/FitsIOServer/fitsfile.cc
r2129 r2197 26 26 if (dc >0) ddata_ = vector<double>(dc); 27 27 if (fc >0) fdata_ = vector<float>(fc); 28 if (ic >0) idata_ = vector<int>(fc); 29 if (cc >0) cdata_ = vector<string>(fc); 28 if (ic >0) idata_ = vector<int>(ic); 30 29 if (lc >0) ldata_ = vector<long>(lc); 31 30 if (bc >0) bdata_ = vector<unsigned char>(bc); 31 if (cc >0) cdata_ = vector<string>(cc); 32 32 } 33 33 … … 66 66 } 67 67 68 68 FitsFile::BufferLine::BufferLine(const vector<FitsFile::FitsDataType>& types) 69 { 70 71 72 int dc=0; 73 int fc=0; 74 int shc=0; 75 int ic=0; 76 int lc=0; 77 int cc=0; 78 int bc=0; 79 id_ = vector< pair<FitsFile::FitsDataType, int> >(types.size()); 80 for (int k= 0; k < types.size(); k++) 81 { 82 switch( types[k] ) 83 { 84 case FitsFile::FitsDataType_double : 85 { 86 id_[k] = pair<FitsFile::FitsDataType, int>(FitsFile::FitsDataType_double, dc); 87 dc++; 88 break; 89 } 90 case FitsFile::FitsDataType_float : 91 { 92 id_[k] = pair<FitsFile::FitsDataType, int>(FitsFile::FitsDataType_float, fc); 93 fc++; 94 break; 95 } 96 case FitsFile::FitsDataType_short : 97 { 98 id_[k] = pair<FitsFile::FitsDataType, int>(FitsDataType_short, shc); 99 shc++; 100 break; 101 } 102 case FitsFile::FitsDataType_int : 103 { 104 id_[k] = pair<FitsFile::FitsDataType, int>(FitsDataType_int, ic); 105 ic++; 106 break; 107 } 108 case FitsFile::FitsDataType_long : 109 { 110 id_[k] = pair<FitsFile::FitsDataType, int>(FitsFile::FitsDataType_long, lc); 111 lc++; 112 break; 113 } 114 case FitsFile::FitsDataType_byte : 115 { 116 id_[k] = pair<FitsFile::FitsDataType, int>(FitsFile::FitsDataType_byte, bc); 117 bc++; 118 break; 119 } 120 case FitsDataType_char : 121 { 122 id_[k] = pair<FitsFile::FitsDataType, int>(FitsFile::FitsDataType_char, cc); 123 cc++; 124 break; 125 } 126 default: 127 { 128 throw PException(" FitsFile::getHeaderWithSophyaObject() : unsupported FITS data type"); 129 } 130 } 131 } 132 133 if (dc >0) ddata_ = vector<r_8>(dc); 134 if (fc >0) fdata_ = vector<r_4>(fc); 135 if (shc >0) shdata_ = vector<int_2>(shc); 136 if (ic >0) idata_ = vector<int_4>(ic); 137 if (lc >0) ldata_ = vector<int_8>(lc); 138 if (cc >0) cdata_ = vector<string>(cc); 139 if (bc >0) bdata_ = vector<unsigned char>(bc); 140 } 141 142 143 void FitsFile::BufferLine::Print() const 144 { 145 cout << " impression de la ligne: " << endl; 146 147 cout << " doubles : " << endl; 148 for (int k=0; k< ddata_.size(); k++) 149 { 150 cout << ddata_[k] << " " ; 151 } 152 cout << endl; 153 154 cout << " floats : " << endl; 155 for (int k=0; k< fdata_.size(); k++) 156 { 157 cout << fdata_[k] << " " ; 158 } 159 cout << endl; 160 161 cout << " entiers courts: " << endl; 162 for (int k=0; k< shdata_.size(); k++) 163 { 164 cout << shdata_[k] << " " ; 165 } 166 cout << endl; 167 cout << " entiers : " << endl; 168 for (int k=0; k< idata_.size(); k++) 169 { 170 cout << idata_[k] << " " ; 171 } 172 cout << endl; 173 174 cout << " entiers longs : " << endl; 175 for (int k=0; k< ldata_.size(); k++) 176 { 177 cout << ldata_[k] << " " ; 178 } 179 cout << endl; 180 181 cout << " chaines carac. : " << endl; 182 for (int k=0; k< cdata_.size(); k++) 183 { 184 cout << cdata_[k] << " " ; 185 } 186 cout << endl; 187 188 cout << " bytes : " << endl; 189 for (int k=0; k< bdata_.size(); k++) 190 { 191 cout << (char)bdata_[k] << " " ; 192 } 193 cout << endl; 194 195 196 } 69 197 70 198 /*! … … 601 729 // printerror( status,":FitsInFile::getHeader : erreur movabs"); 602 730 } 731 732 603 733 if(hdutype == IMAGE_HDU) 604 734 { … … 627 757 KeywordsIntoDVList(fptr_, dvl_, hdunum_); 628 758 } 759 760 } 761 if (hdutype_ == FitsExtensionType_BINARY_TBL || hdutype_ == FitsExtensionType_ASCII_TBL) 762 { 763 bfl_ = BufferLine(types_); 629 764 } 630 765 } … … 736 871 } 737 872 return taille_des_chaines_[index]; 873 } 874 875 const FitsFile::BufferLine& FitsInFile::GetBufferLine(long NoLine) 876 { 877 int status= 0; 878 int anynul; 879 double dnull= dnull_; 880 float fnull= fnull_; 881 int inull= inull_; 882 char* cnull= const_cast<char*>(cnull_.c_str()); 883 int ncol; 884 long nels=1; 885 double dval; 886 float fval; 887 int ival; 888 889 // pas d'entier de longueur superieure a 32 bits, pour cfitsio 890 int lval; 891 892 unsigned char usval; 893 int rang = 0; 894 int ccount = 0; 895 for (ncol=0; ncol<nbcols_; ncol++) 896 { 897 rang = bfl_.identificateur()[ncol].second; 898 // cout << " fitsfile : relecture col " << ncol << " type " << bfl_.identificateur()[ncol].first << " rang " << rang << endl; 899 switch (bfl_.identificateur()[ncol].first) 900 { 901 case FitsDataType_double : 902 fits_read_col(fptr_,TDOUBLE,ncol+1,NoLine+1,1,1,&dnull, &dval,&anynul,&status); 903 bfl_.r_8Array(rang) = (r_8)dval; 904 break; 905 case FitsDataType_float : 906 fits_read_col(fptr_,TFLOAT,ncol+1,NoLine+1,1,1,&fnull,&fval,&anynul,&status); 907 bfl_.r_4Array(rang) = (r_4)fval; 908 break; 909 case FitsDataType_short : 910 fits_read_col(fptr_,TSHORT,ncol+1,NoLine+1,1,1,&inull,&ival, &anynul,&status); 911 bfl_.int_2Array(rang) = (int_2)ival; 912 break; 913 case FitsDataType_int : 914 fits_read_col(fptr_,TINT,ncol+1,NoLine+1,1,1,&inull,&ival, &anynul,&status); 915 bfl_.int_4Array(rang) = (int_4)ival; 916 break; 917 case FitsDataType_long : 918 fits_read_col(fptr_,TLONG,ncol+1,NoLine+1,1,1,&inull,&lval, &anynul,&status); 919 bfl_.int_8Array(rang) = (int_8)lval; 920 break; 921 case FitsDataType_byte : 922 fits_read_col(fptr_,TBYTE,ncol+1,NoLine+1,1,1,&inull, &usval, &anynul,&status); 923 bfl_.u_charArray(rang) = usval; 924 break; 925 case FitsDataType_char : 926 char* chaine = new char[taille_des_chaines_[ccount++]]; 927 fits_read_col(fptr_,TSTRING,ncol+1,NoLine+1,1,1,cnull,&chaine,&anynul,&status); 928 bfl_.stringArray(rang) = string(chaine); 929 break; 930 } 931 if (status) 932 { 933 ResetStatus(status); 934 break; 935 } 936 } 937 // cout << " fitsfile : ligne relue " << endl; 938 // bfl_.Print(); 939 return bfl_; 738 940 } 739 941 … … 778 980 break; 779 981 } 780 case FitsDataType_float : 781 fits_read_col(fptr_,TFLOAT,ncol+1,ligneALire,premierElement,1,&fnull,&fdata[fcount++],&anynul,&status); 782 break; 982 case FitsDataType_float : 983 { 984 fits_read_col(fptr_,TFLOAT,ncol+1,ligneALire,premierElement,1,&fnull,&fdata[fcount++],&anynul,&status); 985 break; 986 } 783 987 case FitsDataType_int : 784 fits_read_col(fptr_,TINT,ncol+1,ligneALire,premierElement,1,&inull,&idata[icount++], 988 { 989 fits_read_col(fptr_,TINT,ncol+1,ligneALire,premierElement,1,&inull,&idata[icount++], 785 990 &anynul,&status); 786 break; 991 break; 992 } 787 993 case FitsDataType_long : 788 fits_read_col(fptr_,TLONG,ncol+1,ligneALire,premierElement,1,&inull,&idata[icount++], &anynul,&status); 789 break; 994 { 995 fits_read_col(fptr_,TLONG,ncol+1,ligneALire,premierElement,1,&inull,&idata[icount++], &anynul,&status); 996 break; 997 } 790 998 case FitsDataType_byte : 791 999 { … … 793 1001 fits_read_col(fptr_,TBYTE,ncol+1,ligneALire,premierElement,1,&inull,&uschar, &anynul,&status); 794 1002 idata[icount++] = (int)uschar; 795 }796 break;1003 break; 1004 } 797 1005 case FitsDataType_char : 798 fits_read_col(fptr_,TSTRING,ncol+1,ligneALire,premierElement,1,cnull,&cdata[ccount++],&anynul,&status); 799 break; 1006 { 1007 fits_read_col(fptr_,TSTRING,ncol+1,ligneALire,premierElement,1,cnull,&cdata[ccount++],&anynul,&status); 1008 break; 1009 } 1010 default: 1011 { 1012 throw PException(" FitsInFile::GetBinTabLine : unsupported FITS data type"); 1013 } 800 1014 } 801 1015 if (status) … … 829 1043 { 830 1044 case FitsDataType_double : 831 fits_read_col(fptr_,TDOUBLE,ncol+1,NoLine+1,1,1,&dnull,&ligne.ddata_[dcount++],&anynul,&status); 832 break; 1045 { 1046 fits_read_col(fptr_,TDOUBLE,ncol+1,NoLine+1,1,1,&dnull,&ligne.ddata_[dcount++],&anynul,&status); 1047 break; 1048 } 833 1049 case FitsDataType_float : 834 fits_read_col(fptr_,TFLOAT,ncol+1,NoLine+1,1,1,&fnull,&ligne.fdata_[fcount++],&anynul,&status); 835 break; 1050 { 1051 fits_read_col(fptr_,TFLOAT,ncol+1,NoLine+1,1,1,&fnull,&ligne.fdata_[fcount++],&anynul,&status); 1052 break; 1053 } 836 1054 case FitsDataType_int : 837 fits_read_col(fptr_,TINT,ncol+1,NoLine+1,1,1,&inull,&ligne.idata_[icount++], &anynul,&status); 838 break; 1055 { 1056 fits_read_col(fptr_,TINT,ncol+1,NoLine+1,1,1,&inull,&ligne.idata_[icount++], &anynul,&status); 1057 break; 1058 } 839 1059 case FitsDataType_long : 840 fits_read_col(fptr_,TLONG,ncol+1,NoLine+1,1,1,&inull,&ligne.ldata_[icount++], &anynul,&status); 841 break; 1060 { 1061 fits_read_col(fptr_,TLONG,ncol+1,NoLine+1,1,1,&inull,&ligne.ldata_[icount++], &anynul,&status); 1062 break; 1063 } 842 1064 case FitsDataType_byte : 843 fits_read_col(fptr_,TBYTE,ncol+1,NoLine+1,1,1,&inull,&ligne.bdata_[icount++], &anynul,&status); 844 break; 1065 { 1066 fits_read_col(fptr_,TBYTE,ncol+1,NoLine+1,1,1,&inull,&ligne.bdata_[icount++], &anynul,&status); 1067 break; 1068 } 845 1069 case FitsDataType_char : 846 char* chaine = new char[taille_des_chaines_[ccount]]; 847 fits_read_col(fptr_,TSTRING,ncol+1,NoLine+1,1,1,cnull,&chaine,&anynul,&status); 848 ligne.cdata_[ccount++] = string(chaine); 849 break; 1070 { 1071 char* chaine = new char[taille_des_chaines_[ccount]]; 1072 fits_read_col(fptr_,TSTRING,ncol+1,NoLine+1,1,1,cnull,&chaine,&anynul,&status); 1073 ligne.cdata_[ccount++] = string(chaine); 1074 break; 1075 } 1076 default: 1077 { 1078 throw PException(" FitsInFile::GetBinTabLine : unsupported FITS data type"); 1079 } 850 1080 } 851 1081 if (status) … … 856 1086 } 857 1087 } 1088 1089 858 1090 859 1091 /*! \fn void SOPHYA::FitsInFile::GetBinTabLine(int NoLine, float* fdata) … … 945 1177 long repeat,width; 946 1178 fits_get_coltype(fptr_, NoCol+1,&DTYPE,&repeat,&width,&status); 947 cout << " en lecture fits trouve le type " << DTYPE << endl;948 1179 if( DTYPE != TLONG && DTYPE != TINT) 949 1180 { … … 1137 1368 int rept=0; 1138 1369 if(hdutype == ASCII_TBL) 1139 {1140 for(ii = 0; ii < nbcols; ii++)1141 {1142 int DTYPE;1143 long width;1144 long repete = 0;1145 fits_get_coltype(fileptr,ii+1,&DTYPE,&repete,&width,&status);1146 if( status ) printerror( status,"erreur lecture type de colonne");1147 rept = repete;1148 noms.push_back(string(ttype[ii]));1149 switch (DTYPE)1150 {1151 case TDOUBLE :1152 types.push_back(FitsDataType_double);1153 break;1154 case TFLOAT :1155 types.push_back(FitsDataType_float);1156 break;1157 case TLONG :1158 types.push_back(FitsDataType_long);1159 break;1160 case TSHORT :1161 types.push_back(FitsDataType_int);1162 break;1163 case TSTRING :1164 types.push_back(FitsDataType_char);1165 taille_des_chaines.push_back(width);1166 rept/=width;1167 break;1168 default :1169 cout << " field " << ii+1 << " DTYPE= " << DTYPE << endl;1170 throw IOExc("FitsFile::GetBinTabParameters, unsupported data type of field, for ASCII table");1171 }1172 repeat.push_back(rept);1173 }1174 }1175 else1176 1370 { 1177 1371 for(ii = 0; ii < nbcols; ii++) … … 1199 1393 break; 1200 1394 case TSHORT : 1395 types.push_back(FitsDataType_short); 1396 break; 1397 case TSTRING : 1398 types.push_back(FitsDataType_char); 1399 taille_des_chaines.push_back(width); 1400 rept/=width; 1401 break; 1402 default : 1403 cout << " field " << ii+1 << " DTYPE= " << DTYPE << endl; 1404 throw IOExc("FitsFile::GetBinTabParameters, unsupported data type of field, for ASCII table"); 1405 } 1406 repeat.push_back(rept); 1407 } 1408 } 1409 else 1410 { 1411 for(ii = 0; ii < nbcols; ii++) 1412 { 1413 int DTYPE; 1414 long width; 1415 long repete = 0; 1416 fits_get_coltype(fileptr,ii+1,&DTYPE,&repete,&width,&status); 1417 if( status ) printerror( status,"erreur lecture type de colonne"); 1418 rept = repete; 1419 noms.push_back(string(ttype[ii])); 1420 switch (DTYPE) 1421 { 1422 case TDOUBLE : 1423 types.push_back(FitsDataType_double); 1424 break; 1425 case TFLOAT : 1426 types.push_back(FitsDataType_float); 1427 break; 1428 case TLONG : 1429 types.push_back(FitsDataType_long); 1430 break; 1431 case TINT : 1201 1432 types.push_back(FitsDataType_int); 1433 break; 1434 case TSHORT : 1435 types.push_back(FitsDataType_short); 1202 1436 break; 1203 1437 case TSTRING : … … 1718 1952 1719 1953 1720 // la logique voudrait qu'on distingue TLONG et TINT. Mais si j'ecris1721 // et relis immediatement quelque chose en TLONG l'experience montre 1722 // que ca foire. Donc, je fais tout en TINT, d'ailleurs cfitsio n'a pas 1723 // (apparemment) d'entiers de longueur superieure a 32 bits.1724 // En fait, je n'y comprend rien. A suivre (GLM). 1725 if (code == TINT || code == TLONG )1726 {1727 cout << " j'ecris des TINT" << endl;1954 1955 if (code == TINT || code == TLONG) 1956 { 1957 // cfitsio n'a que des entiers de longueur inferieure a 32 bits. 1958 // ici, a l'ecriture TLONG impliquerait que le tableau de donnees 1959 // soit un tableau int_8. Donc c'est toujours TINT qu;il faut mettre 1960 // De plus, j'ai l'impression que TINT va devenir obsolete dans cfitsio 1961 // (GLM) 1728 1962 fits_write_col(fptr_,TINT,nocol+1,1,1,nentries, donnees ,&status); 1729 }1730 else if (code == TSHORT)1731 {1732 cout << " j'ecris des TSHORT " << endl;1733 fits_write_col(fptr_,TSHORT,nocol+1,1,1,nentries, donnees ,&status);1734 1963 } 1735 1964 else … … 2211 2440 { 2212 2441 cout << "FitsKeyword : complex keyword value not supported" << endl;; 2442 break; 2213 2443 } 2214 2444 default :
Note:
See TracChangeset
for help on using the changeset viewer.