Parse FITS keywords
This commit is contained in:
parent
a4ea061f38
commit
462d2350f0
20
src/Fits.php
20
src/Fits.php
@ -17,6 +17,7 @@ class Fits
|
|||||||
private $byteStream;
|
private $byteStream;
|
||||||
private string $path;
|
private string $path;
|
||||||
public readonly int $size;
|
public readonly int $size;
|
||||||
|
public readonly string $headerBlock;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws InvalidFitsException, InvalidPathException
|
* @throws InvalidFitsException, InvalidPathException
|
||||||
@ -34,6 +35,8 @@ class Fits
|
|||||||
if (! $this->validate()) {
|
if (! $this->validate()) {
|
||||||
throw new InvalidFitsException('The opened file is not a valid FITS image (invalid block size)');
|
throw new InvalidFitsException('The opened file is not a valid FITS image (invalid block size)');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->headerBlock = $this->extractHeader();
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Validate the given FITS file based on block sizes
|
* Validate the given FITS file based on block sizes
|
||||||
@ -52,11 +55,16 @@ class Fits
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* @todo Return FitsHeader object
|
* @return FitsHeader
|
||||||
* @return string
|
|
||||||
*/
|
*/
|
||||||
#[\ReturnTypeWillChange]
|
public function header(): FitsHeader
|
||||||
public function header(): string
|
{
|
||||||
|
return new FitsHeader($this->headerBlock);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Extract the FITS header block as a string
|
||||||
|
*/
|
||||||
|
private function extractHeader(): string
|
||||||
{
|
{
|
||||||
$contents = fread($this->byteStream, $this->size);
|
$contents = fread($this->byteStream, $this->size);
|
||||||
$end = strpos($contents, 'END');
|
$end = strpos($contents, 'END');
|
||||||
@ -66,8 +74,8 @@ class Fits
|
|||||||
return substr($contents, 0, $headerEnd);
|
return substr($contents, 0, $headerEnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function fromPath(string $path): void
|
public function writeTo(string $path): void
|
||||||
{
|
{
|
||||||
$this->byteStream = fopen($path, 'rb');
|
// TODO
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,52 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace Dumbastro\FitsPhp;
|
namespace Dumbastro\FitsPhp;
|
||||||
|
|
||||||
|
use Dumbastro\FitsPhp\Keyword;
|
||||||
|
|
||||||
class FitsHeader
|
class FitsHeader
|
||||||
{
|
{
|
||||||
|
private string $headerBlock;
|
||||||
|
/**
|
||||||
|
* @var Keyword[] $keywords
|
||||||
|
*/
|
||||||
|
public readonly array $keywords;
|
||||||
|
|
||||||
|
public function __construct(string $headerBlock)
|
||||||
|
{
|
||||||
|
$this->headerBlock = $headerBlock;
|
||||||
|
$this->keywords = $this->readKeywords();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Initialize the keyword records array
|
||||||
|
*
|
||||||
|
* From the spec: each keyword record, including
|
||||||
|
* any comments, is at most 80 bytes long
|
||||||
|
* @return Keyword[]
|
||||||
|
*/
|
||||||
|
private function readKeywords(): array
|
||||||
|
{
|
||||||
|
$records = str_split($this->headerBlock, 80);
|
||||||
|
|
||||||
|
$records = array_filter(
|
||||||
|
$records,
|
||||||
|
fn (string $r) => trim($r) !== '' && !str_starts_with($r, 'END')
|
||||||
|
);
|
||||||
|
|
||||||
|
$keywords = [];
|
||||||
|
|
||||||
|
foreach ($records as $record) {
|
||||||
|
$splitByComment = explode('/', $record);
|
||||||
|
$comment = isset($splitByComment[1]) ? trim($splitByComment[1]) : null;
|
||||||
|
$nameValue = explode('=', $splitByComment[0]);
|
||||||
|
|
||||||
|
$keywords[] = new Keyword(
|
||||||
|
name : trim($nameValue[0]),
|
||||||
|
value : trim($nameValue[1]),
|
||||||
|
comment : $comment,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $keywords;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
18
src/Keyword.php
Normal file
18
src/Keyword.php
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Dumbastro\FitsPhp;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A FITS keyword record
|
||||||
|
* @todo Add types for max lengths?
|
||||||
|
*/
|
||||||
|
readonly class Keyword
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
public string $name,
|
||||||
|
public string $value,
|
||||||
|
public ?string $comment,
|
||||||
|
) {}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user