PDL-IO-Dcm
view release on metacpan or search on metacpan
lib/PDL/IO/Dcm/Plugins/MRISiemens.pm view on Meta::CPAN
PDL::Dims->import(qw/is_equidistant dmin dmax vals hpar dinc initdim dimsize drot idx diminfo /);
#say "init_dims: ",$self->hdr->{dcm_key};
#say "init_dims: ",$self->hdr->{dicom}->{Rows} ;
#say "init_dims: hpar ",hpar($self,'dicom','Rows');
PDL::Transform->import(qw/t_linear/);
#say diminfo ($self),$self->hdr->{ascconv}->{sGroupArray_asGroup_1__nSize};
# center=inner(rot*scale,dim/2)+Image Position (Patient)
# xf=t_linear(matrix=>Pixel Scale*$rot->transpose,post=>Image Position (Patient))
if (hpar($self,'ascconv','sGroupArray_asGroup_1__nSize')){
warn "Multiple slice groups, support dubious!";
}
use PDL::NiceSlice;
#my $v=zeroes(3);
# This needs to be converted to dicom fields for navs ...
# Center of FOV
my $dims=$self->hdr->{dicom}->{"Image Orientation (Patient)"}->shape;
my @li=( 3,2,list ( $dims->slice("1:")));
my $sh= $self->hdr->{dicom}->{"Image Orientation (Patient)"}->reshape(@li);
my $w= $self->hdr->{dicom}->{"Pixel Spacing"}->dummy(0,1)*$sh;
my $vv=($self->hdr->{dicom}->{Columns}*$w->slice(",0")+$self->hdr->{dicom}->{Rows}*$w->slice(",1"))->clump(0,1);
my $v=$vv/2+$self->hdr->{dicom}->{"Image Position (Patient)"}; #->transpose;
#$v(0,).=hpar($self,'ascconv','sSliceArray_asSlice_0__sPosition_dSag') ||0; #x
#$v(1,).=hpar($self,'ascconv','sSliceArray_asSlice_0__sPosition_dCor') ||0; #y
#$v(2,).=hpar($self,'ascconv','sSliceArray_asSlice_0__sPosition_dTra') ||0; #z
#say $v;
#say "hpar: pos ",hpar($self,'dicom','Image Position (Patient)'),
#$self->hdr->{dicom}->{'Image Position (Patient)'};
#say "init_dims: ",hpar($self,'dicom','Rows');
my $pos_d;
$pos_d=(hpar($self,'dicom','Image Position (Patient)'))->flat->(:2); #->uniq;
#my $ir=hpar($self,'ascconv','sSliceArray_asSlice_0__dInPlaneRot') ||0; #radiant
my $or=pdl(hpar($self,'dicom','Image Orientation (Patient)'))->flat->(:5)
->reshape(3,2)->transpose; #
my $pe_dir=hpar($self,'dicom','In-plane Phase Encoding Direction');
# Scaling
# Rotation
my $srot=zeroes(3,3);
$srot(:1,).=$or;
$srot(2,;-).=crossp($or(1,;-),$or(0,;-));
$srot(2,;-).=pdl[0,0,1] unless any ($srot(2,;-));
#say "spatial rotation $srot";
#$pos_d=$pos_d(,0;-);
# Calculate and initialise the transformation
my @ors=qw/Sag Cor Tra/;
say $srot;
$self->hdr->{orientation}=$ors[maximum_ind(abs($srot(2;-)))]; # normal vector lookup
my $pe=$self->hdr->{dicom}->{"In-plane Phase Encoding Direction"}
||$self->hdr->{dicom}->{"InPlanePhaseEncodingDirection"};
if ($self->hdr->{orientation} eq 'Tra'){ # transversal slice
#say $self->hdr->{orientation}. " Orientation";
$self->hdr->{sl}='z';
if ($pe eq 'COL'){
$self->hdr->{ro}='x';
$self->hdr->{pe}='y';
} else {
$self->hdr->{ro}='y';
$self->hdr->{pe}='x';
}
}
if ($self->hdr->{orientation} eq 'Cor'){ # coronal slice
$self->hdr->{sl}='y';
if ($pe eq 'COL') {
$self->hdr->{ro}='x';
$self->hdr->{pe}='z';
} else {
$self->hdr->{ro}='z';
$self->hdr->{pe}='x';
}
}
if ($self->hdr->{orientation} eq 'Sag'){ # sagittal slice
$self->hdr->{sl}='x';
if ($pe eq 'COL') {
$self->hdr->{ro}='y';
$self->hdr->{pe}='z';
} else {
$self->hdr->{ro}='z';
$self->hdr->{pe}='y';
}
}
my $s=zeroes(3); # matrix size
#my $fov=zeroes(3); # FOV
#$fov(0).=$self->hdr->{ascconv}->{sSliceArray_asSlice_0__dReadoutFOV};
#$fov(1).=$self->hdr->{ascconv}->{sSliceArray_asSlice_0__dPhaseFOV};
$s(0).=$self->dim(0);
$s(1).=$self->dim(1);
#if ($pe =~ 'COL') {
# $s(0).=$self->hdr->{csa}->{Columns};
# $s(1).=$self->hdr->{csa}->{Rows};
#say "COL! $s";
#} else {
# $s(1).=$self->hdr->{dicom}->{Width}||$self->hdr->{dicom}->{Columns};
# $s(0).=$self->hdr->{dicom}->{Height}||$self->hdr->{dicom}->{Rows};
#$fov(1).=$self->hdr->{ascconv}->{sSliceArray_asSlice_0__dReadoutFOV};
#$fov(0).=$self->hdr->{ascconv}->{sSliceArray_asSlice_0__dPhaseFOV};
#}
#say "PE $pe $s $fov " ;
$s(2).=1;
# Slice groups!
#if ($$opt{split}) {
#my ($sg,$size)=map_slicegroup($self);
#$s(2).=$self->hdr->{dicom}->{"Image Orientation (Patient)"}->dim(1);
#} else {
#$s(2)*=$self->hdr->{ascconv}->{'sSliceArray_lSize'};
$s(2).=$self->hdr->{dicom}->{'Image Orientation (Patient)'}->dim(2);
#}
$self->hdr->{'3d'}=1 if (($self->hdr->{dicom}->{MRAcquisitionType}||
hpar($self,'dicom','MR Acquisition Type')) eq '3D'); # 3D
if ($self->hdr->{'3d'}) {
#$s(2).=$self->hdr->{ascconv}->{'sKSpace_lImagesPerSlab'} ;
#$fov(2).=$self->hdr->{ascconv}->{sSliceArray_asSlice_0__dThickness};
} else {
#$fov(2).=$self->hdr->{dicom}->{"Spacing Between Slices"}*$s(2)
# ||$self->hdr->{ascconv}->{'sSliceArray_asSlice_0__dThickness'};
}
#$s(2).=1 if ($s(2)<1);
#say "FOV $fov matrix $s";
my $rot=identity($self->ndims);
my $inc_d=zeroes(3);
( run in 1.262 second using v1.01-cache-2.11-cpan-2398b32b56e )