FitsLibrary 0.4.0-pre

This is a prerelease version of FitsLibrary.
dotnet add package FitsLibrary --version 0.4.0-pre
NuGet\Install-Package FitsLibrary -Version 0.4.0-pre
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="FitsLibrary" Version="0.4.0-pre" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add FitsLibrary --version 0.4.0-pre
#r "nuget: FitsLibrary, 0.4.0-pre"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install FitsLibrary as a Cake Addin
#addin nuget:?package=FitsLibrary&version=0.4.0-pre&prerelease

// Install FitsLibrary as a Cake Tool
#tool nuget:?package=FitsLibrary&version=0.4.0-pre&prerelease

FitsLibrary

License master branch Nuget

This project is currently in pre-release, not all functionality is implemented yet. Use at own risk!

FitsLibrary is a native C# / dotnet core implementation using the most up to date FITS 4.0 specification for writing and reading astronomical FITS files.

The library focuses on being fast and easy to use. It makes use of the newer C# generic maths features, which require net8.0.

Current Development state

What currently works

  • Loading of header data
  • Validation of header content
  • Reading of N-Dimensional data arrays (PRIMARY and IMAGE hdu's)
  • Writing .fits files

What doesn't work

  • Reading / writing of extensions of type TABLE and BINTABLE

Reading files

Reading header data

Every HDU comes with a header with meta-information:

var header = fitsFile.HeaderDataUnits[x].Header;

Which can then be acceessed like this:

var value = header["SomeValue"] as string;

Note that values are stored as type object but can be cast to whatever type the value has (like string, long, float, ...)

If you want to just read the primary header of a file, without opening the whole file you can do

var header = FitsDocumentHelper.ReadHeaderAsync("path/to/file");

You can assign values through

var exampleValue = 1.2f;
header.Entries.Add(new HeaderEntry("exampleKey", exampleValue));
// or with comment
header.Entries.Add(new HeaderEntry("exampleKey", exampleValue, "some Comment"));

Reading content data

This library can open Fits files in a strong typed way (if you know the type of data inside the primary hdu beforehand) or a type unspecific way.

Strong typed

Open a fits file using

var reader = new FitsDocumentReader<float>();
var fitsFile = await reader.ReadAsync("SampleFiles/FOCx38i0101t_c0f.fits"); // or reader.ReadAsync(stream)

And then access the data in a strong typed way through

for (int x = 0; x < fitsFile.PrimaryHdu.Header.AxisSizes[0]; x++) {
    for (int y = 0; y < fitsFile.PrimaryHdu.Header.AxisSizes[1]; y++) {
        var valueAtXY = fitsFile.PrimaryHdu.Data.GetValueAt(x, y);
    }
 }

Untyped

var reader = new FitsDocumentReader();
var fitsFile = await reader.ReadAsync(FITS_FILE);

And then access the data in a strong typed way through

var primaryHdu = (ImageHeaderDataUnit<short>)fitsFile.HeaderDataUnits[0];
for (var x = 0; x < fitsFile.HeaderDataUnits[0].Header.AxisSizes[0]; x++)
{
    for (var y = 0; y < fitsFile.HeaderDataUnits[0].Header.AxisSizes[1]; y++)
    {
        var val = primaryHdu.Data.GetValueAt(x, y);
    }
}

Accessing Raw data

By accessing hdu.Data.RawData (which is of type Memory<T>, use .Span to access data or much slower .ToArray()) This is used for fast access, does not differentiate between dimensions. Index for value in 2 dimensional data for example is calculated like this:

index = indexAxis1 + (axisSize1 * indexAxis2)
fitsFile.Content.Span[index];

Find the datatype of a Header Data Unit (HDU):

If you want to know the data type stored in the primary hdu of a fits file, without opening the whole file you can do:

var dataType = await FitsDocumentHelper.GetDocumentContentType("SampleFiles/FOCx38i0101t_c0f.fits");

If you have already opened the file, you can do

var reader = new FitsDocumentReader<float>();
var fitsFile = await reader.ReadAsync("SampleFiles/FOCx38i0101t_c0f.fits");

Writing files

Files can be written using the FitsDocumentWriter:

var reader = new FitsDocumentWriter();
await reader.WriteAsync(fitsFile, "SampleFiles/FOCx38i0101t_c0f.fits");
Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
0.4.0-pre 38 5/16/2024
0.3.0-pre 101 3/16/2023
0.2.0-pre 171 5/20/2021
0.1.1-pre 160 2/8/2021
0.1.0-pre 184 2/8/2021

- Now with fits file writing support!
     - Drastically inreased reading performance
     - Reads all hdus now (instead of just the first one)
     - Support for extension headers (only type IMAGE so far)