diff --git a/.github/workflows/wetrun-testing.yml b/.github/workflows/wetrun-testing.yml index fcf5df8..d7ac6b7 100644 --- a/.github/workflows/wetrun-testing.yml +++ b/.github/workflows/wetrun-testing.yml @@ -4,6 +4,7 @@ on: pull_request: types: [labeled] workflow_dispatch: + jobs: wetrun_test: if: > diff --git a/autoafids/config/snakebids.yml b/autoafids/config/snakebids.yml index 518855a..0c9b5b8 100644 --- a/autoafids/config/snakebids.yml +++ b/autoafids/config/snakebids.yml @@ -147,12 +147,30 @@ parse_args: default: false required: false + --template-flow: + help: 'Downloads a template from templateflow and uses it to assess the quality of registration.' + choices: ['MNI152Lin', 'MNI152NLin2009cAsym', 'MNI152NLin6Sym', 'OASIS30ANTs', 'MNI152NLin2009cSym', 'MNI305', 'fsaverage', 'MNI152NLin2009bSym', 'MNI152NLin6Asym','MNIColin27'] + default: false + required: false + type: str + --fidqc: help: 'Generate *.html files for QC of AutoAFIDs outputs. (default: %(default)s)' dest: "fidqc" action: "store_true" # Automatically sets to True when flag is used default: false # Default to False when not used + --LEAD-DBS-DIR: + help: 'Path to a LEAD-DBS derivatives dataset, for folder(s) that contains multiple derivatives datasets (default: %(default)s) ' + default: false + required: false + type: str + + --FMRIPREP-DIR: + help: 'Path to a fMRIPrep derivatives dataset, for folder(s) that contains multiple derivatives datasets (default: %(default)s) ' + default: false + required: false + type: str --workdir: help: | @@ -166,10 +184,12 @@ parse_args: # Nifti template templatet1w: 'resources/tpl-MNI152NLin2009cAsym_res-01_T1w.nii.gz' +templatet1w_lead: 'resources/tpl-MNI152NLin2009bAsym_res-01_T1w.nii.gz' # AFIDs fcsv template fcsv: 'resources/dummy.fcsv' fcsv_mni: 'resources/tpl-MNI152NLin2009cAsym_res-01_desc-groundtruth_afids.fcsv' +fcsv_mni_lead: 'resources/tpl-MNI152NLin2009bAsym_res-01_desc-groundtruth_afids.fcsv' singularity: synthstrip: 'docker://freesurfer/synthstrip:1.3' diff --git a/autoafids/resources/regqc/tpl-MNI152Lin_res-01_desc-groundtruth_afids.fcsv b/autoafids/resources/regqc/tpl-MNI152Lin_res-01_desc-groundtruth_afids.fcsv new file mode 100644 index 0000000..dbfd695 --- /dev/null +++ b/autoafids/resources/regqc/tpl-MNI152Lin_res-01_desc-groundtruth_afids.fcsv @@ -0,0 +1,35 @@ +# Markups fiducial file version = 4.6 +# CoordinateSystem = 0 +# columns = id,x,y,z,ow,ox,oy,oz,vis,sel,lock,label,desc,associatedNodeID +vtkMRMLMarkupsFiducialNode_1,0.265,2.8417499999999998,-4.8774999999999995,0,0,0,1,1,1,0,1,AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_2,0.2445,-27.409750000000003,-3.4354999999999998,0,0,0,1,1,1,0,2,PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_3,0.4515,-37.737750000000005,-11.50975,0,0,0,1,1,1,0,3,infracollicular sulcus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_4,0.44575,-22.92625,-20.76375,0,0,0,1,1,1,0,4,PMJ,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_5,0.3135,-16.02675,-12.569500000000001,0,0,0,1,1,1,0,5,superior interpeduncular fossa,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_6,12.102500000000001,-27.875,-11.502500000000001,0,0,0,1,1,1,0,6,R superior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_7,-10.94475,-28.10075,-11.72175,0,0,0,1,1,1,0,7,L superior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_8,11.13075,-30.933750000000003,-20.5895,0,0,0,1,1,1,0,8,R inferior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_9,-10.21625,-31.3505,-21.23725,0,0,0,1,1,1,0,9,L inferior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_10,0.38425,-53.887499999999996,1.59275,0,0,0,1,1,1,0,10,culmen,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_11,0.452,-8.468,-14.756499999999999,0,0,0,1,1,1,0,11,intermammillary sulcus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_12,2.9812499999999997,-8.50625,-14.4335,0,0,0,1,1,1,0,12,R MB,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_13,-1.8632499999999999,-8.5285,-14.462,0,0,0,1,1,1,0,13,L MB,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_14,0.446,-32.061,-0.18025,0,0,0,1,1,1,0,14,pineal gland,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_15,15.64825,3.7824999999999998,24.4835,0,0,0,1,1,1,0,15,R LV at AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_16,-14.961,3.7824999999999998,24.49425,0,0,0,1,1,1,0,16,L LV at AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_17,20.096,-27.11825,25.02375,0,0,0,1,1,1,0,17,R LV at PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_18,-19.12425,-27.432,25.043499999999998,0,0,0,1,1,1,0,18,L LV at PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_19,0.27575,33.002,3.20125,0,0,0,1,1,1,0,19,genu of CC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_20,0.389,-38.60775,5.9295,0,0,0,1,1,1,0,20,splenium of CC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_21,35.3565,-5.468999999999999,-24.86,0,0,0,1,1,1,0,21,R AL temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_22,-33.27625,-8.8255,-23.63625,0,0,0,1,1,1,0,22,L AL temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_23,21.103749999999998,-10.334999999999999,-17.2245,0,0,0,1,1,1,0,23,R superior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_24,-18.887500000000003,-11.908750000000001,-16.926750000000002,0,0,0,1,1,1,0,24,L superior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_25,21.724999999999998,-4.606,-28.0105,0,0,0,1,1,1,0,25,R inferior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_26,-19.297,-5.2415,-25.759500000000003,0,0,0,1,1,1,0,26,L inferior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_27,14.356499999999999,-38.446,3.676,0,0,0,1,1,1,0,27,R indusium griseum origin,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_28,-14.013,-40.19825,2.217,0,0,0,1,1,1,0,28,L indusium griseum origin,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_29,21.1005,-78.59375,3.8802499999999993,0,0,0,1,1,1,0,29,R ventral occipital horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_30,-18.045499999999997,-82.6635,2.4375,0,0,0,1,1,1,0,30,L ventral occipital horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_31,12.953,17.591749999999998,-12.82825,0,0,0,1,1,1,0,31,R olfactory sulcal fundus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_32,-12.935749999999999,17.182249999999996,-13.61225,0,0,0,1,1,1,0,32,L olfactory sulcal fundus,vtkMRMLScalarVolumeNode1 diff --git a/autoafids/resources/regqc/tpl-MNI152NLin2009bSym_res-1_desc-groundtruth_afids.fcsv b/autoafids/resources/regqc/tpl-MNI152NLin2009bSym_res-1_desc-groundtruth_afids.fcsv new file mode 100644 index 0000000..3b9d48e --- /dev/null +++ b/autoafids/resources/regqc/tpl-MNI152NLin2009bSym_res-1_desc-groundtruth_afids.fcsv @@ -0,0 +1,35 @@ +# Markups fiducial file version = 4.6 +# CoordinateSystem = 0 +# columns = id,x,y,z,ow,ox,oy,oz,vis,sel,lock,label,desc,associatedNodeID +vtkMRMLMarkupsFiducialNode_1,-0.1198055,2.55212,-4.81723,0,0,0,1,1,1,0,1,AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_2,0.1409195,-25.124,-2.096035,0,0,0,1,1,1,0,2,PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_3,0.130151,-37.8742,-10.05817,0,0,0,1,1,1,0,3,infracollicular sulcus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_4,0.0267405,-23.35095,-21.87635,0,0,0,1,1,1,0,4,PMJ,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_5,-0.01609995,-14.39165,-10.7025,0,0,0,1,1,1,0,5,superior interpeduncular fossa,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_6,13.3752,-26.0718,-9.788495,0,0,0,1,1,1,0,6,R superior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_7,-13.05015,-26.38415,-9.760085,0,0,0,1,1,1,0,7,L superior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_8,11.1066,-30.21855,-21.3211,0,0,0,1,1,1,0,8,R inferior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_9,-10.8376,-30.35535,-21.02715,0,0,0,1,1,1,0,9,L inferior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_10,-0.0609305,-52.3597,2.02387,0,0,0,1,1,1,0,10,culmen,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_11,-0.175911,-8.20253,-15.39965,0,0,0,1,1,1,0,11,intermammillary sulcus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_12,2.10252,-8.12621,-14.502,0,0,0,1,1,1,0,12,R MB,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_13,-1.850385,-7.991405,-14.413,0,0,0,1,1,1,0,13,L MB,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_14,-0.183038,-31.2358,0.586406,0,0,0,1,1,1,0,14,pineal gland,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_15,15.1932,6.031435,25.2426,0,0,0,1,1,1,0,15,R LV at AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_16,-15.43225,6.228585,24.9267,0,0,0,1,1,1,0,16,L LV at AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_17,18.54945,-22.73095,28.598,0,0,0,1,1,1,0,17,R LV at PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_18,-18.6767,-22.7815,28.42485,0,0,0,1,1,1,0,18,L LV at PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_19,0.002431,33.43875,2.52457,0,0,0,1,1,1,0,19,genu of CC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_20,0.132994,-37.6245,6.401015,0,0,0,1,1,1,0,20,splenium of CC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_21,34.47875,-4.880005,-26.81425,0,0,0,1,1,1,0,21,R AL temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_22,-34.3701,-4.84792,-26.9405,0,0,0,1,1,1,0,22,L AL temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_23,17.93685,-10.93965,-17.9412,0,0,0,1,1,1,0,23,R superior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_24,-18.21465,-10.78475,-18.1403,0,0,0,1,1,1,0,24,L superior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_25,20.91065,-4.410115,-27.6511,0,0,0,1,1,1,0,25,R inferior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_26,-20.9084,-4.5878,-27.29665,0,0,0,1,1,1,0,26,L inferior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_27,13.69415,-43.103,5.85519,0,0,0,1,1,1,0,27,R indusium griseum origin,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_28,-13.33945,-43.3071,5.90314,0,0,0,1,1,1,0,28,L indusium griseum origin,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_29,19.8371,-81.1685,3.90738,0,0,0,1,1,1,0,29,R ventral occipital horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_30,-19.93535,-81.2627,4.248705,0,0,0,1,1,1,0,30,L ventral occipital horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_31,12.54255,17.7086,-12.74795,0,0,0,1,1,1,0,31,R olfactory sulcal fundus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_32,-12.8065,18.11375,-12.85975,0,0,0,1,1,1,0,32,L olfactory sulcal fundus,vtkMRMLScalarVolumeNode1 diff --git a/autoafids/resources/regqc/tpl-MNI152NLin2009cAsym_res-01_desc-groundtruth_afids.fcsv b/autoafids/resources/regqc/tpl-MNI152NLin2009cAsym_res-01_desc-groundtruth_afids.fcsv new file mode 100644 index 0000000..e533f27 --- /dev/null +++ b/autoafids/resources/regqc/tpl-MNI152NLin2009cAsym_res-01_desc-groundtruth_afids.fcsv @@ -0,0 +1,35 @@ +# Markups fiducial file version = 4.6 +# CoordinateSystem = 0 +# columns = id,x,y,z,ow,ox,oy,oz,vis,sel,lock,label,desc,associatedNodeID +vtkMRMLMarkupsFiducialNode_1,-0.204861407692308,2.72288076923077,-4.88105282051282,0,0,0,1,1,1,0,1,AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_2,-0.00726026948717949,-25.0450538461538,-2.21068230769231,0,0,0,1,1,1,0,2,PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_3,0.025998141025641,-37.691917948718,-11.0111497435897,0,0,0,1,1,1,0,3,infracollicular sulcus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_4,-0.0892198512820513,-23.1885743589744,-21.5288358974359,0,0,0,1,1,1,0,4,PMJ,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_5,-0.05649251,-13.7676564102564,-10.950028974359,0,0,0,1,1,1,0,5,superior interpeduncular fossa,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_6,13.3113025641026,-25.951058974359,-9.74885435897436,0,0,0,1,1,1,0,6,R superior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_7,-13.607458974359,-26.4451,-9.7076082051282,0,0,0,1,1,1,0,7,L superior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_8,10.8321820512821,-30.8104076923077,-21.5949358974359,0,0,0,1,1,1,0,8,R inferior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_9,-10.9824102564103,-30.8778025641026,-21.4372025641026,0,0,0,1,1,1,0,9,L inferior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_10,0.0100564897435897,-52.5094615384615,2.14842435897436,0,0,0,1,1,1,0,10,culmen,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_11,-0.0743417574102564,-8.36030051282051,-15.9354820512821,0,0,0,1,1,1,0,11,intermammillary sulcus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_12,2.02761256410256,-8.15453153846154,-15.0245538461538,0,0,0,1,1,1,0,12,R MB,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_13,-2.19342487179487,-8.21593282051282,-15.0426743589744,0,0,0,1,1,1,0,13,L MB,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_14,0.00940744421052632,-31.5985789473684,0.568596455263158,0,0,0,1,1,1,0,14,pineal gland,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_15,15.1850526315789,5.61940868421053,24.9488552631579,0,0,0,1,1,1,0,15,R LV at AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_16,-15.7984342105263,5.47038342105263,25.0905473684211,0,0,0,1,1,1,0,16,L LV at AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_17,18.7231289473684,-22.0626210526316,28.0333394736842,0,0,0,1,1,1,0,17,R LV at PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_18,-18.4848157894737,-22.2426736842105,28.1745157894737,0,0,0,1,1,1,0,18,L LV at PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_19,-0.111086676315789,33.3615236842105,2.12355523157895,0,0,0,1,1,1,0,19,genu of CC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_20,0.116840065,-37.6019447368421,6.49650894736842,0,0,0,1,1,1,0,20,splenium of CC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_21,34.0034921052632,-4.056905,-27.3505,0,0,0,1,1,1,0,21,R AL temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_22,-34.8327763157895,-6.646575,-25.3468578947368,0,0,0,1,1,1,0,22,L AL temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_23,17.4263131578947,-10.0524047368421,-18.2650921052632,0,0,0,1,1,1,0,23,R superior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_24,-18.1468184210526,-10.9803721052632,-18.3750131578947,0,0,0,1,1,1,0,24,L superior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_25,20.4641447368421,-4.03479921052632,-28.0214973684211,0,0,0,1,1,1,0,25,R inferior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_26,-21.3443842105263,-5.12460973684211,-27.9912052631579,0,0,0,1,1,1,0,26,L inferior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_27,14.6365184210526,-40.7174131578947,4.71004973684211,0,0,0,1,1,1,0,27,R indusium griseum origin,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_28,-14.8907842105263,-43.0901605263158,4.23491921052632,0,0,0,1,1,1,0,28,L indusium griseum origin,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_29,20.5600675675676,-79.8774891891892,4.60286108108108,0,0,0,1,1,1,0,29,R ventral occipital horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_30,-18.9085052631579,-82.82955,3.54751710526316,0,0,0,1,1,1,0,30,L ventral occipital horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_31,11.8931421052632,18.5102315789474,-12.3773210526316,0,0,0,1,1,1,0,31,R olfactory sulcal fundus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_32,-13.3650815789474,17.0294973684211,-13.0638105263158,0,0,0,1,1,1,0,32,L olfactory sulcal fundus,vtkMRMLScalarVolumeNode1 \ No newline at end of file diff --git a/autoafids/resources/regqc/tpl-MNI152NLin2009cSym_res-1_desc-groundtruth_afids.fcsv b/autoafids/resources/regqc/tpl-MNI152NLin2009cSym_res-1_desc-groundtruth_afids.fcsv new file mode 100644 index 0000000..a7eff1f --- /dev/null +++ b/autoafids/resources/regqc/tpl-MNI152NLin2009cSym_res-1_desc-groundtruth_afids.fcsv @@ -0,0 +1,35 @@ +# Markups fiducial file version = 4.6 +# CoordinateSystem = 0 +# columns = id,x,y,z,ow,ox,oy,oz,vis,sel,lock,label,desc,associatedNodeID +vtkMRMLMarkupsFiducialNode_1,-0.06725,2.8625,-4.833,0,0,0,1,1,1,0,1,AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_2,-0.08449999999999999,-25.1645,-1.935,0,0,0,1,1,1,0,2,PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_3,-0.036750000000000005,-37.904999999999994,-12.25175,0,0,0,1,1,1,0,3,infracollicular sulcus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_4,0.092,-23.63375,-21.429,0,0,0,1,1,1,0,4,PMJ,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_5,-0.01375,-13.621,-11.32725,0,0,0,1,1,1,0,5,superior interpeduncular fossa,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_6,13.12325,-26.3525,-9.777000000000001,0,0,0,1,1,1,0,6,R superior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_7,-13.6855,-26.3955,-9.554,0,0,0,1,1,1,0,7,L superior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_8,11.1195,-30.851,-21.99175,0,0,0,1,1,1,0,8,R inferior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_9,-11.11475,-30.957749999999997,-22.075,0,0,0,1,1,1,0,9,L inferior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_10,-0.2355,-52.72925,1.9145,0,0,0,1,1,1,0,10,culmen,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_11,-0.013999999999999995,-8.295,-16.229,0,0,0,1,1,1,0,11,intermammillary sulcus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_12,2.232,-8.0815,-14.92775,0,0,0,1,1,1,0,12,R MB,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_13,-2.2039999999999997,-8.10775,-14.858,0,0,0,1,1,1,0,13,L MB,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_14,-0.05125,-31.646250000000002,0.44525000000000003,0,0,0,1,1,1,0,14,pineal gland,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_15,15.315000000000001,5.22375,24.67375,0,0,0,1,1,1,0,15,R LV at AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_16,-15.31825,5.2265,24.732,0,0,0,1,1,1,0,16,L LV at AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_17,18.7605,-22.9955,27.704250000000002,0,0,0,1,1,1,0,17,R LV at PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_18,-18.75525,-22.926,27.444999999999997,0,0,0,1,1,1,0,18,L LV at PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_19,0.12949999999999998,33.259,1.9165,0,0,0,1,1,1,0,19,genu of CC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_20,-0.18475,-37.6545,6.0825,0,0,0,1,1,1,0,20,splenium of CC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_21,34.238249999999994,-5.7415,-26.74375,0,0,0,1,1,1,0,21,R AL temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_22,-34.24725,-6.14975,-26.351999999999997,0,0,0,1,1,1,0,22,L AL temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_23,18.3745,-10.984,-17.58725,0,0,0,1,1,1,0,23,R superior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_24,-18.55675,-11.1765,-17.7785,0,0,0,1,1,1,0,24,L superior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_25,21.77375,-4.7692499999999995,-29.44175,0,0,0,1,1,1,0,25,R inferior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_26,-22.153000000000002,-4.979500000000001,-29.33125,0,0,0,1,1,1,0,26,L inferior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_27,14.4425,-42.2705,4.43325,0,0,0,1,1,1,0,27,R indusium griseum origin,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_28,-14.478,-42.569750000000006,4.25425,0,0,0,1,1,1,0,28,L indusium griseum origin,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_29,20.255000000000003,-80.53275000000001,4.89525,0,0,0,1,1,1,0,29,R ventral occipital horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_30,-19.86775,-81.0495,4.46075,0,0,0,1,1,1,0,30,L ventral occipital horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_31,12.474250000000001,16.982499999999998,-13.2695,0,0,0,1,1,1,0,31,R olfactory sulcal fundus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_32,-12.88525,17.2745,-13.21375,0,0,0,1,1,1,0,32,L olfactory sulcal fundus,vtkMRMLScalarVolumeNode1 diff --git a/autoafids/resources/regqc/tpl-MNI152NLin6Asym_res-01_desc-groundtruth_afids.fcsv b/autoafids/resources/regqc/tpl-MNI152NLin6Asym_res-01_desc-groundtruth_afids.fcsv new file mode 100644 index 0000000..bcc0a43 --- /dev/null +++ b/autoafids/resources/regqc/tpl-MNI152NLin6Asym_res-01_desc-groundtruth_afids.fcsv @@ -0,0 +1,35 @@ +# Markups fiducial file version = 4.6 +# CoordinateSystem = 0 +# columns = id,x,y,z,ow,ox,oy,oz,vis,sel,lock,label,desc,associatedNodeID +vtkMRMLMarkupsFiducialNode_1,0.402,2.5665,-5.312750000000001,0,0,0,1,1,1,0,1,AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_2,0.52625,-25.466749999999998,-2.261,0,0,0,1,1,1,0,2,PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_3,0.38675,-37.50125,-11.652999999999999,0,0,0,1,1,1,0,3,infracollicular sulcus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_4,0.5599999999999999,-23.65125,-20.8645,0,0,0,1,1,1,0,4,PMJ,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_5,0.4795,-14.091,-11.051000000000002,0,0,0,1,1,1,0,5,superior interpeduncular fossa,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_6,12.589,-27.009999999999998,-10.4315,0,0,0,1,1,1,0,6,R superior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_7,-11.97875,-27.383499999999998,-10.471,0,0,0,1,1,1,0,7,L superior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_8,11.096749999999998,-31.156,-21.80775,0,0,0,1,1,1,0,8,R inferior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_9,-10.125499999999999,-31.092000000000002,-21.546,0,0,0,1,1,1,0,9,L inferior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_10,0.25975000000000004,-52.1315,1.31175,0,0,0,1,1,1,0,10,culmen,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_11,0.48000000000000004,-8.59625,-15.615749999999998,0,0,0,1,1,1,0,11,intermammillary sulcus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_12,2.6864999999999997,-8.45,-14.895,0,0,0,1,1,1,0,12,R MB,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_13,-1.8592500000000003,-8.43425,-14.847999999999999,0,0,0,1,1,1,0,13,L MB,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_14,0.53725,-31.66475,0.3555,0,0,0,1,1,1,0,14,pineal gland,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_15,15.08925,5.01025,23.69375,0,0,0,1,1,1,0,15,R LV at AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_16,-14.49275,5.0352500000000004,23.57325,0,0,0,1,1,1,0,16,L LV at AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_17,19.29225,-23.075,26.0725,0,0,0,1,1,1,0,17,R LV at PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_18,-18.10325,-23.107000000000003,26.18325,0,0,0,1,1,1,0,18,L LV at PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_19,0.5052500000000001,32.68625,3.147,0,0,0,1,1,1,0,19,genu of CC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_20,0.62675,-37.77625,5.970000000000001,0,0,0,1,1,1,0,20,splenium of CC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_21,35.108000000000004,-5.78625,-25.394,0,0,0,1,1,1,0,21,R AL temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_22,-32.951499999999996,-7.51,-24.64675,0,0,0,1,1,1,0,22,L AL temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_23,18.68825,-10.3385,-17.303,0,0,0,1,1,1,0,23,R superior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_24,-17.9405,-11.03625,-17.4545,0,0,0,1,1,1,0,24,L superior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_25,21.373250000000002,-4.13075,-26.94975,0,0,0,1,1,1,0,25,R inferior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_26,-21.49075,-4.686999999999999,-27.414,0,0,0,1,1,1,0,26,L inferior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_27,14.418750000000001,-41.43375,4.6135,0,0,0,1,1,1,0,27,R indusium griseum origin,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_28,-13.224499999999999,-42.499750000000006,4.051,0,0,0,1,1,1,0,28,L indusium griseum origin,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_29,21.46,-78.0805,3.601,0,0,0,1,1,1,0,29,R ventral occipital horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_30,-18.810250000000003,-80.85549999999999,3.2502500000000003,0,0,0,1,1,1,0,30,L ventral occipital horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_31,12.72325,17.876,-12.12775,0,0,0,1,1,1,0,31,R olfactory sulcal fundus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_32,-12.652000000000001,17.16875,-12.67675,0,0,0,1,1,1,0,32,L olfactory sulcal fundus,vtkMRMLScalarVolumeNode1 diff --git a/autoafids/resources/regqc/tpl-MNI152NLin6Sym_res-01_desc-groundtruth_afids.fcsv b/autoafids/resources/regqc/tpl-MNI152NLin6Sym_res-01_desc-groundtruth_afids.fcsv new file mode 100644 index 0000000..8ff1d4a --- /dev/null +++ b/autoafids/resources/regqc/tpl-MNI152NLin6Sym_res-01_desc-groundtruth_afids.fcsv @@ -0,0 +1,35 @@ +# Markups fiducial file version = 4.6 +# CoordinateSystem = 0 +# columns = id,x,y,z,ow,ox,oy,oz,vis,sel,lock,label,desc,associatedNodeID +vtkMRMLMarkupsFiducialNode_1,-0.002749999999999999,2.5065,-4.1025,0,0,0,1,1,1,0,1,AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_2,-0.013499999999999998,-25.246000000000002,-2.14525,0,0,0,1,1,1,0,2,PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_3,-0.043250000000000004,-37.381,-11.91,0,0,0,1,1,1,0,3,infracollicular sulcus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_4,-0.045,-23.987750000000002,-21.08325,0,0,0,1,1,1,0,4,PMJ,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_5,-0.018250000000000002,-13.46425,-10.9435,0,0,0,1,1,1,0,5,superior interpeduncular fossa,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_6,12.65625,-26.993000000000002,-9.847750000000001,0,0,0,1,1,1,0,6,R superior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_7,-12.9745,-26.796750000000003,-9.88975,0,0,0,1,1,1,0,7,L superior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_8,10.881499999999999,-31.073499999999996,-21.94925,0,0,0,1,1,1,0,8,R inferior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_9,-10.83325,-31.1095,-21.926000000000002,0,0,0,1,1,1,0,9,L inferior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_10,0.0055,-53.562999999999995,2.02025,0,0,0,1,1,1,0,10,culmen,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_11,-0.06275,-8.10725,-15.47,0,0,0,1,1,1,0,11,intermammillary sulcus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_12,2.23475,-8.14125,-14.59975,0,0,0,1,1,1,0,12,R MB,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_13,-2.4762500000000003,-8.14725,-14.62125,0,0,0,1,1,1,0,13,L MB,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_14,-0.06025,-31.80925,1.04025,0,0,0,1,1,1,0,14,pineal gland,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_15,15.232,4.07225,24.734,0,0,0,1,1,1,0,15,R LV at AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_16,-15.204749999999999,4.044,24.799,0,0,0,1,1,1,0,16,L LV at AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_17,18.6545,-23.72525,26.94025,0,0,0,1,1,1,0,17,R LV at PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_18,-18.4735,-23.73575,27.1125,0,0,0,1,1,1,0,18,L LV at PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_19,-0.0485,33.619,2.9905,0,0,0,1,1,1,0,19,genu of CC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_20,-0.04575,-37.903,6.6392500000000005,0,0,0,1,1,1,0,20,splenium of CC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_21,34.1785,-6.751,-25.7565,0,0,0,1,1,1,0,21,R AL temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_22,-34.300250000000005,-6.83225,-25.673750000000002,0,0,0,1,1,1,0,22,L AL temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_23,19.13525,-10.780249999999999,-16.93425,0,0,0,1,1,1,0,23,R superior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_24,-19.17075,-10.82125,-16.899250000000002,0,0,0,1,1,1,0,24,L superior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_25,21.55525,-5.1635,-27.14675,0,0,0,1,1,1,0,25,R inferior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_26,-21.43575,-4.77325,-27.136000000000003,0,0,0,1,1,1,0,26,L inferior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_27,13.57075,-42.54575,5.10075,0,0,0,1,1,1,0,27,R indusium griseum origin,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_28,-14.163999999999998,-42.568250000000006,5.109,0,0,0,1,1,1,0,28,L indusium griseum origin,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_29,20.907000000000004,-78.422,5.17825,0,0,0,1,1,1,0,29,R ventral occipital horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_30,-20.80825,-78.37125,5.078250000000001,0,0,0,1,1,1,0,30,L ventral occipital horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_31,12.6275,18.14575,-12.206,0,0,0,1,1,1,0,31,R olfactory sulcal fundus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_32,-12.64125,17.96375,-12.3105,0,0,0,1,1,1,0,32,L olfactory sulcal fundus,vtkMRMLScalarVolumeNode1 diff --git a/autoafids/resources/regqc/tpl-MNI305_desc-groundtruth_afids.fcsv b/autoafids/resources/regqc/tpl-MNI305_desc-groundtruth_afids.fcsv new file mode 100644 index 0000000..2dcaa26 --- /dev/null +++ b/autoafids/resources/regqc/tpl-MNI305_desc-groundtruth_afids.fcsv @@ -0,0 +1,35 @@ +# Markups fiducial file version = 4.10 +# CoordinateSystem = 0 +# columns = id,x,y,z,ow,ox,oy,oz,vis,sel,lock,label,desc,associatedNodeID +vtkMRMLMarkupsFiducialNode_1,0.38425000000000004,1.63575,-4.784,0,0,0,1,1,1,0,1,AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_2,0.2745,-29.36975,-4.03825,0,0,0,1,1,1,0,2,PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_3,0.20650000000000004,-38.08225,-12.4535,0,0,0,1,1,1,0,3,infracollicular sulcus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_4,0.62325,-23.0955,-20.8555,0,0,0,1,1,1,0,4,PMJ,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_5,0.31675000000000003,-15.37825,-10.81575,0,0,0,1,1,1,0,5,superior interpeduncular fossa,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_6,13.186250000000001,-28.18875,-11.696,0,0,0,1,1,1,0,6,R superior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_7,-11.645,-28.647750000000002,-11.3545,0,0,0,1,1,1,0,7,L superior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_8,11.25525,-32.765,-22.72525,0,0,0,1,1,1,0,8,R inferior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_9,-9.597,-33.005250000000004,-23.125,0,0,0,1,1,1,0,9,L inferior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_10,-0.12175000000000001,-51.568,0.9937499999999998,0,0,0,1,1,1,0,10,culmen,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_11,0.45000000000000007,-9.932500000000001,-15.17975,0,0,0,1,1,1,0,11,intermammillary sulcus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_12,2.73975,-9.79425,-15.22175,0,0,0,1,1,1,0,12,R MB,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_13,-2.19525,-9.47325,-15.28475,0,0,0,1,1,1,0,13,L MB,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_14,0.43125,-35.63275,-0.52875,0,0,0,1,1,1,0,14,pineal gland,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_15,14.181000000000001,2.50225,23.698500000000003,0,0,0,1,1,1,0,15,R LV at AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_16,-14.02875,2.58875,23.88675,0,0,0,1,1,1,0,16,L LV at AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_17,19.826499999999996,-28.7645,24.676,0,0,0,1,1,1,0,17,R LV at PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_18,-18.39825,-28.641,24.98875,0,0,0,1,1,1,0,18,L LV at PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_19,0.03925,31.401500000000002,5.4685,0,0,0,1,1,1,0,19,genu of CC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_20,0.525,-39.41825,5.409000000000001,0,0,0,1,1,1,0,20,splenium of CC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_21,36.10575,-10.73675,-23.56175,0,0,0,1,1,1,0,21,R AL temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_22,-33.93725,-10.72275,-23.552,0,0,0,1,1,1,0,22,L AL temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_23,22.42975,-10.911000000000001,-18.08475,0,0,0,1,1,1,0,23,R superior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_24,-22.23925,-12.456750000000001,-18.784,0,0,0,1,1,1,0,24,L superior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_25,28.859250000000003,-8.495,-25.996499999999997,0,0,0,1,1,1,0,25,R inferior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_26,-28.120250000000002,-9.931249999999999,-24.659750000000003,0,0,0,1,1,1,0,26,L inferior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_27,16.698,-40.57575,0.10724999999999996,0,0,0,1,1,1,0,27,R indusium griseum origin,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_28,-15.8635,-41.180499999999995,-1.15375,0,0,0,1,1,1,0,28,L indusium griseum origin,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_29,20.802,-78.6385,3.22525,0,0,0,1,1,1,0,29,R ventral occipital horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_30,-19.452749999999998,-80.11975,2.7747499999999996,0,0,0,1,1,1,0,30,L ventral occipital horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_31,12.02425,14.88375,-12.5785,0,0,0,1,1,1,0,31,R olfactory sulcal fundus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_32,-13.2365,14.7675,-12.539750000000002,0,0,0,1,1,1,0,32,L olfactory sulcal fundus,vtkMRMLScalarVolumeNode1 diff --git a/autoafids/resources/regqc/tpl-MNIColin27_desc-groundtruth_afids.fcsv b/autoafids/resources/regqc/tpl-MNIColin27_desc-groundtruth_afids.fcsv new file mode 100644 index 0000000..df87509 --- /dev/null +++ b/autoafids/resources/regqc/tpl-MNIColin27_desc-groundtruth_afids.fcsv @@ -0,0 +1,35 @@ +# Markups fiducial file version = 4.6 +# CoordinateSystem = 0 +# columns = id,x,y,z,ow,ox,oy,oz,vis,sel,lock,label,desc,associatedNodeID +vtkMRMLMarkupsFiducialNode_1,0.547527528125,4.007721875,-5.85731125,0,0,0,1,1,1,0,1,AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_2,0.31921995625,-23.23456875,-3.72751125,0,0,0,1,1,1,0,2,PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_3,0.561583,-34.45210625,-12.8559625,0,0,0,1,1,1,0,3,infracollicular sulcus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_4,0.6079103125,-19.538690625,-21.89735,0,0,0,1,1,1,0,4,PMJ,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_5,0.4886344625,-11.1283246875,-11.5526875,0,0,0,1,1,1,0,5,superior interpeduncular fossa,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_6,14.08818125,-23.66650625,-11.0875246875,0,0,0,1,1,1,0,6,R superior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_7,-12.717509375,-24.440084375,-10.993478125,0,0,0,1,1,1,0,7,L superior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_8,12.1797375,-27.100284375,-22.624340625,0,0,0,1,1,1,0,8,R inferior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_9,-11.1640475,-27.94559375,-22.2905875,0,0,0,1,1,1,0,9,L inferior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_10,0.665826690625,-52.2055875,4.512423125,0,0,0,1,1,1,0,10,culmen,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_11,0.9424654375,-5.88735375,-16.407625,0,0,0,1,1,1,0,11,intermammillary sulcus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_12,3.49182,-5.5838253125,-15.65260625,0,0,0,1,1,1,0,12,R MB,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_13,-1.44826446875,-5.720745,-15.537396875,0,0,0,1,1,1,0,13,L MB,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_14,0.1166158878125,-28.649928125,-0.33771765625,0,0,0,1,1,1,0,14,pineal gland,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_15,15.011765625,6.1724759375,22.566596875,0,0,0,1,1,1,0,15,R LV at AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_16,-15.90715,6.4662878125,24.069828125,0,0,0,1,1,1,0,16,L LV at AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_17,17.972071875,-20.823715625,30.46349375,0,0,0,1,1,1,0,17,R LV at PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_18,-18.779996875,-20.611896875,30.416096875,0,0,0,1,1,1,0,18,L LV at PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_19,0.70195960625,35.429990625,1.760076875,0,0,0,1,1,1,0,19,genu of CC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_20,0.108530173125,-32.37980625,10.1816840625,0,0,0,1,1,1,0,20,splenium of CC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_21,36.0364625,-1.0992918125,-29.31504375,0,0,0,1,1,1,0,21,R AL temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_22,-33.24596875,-2.996340625,-27.734278125,0,0,0,1,1,1,0,22,L AL temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_23,19.775496875,-7.527871875,-17.524228125,0,0,0,1,1,1,0,23,R superior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_24,-19.331309375,-8.076225625,-18.7995,0,0,0,1,1,1,0,24,L superior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_25,23.89074375,-1.8913829375,-27.64306875,0,0,0,1,1,1,0,25,R inferior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_26,-20.382253125,-3.704695625,-28.9971,0,0,0,1,1,1,0,26,L inferior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_27,13.6410125,-38.46600625,8.433885625,0,0,0,1,1,1,0,27,R indusium griseum origin,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_28,-14.791465625,-40.95736875,8.190668125,0,0,0,1,1,1,0,28,L indusium griseum origin,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_29,27.4747875,-63.9652125,2.0995312825,0,0,0,1,1,1,0,29,R ventral occipital horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_30,-23.890625,-69.7058125,2.33407990625,0,0,0,1,1,1,0,30,L ventral occipital horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_31,13.3516125,22.4382375,-11.7592125,0,0,0,1,1,1,0,31,R olfactory sulcal fundus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_32,-13.322734375,21.3597625,-12.51313125,0,0,0,1,1,1,0,32,L olfactory sulcal fundus,vtkMRMLScalarVolumeNode1 diff --git a/autoafids/resources/regqc/tpl-OASIS30ANTs_res-01_desc-groundtruth_afids.fcsv b/autoafids/resources/regqc/tpl-OASIS30ANTs_res-01_desc-groundtruth_afids.fcsv new file mode 100644 index 0000000..8ccb65d --- /dev/null +++ b/autoafids/resources/regqc/tpl-OASIS30ANTs_res-01_desc-groundtruth_afids.fcsv @@ -0,0 +1,35 @@ +# Markups fiducial file version = 4.6 +# CoordinateSystem = 0 +# columns = id,x,y,z,ow,ox,oy,oz,vis,sel,lock,label,desc,associatedNodeID +vtkMRMLMarkupsFiducialNode_1,-109.9665,-134.07325,-129.8755,0,0,0,1,1,1,0,1,AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_2,-110.03925000000001,-160.93525,-129.458,0,0,0,1,1,1,0,2,PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_3,-109.98349999999999,-172.01975000000002,-140.20274999999998,0,0,0,1,1,1,0,3,infracollicular sulcus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_4,-110.0005,-158.62125,-146.06799999999998,0,0,0,1,1,1,0,4,PMJ,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_5,-110.00875,-149.2665,-136.6645,0,0,0,1,1,1,0,5,superior interpeduncular fossa,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_6,-98.47075,-161.65225,-136.55675,0,0,0,1,1,1,0,6,R superior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_7,-121.717,-161.79000000000002,-136.67625,0,0,0,1,1,1,0,7,L superior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_8,-100.04124999999999,-164.08325,-146.678,0,0,0,1,1,1,0,8,R inferior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_9,-119.78,-164.05975,-146.71425,0,0,0,1,1,1,0,9,L inferior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_10,-110.39375,-187.82275,-129.085,0,0,0,1,1,1,0,10,culmen,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_11,-109.80949999999999,-143.49375,-140.37925,0,0,0,1,1,1,0,11,intermammillary sulcus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_12,-107.64874999999999,-143.5275,-139.6105,0,0,0,1,1,1,0,12,R MB,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_13,-111.99875,-143.52799999999996,-139.65800000000002,0,0,0,1,1,1,0,13,L MB,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_14,-110.194,-166.5135,-127.24999999999999,0,0,0,1,1,1,0,14,pineal gland,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_15,-95.38300000000001,-133.7965,-104.49575,0,0,0,1,1,1,0,15,R LV at AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_16,-124.41499999999999,-133.75725,-104.61949999999999,0,0,0,1,1,1,0,16,L LV at AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_17,-92.27824999999999,-160.54449999999997,-104.01150000000001,0,0,0,1,1,1,0,17,R LV at PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_18,-127.8655,-160.422,-104.15650000000001,0,0,0,1,1,1,0,18,L LV at PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_19,-109.97075000000001,-105.47575,-120.11574999999999,0,0,0,1,1,1,0,19,genu of CC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_20,-109.95825,-172.67475000000002,-123.883,0,0,0,1,1,1,0,20,splenium of CC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_21,-78.09025,-139.83325,-149.31799999999998,0,0,0,1,1,1,0,21,R AL temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_22,-141.27375,-140.64800000000002,-148.89875,0,0,0,1,1,1,0,22,L AL temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_23,-91.79324999999999,-145.865,-141.126,0,0,0,1,1,1,0,23,R superior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_24,-128.36450000000002,-146.24775,-141.16375,0,0,0,1,1,1,0,24,L superior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_25,-89.50150000000001,-138.7625,-150.98025,0,0,0,1,1,1,0,25,R inferior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_26,-129.80775,-139.208,-151.2225,0,0,0,1,1,1,0,26,L inferior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_27,-97.061,-176.29500000000002,-125.12225,0,0,0,1,1,1,0,27,R indusium griseum origin,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_28,-124.50725,-177.8245,-126.14250000000001,0,0,0,1,1,1,0,28,L indusium griseum origin,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_29,-91.17325000000001,-211.98725,-127.92825,0,0,0,1,1,1,0,29,R ventral occipital horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_30,-128.1335,-214.29475,-128.61875,0,0,0,1,1,1,0,30,L ventral occipital horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_31,-98.2075,-118.40350000000001,-135.2765,0,0,0,1,1,1,0,31,R olfactory sulcal fundus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_32,-121.63900000000001,-118.67850000000001,-135.93175,0,0,0,1,1,1,0,32,L olfactory sulcal fundus,vtkMRMLScalarVolumeNode1 diff --git a/autoafids/resources/regqc/tpl-fsaverage_res-01_den-41k_desc-groundtruth_afids.fcsv b/autoafids/resources/regqc/tpl-fsaverage_res-01_den-41k_desc-groundtruth_afids.fcsv new file mode 100644 index 0000000..a54f1e9 --- /dev/null +++ b/autoafids/resources/regqc/tpl-fsaverage_res-01_den-41k_desc-groundtruth_afids.fcsv @@ -0,0 +1,35 @@ +# Markups fiducial file version = 4.6 +# CoordinateSystem = 0 +# columns = id,x,y,z,ow,ox,oy,oz,vis,sel,lock,label,desc,associatedNodeID +vtkMRMLMarkupsFiducialNode_1,0.658,1.6740000000000002,-6.0504999999999995,0,0,0,1,1,1,0,1,AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_2,0.48325,-26.781,-3.0147500000000003,0,0,0,1,1,1,0,2,PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_3,0.49274999999999997,-38.945750000000004,-11.130999999999998,0,0,0,1,1,1,0,3,infracollicular sulcus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_4,0.68575,-24.37825,-20.09825,0,0,0,1,1,1,0,4,PMJ,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_5,0.70275,-15.460249999999998,-10.07575,0,0,0,1,1,1,0,5,superior interpeduncular fossa,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_6,13.05875,-28.90575,-9.8035,0,0,0,1,1,1,0,6,R superior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_7,-12.185749999999999,-28.46,-10.2395,0,0,0,1,1,1,0,7,L superior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_8,12.1425,-32.0705,-21.53,0,0,0,1,1,1,0,8,R inferior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_9,-10.5765,-31.889499999999998,-22.0805,0,0,0,1,1,1,0,9,L inferior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_10,0.4139999999999999,-53.025499999999994,-1.3547500000000001,0,0,0,1,1,1,0,10,culmen,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_11,0.618,-10.39525,-13.24025,0,0,0,1,1,1,0,11,intermammillary sulcus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_12,3.18625,-10.0345,-13.102,0,0,0,1,1,1,0,12,R MB,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_13,-1.94475,-10.212,-13.86825,0,0,0,1,1,1,0,13,L MB,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_14,0.48974999999999996,-32.17725,0.54075,0,0,0,1,1,1,0,14,pineal gland,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_15,18.40075,2.3815,27.63075,0,0,0,1,1,1,0,15,R LV at AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_16,-17.39975,3.1940000000000004,27.208750000000002,0,0,0,1,1,1,0,16,L LV at AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_17,20.4895,-26.69025,27.59325,0,0,0,1,1,1,0,17,R LV at PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_18,-19.8915,-25.717,27.66325,0,0,0,1,1,1,0,18,L LV at PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_19,0.5635,34.322500000000005,2.86925,0,0,0,1,1,1,0,19,genu of CC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_20,0.37174999999999997,-39.53175,4.87925,0,0,0,1,1,1,0,20,splenium of CC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_21,35.148250000000004,-7.5575,-26.124,0,0,0,1,1,1,0,21,R AL temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_22,-33.030249999999995,-7.855750000000001,-26.443250000000003,0,0,0,1,1,1,0,22,L AL temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_23,23.073999999999998,-11.91725,-16.86825,0,0,0,1,1,1,0,23,R superior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_24,-22.32175,-12.18125,-16.9795,0,0,0,1,1,1,0,24,L superior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_25,24.83325,-6.15925,-26.667499999999997,0,0,0,1,1,1,0,25,R inferior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_26,-23.9145,-5.99275,-26.131,0,0,0,1,1,1,0,26,L inferior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_27,14.036500000000002,-40.566,2.32275,0,0,0,1,1,1,0,27,R indusium griseum origin,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_28,-13.159,-40.59325,1.8685,0,0,0,1,1,1,0,28,L indusium griseum origin,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_29,20.364250000000002,-81.697,3.2545,0,0,0,1,1,1,0,29,R ventral occipital horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_30,-19.13375,-82.56475,2.3285,0,0,0,1,1,1,0,30,L ventral occipital horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_31,13.18975,16.3695,-13.29825,0,0,0,1,1,1,0,31,R olfactory sulcal fundus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_32,-12.841249999999999,15.933,-14.65,0,0,0,1,1,1,0,32,L olfactory sulcal fundus,vtkMRMLScalarVolumeNode1 diff --git a/autoafids/resources/tpl-MNI152NLin2009bAsym_res-01_T1w.nii.gz b/autoafids/resources/tpl-MNI152NLin2009bAsym_res-01_T1w.nii.gz new file mode 100644 index 0000000..94e8857 Binary files /dev/null and b/autoafids/resources/tpl-MNI152NLin2009bAsym_res-01_T1w.nii.gz differ diff --git a/autoafids/resources/tpl-MNI152NLin2009bAsym_res-01_desc-groundtruth_afids.fcsv b/autoafids/resources/tpl-MNI152NLin2009bAsym_res-01_desc-groundtruth_afids.fcsv new file mode 100644 index 0000000..7235d4a --- /dev/null +++ b/autoafids/resources/tpl-MNI152NLin2009bAsym_res-01_desc-groundtruth_afids.fcsv @@ -0,0 +1,35 @@ +# Markups fiducial file version = 4.6 +# CoordinateSystem = 0 +# columns = id,x,y,z,ow,ox,oy,oz,vis,sel,lock,label,desc,associatedNodeID +vtkMRMLMarkupsFiducialNode_1,-0.204861407692308,2.72288076923077,-4.88105282051282,0,0,0,1,1,1,0,1,AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_2,-0.00726026948717949,-25.0450538461538,-2.21068230769231,0,0,0,1,1,1,0,2,PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_3,0.025998141025641,-37.691917948718,-11.0111497435897,0,0,0,1,1,1,0,3,infracollicular sulcus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_4,-0.0892198512820513,-23.1885743589744,-21.5288358974359,0,0,0,1,1,1,0,4,PMJ,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_5,-0.05649251,-13.7676564102564,-10.950028974359,0,0,0,1,1,1,0,5,superior interpeduncular fossa,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_6,13.3113025641026,-25.951058974359,-9.74885435897436,0,0,0,1,1,1,0,6,R superior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_7,-13.607458974359,-26.4451,-9.7076082051282,0,0,0,1,1,1,0,7,L superior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_8,10.8321820512821,-30.8104076923077,-21.5949358974359,0,0,0,1,1,1,0,8,R inferior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_9,-10.9824102564103,-30.8778025641026,-21.4372025641026,0,0,0,1,1,1,0,9,L inferior LMS,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_10,0.0100564897435897,-52.5094615384615,2.14842435897436,0,0,0,1,1,1,0,10,culmen,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_11,-0.0743417574102564,-8.36030051282051,-15.9354820512821,0,0,0,1,1,1,0,11,intermammillary sulcus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_12,2.02761256410256,-8.15453153846154,-15.0245538461538,0,0,0,1,1,1,0,12,R MB,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_13,-2.19342487179487,-8.21593282051282,-15.0426743589744,0,0,0,1,1,1,0,13,L MB,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_14,0.00940744421052632,-31.5985789473684,0.568596455263158,0,0,0,1,1,1,0,14,pineal gland,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_15,15.1850526315789,5.61940868421053,24.9488552631579,0,0,0,1,1,1,0,15,R LV at AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_16,-15.7984342105263,5.47038342105263,25.0905473684211,0,0,0,1,1,1,0,16,L LV at AC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_17,18.7231289473684,-22.0626210526316,28.0333394736842,0,0,0,1,1,1,0,17,R LV at PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_18,-18.4848157894737,-22.2426736842105,28.1745157894737,0,0,0,1,1,1,0,18,L LV at PC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_19,-0.111086676315789,33.3615236842105,2.12355523157895,0,0,0,1,1,1,0,19,Genu of CC,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_20,0.116840065,-37.6019447368421,6.49650894736842,0,0,0,1,1,1,0,20,Splenium,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_21,34.0034921052632,-4.056905,-27.3505,0,0,0,1,1,1,0,21,R AL temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_22,-34.8327763157895,-6.646575,-25.3468578947368,0,0,0,1,1,1,0,22,L AL temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_23,17.4263131578947,-10.0524047368421,-18.2650921052632,0,0,0,1,1,1,0,23,R superior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_24,-18.1468184210526,-10.9803721052632,-18.3750131578947,0,0,0,1,1,1,0,24,L superior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_25,20.4641447368421,-4.03479921052632,-28.0214973684211,0,0,0,1,1,1,0,25,R inferior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_26,-21.3443842105263,-5.12460973684211,-27.9912052631579,0,0,0,1,1,1,0,26,L inferior AM temporal horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_27,14.6365184210526,-40.7174131578947,4.71004973684211,0,0,0,1,1,1,0,27,R indusium griseum origin,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_28,-14.8907842105263,-43.0901605263158,4.23491921052632,0,0,0,1,1,1,0,28,L indusium griseum origin,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_29,20.8308868421053,-79.2528368421053,4.51120236842105,0,0,0,1,1,1,0,29,R ventral occipital horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_30,-18.9085052631579,-82.82955,3.54751710526316,0,0,0,1,1,1,0,30,L ventral occipital horn,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_31,11.8931421052632,18.5102315789474,-12.3773210526316,0,0,0,1,1,1,0,31,R olfactory sulcal fundus,vtkMRMLScalarVolumeNode1 +vtkMRMLMarkupsFiducialNode_32,-13.3650815789474,17.0294973684211,-13.0638105263158,0,0,0,1,1,1,0,32,L olfactory sulcal fundus,vtkMRMLScalarVolumeNode1 diff --git a/autoafids/run.py b/autoafids/run.py index 4f7b033..47063de 100755 --- a/autoafids/run.py +++ b/autoafids/run.py @@ -26,6 +26,11 @@ # Set the conda prefix directory conda_prefix = Path(utils.get_download_dir()) / "conda" +# Set templateflow directory +os.environ['TEMPLATEFLOW_HOME'] = str( + Path(utils.get_download_dir()) / "templateflow" + ) + # Set the environment variable SNAKEMAKE_CONDA_PREFIX if not already set if "SNAKEMAKE_CONDA_PREFIX" not in os.environ: os.environ["SNAKEMAKE_CONDA_PREFIX"] = str(conda_prefix) diff --git a/autoafids/workflow/Snakefile b/autoafids/workflow/Snakefile index fc357a3..6427d08 100644 --- a/autoafids/workflow/Snakefile +++ b/autoafids/workflow/Snakefile @@ -343,6 +343,12 @@ if config["fidqc"]: include: "rules/fidqc.smk" +if config["LEAD_DBS_DIR"] or config["FMRIPREP_DIR"]: + print("..... Registration QC Enabled .....") + + include: "rules/regqc.smk" + + rule all: input: models=inputs[config["modality"]].expand( @@ -365,6 +371,17 @@ rule all: ) if config["fidqc"] else [], + regqc=inputs[config["modality"]].expand( + bids( + root=root, + datatype="regqc", + desc="reg", + suffix="qc.html", + **inputs[config["modality"]].wildcards + ) + ) + if config["LEAD_DBS_DIR"] or config["FMRIPREP_DIR"] + else [], afidspred=inputs[config["modality"]].expand( bids( root=root, diff --git a/autoafids/workflow/envs/regqc.yaml b/autoafids/workflow/envs/regqc.yaml new file mode 100644 index 0000000..48accc1 --- /dev/null +++ b/autoafids/workflow/envs/regqc.yaml @@ -0,0 +1,11 @@ +--- +name: regqc +channels: [khanlab,conda-forge, defaults] +dependencies: + - python=3.9 + - plotly + - simpleitk + - scipy + - matplotlib + - pandas + - antspyx=0.5.3 \ No newline at end of file diff --git a/autoafids/workflow/envs/templateflow.yaml b/autoafids/workflow/envs/templateflow.yaml new file mode 100644 index 0000000..e8ca27d --- /dev/null +++ b/autoafids/workflow/envs/templateflow.yaml @@ -0,0 +1,4 @@ +--- +name: templateflow +channels: [conda-forge, defaults] +dependencies: [python=3.9, templateflow] \ No newline at end of file diff --git a/autoafids/workflow/envs/utils.yaml b/autoafids/workflow/envs/utils.yaml index fc4fab7..3573275 100644 --- a/autoafids/workflow/envs/utils.yaml +++ b/autoafids/workflow/envs/utils.yaml @@ -1,4 +1,9 @@ --- name: utils channels: [conda-forge, defaults] -dependencies: [python=3.9, nibabel, pandas, matplotlib, joblib] +dependencies: + - python=3.9 + - nibabel + - pandas + - matplotlib + - joblib diff --git a/autoafids/workflow/rules/cnn.smk b/autoafids/workflow/rules/cnn.smk index cc096c3..1abb9e0 100644 --- a/autoafids/workflow/rules/cnn.smk +++ b/autoafids/workflow/rules/cnn.smk @@ -12,7 +12,7 @@ rule download_cnn_model: suffix="downlaod_model.log", ), shell: - "wget -q https://{params.url} -O model.zip && " + "wget https://{params.url} -O model.zip && " " unzip -q -d {output.unzip_dir} model.zip && " " rm model.zip" diff --git a/autoafids/workflow/rules/regqc.smk b/autoafids/workflow/rules/regqc.smk new file mode 100644 index 0000000..fe6074e --- /dev/null +++ b/autoafids/workflow/rules/regqc.smk @@ -0,0 +1,185 @@ +from pathlib import Path +import glob + +lead_dbs_dir = config.get("LEAD_DBS_DIR", False) +fmriprep_dir = config.get("FMRIPREP_DIR", False) + +template_name = config.get("template_flow", "") + +template_dict = { + "MNI152Lin": "resources/regqc/tpl-MNI152Lin_res-01_desc-groundtruth_afids.fcsv", + "MNI152NLin2009cAsym": "resources/regqc/tpl-MNI152NLin2009cAsym_res-01_desc-groundtruth_afids.fcsv", + "MNI152NLin6Sym": "resources/regqc/tpl-MNI152NLin6Asym_res-01_desc-groundtruth_afids.fcsv", + "OASIS30ANTs": "resources/regqc/tpl-OASIS30ANTs_res-01_desc-groundtruth_afids.fcsv", + "MNI152NLin2009cSym": "resources/regqc/tpl-MNI152NLin2009cSym_res-1_desc-groundtruth_afids.fcsv", + "MNI305": "resources/regqc/tpl-MNI305_desc-groundtruth_afids.fcsv", + "fsaverage": "resources/regqc/tpl-fsaverage_res-01_den-41k_desc-groundtruth_afids.fcsv", + "MNI152NLin2009bSym": "resources/regqc/tpl-MNI152NLin2009bSym_res-1_desc-groundtruth_afids.fcsv", + "MNI152NLin6Asym": "resources/regqc/tpl-MNI152NLin6Asym_res-01_desc-groundtruth_afids.fcsv", + "MNIColin27": "resources/regqc/tpl-MNIColin27_desc-groundtruth_afids.fcsv", +} + + +def get_warp_path(subject): + if lead_dbs_dir: + trans_dir = ( + Path(lead_dbs_dir) + / f"sub-{subject}" + / "normalization" + / "transformations" + ) + pattern = f"sub-{subject}*_from-MNI*_to-anchorNative_desc-ants.nii.gz" + matches = list(trans_dir.glob(pattern)) + if matches: + return str(matches[0]) + return None + + elif fmriprep_dir: + trans_dir = Path(fmriprep_dir) / f"sub-{subject}" / "anat" + pattern = f"sub-{subject}*from-MNI*_to-T1w_mode-image_xfm.h5" + matches = list(trans_dir.glob(pattern)) + if matches: + return str(matches[0]) + return None + + else: + raise ValueError( + "No LEAD-DBS or fMRIPrep directory provided for warp." + ) + + +def get_optional_matrix_path(subject): + if lead_dbs_dir: + trans_dir = ( + Path(lead_dbs_dir) + / f"sub-{subject}" + / "coregistration" + / "transformations" + ) + pattern = f"sub-{subject}_desc-precoreg_*T1w.mat" + matches = list(trans_dir.glob(pattern)) + if matches: + return str(matches[0]) + return [] + if fmriprep_dir: + return [] + + +def get_resampled_im(subject): + if lead_dbs_dir: + pattern = str( + Path(lead_dbs_dir) + / f"sub-{subject}" + / "normalization" + / "anat" + / f"sub-{subject}_ses-preop_space-*_desc-preproc_acq-*_T1w.nii*" + ) + matches = glob.glob(pattern) + if matches: + return matches[0] + else: + raise FileNotFoundError( + f"No resampled image found for subject {subject} in LEAD-DBS" + ) + + elif fmriprep_dir: + pattern = str( + Path(fmriprep_dir) + / f"sub-{subject}" + / "anat" + / f"sub-{subject}*_space-MNI*_desc-preproc_T1w.nii.gz" + ) + matches = glob.glob(pattern) + if matches: + return matches[0] + else: + raise FileNotFoundError( + f"No resampled image found for subject {subject} in fMRIPrep" + ) + + else: + raise ValueError( + "No LEAD-DBS or fMRIPrep directory provided for resampled image." + ) + + +def get_ref_paths(): + if template_name: + refimage = directory(Path(download_dir) / "templateflow") + + refcoordinate = str( + Path(workflow.basedir).parent / template_dict[template_name] + ) + else: + if lead_dbs_dir: + refimage = str( + Path(workflow.basedir).parent / config["templatet1w_lead"] + ) + refcoordinate = str( + Path(workflow.basedir).parent / config["fcsv_mni_lead"] + ) + else: + refimage = str( + Path(workflow.basedir).parent / config["templatet1w"] + ) + refcoordinate = str( + Path(workflow.basedir).parent / config["fcsv_mni"] + ) + return refimage, refcoordinate + + +rule download_template: + params: + template=template_name, + output: + template_path=directory(Path(download_dir) / "templateflow"), + conda: + "../envs/templateflow.yaml" + script: + "../scripts/template_flow.py" + + +rule regqc: + input: + afidfcsv=bids( + root=root, + datatype="afids-cnn", + desc="afidscnn", + suffix="afids.fcsv", + **inputs[config["modality"]].wildcards + ), + im=lambda wildcards: get_resampled_im(wildcards.subject), + warp=lambda wildcards: get_warp_path(wildcards.subject), + optional_matrix=lambda wildcards: get_optional_matrix_path( + wildcards.subject + ), + refim=lambda wildcards: get_ref_paths()[0], + refcoord=lambda wildcards: get_ref_paths()[1], + output: + html=bids( + root=root, + datatype="regqc", + desc="reg", + suffix="qc.html", + **inputs[config["modality"]].wildcards + ), + csv=bids( + root=root, + datatype="regqc", + desc="reg", + suffix="qc.csv", + **inputs[config["modality"]].wildcards + ), + fcsv=bids( + root=root, + datatype="regqc", + desc="reg", + suffix="afids.fcsv", + **inputs[config["modality"]].wildcards + ), + params: + template=template_name, + conda: + "../envs/regqc.yaml" + script: + "../scripts/regqc.py" diff --git a/autoafids/workflow/scripts/apply.py b/autoafids/workflow/scripts/apply.py index 15af6b1..8f9a1eb 100644 --- a/autoafids/workflow/scripts/apply.py +++ b/autoafids/workflow/scripts/apply.py @@ -308,7 +308,10 @@ def process_distances( thresholded = transformed thresholded[thresholded < thresh] = 0 thresholded = (thresholded * 1000000).astype(int) - new = skimage.measure.regionprops(thresholded) + try: + new = skimage.measure.regionprops(thresholded) + except MemoryError: + new=None if not new: print("No centroid found for this afid. Results may be suspect.") return np.array( @@ -377,21 +380,7 @@ def apply_model( mni_fid_resampled, radius, ) - # do it again to improve prediction - fid_pred = np.rint(fid_resampled).astype(int) - distances2 = predict_distances( - radius, - model, - fid_pred, - img_data, - ) - fid_resampled2 = process_distances( - distances2, - img_data, - fid_pred, - radius, - ) - return fid_voxel2world(fid_resampled2, img.affine) + return fid_voxel2world(fid_resampled, img.affine) def apply_all( diff --git a/autoafids/workflow/scripts/regqc.py b/autoafids/workflow/scripts/regqc.py new file mode 100644 index 0000000..3b7835b --- /dev/null +++ b/autoafids/workflow/scripts/regqc.py @@ -0,0 +1,762 @@ +# === REGISTRATION QC SCRIPT WITH MRI VIEWER === +import base64 +import csv +from io import BytesIO +from pathlib import Path + +import ants +import matplotlib.pyplot as plt +import nibabel as nib +import numpy as np +import pandas as pd +import plotly.graph_objects as go +import plotly.io as pio +import scipy.io +import SimpleITK as SimpleITK +from jinja2 import Template + +FCSV_TEMPLATE = ( + Path(__file__).parent + / ".." + / ".." + / "resources" + / "tpl-MNI152NLin2009cAsym_res-01_T1w.fcsv" +) + + +def afids_to_fcsv( + transformed_coords, output_path, template_path=FCSV_TEMPLATE + ): + """ + Writes transformed AFID coordinates + to a new FCSV file using a template FCSV. + + Parameters + ---------- + transformed_coords : np.ndarray + Transformed coordinates of shape (N, 3) + template_path : str or Path + Path to the template FCSV file (Slicer-compatible) + output_path : str or Path + Output path for the new FCSV file + """ + with open(template_path, encoding="utf-8", newline="") as template_file: + # Read the first three header lines + header = [template_file.readline() for _ in range(3)] + reader = csv.DictReader( + template_file, + fieldnames=[ + "id", + "x", + "y", + "z", + "ow", + "ox", + "oy", + "oz", + "vis", + "sel", + "lock", + "label", + "desc", + "associatedNodeID" + ] + ) + rows = list(reader) + + # Update coordinates + for i, row in enumerate(rows): + row['x'], row['y'], row['z'] = map(str, transformed_coords[i]) + + # Write updated FCSV + with open(output_path, "w", newline="") as out_file: + out_file.writelines(header) + writer = csv.DictWriter(out_file, fieldnames=reader.fieldnames) + writer.writerows(rows) + +# --- LOAD FCSV --- +def load_fcsv(path): + """ + Loads an FCSV file and returns both coordinates and full DataFrame. + + Returns: + - coords: np.ndarray of shape (N, 3) + - labels: list of coordinate labels + """ + df = pd.read_csv(path, skiprows=2) + coords = df[['x', 'y', 'z']].to_numpy() + labels = df['label'].tolist() + return coords, labels + +# --- APPLY 4X4 --- +def apply_affine_transform(mat_path, coords): + """ + Applies a transformation matrix to 3D coordinates. + + Parameters: + - mat_path: str, path to the .mat file with the transformation matrix + - coords: np.ndarray of shape (N, 3), input coordinates + + Returns: + - transformed_coords: np.ndarray of shape (N, 3) + """ + mat_contents = scipy.io.loadmat(mat_path) + transformation_matrix = mat_contents['tmat'] + homogeneous_coords = np.hstack((coords, np.ones((coords.shape[0], 1)))) + transformed_homogeneous = ( + np.linalg.inv(transformation_matrix) @ homogeneous_coords.T + ).T + return transformed_homogeneous[:, :3] + +# --- APPLY WARP (HARMONIZED) --- +def apply_warp_deformation( + transform_path, + coords, + flip_ras_lps=True, + leaddbs=True): + """ + Applies a non-linear warp deformation to coordinates + using a SimpleITK displacement field. + + Parameters: + - transform_path: str, path to the transformation file (.nii or .h5) + - coords: np.ndarray of shape (N, 3), coordinates to transform + - flip_ras_lps: bool, whether to flip x/y axes for RAS ↔ LPS conversion + + Returns: + - transformed_coords: np.ndarray of shape (N, 3), transformed coordinates + """ + if flip_ras_lps: + coords = coords * np.array([-1, -1, 1]) + + if leaddbs: + + transform_image = SimpleITK.ReadImage(transform_path) + transform_image = SimpleITK.Cast( + transform_image, SimpleITK.sitkVectorFloat64 + ) + transform = SimpleITK.Transform(transform_image) + + transformed_coords = np.array([ + transform.TransformPoint(point.tolist()) for point in coords + ]) + + else: + d = pd.DataFrame(data=coords, columns=['x','y','z']) + transformed_coords_dataframe = ants.apply_transforms_to_points( 3, + d, + transform_path) + transformed_coords = transformed_coords_dataframe.to_numpy() + + if flip_ras_lps: + transformed_coords = transformed_coords * np.array([-1, -1, 1]) + + return transformed_coords + +# --- COMPUTE ERROR --- +def compute_error_components(gt, pred): + dx = np.abs(pred[:, 0] - gt[:, 0]) + dy = np.abs(pred[:, 1] - gt[:, 1]) + dz = np.abs(pred[:, 2] - gt[:, 2]) + ed = np.linalg.norm(pred - gt, axis=1) + return dx, dy, dz, ed + + +# --- HEATMAP PLOT --- +def make_toggleable_heatmap(error_components, afid_ids): + components = ["x", "y", "z", "ED"] + data_matrix = np.stack(error_components, axis=1) + y_labels = [f"AFID {i}" for i in afid_ids] + fig = go.Figure(data=go.Heatmap( + z=data_matrix, x=components, y=y_labels, + colorscale=[[0.0, 'rgb(255,255,255)'], [1.0, 'rgb(220,0,0)']], + colorbar=dict(title="Error (mm)"), + hovertemplate="AFID %{y}
%{x} Error = %{z:.2f} mm" + )) + fig.update_layout( + height=600, + width=500, + margin=dict(t=0, b=0, l=0, r=0), + template='plotly_white' + ) + return pio.to_html(fig, full_html=False, include_plotlyjs='cdn') + + +# --- 3D SCATTER PLOT --- +def make_3d_plot(gt, pred, afid_ids): + fig = go.Figure() + fig.add_trace( + go.Scatter3d( + x=gt[:, 0], + y=gt[:, 1], + z=gt[:, 2], + mode='markers', + name='Stereotactic Space', + marker=dict( + size=6, color='green', opacity=0.7, symbol='diamond' + ), + text=afid_ids + ) + ) + fig.add_trace( + go.Scatter3d( + x=pred[:, 0], + y=pred[:, 1], + z=pred[:, 2], + mode='markers', + name='Registered Subject', + marker=dict( + size=6, color='red', opacity=0.7, symbol='cross' + ), + text=afid_ids + ) + ) + for i in range(gt.shape[0]): + fig.add_trace( + go.Scatter3d( + x=[gt[i, 0], pred[i, 0]], + y=[gt[i, 1], pred[i, 1]], + z=[gt[i, 2], pred[i, 2]], + mode='lines', + line=dict(color='orange', width=7), + showlegend=False + ) + ) + fig.update_layout( + scene=dict( + xaxis_title='X', + yaxis_title='Y', + zaxis_title='Z', + bgcolor='rgb(250,250,250)' + ), + height=600, + width=800, + margin=dict(t=0, b=0, l=0, r=0), + template='plotly_white', + legend=dict(x=0.7, y=0.9) + ) + return pio.to_html(fig, full_html=False, include_plotlyjs='cdn') + +# --- Coordinate Utilities --- +def world_to_voxel_coords(img, world_coords): + """Convert world (RAS+) coordinates to + voxel coordinates using inverse affine.""" + affine_inv = np.linalg.inv(img.affine) + return np.round(affine_inv.dot(np.append(world_coords, 1))).astype(int) + +def get_afid_world_and_voxel_coords(img, fcsv_path, label_num): + """Get both world and voxel coordinates for a given AFID label.""" + df = pd.read_csv(fcsv_path, skiprows=2) + row = df[df['label'] == label_num] + if row.empty: + return None, None + world_coords = row[['x', 'y', 'z']].to_numpy()[0] + voxel_coords = world_to_voxel_coords(img, world_coords) + return world_coords, voxel_coords + +# --- Visualization Utilities --- +def render_mri_planes(data, coords, zoom=50, show_crosshairs=True): + """ + Render sagittal, coronal, and axial slices + centered at given voxel coordinates. + + Parameters: + - data: 3D NumPy array of the MRI volume + - coords: tuple of 3 voxel coordinates (x, y, z) + - zoom: int, number of voxels to include around center + - show_crosshairs: bool, whether to draw red crosshairs + + Returns: + - base64-encoded PNG image with the 3 slices side-by-side + """ + x, y, z = coords + fig, axes = plt.subplots(1, 3, figsize=(12, 4)) + slice_data_list = [data[x, :, :], data[:, y, :], data[:, :, z]] + cross_coords_list = [(y, z), (x, z), (x, y)] + titles = ["Sagittal", "Coronal", "Axial"] + + for i, ax in enumerate(axes): + slice_2d = slice_data_list[i].T # Transpose for display + x_cross, y_cross = cross_coords_list[i] + + ax.imshow(slice_2d, cmap="gray", origin="lower") + + if show_crosshairs: + ax.axvline(x_cross, color="r", lw=1) + ax.axhline(y_cross, color="r", lw=1) + + ax.set_xlim(x_cross - zoom, x_cross + zoom) + ax.set_ylim(y_cross - zoom, y_cross + zoom) + ax.set_title(titles[i]) + ax.axis("off") + + buf = BytesIO() + plt.tight_layout() + plt.savefig(buf, format="png", bbox_inches="tight") + plt.close(fig) + return base64.b64encode(buf.getvalue()).decode() + +# --- HTML Utilities --- +def build_afid_viewer_block(label, error_val, subject_image, ref_image): + return f""" +
+ + +
+ AFID {label}: {error_val:.2f} mm +
+ + +
+ + +
+ + +
+ Subject Space +  ←→  + Stereotactic Space +
+ + + +
+ """ + +# --- Main Viewer Builder --- +def generate_qualitative_mri_html( + subject_nii, + ref_nii, + ref_fcsv, + ed_errors, + labels=list(range(1, 33)), + zoom=40 + ): + """Generates HTML for visual comparison of AFID localization + on subject vs template MRI.""" + subject_img = nib.as_closest_canonical(nib.load(subject_nii)) + ref_img = nib.as_closest_canonical(nib.load(ref_nii)) + subject_data = subject_img.get_fdata() + ref_data = ref_img.get_fdata() + + viewer_blocks = [] + for i, label in enumerate(labels): + world_coords, template_voxel = get_afid_world_and_voxel_coords( + ref_img, ref_fcsv, label + ) + if world_coords is None: + continue + subject_voxel = world_to_voxel_coords(subject_img, world_coords) + subject_image = render_mri_planes( + subject_data, subject_voxel[:3], zoom=zoom + ) + ref_image = render_mri_planes(ref_data, template_voxel[:3], zoom=zoom) + viewer_blocks.append( + build_afid_viewer_block( + label, ed_errors[i], subject_image, ref_image + ) + ) + + return f""" +
+
Registration Error Qualitative Review
+
+ +
+
+ {''.join(viewer_blocks)} +
+
+ 1 / {len(viewer_blocks)} +
+
+ +
+
+ """ + +# --- RENDER HTML DASHBOARD --- +def render_dashboard_html( + output_path, heatmap_html, scatter_html, ed_errors, qualitative_html + ): + stats = pd.Series(ed_errors).describe(percentiles=[.25, .5, .75]).to_dict() + std = np.std(ed_errors) + template = Template(""" + + + AFID Inspector + + + + +
+
+

