{
  "id": 539744,
  "title": "24th Place Solution for the RSNA 2024 Lumbar Spine Degenerative Classification Competition",
  "url": "/competitions/rsna-2024-lumbar-spine-degenerative-classification/discussion/539744",
  "author_name": "Daniel Phalen",
  "post_date": "2024-10-10T15:31:59.781000",
  "votes": 6,
  "comment_count": 0,
  "views": 0,
  "content": "<p>Thanks to the organizers for this competition, and my partner Simon Veitner <a href=\"https://www.kaggle.com/simonveitner\" target=\"_blank\">@simonveitner</a> for the help!</p>\n<h2>Overview</h2>\n<p><a href=\"https://www.kaggle.com/competitions/rsna-2024-lumbar-spine-degenerative-classification/overview\" target=\"_blank\">Competition Main Page</a></p>\n<p><a href=\"https://www.kaggle.com/competitions/rsna-2024-lumbar-spine-degenerative-classification/data\" target=\"_blank\">Competition Data Page</a></p>\n<p>Our solution was built from a two stage process:</p>\n<ol>\n<li>Find the key points<ol>\n<li>Use a TD-CNN to determine the instance numbers.</li>\n<li>Use a UNet Segmentation model and heatmap loss to determine the locations of each of the vertebrae.</li></ol></li>\n<li>Crop and classify each condition.<ol>\n<li>Resize to constant pixel size and area.</li>\n<li>Use a TD-CNN to do the classification.</li></ol></li>\n</ol>\n<p>The code is available at <a href=\"https://github.com/phalendj/rsna2024\" target=\"_blank\">https://github.com/phalendj/rsna2024</a>.</p>\n<h2>Comments on the Data</h2>\n<p>Looking through the training data, we had the different studies, which were then divided into different series covering the different image types Sagittal T2/STIR, Sagittal T1, and Axial T2.  In some studies there were multiple series of a single image type.  Within the different image types, there were what I called 'Stacks', which were instances that formed a regular grid of voxels, so all had the same orientation and spacing.</p>\n<p>Within a single stack, we can come up with the affine matrix that maps the voxel location to a point in the world space via an Affine matrix that can be constructed from the image orientation and location data in the dicom metadata.  We then would use this affine matrix for each stack to translate points from one pixel space into another.  To construct the full affine matrix, we followed (<a href=\"https://nipy.org/nibabel/dicom/dicom_orientation.html)[https://nipy.org/nibabel/dicom/dicom_orientation.html]\" target=\"_blank\">https://nipy.org/nibabel/dicom/dicom_orientation.html)[https://nipy.org/nibabel/dicom/dicom_orientation.html]</a>.  Let $$(Z_x \\Delta k, Z_y \\Delta k, Z_z \\Delta k) = S_1 - S_0$$ be the difference in the zero voxel points of two instances, then the affine matrix is defined $P = A n$</p>\n<p>$$ \\left[\\begin{array}{c}<br>\nP_x \\\\<br>\nP_y \\\\<br>\nP_z \\\\<br>\n1 \\end{array}<br>\n\\right] = <br>\n\\left[<br>\n\\begin{array}{cccc}<br>\nX_x \\Delta i &amp; Y_x \\Delta j &amp; Z_x \\Delta k &amp; S_x \\\\<br>\nX_y \\Delta i &amp; Y_y \\Delta j &amp; Z_y \\Delta k &amp; S_y \\\\<br>\nX_z \\Delta i &amp; Y_z \\Delta j &amp; Z_z \\Delta k &amp; S_z \\\\<br>\n0 &amp; 0 &amp; 0 &amp; 1 \\\\<br>\n\\end{array}<br>\n\\right]<br>\n\\left[\\begin{array}{c}<br>\ni \\\\<br>\nj \\\\<br>\nk \\\\<br>\n1 \\end{array}<br>\n\\right]<br>\n$$</p>\n<p>And conversions from one pixel space to another are done using the matrix $$ A^{\\prime -1} A$$.</p>\n<p>Many of the vertebrae we found to be mislabelled, usually off by one.  We went through a few iterations of finding where our model for keypoints did not match the training data and corrected any training data.</p>\n<h2>Model</h2>\n<h3>Finding diagnosis location points</h3>\n<h4>Instance finding</h4>\n<p>For this we focussed on the Sagittal T2/STIR images in order to find the locations of the vertebrae.  First we found the projected instance numbers using a TD-CNN on all of the Sagittal T2/STIR instances of the largest stack,</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F5552115%2F534d58cf5303d09d363a0cc01a42f1f6%2FTDCNN.png?generation=1728574147484838&amp;alt=media\" alt=\"TD-CNN\"></p>\n<p>We then output the probability that each image was the correct image.</p>\n<h4>Keypoint finding</h4>\n<p>Using the same Sagittal T2/STIR images, we used a 2.5D CNN with 15 channel input and timm_efficientnet_b2 in the segmentation-models-pytorch package.  We then used Heatmap loss as outlined in <a href=\"https://www.kaggle.com/code/sacuscreed/sagittal-t2-sagittal-level-segmentation\" target=\"_blank\">https://www.kaggle.com/code/sacuscreed/sagittal-t2-sagittal-level-segmentation</a> by Angel Jacinto Sanchez Ruiz (@sacuscreed).</p>\n<p>Finally, after taking the training data and translating each label coordinate to the world space, we found the average offset in mm for the foraminal locations and the subarticular locations.   We used this to generate a file 'test_label_coordinates.csv' for the next step.</p>\n<p>Given the size of the areas we would pull for our diagnosis model, we found that this was good enough to move to the next level.</p>\n<h3>Diagnosis Model</h3>\n<p>After finding locations, we used a 224x224 image for input into a TDCNN, same as outlined above.  We would find the center location for a level, then cut an image of size 40-50mm around that location and scale to the input size.  We found that the different studies had a wide variety of pixel spacings, so this gave a standard size of the target area.  We would then train this with Weighted CrossEntropyLoss.  The model we submitted with was <code>densenet121</code>.</p>\n<p>For spinal, the size of a batch for training would be (B, 5(Levels), 11(Images), 224, 224), for foraminal narrowing (B, 5(Levels), 2 (Sides), 11(Images), 224, 224), and for subarticular stenosis (B, 5(Levels), 7(Images), 224, 224).  For Subarticular Stenosis, we found applying a flip to the right side images gave a better model since everything was in a standard format.</p>\n<p>After all of the training, we did add a master model that had all the same inputs, but joined all outputs for a single level into a large input for a classifier head.  We found there was a lot of correllation in the different diagnoses for a single spinal level, but not as much among the different levels.</p>\n<h3>What did not work for us</h3>\n<ol>\n<li>3D models</li>\n<li>Using all images in a single TD-CNN.</li>\n</ol>\n<h3>Things we would have done better</h3>\n<ol>\n<li>After the initial finding of key points on Sagittal T2/STIR, I would have probably been better off if we had used that to better zoom in on the locations in the other views.</li>\n<li>Many more models in the ensemble.  </li>\n</ol>",
  "messages": [
    {
      "id": 3013837,
      "postDate": "2024-10-10T15:31:59.783Z",
      "content": "<p>Thanks to the organizers for this competition, and my partner Simon Veitner <a href=\"https://www.kaggle.com/simonveitner\" target=\"_blank\">@simonveitner</a> for the help!</p>\n<h2>Overview</h2>\n<p><a href=\"https://www.kaggle.com/competitions/rsna-2024-lumbar-spine-degenerative-classification/overview\" target=\"_blank\">Competition Main Page</a></p>\n<p><a href=\"https://www.kaggle.com/competitions/rsna-2024-lumbar-spine-degenerative-classification/data\" target=\"_blank\">Competition Data Page</a></p>\n<p>Our solution was built from a two stage process:</p>\n<ol>\n<li>Find the key points<ol>\n<li>Use a TD-CNN to determine the instance numbers.</li>\n<li>Use a UNet Segmentation model and heatmap loss to determine the locations of each of the vertebrae.</li></ol></li>\n<li>Crop and classify each condition.<ol>\n<li>Resize to constant pixel size and area.</li>\n<li>Use a TD-CNN to do the classification.</li></ol></li>\n</ol>\n<p>The code is available at <a href=\"https://github.com/phalendj/rsna2024\" target=\"_blank\">https://github.com/phalendj/rsna2024</a>.</p>\n<h2>Comments on the Data</h2>\n<p>Looking through the training data, we had the different studies, which were then divided into different series covering the different image types Sagittal T2/STIR, Sagittal T1, and Axial T2.  In some studies there were multiple series of a single image type.  Within the different image types, there were what I called 'Stacks', which were instances that formed a regular grid of voxels, so all had the same orientation and spacing.</p>\n<p>Within a single stack, we can come up with the affine matrix that maps the voxel location to a point in the world space via an Affine matrix that can be constructed from the image orientation and location data in the dicom metadata.  We then would use this affine matrix for each stack to translate points from one pixel space into another.  To construct the full affine matrix, we followed (<a href=\"https://nipy.org/nibabel/dicom/dicom_orientation.html)[https://nipy.org/nibabel/dicom/dicom_orientation.html]\" target=\"_blank\">https://nipy.org/nibabel/dicom/dicom_orientation.html)[https://nipy.org/nibabel/dicom/dicom_orientation.html]</a>.  Let $$(Z_x \\Delta k, Z_y \\Delta k, Z_z \\Delta k) = S_1 - S_0$$ be the difference in the zero voxel points of two instances, then the affine matrix is defined $P = A n$</p>\n<p>$$ \\left[\\begin{array}{c}<br>\nP_x \\\\<br>\nP_y \\\\<br>\nP_z \\\\<br>\n1 \\end{array}<br>\n\\right] = <br>\n\\left[<br>\n\\begin{array}{cccc}<br>\nX_x \\Delta i &amp; Y_x \\Delta j &amp; Z_x \\Delta k &amp; S_x \\\\<br>\nX_y \\Delta i &amp; Y_y \\Delta j &amp; Z_y \\Delta k &amp; S_y \\\\<br>\nX_z \\Delta i &amp; Y_z \\Delta j &amp; Z_z \\Delta k &amp; S_z \\\\<br>\n0 &amp; 0 &amp; 0 &amp; 1 \\\\<br>\n\\end{array}<br>\n\\right]<br>\n\\left[\\begin{array}{c}<br>\ni \\\\<br>\nj \\\\<br>\nk \\\\<br>\n1 \\end{array}<br>\n\\right]<br>\n$$</p>\n<p>And conversions from one pixel space to another are done using the matrix $$ A^{\\prime -1} A$$.</p>\n<p>Many of the vertebrae we found to be mislabelled, usually off by one.  We went through a few iterations of finding where our model for keypoints did not match the training data and corrected any training data.</p>\n<h2>Model</h2>\n<h3>Finding diagnosis location points</h3>\n<h4>Instance finding</h4>\n<p>For this we focussed on the Sagittal T2/STIR images in order to find the locations of the vertebrae.  First we found the projected instance numbers using a TD-CNN on all of the Sagittal T2/STIR instances of the largest stack,</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F5552115%2F534d58cf5303d09d363a0cc01a42f1f6%2FTDCNN.png?generation=1728574147484838&amp;alt=media\" alt=\"TD-CNN\"></p>\n<p>We then output the probability that each image was the correct image.</p>\n<h4>Keypoint finding</h4>\n<p>Using the same Sagittal T2/STIR images, we used a 2.5D CNN with 15 channel input and timm_efficientnet_b2 in the segmentation-models-pytorch package.  We then used Heatmap loss as outlined in <a href=\"https://www.kaggle.com/code/sacuscreed/sagittal-t2-sagittal-level-segmentation\" target=\"_blank\">https://www.kaggle.com/code/sacuscreed/sagittal-t2-sagittal-level-segmentation</a> by Angel Jacinto Sanchez Ruiz (@sacuscreed).</p>\n<p>Finally, after taking the training data and translating each label coordinate to the world space, we found the average offset in mm for the foraminal locations and the subarticular locations.   We used this to generate a file 'test_label_coordinates.csv' for the next step.</p>\n<p>Given the size of the areas we would pull for our diagnosis model, we found that this was good enough to move to the next level.</p>\n<h3>Diagnosis Model</h3>\n<p>After finding locations, we used a 224x224 image for input into a TDCNN, same as outlined above.  We would find the center location for a level, then cut an image of size 40-50mm around that location and scale to the input size.  We found that the different studies had a wide variety of pixel spacings, so this gave a standard size of the target area.  We would then train this with Weighted CrossEntropyLoss.  The model we submitted with was <code>densenet121</code>.</p>\n<p>For spinal, the size of a batch for training would be (B, 5(Levels), 11(Images), 224, 224), for foraminal narrowing (B, 5(Levels), 2 (Sides), 11(Images), 224, 224), and for subarticular stenosis (B, 5(Levels), 7(Images), 224, 224).  For Subarticular Stenosis, we found applying a flip to the right side images gave a better model since everything was in a standard format.</p>\n<p>After all of the training, we did add a master model that had all the same inputs, but joined all outputs for a single level into a large input for a classifier head.  We found there was a lot of correllation in the different diagnoses for a single spinal level, but not as much among the different levels.</p>\n<h3>What did not work for us</h3>\n<ol>\n<li>3D models</li>\n<li>Using all images in a single TD-CNN.</li>\n</ol>\n<h3>Things we would have done better</h3>\n<ol>\n<li>After the initial finding of key points on Sagittal T2/STIR, I would have probably been better off if we had used that to better zoom in on the locations in the other views.</li>\n<li>Many more models in the ensemble.  </li>\n</ol>",
      "rawMarkdown": "Thanks to the organizers for this competition, and my partner Simon Veitner @simonveitner for the help!\n\n## Overview\n\n[Competition Main Page](https://www.kaggle.com/competitions/rsna-2024-lumbar-spine-degenerative-classification/overview)\n\n[Competition Data Page](https://www.kaggle.com/competitions/rsna-2024-lumbar-spine-degenerative-classification/data)\n\nOur solution was built from a two stage process:\n\n1. Find the key points\n    1. Use a TD-CNN to determine the instance numbers.\n    2. Use a UNet Segmentation model and heatmap loss to determine the locations of each of the vertebrae.\n2. Crop and classify each condition.\n    1. Resize to constant pixel size and area.\n    2. Use a TD-CNN to do the classification.\n\n\nThe code is available at [https://github.com/phalendj/rsna2024](https://github.com/phalendj/rsna2024).\n\n\n## Comments on the Data\n\nLooking through the training data, we had the different studies, which were then divided into different series covering the different image types Sagittal T2/STIR, Sagittal T1, and Axial T2.  In some studies there were multiple series of a single image type.  Within the different image types, there were what I called 'Stacks', which were instances that formed a regular grid of voxels, so all had the same orientation and spacing.\n\nWithin a single stack, we can come up with the affine matrix that maps the voxel location to a point in the world space via an Affine matrix that can be constructed from the image orientation and location data in the dicom metadata.  We then would use this affine matrix for each stack to translate points from one pixel space into another.  To construct the full affine matrix, we followed (https://nipy.org/nibabel/dicom/dicom_orientation.html)[https://nipy.org/nibabel/dicom/dicom_orientation.html].  Let $$(Z_x \\Delta k, Z_y \\Delta k, Z_z \\Delta k) = S_1 - S_0$$ be the difference in the zero voxel points of two instances, then the affine matrix is defined $P = A n$\n\n$$ \\left\\[\\begin{array}{c}\nP_x \\\\\\\\\nP_y \\\\\\\\\nP_z \\\\\\\\\n1 \\end{array}\n\\right\\] = \n\\left\\[\n\\begin{array}{cccc}\nX_x \\Delta i & Y_x \\Delta j & Z_x \\Delta k & S_x \\\\\\\\\nX_y \\Delta i & Y_y \\Delta j & Z_y \\Delta k & S_y \\\\\\\\\nX_z \\Delta i & Y_z \\Delta j & Z_z \\Delta k & S_z \\\\\\\\\n0 & 0 & 0 & 1 \\\\\\\\\n\\end{array}\n\\right\\]\n\\left\\[\\begin{array}{c}\ni \\\\\\\\\nj \\\\\\\\\nk \\\\\\\\\n1 \\end{array}\n\\right\\]\n$$\n\nAnd conversions from one pixel space to another are done using the matrix $$ A^{\\prime -1} A$$.\n\nMany of the vertebrae we found to be mislabelled, usually off by one.  We went through a few iterations of finding where our model for keypoints did not match the training data and corrected any training data.\n\n## Model\n\n### Finding diagnosis location points\n\n#### Instance finding\n\nFor this we focussed on the Sagittal T2/STIR images in order to find the locations of the vertebrae.  First we found the projected instance numbers using a TD-CNN on all of the Sagittal T2/STIR instances of the largest stack,\n\n![TD-CNN](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F5552115%2F534d58cf5303d09d363a0cc01a42f1f6%2FTDCNN.png?generation=1728574147484838&alt=media)\n\nWe then output the probability that each image was the correct image.\n\n#### Keypoint finding\n\nUsing the same Sagittal T2/STIR images, we used a 2.5D CNN with 15 channel input and timm_efficientnet_b2 in the segmentation-models-pytorch package.  We then used Heatmap loss as outlined in [https://www.kaggle.com/code/sacuscreed/sagittal-t2-sagittal-level-segmentation](https://www.kaggle.com/code/sacuscreed/sagittal-t2-sagittal-level-segmentation) by Angel Jacinto Sanchez Ruiz (@sacuscreed).\n\n\nFinally, after taking the training data and translating each label coordinate to the world space, we found the average offset in mm for the foraminal locations and the subarticular locations.   We used this to generate a file 'test_label_coordinates.csv' for the next step.\n\nGiven the size of the areas we would pull for our diagnosis model, we found that this was good enough to move to the next level.\n\n### Diagnosis Model\n\nAfter finding locations, we used a 224x224 image for input into a TDCNN, same as outlined above.  We would find the center location for a level, then cut an image of size 40-50mm around that location and scale to the input size.  We found that the different studies had a wide variety of pixel spacings, so this gave a standard size of the target area.  We would then train this with Weighted CrossEntropyLoss.  The model we submitted with was `densenet121`.\n\nFor spinal, the size of a batch for training would be (B, 5(Levels), 11(Images), 224, 224), for foraminal narrowing (B, 5(Levels), 2 (Sides), 11(Images), 224, 224), and for subarticular stenosis (B, 5(Levels), 7(Images), 224, 224).  For Subarticular Stenosis, we found applying a flip to the right side images gave a better model since everything was in a standard format.\n\nAfter all of the training, we did add a master model that had all the same inputs, but joined all outputs for a single level into a large input for a classifier head.  We found there was a lot of correllation in the different diagnoses for a single spinal level, but not as much among the different levels.\n\n### What did not work for us\n\n\n1. 3D models\n2. Using all images in a single TD-CNN.\n\n\n### Things we would have done better\n\n1. After the initial finding of key points on Sagittal T2/STIR, I would have probably been better off if we had used that to better zoom in on the locations in the other views.\n2. Many more models in the ensemble.  \n\n",
      "votes": 6
    }
  ],
  "comments": [],
  "raw_markdown_by_id": {
    "3013837": "Thanks to the organizers for this competition, and my partner Simon Veitner @simonveitner for the help!\n\n## Overview\n\n[Competition Main Page](https://www.kaggle.com/competitions/rsna-2024-lumbar-spine-degenerative-classification/overview)\n\n[Competition Data Page](https://www.kaggle.com/competitions/rsna-2024-lumbar-spine-degenerative-classification/data)\n\nOur solution was built from a two stage process:\n\n1. Find the key points\n    1. Use a TD-CNN to determine the instance numbers.\n    2. Use a UNet Segmentation model and heatmap loss to determine the locations of each of the vertebrae.\n2. Crop and classify each condition.\n    1. Resize to constant pixel size and area.\n    2. Use a TD-CNN to do the classification.\n\n\nThe code is available at [https://github.com/phalendj/rsna2024](https://github.com/phalendj/rsna2024).\n\n\n## Comments on the Data\n\nLooking through the training data, we had the different studies, which were then divided into different series covering the different image types Sagittal T2/STIR, Sagittal T1, and Axial T2.  In some studies there were multiple series of a single image type.  Within the different image types, there were what I called 'Stacks', which were instances that formed a regular grid of voxels, so all had the same orientation and spacing.\n\nWithin a single stack, we can come up with the affine matrix that maps the voxel location to a point in the world space via an Affine matrix that can be constructed from the image orientation and location data in the dicom metadata.  We then would use this affine matrix for each stack to translate points from one pixel space into another.  To construct the full affine matrix, we followed (https://nipy.org/nibabel/dicom/dicom_orientation.html)[https://nipy.org/nibabel/dicom/dicom_orientation.html].  Let $$(Z_x \\Delta k, Z_y \\Delta k, Z_z \\Delta k) = S_1 - S_0$$ be the difference in the zero voxel points of two instances, then the affine matrix is defined $P = A n$\n\n$$ \\left\\[\\begin{array}{c}\nP_x \\\\\\\\\nP_y \\\\\\\\\nP_z \\\\\\\\\n1 \\end{array}\n\\right\\] = \n\\left\\[\n\\begin{array}{cccc}\nX_x \\Delta i & Y_x \\Delta j & Z_x \\Delta k & S_x \\\\\\\\\nX_y \\Delta i & Y_y \\Delta j & Z_y \\Delta k & S_y \\\\\\\\\nX_z \\Delta i & Y_z \\Delta j & Z_z \\Delta k & S_z \\\\\\\\\n0 & 0 & 0 & 1 \\\\\\\\\n\\end{array}\n\\right\\]\n\\left\\[\\begin{array}{c}\ni \\\\\\\\\nj \\\\\\\\\nk \\\\\\\\\n1 \\end{array}\n\\right\\]\n$$\n\nAnd conversions from one pixel space to another are done using the matrix $$ A^{\\prime -1} A$$.\n\nMany of the vertebrae we found to be mislabelled, usually off by one.  We went through a few iterations of finding where our model for keypoints did not match the training data and corrected any training data.\n\n## Model\n\n### Finding diagnosis location points\n\n#### Instance finding\n\nFor this we focussed on the Sagittal T2/STIR images in order to find the locations of the vertebrae.  First we found the projected instance numbers using a TD-CNN on all of the Sagittal T2/STIR instances of the largest stack,\n\n![TD-CNN](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F5552115%2F534d58cf5303d09d363a0cc01a42f1f6%2FTDCNN.png?generation=1728574147484838&alt=media)\n\nWe then output the probability that each image was the correct image.\n\n#### Keypoint finding\n\nUsing the same Sagittal T2/STIR images, we used a 2.5D CNN with 15 channel input and timm_efficientnet_b2 in the segmentation-models-pytorch package.  We then used Heatmap loss as outlined in [https://www.kaggle.com/code/sacuscreed/sagittal-t2-sagittal-level-segmentation](https://www.kaggle.com/code/sacuscreed/sagittal-t2-sagittal-level-segmentation) by Angel Jacinto Sanchez Ruiz (@sacuscreed).\n\n\nFinally, after taking the training data and translating each label coordinate to the world space, we found the average offset in mm for the foraminal locations and the subarticular locations.   We used this to generate a file 'test_label_coordinates.csv' for the next step.\n\nGiven the size of the areas we would pull for our diagnosis model, we found that this was good enough to move to the next level.\n\n### Diagnosis Model\n\nAfter finding locations, we used a 224x224 image for input into a TDCNN, same as outlined above.  We would find the center location for a level, then cut an image of size 40-50mm around that location and scale to the input size.  We found that the different studies had a wide variety of pixel spacings, so this gave a standard size of the target area.  We would then train this with Weighted CrossEntropyLoss.  The model we submitted with was `densenet121`.\n\nFor spinal, the size of a batch for training would be (B, 5(Levels), 11(Images), 224, 224), for foraminal narrowing (B, 5(Levels), 2 (Sides), 11(Images), 224, 224), and for subarticular stenosis (B, 5(Levels), 7(Images), 224, 224).  For Subarticular Stenosis, we found applying a flip to the right side images gave a better model since everything was in a standard format.\n\nAfter all of the training, we did add a master model that had all the same inputs, but joined all outputs for a single level into a large input for a classifier head.  We found there was a lot of correllation in the different diagnoses for a single spinal level, but not as much among the different levels.\n\n### What did not work for us\n\n\n1. 3D models\n2. Using all images in a single TD-CNN.\n\n\n### Things we would have done better\n\n1. After the initial finding of key points on Sagittal T2/STIR, I would have probably been better off if we had used that to better zoom in on the locations in the other views.\n2. Many more models in the ensemble.  \n\n"
  }
}