[fitsbits] BINTABLE convention for >999 columns

Francois-Xavier PINEAU francois-xavier.pineau at astro.unistra.fr
Tue Jul 11 07:31:29 EDT 2017


Ok, thank you very much Mark.

I should have read all details more carefully.

And thank you for the comments excerpt. I understand that it is related to:

/* Byte is a bit tricky since a FITS byte is unsigned, while
  * a byte in a StarTable (a java byte) is signed. */


  in uk/ac/starlink/fits/ScalarColumnWriter.java


fx

Le 11/07/2017 à 12:20, Mark Taylor a écrit :
> On Tue, 11 Jul 2017, Francois-Xavier PINEAU wrote:
>
>> P.S: Mark (T), in your convention, if I am correct, you are using an array of
>>       16-bits integers.
> The example I posted did use format I = 16-bit integers.
> But the text of the convention I propose says this:
>
>   - The container column is declared in the header with some
>        TFORM999 value corresponding to the total field length required
>        by all the extended columns ('B' is the obvious data type, but
>        any legal TFORM value that gives the right width MAY be used).
>        The byte count implied by TFORM999 MUST be equal to the
>        total byte count implied by all extended columns.
>
>>       Why not using an array of Unsigned Bytes?
>>       In some cases (odd number of L, B, C, X/8 types in columns > 998)
>> 1 byte
>>       will be "wasted", right?
> No, such "waste" is explicitly forbidden by the final sentence
> in the rule quoted above.
> The example I posted can use format 'I' (16-bit signed integer) because
> the number of bytes required happens to be even.  If it was odd,
> I would use 'B' (8-bit unsigned integer).  If any other software
> wants to implement this convention, it is free to use B
> (or anything else that gives the right length) in all cases.
>
> So why don't I just use B in all cases?  The answer is rather nasty.
> Here are the comments I have in the relevant part of my prototype code:
>
>          /* Work out how we will declare the data type for this column
>           * in the FITS header.  Since this column data is not supposed
>           * to have any meaning, it doesn't matter what format we use
>           * as long as it's the right length.
>           * The obvious thing would be to use 'B' format (byte),
>           * and that does work.  However, FITS bytes are unsigned,
>           * and java bytes are signed.  To get round that,
>           * the STIL FITS reading code usually turns FITS bytes into java
>           * shorts on read.  That doesn't break anything, but it means that
>           * if a non-WideFits-aware STIL reader encounters a WideFits table,
>           * it may end up doing expensive and useless conversions of
>           * large byte arrays to large short arrays.
>           * (Other software may or may not have similar issues with
>           * FITS unsigned bytes, I don't know).
>           * So, if the element size is an even number of bytes, write it
>           * using TFORM = 'I' (16-bit signed integer) instead.
>           * Since the FITS and java 16-bit types match each other, this
>           * avoids the problem.  If it's an odd number, we still have to
>           * go with bytes. */
>
> But this is really implementation-dependent stuff, and these
> considerations are not part of the convention I'm proposing.
>
> Mark
>
> --
> Mark Taylor   Astronomical Programmer   Physics, Bristol University, UK
> m.b.taylor at bris.ac.uk +44-117-9288776  http://www.star.bris.ac.uk/~mbt/



More information about the fitsbits mailing list