#!/usr/bin/perl # # This is for getting age at MRI date # Intended for MRIFACE protocol # All info is XNAT stored. # # Copyleft 2022 # use strict; use warnings; use JSON; use Date::Manip; use Math::Round; my $xprj; my $oxfile; while (@ARGV and $ARGV[0] =~ /^-/) { $_ = shift; last if /^--$/; if (/^-o/) {$oxfile = shift; chomp($oxfile);} if (/^-x/) {$xprj = shift; chomp($xprj);} } die "Should supply XNAT project" unless $xprj; $oxfile = $xprj.'_age_data.csv' unless $oxfile; #Read xnat user config my $xconf_file = $ENV{'HOME'}.'/.xnatapic/xnat.conf'; my %xconf; open IDF, "<$xconf_file"; while (){ if (/^#.*/ or /^\s*$/) { next; } my ($n, $v) = /(.*)=(.*)/; $xconf{$n} = $v; } #get the jsessionid my $q = 'curl -f -X POST -u "'.$xconf{'USER'}.':'.$xconf{'PASSWORD'}.'" "'.$xconf{'HOST'}.'/data/JSESSION" 2>/dev/null'; my $jid = qx/$q/; my %subjects; $q = 'curl -f -b JSESSIONID='.$jid.' -X GET "'.$xconf{'HOST'}.'/data/projects/'.$xprj.'/subjects?format=csv&columns=ID,label" 2>/dev/null'; my @sbj_res = split '\n', qx/$q/; foreach my $sbj_prop (@sbj_res){ if ($sbj_prop =~ /^XNAT/){ my ($sid,$slabel) = $sbj_prop =~ /^(XNAT.+),(\S+),(.*)$/; $subjects{$sid}{'label'} = $slabel; my $qe = 'curl -f -b JSESSIONID='.$jid.' -X GET "'.$xconf{'HOST'}.'/data/projects/'.$xprj.'/subjects/'.$sid.'/experiments?format=json&xsiType=xnat:mrSessionData" 2>/dev/null'; my $json_res = qx/$qe/; my $exp_prop = decode_json $json_res; foreach my $experiment (@{$exp_prop->{'ResultSet'}{'Result'}}){ $subjects{$sid}{'experimentID'} = $experiment->{'ID'}; } my $mri_date; if (exists($subjects{$sid}{'experimentID'}) and $subjects{$sid}{'experimentID'}){ my $qr = 'curl -f -b JSESSIONID='.$jid.' -X GET "'.$xconf{'HOST'}.'/data/projects/'.$xprj.'/experiments/'.$subjects{$sid}{'experimentID'}.'?format=json" 2>/dev/null | jq ".items[0].data_fields.date"'; $mri_date = qx/$qr/; chomp $mri_date; $mri_date =~ s/.*(\d{4})-(\d{2})-(\d{2}).*/$2\/$3\/$1/; #print "MRI date: $mri_date\n"; } my $qs = 'curl -f -b JSESSIONID='.$jid.' -X GET "'.$xconf{'HOST'}.'/data/projects/'.$xprj.'/subjects/'.$sid.'?format=json" 2>/dev/null | jq ".items[0].children[] | select(.field==\"demographics\") | .items[0].data_fields.dob"'; #print "$qs\n"; my $dob = qx/$qs/; chomp $dob; $dob =~ s/.*(\d{4})-(\d{2})-(\d{2}).*/$2\/$3\/$1/; #print "DoB: $dob\n"; if ($mri_date and $dob){ #my $d1 = ParseDate($dob); #my $d2 = ParseDate($mri_date); #print "$d1 - $d2\n"; my $ddif = Delta_Format(DateCalc(ParseDate($dob),ParseDate($mri_date)),2,"%hh")/(24*365.2425); $subjects{$sid}{'age'} = nearest(0.1, $ddif); print "$subjects{$sid}{'label'}, $subjects{$sid}{'age'}\n"; } } } open ODF, ">$oxfile"; print ODF "Subject,Age\n"; foreach my $subject (sort keys %subjects){ if(exists($subjects{$subject}{'age'})){ print ODF "$subjects{$subject}{'label'},$subjects{$subject}{'age'}\n"; } } close ODF;