AFID Registration QC

+
+
+ +
+
Registration Error Summary
+
+ {% for label, value in stats.items() if label != 'Mean' %} +
+
{{ label }}
+
+ {{ '%.2f' % value }} mm +
+
+ {% endfor %} +
+
+
+
Mean
+
+ {{ '%.2f' % stats['Mean'] }} mm +
+
+
+
Std Dev
+
{{ '%.2f' % std }} mm
+
+
+
+ + + {{ qualitative|safe }} + + +
+
+ Registration Error Visualization +
+
+
+ {{ heatmap|safe }} +
+
+ {{ scatter|safe }} +
+
+
+
+ +
+ + + """) + html = template.render( + stats={ + "Min": stats["min"], + "25%": stats["25%"], + "Median": stats["50%"], + "75%": stats["75%"], + "Max": stats["max"], + "Mean": stats["mean"] + }, + std=std, + heatmap=heatmap_html, + scatter=scatter_html, + qualitative=qualitative_html + ) + Path(output_path).write_text(html) + return output_path + + +# --- MAIN WRAPPER --- +def generate_afid_qc_dashboard( + template_name, + gt_fcsv_path, + pred_fcsv_path, + output_html_path, + output_fcsv_path, + output_csv_path,subject_nii, + template_path_or_dir, + matfile_path, + warpfile_path + ): + native_coords, afid_ids = load_fcsv(gt_fcsv_path) + if matfile_path: + gt_coords_a= apply_affine_transform(matfile_path,native_coords) + gt_coords= apply_warp_deformation(warpfile_path,gt_coords_a) + else: + gt_coords= apply_warp_deformation(warpfile_path, + native_coords, + leaddbs=False) + pred_coords, _ = load_fcsv(pred_fcsv_path) + afids_to_fcsv(gt_coords, output_fcsv_path) + dx, dy, dz, ed = compute_error_components(gt_coords, pred_coords) + + # --- EXPORT TO CSV --- + error_df = pd.DataFrame({ + "AFID": afid_ids, + "dx (mm)": dx, + "dy (mm)": dy, + "dz (mm)": dz, + "ED (mm)": ed + }) + + if template_name: + if template_name in ['MNI152NLin2009bAsym','MNI152NLin2009bSym']: + template_nii = str(Path(template_path_or_dir) / + f'tpl-{template_name}' / + f'tpl-{template_name}_res-1_T1w.nii.gz') + elif template_name in ['MNI305', 'MNIColin27']: + template_nii = str(Path(template_path_or_dir) / + f'tpl-{template_name}' / + f'tpl-{template_name}_T1w.nii.gz') + else: + template_nii = str(Path(template_path_or_dir) / + f'tpl-{template_name}' / + f'tpl-{template_name}_res-01_T1w.nii.gz') + else: + template_nii = template_path_or_dir + + + error_df.to_csv(output_csv_path, index=False) + heatmap_html = make_toggleable_heatmap([dx, dy, dz, ed], afid_ids) + scatter_html = make_3d_plot(gt_coords, pred_coords, afid_ids) + qualitative_html = generate_qualitative_mri_html( + subject_nii, template_nii, pred_fcsv_path, ed,zoom=50) + return render_dashboard_html( + output_html_path, heatmap_html, scatter_html, ed, qualitative_html) + + +if __name__ == "__main__": + generate_afid_qc_dashboard( + template_name=snakemake.params['template'], + gt_fcsv_path=snakemake.input["afidfcsv"], + pred_fcsv_path=snakemake.input["refcoord"], + output_html_path=snakemake.output["html"], + output_fcsv_path=snakemake.output["fcsv"], + output_csv_path=snakemake.output["csv"], + subject_nii=snakemake.input["im"], + template_path_or_dir=snakemake.input["refim"], + matfile_path=snakemake.input["optional_matrix"], + warpfile_path=snakemake.input["warp"] + ) diff --git a/autoafids/workflow/scripts/template_flow.py b/autoafids/workflow/scripts/template_flow.py new file mode 100644 index 0000000..c1dd350 --- /dev/null +++ b/autoafids/workflow/scripts/template_flow.py @@ -0,0 +1,19 @@ +from templateflow import api as tflow + +template_name = snakemake.params["template"] + +if template_name in ['MNI305', 'MNIColin27']: + template_path = tflow.get( + str(template_name), + desc=None, + suffix='T1w', + extension='nii.gz' + ) +else: + template_path = tflow.get( + str(template_name), + desc=None, + resolution=1, + suffix='T1w', + extension='nii.gz' + ) diff --git a/docs/images/dag.png b/docs/images/dag.png index 7352754..14f1b7f 100644 Binary files a/docs/images/dag.png and b/docs/images/dag.png differ diff --git a/test_data/bids_T1w/test_fcsv_output.py b/test_data/bids_T1w/test_fcsv_output.py index 013631b..c48d979 100644 --- a/test_data/bids_T1w/test_fcsv_output.py +++ b/test_data/bids_T1w/test_fcsv_output.py @@ -1,25 +1,27 @@ -from sklearn.metrics import mean_squared_error -import pandas as pd import argparse +import pandas as pd +from sklearn.metrics import mean_squared_error + + # compute the mean squared error between 2 fcsv files def compute_mse(autoafids_fcsv, baseline_fcsv): - + # read the data, skipping the first 2 lines (headers and metadata) autoafids_data = pd.read_csv(autoafids_fcsv, comment='#', header=None) baseline_data = pd.read_csv(baseline_fcsv, comment='#', header=None) - + # extract the columns for coordinates (x, y, z) from both files (columns 1, 2, 3) autoafids_coords = autoafids_data.iloc[:, 1:4].values baseline_coords = baseline_data.iloc[:, 1:4].values - + # make sure the files are the same shape if autoafids_coords.shape != baseline_coords.shape: raise ValueError("The files have a different number of points. MSE computation requires equal data points.") - + # compute total mse mse = mean_squared_error(autoafids_coords, baseline_coords) - + return mse parser = argparse.ArgumentParser(description="Set paths for the computing the mse for the fcsv files.") diff --git a/tests/test_fcsv_output.py b/tests/test_fcsv_output.py index 013631b..c48d979 100644 --- a/tests/test_fcsv_output.py +++ b/tests/test_fcsv_output.py @@ -1,25 +1,27 @@ -from sklearn.metrics import mean_squared_error -import pandas as pd import argparse +import pandas as pd +from sklearn.metrics import mean_squared_error + + # compute the mean squared error between 2 fcsv files def compute_mse(autoafids_fcsv, baseline_fcsv): - + # read the data, skipping the first 2 lines (headers and metadata) autoafids_data = pd.read_csv(autoafids_fcsv, comment='#', header=None) baseline_data = pd.read_csv(baseline_fcsv, comment='#', header=None) - + # extract the columns for coordinates (x, y, z) from both files (columns 1, 2, 3) autoafids_coords = autoafids_data.iloc[:, 1:4].values baseline_coords = baseline_data.iloc[:, 1:4].values - + # make sure the files are the same shape if autoafids_coords.shape != baseline_coords.shape: raise ValueError("The files have a different number of points. MSE computation requires equal data points.") - + # compute total mse mse = mean_squared_error(autoafids_coords, baseline_coords) - + return mse parser = argparse.ArgumentParser(description="Set paths for the computing the mse for the fcsv files.")