App-AFNI-SiemensPhysio
view release on metacpan or search on metacpan
lib/App/AFNI/SiemensPhysio.pm view on Meta::CPAN
# reset rate if its only off by a very small amount
# and we don't trust the sample rate we provided
my $newrate = abs($self->{physStart}- $self->{physEnd})/$#{$self->{measures}};
$self->{PhRate} = $newrate
if abs($newrate-$self->{PhRate}) < .00001 and
$self->{trustIdx}!~/All|Phys/i;
say "file is $self->{ptype} with $#{$self->{measures}} samples, " ,
"$self->{physStart}s - $self->{physEnd}s, ",
"sample rate adjusted to $self->{PhRate}"
if $self->{VERB};
# does the time match the sample rate and number of samples
timeCheck($self->{physStart},
$self->{physEnd},
$#{$self->{measures}},
$self->{PhRate} ) unless $self->{trustIdx}=~/All|Phys/i;
}
lib/App/AFNI/SiemensPhysio.pm view on Meta::CPAN
my $ATidx= getidx('AcqTime');
# find max and min acq time from all MR*s
my ($starttime, $endtime) = minmax( map {$_->[$ATidx] } @v);
## set start and end
$self->{MRstart} = getMRAcqSecs($starttime);
$self->{MRend} = getMRAcqSecs($endtime);
say "MR starts $self->{MRstart} (DICOM $starttime) and ends $self->{MRend} (DICOM $endtime)"
if $self->{VERB};
timeCheck($self->{MRstart},
$self->{MRend},
$self->{nDcms},
$self->{TR}) unless $self->{trustIdx}=~/All|MR/i;
}
=head2 writeMRPhys
lib/App/AFNI/SiemensPhysio.pm view on Meta::CPAN
# get dir
my $bn=dirname($self->{prefix});
croak "prefix directory ($bn) does not exist!" if ! -d $bn;
$outfile=$self->{prefix}.$outfile;
}
$self->{dat}->{$self->{ptype}}=$outfile;
my @pvals = $self->getMRPhys;
say "saving to $outfile" if $self->{VERB};
writeDat($outfile,@pvals)
}
=head2 retroTS
This is kludgy code hacked together and untested :)
=over
lib/App/AFNI/SiemensPhysio.pm view on Meta::CPAN
"Opts.Cardfile" => "'".$self->{dat}->{puls}."'", # Cardiac data file
"Opts.PhysFS" => 1/$self->{PhRate}, # Physioliogical signal sampling frequency in Hz.
"Opts.Nslices" => $self->{nslice}, # Number of slices
"Opts.VolTR" => $self->{TR}, # Volume TR in seconds
"Opts.SliceOrder" => "'".$self->{sliceOrder}."'" # ['alt+z']/'alt-z'/'seq+z'/'seq-z'/'Custom'/filename.1D
);
# McRetroTS Respdatafile ECGdatafile VolTR Nslices SamplingFreq(PhysFS) ShowGraphs
my @mcrts = qw/Opts.Respfile Opts.Cardfile Opts.VolTR Opts.Nslices Opts.PhysFS/;
my $mccmd = "McRetroTs @params{@mcrts}";
say $mccmd if $runtype !~ /matlab|McRetroTs/g ;;
# if have matlab and singal toolbox, can use this
my $cmd = join("; ", map { join("=",$_,$params{$_}) } keys %params);
$cmd .= "; Opts.ShowGraphs=0;Opts.Quiet=0;"; # turn off graphs, turn on verbose
$cmd .= " rts = RetroTS(Opts)";
# we should wrap matlab up in a try+quit so we dont hang in ML command window on a failure
my $matlabwrap= qq/$matlabbin -nodisplay -r "try; $cmd; catch err; err, exit(1); end; rts, quit;"/;
say $matlabwrap if $runtype !~ /matlab|McRetroTs/i;
# eg
# matlab -nodisplay -r "try; Opts.Cardfile='rest_164627.359000.puls.dat'; Opts.VolTR=1.5; Opts.Nslices=29; Opts.SliceOrder='alt+z'; Opts.PhysFS=50.0074711455304; Opts.Respfile='rest_164627.359000.resp.dat'; rts = RetroTS(Opts); catch; exit(666); end...
# with either command, the original output name will be "oba.slibase.1D"
# change that to our basename (assume resp and puls have same basename, use one from resp)
my $outputname = $self->{dat}->{resp};
$outputname =~ s/.resp.dat$/.slibase.1D/;
# or rename to specified input
#my $outputname=shift if $#_;
lib/App/AFNI/SiemensPhysio.pm view on Meta::CPAN
## print whats up
sub sayIndex {
my $self=shift;
# print out start and stop index for ps and pe
my $ps = timeToSamples($self->{physStart},$self->{physStart},$self->{PhRate});
my $pe = timeToSamples($self->{physStart},$self->{physEnd},$self->{PhRate});
my $s = $self->{MRstartIdx} || undef;
my $e = $self->{MRendIdx} || undef;
# lets talk about what we have
say "(ps ) $self->{physStart} | MR $self->{MRstart} $self->{MRend} | $self->{physEnd} (pe) ";
say "(sidx) $ps | MR $s $e | $pe (eidx)" if $s and $e;
}
1;
( run in 2.163 seconds using v1.01-cache-2.11-cpan-364913b4093 )