<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0cm;
        margin-right:0cm;
        margin-bottom:0cm;
        margin-left:36.0pt;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
span.EmailStyle19
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.EmailStyle20
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:372462974;
        mso-list-type:hybrid;
        mso-list-template-ids:-711795732 -1772834720 134807555 134807557 134807553 134807555 134807557 134807553 134807555 134807557;}
@list l0:level1
        {mso-level-start-at:0;
        mso-level-number-format:bullet;
        mso-level-text:-;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-font-family:Calibri;}
@list l0:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-GB link=blue vlink=purple><div class=WordSection1><p class=MsoNormal>Hi All<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I want to report bugs in NIRFASTSlicer_v.2.0 mesh generation module.<o:p></o:p></p><p class=MsoNormal>I also deliver solutions (attached).<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Major problems: <o:p></o:p></p><p class=MsoListParagraph style='text-indent:-18.0pt;mso-list:l0 level1 lfo2'><![if !supportLists]><span style='mso-list:Ignore'>-<span style='font:7.0pt "Times New Roman"'>        </span></span><![endif]>translation of coordinates from patient space to x-y-z space -> crushes the module<o:p></o:p></p><p class=MsoListParagraph style='text-indent:-18.0pt;mso-list:l0 level1 lfo2'><![if !supportLists]><span style='mso-list:Ignore'>-<span style='font:7.0pt "Times New Roman"'>        </span></span><![endif]>unfinished implementation of fiducial coordinates processing (since NIRFASTSlicer v1.0) -> fiducials useless<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The ‘Create Mesh’ crush and fiducials problems can be reproduced using my head model (generated from MRI with SPM and saved with NIRFASTSlicer2.0).<o:p></o:p></p><p class=MsoNormal>(Please mail me for the segmentation ‘*.nrrd’ file. It’s only 632KB. However, Nirfast mailing list email size limit is 300KB.)<o:p></o:p></p><p class=MsoNormal>The command:<o:p></o:p></p><p class=MsoNormal>cd('C:/Program Files/NIRFASTSlicer 2.0.0/lib/NIRFASTSlicer-2.0/matlab-modules');<o:p></o:p></p><p class=MsoNormal>Image2Mesh(cli_argsread({'--nirfastDir','D:/PROGRAMS/nirfast8/toolbox','--labelmap','C:/Users/wojtkies/AppData/Local/Temp/NIRFASTSlicer/EICE_vtkMRMLLabelMapVolumeNodeC.nrrd','--fiducials','34.7404,71.4787,25.567','--fiducials','0.909979,77.0329,25.567','--fiducials','-29.8908,69.9639,25.567','--meshdir','D:/DOCUMENTS/GRANTY/BITMAP/Warsaw_meeting_05.2018/TEST/mesh_test','--meshname','nirfast_mesh','--meshtype','Standard','--cell_size','3.5','--cellradiusedge','3','--facet_size','3.5','--facetangle','25','--facetdistance','3'}));<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>(Win 10, Matlab R2016a, NIRFASTSLicer2.0 – pure as download, NIRFAST9.0 – pure as download)<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>DETAILS of the two major problems + other minor/major bugs repairs:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>#1<o:p></o:p></p><p class=MsoNormal>Coordinates translation<o:p></o:p></p><p class=MsoNormal>The current implementation (Image2Mesh.m) assumes only one possible orientation of object in the patient space. All images are processed as oriented 'LPS' . The MRI structure I use was saved in 'right-anterior-superior' (‘RAS’) orientation.<o:p></o:p></p><p class=MsoNormal style='text-autospace:none'>My <span style='font-size:13.0pt;font-family:"Courier New";color:black'>spacedir</span> matrix (rotation/scale matrix from patient to xyz space) is as follows (I have 1mm voxels spacing, thus ones in the matrix):<o:p></o:p></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:12.0pt;font-family:"Courier New"'>     0     0     1<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:12.0pt;font-family:"Courier New"'>    -1     0     0<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:12.0pt;font-family:"Courier New"'>     0     1     0<o:p></o:p></span></p><p class=MsoNormal>However, the code assumes nonzero diagonal values (as it is true for ‘LPS’ patient space orientations). Thus, the following lines:<o:p></o:p></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:13.0pt;font-family:"Courier New";color:forestgreen'>% param.TransformMatrix(1,1) = param.TransformMatrix(1,1) / abs(spacedir(1,1));</span><span style='font-size:12.0pt;font-family:"Courier New"'><o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:13.0pt;font-family:"Courier New";color:forestgreen'>% param.TransformMatrix(2,2) = param.TransformMatrix(2,2) / abs(spacedir(2,2));</span><span style='font-size:12.0pt;font-family:"Courier New"'><o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:13.0pt;font-family:"Courier New";color:forestgreen'>% param.TransformMatrix(3,3) = param.TransformMatrix(3,3) / abs(spacedir(3,3));</span><span style='font-size:12.0pt;font-family:"Courier New"'><o:p></o:p></span></p><p class=MsoNormal>produce NaNs at the diagonal of the transformation matrix. We divide 0 by 0. This leads to a big crush.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal style='text-autospace:none'>I think, that the best solution is to use affine transform (<span style='font-size:13.0pt;font-family:"Courier New";color:black'>param.TransformMatrix = img.ijkToLpsTransform;</span>). This affine matrix is called ‘<span style='font-size:13.0pt;font-family:"Courier New";color:black'>ijkToLpsTransform</span>’ but Slicer puts there correct values no matter what is the patient space orientation (i.e. it does not have to be LPS). <o:p></o:p></p><p class=MsoNormal style='text-autospace:none'>The rotation and translation of the model are handled separately despite a ready to use affine matrix. Is there any reason to not trust this matrix? I checked it for different DICOMS (a neck and heads carried out by different hospitals) and this affine transform matrix was always good (for different patient orientations!). I am not sure if I fully understand the terminology LPS etc. and what exactly is passed from Slicer (I just tried to reverse engineer this problem). However, it looks like the proposed solution works.<o:p></o:p></p><p class=MsoNormal style='text-autospace:none'><o:p> </o:p></p><p class=MsoNormal style='text-autospace:none'>Briefly, my changes to the Image2Mesh.m file:<o:p></o:p></p><p class=MsoListParagraph style='text-indent:-18.0pt;mso-list:l0 level1 lfo2;text-autospace:none'><![if !supportLists]><span style='mso-list:Ignore'>-<span style='font:7.0pt "Times New Roman"'>        </span></span><![endif]>the affine transform instead of rotation and translation<o:p></o:p></p><p class=MsoListParagraph style='text-autospace:none'>The rotation was carried out inside ‘Image2Mesh.m’ file, the translation was carried out inside ‘RunCGALMeshGenerator.m’ file. The affine transform does all at once. I have moved the affine operation into ‘Image2Mesh.m’ as this file is closely related to the Slicer which generates the affine transformation matrix. And it might be more clear to keep the transformation as close as possible to the transformation matrix.<o:p></o:p></p><p class=MsoListParagraph style='text-indent:-18.0pt;mso-list:l0 level1 lfo2;text-autospace:none'><![if !supportLists]><span style='mso-list:Ignore'>-<span style='font:7.0pt "Times New Roman"'>        </span></span><![endif]>with the affine transform, there is no need of the hard/hand-coded repairs of the rotation matrix (is this to match the fiducials coordinates? I do not understand this rotations around 0X and 0Y axes.):<o:p></o:p></p><p class=MsoListParagraph style='text-autospace:none'><span style='font-size:13.0pt;font-family:"Courier New";color:forestgreen'>% param.TransformMatrix(1,1) = -1 * param.TransformMatrix(1,1);</span><span style='font-size:12.0pt;font-family:"Courier New"'><o:p></o:p></span></p><p class=MsoListParagraph style='text-autospace:none'><span style='font-size:13.0pt;font-family:"Courier New";color:forestgreen'>% param.TransformMatrix(2,2) = -1 * param.TransformMatrix(2,2);</span><span style='font-size:12.0pt;font-family:"Courier New"'><o:p></o:p></span></p><p class=MsoListParagraph style='text-indent:-18.0pt;mso-list:l0 level1 lfo2;text-autospace:none'><![if !supportLists]><span style='mso-list:Ignore'>-<span style='font:7.0pt "Times New Roman"'>        </span></span><![endif]>removed redundancies<o:p></o:p></p><p class=MsoListParagraph style='text-indent:-18.0pt;mso-list:l0 level1 lfo2;text-autospace:none'><![if !supportLists]><span style='mso-list:Ignore'>-<span style='font:7.0pt "Times New Roman"'>        </span></span><![endif]>code polishing, etc.<o:p></o:p></p><p class=MsoNormal style='text-autospace:none'><o:p> </o:p></p><p class=MsoNormal style='text-autospace:none'>The fix requires changes in two files: RunCGALMeshGenerator.m (NIRFAST package) and Image2Mesh.m (Slicer package). Fixed files attached.<o:p></o:p></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:12.0pt;font-family:"Courier New"'><o:p> </o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:12.0pt;font-family:"Courier New"'>#2<o:p></o:p></span></p><p class=MsoNormal>Unfinished fiducials business<o:p></o:p></p><p class=MsoNormal>Fiducials coordinates are translated internally by the Slicer (by the same vector as in the affine transform in #1). However, they are not rotated.<o:p></o:p></p><p class=MsoNormal>Fiducials look like they are always in the same patient space, no matter what is the data patient orientation. Thus, to convert the fiducials to the x-y-z coordinates a following rotation matrix should be used:<o:p></o:p></p><p class=MsoNormal>    -1     0     0<o:p></o:p></p><p class=MsoNormal>     0    -1     0<o:p></o:p></p><p class=MsoNormal>     0     0     1<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I have added the following to the ‘Image2Mesh.m’ file:<o:p></o:p></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:13.0pt;font-family:"Courier New";color:black'>sdcoords = ([-1 0 0;0 -1 0; 0 0 1]*sdcoords')';</span><span style='font-size:12.0pt;font-family:"Courier New"'><o:p></o:p></span></p><p class=MsoNormal>This and affine transform of the model brings the model and fiducials to the same space.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>BTW: The fiducials coordinates passed to the ‘Image2Mesh.m’ function and saved as a *.csv file are different….<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>#3<o:p></o:p></p><p class=MsoNormal>Reading fiducials fails if there is only one fiducial.<o:p></o:p></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:13.0pt;font-family:"Courier New";color:black'>sdcoords = cell2mat(fiducials)';</span><span style='font-size:12.0pt;font-family:"Courier New"'><o:p></o:p></span></p><p class=MsoNormal>For one fiducial, the ‘fiducials’ is not a cell and the command fails returning error. <o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Problem solved in the attached file.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>#4<o:p></o:p></p><p class=MsoNormal>Can you repair/swap  RunCGALMeshGenerator.m and Image2Mesh.m files in the packages to download?<o:p></o:p></p><p class=MsoNormal>I am going to run a training session ‘from MRI to FEM model’ for PhD students soon (in 2 weeks). The very first thing I will have to do is to ask everybody to repair tools by replacing files here and there (or use my Matlab meshing implementation directly on SPM files, which I developed to test the errors).<o:p></o:p></p><p class=MsoNormal>I have to work on DICOM files that confuses NIRFASTSlicer. So, I have no choice but distribute NIRFASTSlicer with my repaired files.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>#5<o:p></o:p></p><p class=MsoNormal>‘Image2Mesh (Matlab)’ module? A testing leftover? It has inactive settings/parameters. These parameters are loaded from the ‘Create Mesh’ module. There is no easy way to guess that. I propose to delete this redundant module. Or repair the inactive options and leave it as backward compatibility for meshing ‘LabelMaps’ not ‘Segmentations’ as in the new ‘Create Mesh’ module. Or add option of meshing a ‘LabelMap’ to the ‘Create Mesh’ module?<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><span lang=EN-US style='font-family:Consolas;mso-fareast-language:EN-GB'>Regards<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-family:Consolas;mso-fareast-language:EN-GB'>Stanislaw Wojtkiewicz, PhD<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-family:Consolas;mso-fareast-language:EN-GB'><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-family:Consolas;mso-fareast-language:EN-GB'>---<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-family:Consolas;mso-fareast-language:EN-GB'>School of Computer Science<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:Consolas;mso-fareast-language:EN-GB'>University of Birmingham<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:Consolas;mso-fareast-language:EN-GB'>B15 2TT<o:p></o:p></span></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p></div><div id="DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2"><br />
<table style="border-top: 1px solid #D3D4DE;">
        <tr>
        <td style="width: 55px; padding-top: 13px;"><a href="https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient" target="_blank"><img src="https://ipmcdn.avast.com/images/icons/icon-envelope-tick-round-orange-animated-no-repeat-v1.gif" alt="" width="46" height="29" style="width: 46px; height: 29px;" /></a></td>
                <td style="width: 470px; padding-top: 12px; color: #41424e; font-size: 13px; font-family: Arial, Helvetica, sans-serif; line-height: 18px;">Virus-free. <a href="https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient" target="_blank" style="color: #4453ea;">www.avast.com</a>
                </td>
        </tr>
</table><a href="#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2" width="1" height="1"> </a></div></body></html>