001 /* 002 * @(#)FitsTform.java $Revision: 1.4 $ $Date: 2003/04/11 08:41:15 $ 003 * 004 * Copyright (C) 1999 European Southern Observatory 005 * License: GNU General Public License version 2 or later 006 */ 007 package org.eso.fits; 008 009 import java.lang.*; 010 import java.util.*; 011 012 /** FitsTform class decodes information in value fields of FITS 013 * table TFORM and TDISP keywords. 014 * 015 * @version $Revision: 1.4 $ $Date: 2003/04/11 08:41:15 $ 016 * @author P.Grosbol DMD/ESO, <pgrosbol@eso.org> 017 */ 018 public class FitsTform { 019 020 private char dataType = '\0'; 021 private String format; 022 private char eFormat = '\0'; 023 private int repeat = 1; 024 private int width = 0; 025 private int decimals = 0; 026 private int exponent = 0; 027 private String additional = ""; 028 029 /** Constructur for FitsTform class from a FITS table format string. 030 * 031 * @param form String with TFORM or TDISP format 032 * @exception FitsException */ 033 public FitsTform(String form) throws FitsException { 034 char ch; 035 String tok = ""; 036 037 format = form.toUpperCase(); 038 StringTokenizer stok = new StringTokenizer(format, 039 "LXBIJAFEDCMP.OZNSG", 040 true); 041 042 if (stok.hasMoreTokens()) { 043 tok = stok.nextToken(); 044 if (Character.isDigit(tok.charAt(0))) { // decode format repeat 045 try { 046 repeat = (Integer.valueOf(tok)).intValue(); 047 } catch (NumberFormatException e) { 048 throw new FitsException("Wrong TFORM format", 049 FitsException.HEADER); 050 } 051 if (stok.hasMoreTokens()) { 052 tok = stok.nextToken(); 053 } 054 } 055 ch = tok.charAt(0); // get format data type 056 if (Character.isLetter(ch)) { 057 this.dataType = ch; 058 } else { 059 throw new FitsException("Wrong TFORM format", 060 FitsException.HEADER); 061 } 062 } 063 064 // save additional information after data type character 065 int idx = format.indexOf(this.dataType) + 1; 066 if (idx<format.length()) { 067 additional = format.substring(idx); 068 } 069 070 if (dataType != 'P') { // find and decode width etc. 071 while (stok.hasMoreTokens()) { 072 tok = stok.nextToken(); 073 ch = tok.charAt(0); 074 if (Character.isDigit(ch)) break; 075 if (eFormat == '\0') { 076 eFormat = ch; 077 } 078 } 079 if (Character.isDigit(tok.charAt(0))) { 080 try { 081 width = (Integer.valueOf(tok)).intValue(); 082 } catch (NumberFormatException e) { 083 throw new FitsException("Wrong TFORM format", 084 FitsException.HEADER); 085 } 086 } 087 else { 088 switch (dataType) { 089 case 'L' : 090 case 'B' : 091 case 'A' : 092 width = 1; 093 break; 094 case 'X' : 095 width = (0<repeat) ? (repeat-1)%8 + 1 : 0; 096 break; 097 case 'I' : 098 width = 2; 099 break; 100 case 'J' : 101 case 'E' : 102 width = 4; 103 break; 104 case 'D' : 105 case 'C' : 106 case 'P' : 107 width = 8; 108 break; 109 case 'M' : 110 width = 16; 111 break; 112 default : 113 throw new FitsException("Wrong TFORM format", 114 FitsException.HEADER); 115 } 116 } 117 if (stok.hasMoreTokens()) { // get no. of dicimals 118 tok = stok.nextToken(); 119 if (tok.charAt(0) == '.') { 120 if (stok.hasMoreTokens()) tok = stok.nextToken(); 121 try { 122 decimals = (Integer.valueOf(tok)).intValue(); 123 } catch (NumberFormatException e) { 124 throw new FitsException("Wrong TFORM format", 125 FitsException.HEADER); 126 } 127 } else { 128 throw new FitsException("Wrong TFORM format", 129 FitsException.HEADER); 130 } 131 132 if (stok.hasMoreTokens()) { // get size of exponent 133 tok = stok.nextToken(); 134 if (tok.charAt(0) == 'E') { 135 if (stok.hasMoreTokens()) tok = stok.nextToken(); 136 try { 137 decimals = (Integer.valueOf(tok)).intValue(); 138 } catch (NumberFormatException e) { 139 throw new FitsException("Wrong TFORM format", 140 FitsException.HEADER); 141 } 142 } else { 143 throw new FitsException("Wrong TFORM format", 144 FitsException.HEADER); 145 } 146 } 147 } 148 } 149 } 150 151 /** Get method to retrieve the original format string. */ 152 public String getFormat(){ 153 return format; 154 } 155 156 /** Get method to obtain the data type indicated by the format. */ 157 public char getDataType(){ 158 return this.dataType; 159 } 160 161 /** Get method to give the extended E-format display format. 162 * 'E' indicates engineering format while 'S' is scientific. 163 * If none is given a null character is returned. */ 164 public char getEFormat(){ 165 return this.eFormat; 166 } 167 168 /** Get method to obtain the repeat factor of the format for 169 * Binary Tables (by default it is 1). */ 170 public int getRepeat(){ 171 return repeat; 172 } 173 174 /** Get method to retrieve the field width of a single data value 175 * in bytes. */ 176 public int getWidth(){ 177 return width; 178 } 179 180 /** Get method to give the number of decimals for display formats. 181 * For B/O/X display formats it gives maximum number. */ 182 public int getDecimals(){ 183 return decimals; 184 } 185 186 /** Get method to obtain the number of chararters to be displayd 187 * in an exponential display format. */ 188 public int getExponent(){ 189 return exponent; 190 } 191 192 /** Get method to retreive the additional information string. 193 * This may be appended the prime data type in Binary Table 194 * TFORM keywords e.g. P type. */ 195 public String getAdditional(){ 196 return additional; 197 } 198 } 199 200 201 202