<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Calibri,Arial,Helvetica,sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
On the topic of proper types for FITS, I'm working on an Ada 2012 / SPARK 2014 implementation of the Standard, meaning formally/'mechanically' provable, the following is the specification (<span style="font-family: Consolas,Courier,monospace;">FITS.ads</span>)
 —<br>
<span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">Pragma Ada_2012;</span>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">Pragma Assertion_Policy( Check );</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">Pragma Restrictions( No_Implementation_Aspect_Specifications );</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">Pragma Restrictions( No_Implementation_Attributes            );</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">Pragma Restrictions( No_Implementation_Pragmas               );</span></div>
<div><br>
</div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">With</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">System,</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">Ada.Streams,</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">Ada.IO_Exceptions,</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">Ada.Unchecked_Conversion;</span></div>
<div><br>
</div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">Package FITS with Pure, SPARK_Mode => On is</span></div>
<div><br>
</div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    -----------------</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    --  CONSTANTS  --</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    -----------------</span></div>
<div><br>
</div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    -- FITS 4.0 (3.1)</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    --  Each FITS structure shall consist of an integral number of</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    --  FITS blocks which are each 2880 bytes (23040 bits) in length.</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Block_Size_Bits  : Constant := 23_040;</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Block_Size_Bytes : Constant := Block_Size_Bits / 8; -- Assumes 8-bit Byte.</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Pragma Assert( Block_Size_Bytes = 2_880 );</span></div>
<div><br>
</div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    -- FITS 4.0 (3.3.1)</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    --  Each 2880-byte header block contains 36 keyword records.</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Keyword_Line_Size : Constant := 80;</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Keywords_in_Block : Constant := Block_Size_Bytes / Keyword_Line_Size;</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Pragma Assert( Keywords_in_Block = 36 );</span></div>
<div><br>
</div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    -- IMPLEMENTATION LIMITATION.</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Maximum_Keyword_Blocks : Constant := 100; -- So, 3_600 keywords.</span></div>
<div><br>
</div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    -- FITS 4.0 (3.2)</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    --  The header blocks shall contain only the restricted set of ASCII text</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    --  characters, decimal 32 through 126 (hexadecimal 20 through 7E).</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Header_Character_First : Constant Character := Character'Val(  32 );</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Header_Character_Last  : Constant Character := Character'Val( 126 );</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Subtype Header_Character is Character range Header_Character_First..Header_Character_Last</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">      with  Static_Predicate => Header_Character >= Header_Character_First and</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">                                Header_Character <= Header_Character_Last;</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Subtype Record_String is String</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">      with Dynamic_Predicate =></span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">        Record_String'Length <= 80 and -- Should be "equal to 80", but for convienience is allowed to be less.<br>
</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">        (for all Ch of Record_String => Ch in Header_Character);</span></div>
<div><br>
</div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Subtype KW_String is Record_String</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">      with Dynamic_Predicate =></span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">        KW_String'Length <= 8 and</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">        (if KW_String'Length in 1..8 then</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">         -- If there is a SPACE in the keword, no successive character may</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">         -- contain a non-SPACE character; this is equivelant to FOR ALL x in</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">         -- range 1..7, if the next character is not a space, neither is x.</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">           (for all I in KW_String'First..Positive'Pred(KW_String'Last)</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">                => (if KW_String(Positive'Succ(I)) /= ' ' then KW_String(I) /= ' ')</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">         )) and</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">      (for all Ch of KW_String => Ch in Header_Character);</span></div>
<div><br>
</div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Checksum_Character_First : Constant Character := Character'Val( 16#30# );</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Checksum_Character_Last  : Constant Character := Character'Val( 16#72# );</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Subtype Checksum_Character is Header_Character</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">      range Checksum_Character_First..Checksum_Character_Last;</span></div>
<div><br>
</div>
<div><br>
</div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    subtype Digit is Header_Character</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">      with Static_Predicate => Digit in '0'..'9';</span></div>
<div><br>
</div>
<div><br>
</div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Maximum_Axis_Count   : Constant := 999;</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Maximum_Axis_Value   : Constant := 2**31 - 1; --Positive'Last;</span></div>
<div><br>
</div>
<div><br>
</div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    -------------------</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    --  SIMPLE TYPES --</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    -------------------</span></div>
<div><br>
</div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Type Unsigned_64 is mod 2**64 with Size => 64;</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Type Integer_64  is range -(2**63)..(2**63)-1 with Size => 64;</span></div>
<div><br>
</div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Type Element_Type is</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">      (</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">       ET_Float_64, -- -64 IEEE 64-bit floating point values</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">       ET_Float_32, -- -32 IEEE 32-bit floating point values</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">       ET_Unsigned_8, --  8 ASCII characters or 8-bit unsigned integers</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">       ET_Signed_16, --  16 16-bit, twos complement signed integers</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">       ET_Signed_32 --  32 32-bit, twos complement signed integers</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">      );</span></div>
<div><br>
</div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    For Element_Type use</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">      (</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">       ET_Float_64 => -64,</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">       ET_Float_32 => -32,</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">       ET_Unsigned_8 =>   8,</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">       ET_Signed_16 =>  16,</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">       ET_Signed_32 =>  32</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">      );</span></div>
<div><br>
</div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Type Element(<>) is private;</span></div>
<div><br>
</div>
<div><br>
</div>
<div><br>
</div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Type Axis_Count is range 0..Maximum_Axis_Count with Size => 10;</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Type Axis_Value is range 1..Maximum_Axis_Value with Size => 32;</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Type Offset_64 is mod 2**64 with size => 64;</span></div>
<div><br>
</div>
<div><br>
</div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    --Type Axis_Range is range 1..2**32 with Size => 32;</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Type Axis_Dimensions is Array (Axis_Count range <>) of Axis_Value</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">      with Default_Component_Value => 1; --, TYPE_INVARIANT => true;</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Subtype Primary_Data_Array is Axis_Dimensions(1..999);</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Subtype Random_Groups_Data is Axis_Dimensions(1..998);</span></div>
<div><br>
</div>
<div><br>
</div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Function Flatten( Item : Axis_Dimensions ) return Offset_64;</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Function EF( Item : FITS.Axis_Dimensions ) return Offset_64;</span></div>
<div><br>
</div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    -- FITS 4.0 (3.3.2)</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    --  The individual data values shall be stored in big-endian byte order</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    --  such that the byte containing the most significant bits of the</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    --  value appears first in the FITS file, followed by the remaining</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    --  bytes, if any, in decreasing order of significance.</span></div>
<div><br>
</div>
<div><br>
</div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    ------------------</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    --  EXCEPTIONS  --</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    ------------------</span></div>
<div><br>
</div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">--      -- Will be raised when an HDU contains an invalid character.</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">--      Data_Error   : Exception renames Ada.IO_Exceptions.Data_Error;</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">--</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">--      --</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">--      Layout_Error : Exception renames Ada.IO_Exceptions.Layout_Error;</span></div>
<br>
<div><br>
</div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">Private</span></div>
<br>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    -- Check to make sure this is a good/usable representation.</span><br>
</div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    Type Element( Style : Element_Type ) is record</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">Case Style is</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">   When ET_Unsigned_8 =>  U8  : stub; -- Interfaces.Unsigned_8 := 0;</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">   When ET_Signed_16 =>  S16 : stub; -- Interfaces.Integer_16 := 0;</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">   When ET_Signed_32 =>  S32 : stub; -- Interfaces.Integer_32 := 0;</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">   When ET_Float_32 =>  F32 : stub; -- Interfaces.IEEE_Float_32 := 0.0;</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">   When ET_Float_64 =>  F64 : stub; -- Interfaces.IEEE_Float_64 := 0.0;</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">end case;</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">    end record;</span></div>
<div><span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">--      with Bit_Order => System.High_Order_First, Unchecked_Union => True;</span></div>
<span style="color: rgb(12, 100, 192); font-family: "Courier New",monospace;">End FITS;</span><br>
<br>
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------<br>
To test for if a keyword is valid (construction/format-wise), all you have to do is, given a string
<span style="font-family: Consolas,Courier,monospace; color: rgb(12, 136, 42);">Value</span> write
<span style="font-family: "Courier New",monospace; color: rgb(12, 100, 192);">Value in KW_String</span> and use the boolean result.<br>
<br>
</div>
<div id="appendonsend"></div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
<br>
</div>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="divRplyFwdMsg" dir="ltr"><font style="font-size:11pt" face="Calibri, sans-serif" color="#000000"><b>From:</b> fitsbits <fitsbits-bounces@listmgr.nrao.edu> on behalf of fitsbits-request@listmgr.nrao.edu <fitsbits-request@listmgr.nrao.edu><br>
<b>Sent:</b> Saturday, July 17, 2021 10:00 AM<br>
<b>To:</b> fitsbits@listmgr.nrao.edu <fitsbits@listmgr.nrao.edu><br>
<b>Subject:</b> fitsbits Digest, Vol 140, Issue 4</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt">
<div class="PlainText">**Warning: This email originated external to the NMSU email system. Do not click on links or open attachments unless you are sure the content is safe.<br>
<br>
Send fitsbits mailing list submissions to<br>
        fitsbits@listmgr.nrao.edu<br>
<br>
To subscribe or unsubscribe via the World Wide Web, visit<br>
        <a href="https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Flistmgr.nrao.edu%2Fmailman%2Flistinfo%2Ffitsbits&amp;data=04%7C01%7Cefish%40nmsu.edu%7Cec5ad6a2c2ff419eb4b208d9493c2868%7Ca3ec87a89fb84158ba8ff11bace1ebaa%7C1%7C0%7C637621345003233749%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sdata=wP7ojEDgXXkmg77FCzHSjpqwYHeZW7INFEBgNUxAo2I%3D&amp;reserved=0">
https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Flistmgr.nrao.edu%2Fmailman%2Flistinfo%2Ffitsbits&amp;data=04%7C01%7Cefish%40nmsu.edu%7Cec5ad6a2c2ff419eb4b208d9493c2868%7Ca3ec87a89fb84158ba8ff11bace1ebaa%7C1%7C0%7C637621345003233749%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sdata=wP7ojEDgXXkmg77FCzHSjpqwYHeZW7INFEBgNUxAo2I%3D&amp;reserved=0</a><br>
or, via email, send a message with subject or body 'help' to<br>
        fitsbits-request@listmgr.nrao.edu<br>
<br>
You can reach the person managing the list at<br>
        fitsbits-owner@listmgr.nrao.edu<br>
<br>
When replying, please edit your Subject line so it is more specific<br>
than "Re: Contents of fitsbits digest..."<br>
<br>
<br>
Today's Topics:<br>
<br>
   1. Re: JSON to FITS bintable? (Simon Conseil)<br>
<br>
<br>
----------------------------------------------------------------------<br>
<br>
Message: 1<br>
Date: Thu, 15 Jul 2021 09:23:34 +0200<br>
From: Simon Conseil <simon@sconseil.fr><br>
To: fitsbits@listmgr.nrao.edu<br>
Subject: Re: [fitsbits] JSON to FITS bintable?<br>
Message-ID: <62a1ab75-9855-c797-7d45-09cdd9b7f3b8@sconseil.fr><br>
Content-Type: text/plain; charset=utf-8; format=flowed<br>
<br>
Hi,<br>
<br>
It seems difficult to have a generic solution for this kind of problem, <br>
but with a few lines of Python you can easily get a FITS (would need a <br>
bit more work if you want proper types, but those are not well defined <br>
in the JSON):<br>
<br>
In []: data = json.loads('.. data from the email ..')<br>
<br>
# Splitting data and metadata<br>
<br>
In []: orbits = data.pop('orbits')<br>
<br>
# data values were saved as string in the json, convert as float, "NULL" <br>
values could be replaced by NaNs and/or masked<br>
<br>
In []: dtype = [int, float, float, float, float, float, float, float, <br>
float, str, str, float, str, float, int]<br>
<br>
# Data was saved row by row, so use rows=...<br>
<br>
In []: tbl = Table(rows=orbits['data'], names=orbits['fields'], <br>
meta=data, dtype=dtype)<br>
<br>
In []: tbl<br>
Out[]:<br>
<Table length=2><br>
  idx        epoch               ec         ... vinf  geoEcc impFlag<br>
int64      float64           float64       ... str4 float64  int64<br>
----- ----------------- ------------------ ... ---- ------- -------<br>
     0 2459406.890974739 0.2998598423946383 ... NULL   1e+99       0<br>
   999 2459406.890974739 0.2000304724974162 ... NULL   1e+99       0<br>
<br>
# Currently just a dict<br>
<br>
In []: tbl.meta<br>
Out[]:<br>
{'H': '20.3',<br>
  'Vmag': '21.8',<br>
  'arc': '48.40',<br>
  'caDist': None,<br>
  'dec': '-34',<br>
  'elong': '167',<br>
  'geocentricScore': '0',<br>
  'ieoScore': '0',<br>
  'lastRun': '2021-07-13 11:52',<br>
  'moid': '0.6',<br>
  'nObs': '7',<br>
  'neo1kmScore': '0',<br>
  'neoScore': '16',<br>
  'objectName': 'P11hVaG',<br>
  'phaScore': '0',<br>
  'ra': '19:44',<br>
  'rate': '0.9',<br>
  'rating': '0',<br>
  'rmsN': '0.58',<br>
  'signature': {'source': 'NASA/JPL Scout API', 'version': '1.2'},<br>
  'tEphem': '2021-07-13 13:30',<br>
  'tisserandScore': '6',<br>
  'unc': '0.05',<br>
  'uncP1': '0.33',<br>
  'vInf': None}<br>
<br>
# Writing to FITS will convert .meta to a FITS Header, dropping <br>
'signature' which would need to be flattened<br>
<br>
In []: tbl.write('data.fits')<br>
WARNING: VerifyWarning: Keyword name 'geocentricScore' is greater than 8 <br>
characters or contains characters not allowed by the FITS standard; a <br>
HIERARCH card will be created. [astropy.io.fits.card]<br>
WARNING: VerifyWarning: Keyword name 'neo1kmScore' is greater than 8 <br>
characters or contains characters not allowed by the FITS standard; a <br>
HIERARCH card will be created. [astropy.io.fits.card]<br>
WARNING: VerifyWarning: Keyword name 'objectName' is greater than 8 <br>
characters or contains characters not allowed by the FITS standard; a <br>
HIERARCH card will be created. [astropy.io.fits.card]<br>
WARNING: VerifyWarning: Keyword name 'signature' is greater than 8 <br>
characters or contains characters not allowed by the FITS standard; a <br>
HIERARCH card will be created. [astropy.io.fits.card]<br>
WARNING: Attribute `signature` of type <class 'dict'> cannot be added to <br>
FITS Header - skipping [astropy.io.fits.convenience]<br>
WARNING: VerifyWarning: Keyword name 'tisserandScore' is greater than 8 <br>
characters or contains characters not allowed by the FITS standard; a <br>
HIERARCH card will be created. [astropy.io.fits.card]<br>
<br>
Simon<br>
<br>
<br>
<br>
On 7/15/21 8:37 AM, John K. Parejko via fitsbits wrote:<br>
> Well, you could always pickup from that github issue and contribute a patch to astropy for this support!<br>
> <br>
> John<br>
> <br>
>> On 14Jul 2021, at 21:03, Seaman, Robert Lewis - (rseaman) <rseaman@arizona.edu> wrote:<br>
>><br>
>> Hi John,<br>
>><br>
>> Thanks for the (almost) solution. (I presume you edited out the ellipsis.) JSON is fairly ubiquitous in the NEO community. I'm surprised support in astropy has been stalled for five years, at least as a bintable serialization. I may bite the bullet and roll
 my own with CFITSIO.<br>
>><br>
>> Rob<br>
>> --<br>
>><br>
>> ?On 7/14/21, 11:35 AM, "John K. Parejko" <parejkoj@uw.edu> wrote:<br>
>><br>
>>     I couldn?t quite get your json into an astropy.table, but this is almost what you need.<br>
>><br>
>>     import pandas as pd<br>
>>     import astropy.table<br>
>>     data = pd.read_json('table.json', orient='values', typ='series?)<br>
>>     table = astropy.table.Table.from_pandas(data.to_frame()) <? this fails<br>
>>     table.write(?table.fits?)<br>
>><br>
>>     You may be able to get it to work with the appropriate `pd.read_json` options. I?m not that familiar with pandas.<br>
>><br>
>>     There?s an open astropy PR about this, but it stalled out and most recently folks there were moving towards ECSV.<br>
>><br>
>>     <a href="https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fastropy%2Fastropy%2Fissues%2F4604&amp;data=04%7C01%7Cefish%40nmsu.edu%7Cec5ad6a2c2ff419eb4b208d9493c2868%7Ca3ec87a89fb84158ba8ff11bace1ebaa%7C1%7C0%7C637621345003233749%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sdata=1B63vHbxSGHKz0Gk9LsdiAxuJhs0KQzvsNU%2FC77U9oo%3D&amp;reserved=0">
https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fastropy%2Fastropy%2Fissues%2F4604&amp;data=04%7C01%7Cefish%40nmsu.edu%7Cec5ad6a2c2ff419eb4b208d9493c2868%7Ca3ec87a89fb84158ba8ff11bace1ebaa%7C1%7C0%7C637621345003233749%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sdata=1B63vHbxSGHKz0Gk9LsdiAxuJhs0KQzvsNU%2FC77U9oo%3D&amp;reserved=0</a><br>
>><br>
>>     John<br>
>><br>
>><br>
>>> On 13Jul 2021, at 09:12, Seaman, Robert Lewis - (rseaman) via fitsbits <fitsbits@listmgr.nrao.edu> wrote:<br>
>>><br>
>>> Howdy,<br>
>>><br>
>>> Anybody have a viable JSON to bintable converter / library to recommend?<br>
>>><br>
>>> Format as below.<br>
>>><br>
>>> Rob<br>
>>><br>
>>><br>
>>> {<br>
>>>     "H": "20.3",<br>
>>>     "Vmag": "21.8",<br>
>>>     "arc": "48.40",<br>
>>>     "caDist": null,<br>
>>>     "dec": "-34",<br>
>>>     "elong": "167",<br>
>>>     "geocentricScore": "0",<br>
>>>     "ieoScore": "0",<br>
>>>     "lastRun": "2021-07-13 11:52",<br>
>>>     "moid": "0.6",<br>
>>>     "nObs": "7",<br>
>>>     "neo1kmScore": "0",<br>
>>>     "neoScore": "16",<br>
>>>     "objectName": "P11hVaG",<br>
>>>     "orbits": {<br>
>>>         "count": "1000",<br>
>>>         "data": [<br>
>>>             [<br>
>>>                 0,<br>
>>>                 "2459406.890974739",<br>
>>>                 "2.998598423946383E-01",<br>
>>>                 "1.254932587424348E+00",<br>
>>>                 "2459535.040736465",<br>
>>>                 "3.1448800075530471E+02",<br>
>>>                 "6.1192414581791162E+01",<br>
>>>                 "1.1594628618305565E+01",<br>
>>>                 "21.376293",<br>
>>>                 "NULL",<br>
>>>                 "NULL",<br>
>>>                 "3.065249120E-01",<br>
>>>                 "NULL",<br>
>>>                 "1.000000000E+99",<br>
>>>                 0<br>
>>>             ],<br>
>>>    . . .<br>
>>>             [<br>
>>>                 999,<br>
>>>                 "2459406.890974739",<br>
>>>                 "2.000304724974162E-01",<br>
>>>                 "1.584871836255366E+00",<br>
>>>                 "2459160.741920622",<br>
>>>                 "3.1292408591618408E+02",<br>
>>>                 "2.2731638231383295E+02",<br>
>>>                 "1.7097327014467091E+01",<br>
>>>                 "19.682230",<br>
>>>                 "NULL",<br>
>>>                 "NULL",<br>
>>>                 "6.321307279E-01",<br>
>>>                 "NULL",<br>
>>>                 "1.000000000E+99",<br>
>>>                 0<br>
>>>             ]<br>
>>>         ],<br>
>>>         "fields": [<br>
>>>             "idx",<br>
>>>             "epoch",<br>
>>>             "ec",<br>
>>>             "qr",<br>
>>>             "tp",<br>
>>>             "om",<br>
>>>             "w",<br>
>>>             "inc",<br>
>>>             "H",<br>
>>>             "dca",<br>
>>>             "tca",<br>
>>>             "moid",<br>
>>>             "vinf",<br>
>>>             "geoEcc",<br>
>>>             "impFlag"<br>
>>>         ]<br>
>>>     },<br>
>>>     "phaScore": "0",<br>
>>>     "ra": "19:44",<br>
>>>     "rate": "0.9",<br>
>>>     "rating": "0",<br>
>>>     "rmsN": "0.58",<br>
>>>     "signature": {<br>
>>>         "source": "NASA/JPL Scout API",<br>
>>>         "version": "1.2"<br>
>>>     },<br>
>>>     "tEphem": "2021-07-13 13:30",<br>
>>>     "tisserandScore": "6",<br>
>>>     "unc": "0.05",<br>
>>>     "uncP1": "0.33",<br>
>>>     "vInf": null<br>
>>> }<br>
>>><br>
>>> _______________________________________________<br>
>>> fitsbits mailing list<br>
>>> fitsbits@listmgr.nrao.edu<br>
>>> <a href="https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Flistmgr.nrao.edu%2Fmailman%2Flistinfo%2Ffitsbits&amp;data=04%7C01%7Cefish%40nmsu.edu%7Cec5ad6a2c2ff419eb4b208d9493c2868%7Ca3ec87a89fb84158ba8ff11bace1ebaa%7C1%7C0%7C637621345003233749%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sdata=wP7ojEDgXXkmg77FCzHSjpqwYHeZW7INFEBgNUxAo2I%3D&amp;reserved=0">
https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Flistmgr.nrao.edu%2Fmailman%2Flistinfo%2Ffitsbits&amp;data=04%7C01%7Cefish%40nmsu.edu%7Cec5ad6a2c2ff419eb4b208d9493c2868%7Ca3ec87a89fb84158ba8ff11bace1ebaa%7C1%7C0%7C637621345003233749%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sdata=wP7ojEDgXXkmg77FCzHSjpqwYHeZW7INFEBgNUxAo2I%3D&amp;reserved=0</a><br>
>><br>
>>     --<br>
>>     *************************<br>
>>     John Parejko<br>
>>     parejkoj@uw.edu<br>
>>     Rubin Observatory, DIRAC Fellow<br>
>>     <a href="https://nam10.safelinks.protection.outlook.com/?url=http%3A%2F%2Fstaff.washington.edu%2Fparejkoj%2F&amp;data=04%7C01%7Cefish%40nmsu.edu%7Cec5ad6a2c2ff419eb4b208d9493c2868%7Ca3ec87a89fb84158ba8ff11bace1ebaa%7C1%7C0%7C637621345003233749%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sdata=hgnaZchNztxDjdHbcssDi11OdxXT6GfLjfoQxNvHkrY%3D&amp;reserved=0">
https://nam10.safelinks.protection.outlook.com/?url=http%3A%2F%2Fstaff.washington.edu%2Fparejkoj%2F&amp;data=04%7C01%7Cefish%40nmsu.edu%7Cec5ad6a2c2ff419eb4b208d9493c2868%7Ca3ec87a89fb84158ba8ff11bace1ebaa%7C1%7C0%7C637621345003233749%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sdata=hgnaZchNztxDjdHbcssDi11OdxXT6GfLjfoQxNvHkrY%3D&amp;reserved=0</a><br>
>>     Department of Physics and Astronomy<br>
>>     University of Washington<br>
>>     Seattle, WA<br>
>>     **************************<br>
>><br>
>><br>
>><br>
>><br>
>><br>
>><br>
>><br>
>><br>
>><br>
>><br>
>><br>
>><br>
>><br>
>><br>
>><br>
>><br>
>><br>
> <br>
> --<br>
> *************************<br>
> John Parejko<br>
> parejkoj@uw.edu<br>
> Rubin Observatory, DIRAC Fellow<br>
> <a href="https://nam10.safelinks.protection.outlook.com/?url=http%3A%2F%2Fstaff.washington.edu%2Fparejkoj%2F&amp;data=04%7C01%7Cefish%40nmsu.edu%7Cec5ad6a2c2ff419eb4b208d9493c2868%7Ca3ec87a89fb84158ba8ff11bace1ebaa%7C1%7C0%7C637621345003233749%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sdata=hgnaZchNztxDjdHbcssDi11OdxXT6GfLjfoQxNvHkrY%3D&amp;reserved=0">
https://nam10.safelinks.protection.outlook.com/?url=http%3A%2F%2Fstaff.washington.edu%2Fparejkoj%2F&amp;data=04%7C01%7Cefish%40nmsu.edu%7Cec5ad6a2c2ff419eb4b208d9493c2868%7Ca3ec87a89fb84158ba8ff11bace1ebaa%7C1%7C0%7C637621345003233749%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sdata=hgnaZchNztxDjdHbcssDi11OdxXT6GfLjfoQxNvHkrY%3D&amp;reserved=0</a><br>
> Department of Physics and Astronomy<br>
> University of Washington<br>
> Seattle, WA<br>
> **************************<br>
> <br>
> <br>
> <br>
> <br>
> <br>
> <br>
> <br>
> <br>
> <br>
> <br>
> <br>
> <br>
> <br>
> <br>
> <br>
> <br>
> <br>
> _______________________________________________<br>
> fitsbits mailing list<br>
> fitsbits@listmgr.nrao.edu<br>
> <a href="https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Flistmgr.nrao.edu%2Fmailman%2Flistinfo%2Ffitsbits&amp;data=04%7C01%7Cefish%40nmsu.edu%7Cec5ad6a2c2ff419eb4b208d9493c2868%7Ca3ec87a89fb84158ba8ff11bace1ebaa%7C1%7C0%7C637621345003243742%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sdata=qsIHB5JK%2Fjd7bDm2W3Dk6VgVdlDaNn%2F4NJbVBJh3aCA%3D&amp;reserved=0">
https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Flistmgr.nrao.edu%2Fmailman%2Flistinfo%2Ffitsbits&amp;data=04%7C01%7Cefish%40nmsu.edu%7Cec5ad6a2c2ff419eb4b208d9493c2868%7Ca3ec87a89fb84158ba8ff11bace1ebaa%7C1%7C0%7C637621345003243742%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sdata=qsIHB5JK%2Fjd7bDm2W3Dk6VgVdlDaNn%2F4NJbVBJh3aCA%3D&amp;reserved=0</a><br>
> <br>
<br>
<br>
<br>
------------------------------<br>
<br>
Subject: Digest Footer<br>
<br>
_______________________________________________<br>
fitsbits mailing list<br>
fitsbits@listmgr.nrao.edu<br>
<a href="https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Flistmgr.nrao.edu%2Fmailman%2Flistinfo%2Ffitsbits&amp;data=04%7C01%7Cefish%40nmsu.edu%7Cec5ad6a2c2ff419eb4b208d9493c2868%7Ca3ec87a89fb84158ba8ff11bace1ebaa%7C1%7C0%7C637621345003243742%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sdata=qsIHB5JK%2Fjd7bDm2W3Dk6VgVdlDaNn%2F4NJbVBJh3aCA%3D&amp;reserved=0">https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Flistmgr.nrao.edu%2Fmailman%2Flistinfo%2Ffitsbits&amp;data=04%7C01%7Cefish%40nmsu.edu%7Cec5ad6a2c2ff419eb4b208d9493c2868%7Ca3ec87a89fb84158ba8ff11bace1ebaa%7C1%7C0%7C637621345003243742%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sdata=qsIHB5JK%2Fjd7bDm2W3Dk6VgVdlDaNn%2F4NJbVBJh3aCA%3D&amp;reserved=0</a><br>
<br>
<br>
------------------------------<br>
<br>
End of fitsbits Digest, Vol 140, Issue 4<br>
****************************************<br>
<br>
</div>
</span></font></div>
</body>
</html>