The ASDF_WRITE procedure takes an ASDF_File object and writes the header plus all of the associated data. The ASDF (Advanced Scientific Data Format) file format consists of a YAML header followed by zero or more binary data blocks. Binary data can also be stored separately in external files that are linked to the main ASDF file.

This routine is written in the IDL language. Its source code can be found in the file in the lib/datatypes subdirectory of the IDL distribution.


Create an ASDF file containing a single variable and write the data out to a file:

file = ASDF_File('mydata', findgen(100,50))
ASDF_Write, 'myfile.asdf', file

Print out the YAML headers from the file:

IDL> print, ASDF_Parse('myfile.asdf')
#ASDF 1.0.0
... standard ASDF headers ...
mydata: !core/ndarray-1.0.0
  shape: [50,100]
  byteorder: little
  datatype: float32
  source: 0


ASDF_WRITE, Filename, Asdf



Filename must be a string containing the file path to the ASDF file to be written. Any "external" data blocks within the ASDF_File will be written to the same directory and filename with a file suffix of nnnn.asdf, where nnnn is the index number of the data block, starting at zero. For example, if your filename is myfilename.asdf, then external blocks will be written to files myfilename0000.asdf, myfilename0001.asdf, myfilename0002.asdf, etc.


Set this argument to an ASDF_File object containing a nested hierarchy of data blocks.

Note: During the write process, IDL will recursively walk the ASDF_File. For each ASDF_NDArray object that is found, the data will first be read in from any external files. The ASDF_NDArray object will then be updated with a new source property value (either a new index for internal data blocks, or a new filename for external data blocks), and then the data block will be written out to the file.

Note: During write, any scalars that are type complex or double complex will be converted into YAML_Value objects with the !core/complex-1.0.0 tag.



Conversion Rules

When converting IDL variables into ASDF files, the following rules are used:

IDL Variable Type ASDF Item Notes
ASDF_File Main Document  

ASDF !core/ndarray-1.0.0

IDL numeric array

ASDF !core/ndarray-1.0.0




Optional ANCHOR, TAG properties

OrderedHash, Dictionary, or Hash Mapping  
YAML_Sequence Sequence

Optional ANCHOR, TAG properties

List Sequence  
Byte array (not boolean) !!binary with base64  
YAML_Value Scalar value

Optional ANCHOR, TAG properties

YAML_Alias Alias (reference) ALIAS property
String String

Strings that might match a number or null will be quoted

!NULL null  

false or true

Scalar byte or integer value Integer  
BigInteger Integer  
Floating-point scalar number Floating-point number  

Complex or Double complex scalar


Additional Examples

You can construct ASDF files from regular IDL arrays, scalars, hashes, or lists. Using hashes or lists allows you to create a nested hierarchy of data. ASDF_Write will automatically search for IDL arrays within the nested hierarchy and will write them out as ASDF ndarray blocks. For example:

cal = OrderedHash()
cal['title'] = 'Calibration Data'
cal['date'] = 2023
cal['telescope'] = 'JWST'
cal['calibration'] = findgen(10)
file = ASDF_File('Calibration', cal)

Add another data block to the same file using array indexing, and then write out the data to a file:

file['Image'] = bindgen(3, 100, 50)
ASDF_Write, 'calibration.asdf', file

Print out the YAML headers from the file:

print, ASDF_Parse('calibration.asdf')

IDL prints:

#ASDF 1.0.0
... standard ASDF headers ...
  title: Calibration Data
  date: 2023
  telescope: JWST
  calibration: !core/ndarray-1.0.0
    data: [0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0]
    shape: [10]
    byteorder: little
    datatype: float32
Image: !core/ndarray-1.0.0
  shape: [50,100,3]
  byteorder: little
  datatype: uint8
  source: 0

Version History



See Also