[ismrmrd] 262/281: Started changes to ISMRMRD schema layout

Ghislain Vaillant ghisvail-guest at moszumanska.debian.org
Wed Jan 14 20:01:22 UTC 2015


This is an automated email from the git hooks/post-receive script.

ghisvail-guest pushed a commit to annotated tag ismrmrd0.5
in repository ismrmrd.

commit 67936aeeb929a2c896ac46bf69114630085200da
Author: Michael S. Hansen <michael.hansen at nih.gov>
Date:   Tue Aug 19 16:11:50 2014 -0400

    Started changes to ISMRMRD schema layout
---
 schema/ismrmrd.xsd                           |  53 +++------
 schema/ismrmrd_example_extended.xml          |  48 ++++-----
 utilities/generate_cartesian_shepp_logan.cpp |  13 +--
 xml/ismrmrd_xml.cpp                          | 154 +++++++++++----------------
 xml/ismrmrd_xml.h                            |  70 +++++-------
 5 files changed, 130 insertions(+), 208 deletions(-)

diff --git a/schema/ismrmrd.xsd b/schema/ismrmrd.xsd
index 835c28e..fd1c946 100644
--- a/schema/ismrmrd.xsd
+++ b/schema/ismrmrd.xsd
@@ -11,9 +11,7 @@
         <xs:element maxOccurs="1" minOccurs="0" name="acquisitionSystemInformation" type="acquisitionSystemInformationType"/>
         <xs:element maxOccurs="1" minOccurs="1" name="experimentalConditions" type="experimentalConditionsType"/>
         <xs:element maxOccurs="unbounded" minOccurs="1" name="encoding" type="encoding"/>
-        <xs:element maxOccurs="1" minOccurs="0" name="parallelImaging" type="parallelImagingType"/>
         <xs:element maxOccurs="1" minOccurs="0" name="sequenceParameters" type="sequenceParametersType"/>
-        <xs:element maxOccurs="1" minOccurs="0" name="dicomParameters" type="dicomParametersType"/>
         <xs:element maxOccurs="1" minOccurs="0" name="userParameters" type="userParameters"/>
       </xs:sequence>
     </xs:complexType>
@@ -36,12 +34,13 @@
 
   <xs:complexType name="studyInformationType">
     <xs:all>
-      <xs:element minOccurs="0" name="studyDate" type="xs:date"/>
-      <xs:element minOccurs="0" name="studyTime" type="xs:time"/>
-      <xs:element minOccurs="0" name="studyID" type="xs:string"/>
-      <xs:element minOccurs="0" name="accessionNumber" type="xs:long"/>
-      <xs:element minOccurs="0" name="referringPhysicianName" type="xs:string"/>
-      <xs:element minOccurs="0" name="studyDescription" type="xs:string"/>
+      <xs:element minOccurs="0" maxOccurs="1" name="studyDate" type="xs:date"/>
+      <xs:element minOccurs="0" maxOccurs="1" name="studyTime" type="xs:time"/>
+      <xs:element minOccurs="0" maxOccurs="1" name="studyID" type="xs:string"/>
+      <xs:element minOccurs="0" maxOccurs="1" name="accessionNumber" type="xs:long"/>
+      <xs:element minOccurs="0" maxOccurs="1" name="referringPhysicianName" type="xs:string"/>
+      <xs:element minOccurs="0" maxOccurs="1" name="studyDescription" type="xs:string"/>
+      <xs:element minOccurs="0" maxOccurs="1" name="studyInstanceUID" type="xs:string"/>
     </xs:all>
   </xs:complexType>
 
@@ -68,6 +67,9 @@
       <xs:element minOccurs="0" name="protocolName" type="xs:string"/>
       <xs:element minOccurs="0" name="seriesDescription" type="xs:string"/>
       <xs:element maxOccurs="unbounded" minOccurs="0" name="measurementDependency" type="measurementDependencyType"/>
+      <xs:element minOccurs="0" name="seriesInstanceUIDRoot" type="xs:string"/>
+      <xs:element minOccurs="0" name="frameOfReferenceUID" type="xs:string"/>
+      <xs:element minOccurs="0" name="referencedImageSequence" type="referencedImageSequence"/>
     </xs:sequence>
   </xs:complexType>
 
@@ -103,6 +105,8 @@
       <xs:element maxOccurs="1" minOccurs="1" name="encodingLimits" type="encodingLimitsType"/>
       <xs:element maxOccurs="1" minOccurs="1" name="trajectory" type="trajectoryType"/>
       <xs:element maxOccurs="1" minOccurs="0" name="trajectoryDescription" type="trajectoryDescriptionType"/>
+      <xs:element maxOccurs="1" minOccurs="0" name="parallelImaging" type="parallelImagingType"/>
+      <xs:element maxOccurs="1" minOccurs="0" name="echoTrainLength" type="xs:long"/>
     </xs:all>
   </xs:complexType>
 
@@ -177,6 +181,8 @@
       <xs:element minOccurs="1" maxOccurs="unbounded" type="xs:float" name="TR"/>
       <xs:element minOccurs="1" maxOccurs="unbounded" type="xs:float" name="TE"/>
       <xs:element minOccurs="0" maxOccurs="unbounded" type="xs:float" name="TI"/>
+      <xs:element minOccurs="0" maxOccurs="unbounded" type="xs:float" name="flipAngle_deg"/>
+
     </xs:sequence>
   </xs:complexType>
 
@@ -208,43 +214,12 @@
     </xs:all>
   </xs:complexType>
 
-  <xs:complexType name="dicomParametersType">
-    <xs:all>
-      <xs:element minOccurs="1" name="studyInstanceUID" type="xs:string"/>
-      <xs:element minOccurs="0" name="seriesInstanceUIDRoot" type="xs:string"/>
-      <xs:element minOccurs="0" name="frameOfReferenceUID" type="xs:string"/>
-      <xs:element minOccurs="0" name="referencedImageSequence" type="referencedImageSequence"/>
-      <xs:element minOccurs="0" name="MRImageModule" type="MRImageModule"/>
-    </xs:all>
-  </xs:complexType>
-
   <xs:complexType name="referencedImageSequence">
     <xs:sequence>
       <xs:element minOccurs="0" maxOccurs="unbounded" name="referencedSOPInstanceUID" type="xs:string"/>
     </xs:sequence>
   </xs:complexType>
       
-  <xs:complexType name="MRImageModule">
-    <xs:all>
-      <xs:element minOccurs="0" name="imageType" type="xs:string"/>
-      <xs:element minOccurs="0" name="scanningSequence" type="xs:string"/>
-      <xs:element minOccurs="0" name="sequenceVariant" type="xs:string"/>
-      <xs:element minOccurs="0" name="scanOptions" type="xs:string"/>
-      <xs:element minOccurs="0" name="mrAcquisitionType" type="xs:string"/>
-      <xs:element minOccurs="0" name="echoTrainLength" type="xs:long"/>
-      <xs:element minOccurs="0" name="triggerTime" type="xs:float"/>
-      <xs:element minOccurs="0" name="flipAngle_deg" type="xs:float"/>
-      <xs:element minOccurs="0" name="freqEncodingDirection">
-        <xs:simpleType>
-          <xs:restriction base="xs:string">
-            <xs:enumeration value="ROW"/>
-            <xs:enumeration value="COL"/>
-          </xs:restriction>
-        </xs:simpleType>
-      </xs:element>
-    </xs:all>
-  </xs:complexType>
-
   <xs:complexType name="userParameters">
     <xs:sequence>
       <xs:element maxOccurs="unbounded" minOccurs="0" name="userParameterLong" type="userParameterLongType"/>
diff --git a/schema/ismrmrd_example_extended.xml b/schema/ismrmrd_example_extended.xml
index f2a12c5..50dcaaa 100644
--- a/schema/ismrmrd_example_extended.xml
+++ b/schema/ismrmrd_example_extended.xml
@@ -14,6 +14,7 @@
     <accessionNumber>7638376482</accessionNumber>
     <referringPhysicianName>John Doe, MD</referringPhysicianName>
     <studyDescription>This is an example study with all headers set</studyDescription>
+    <studyInstanceUID>1.34.896.2789852.787873.9999</studyInstanceUID>
   </studyInformation>
   <measurementInformation>
     <measurementID>LLJGHH888986</measurementID>
@@ -31,6 +32,14 @@
       <dependencyType>SurfaceCoilCorrection</dependencyType>
       <measurementID>HHJJHJL000977810</measurementID>
     </measurementDependency>
+    <seriesInstanceUIDRoot>1.34.896.2789852.787873</seriesInstanceUIDRoot>
+    <frameOfReferenceUID>1.34.896.2789852.787873.98788.78787</frameOfReferenceUID>
+    <referencedImageSequence>
+      <referencedSOPInstanceUID>1.34.896.2789852.787873.98788.78787.1</referencedSOPInstanceUID>
+      <referencedSOPInstanceUID>1.34.896.2789852.787873.98788.78787.2</referencedSOPInstanceUID>
+      <referencedSOPInstanceUID>1.34.896.2789852.787873.98788.78787.3</referencedSOPInstanceUID>
+      <referencedSOPInstanceUID>1.34.896.2789852.787873.98788.78787.4</referencedSOPInstanceUID>
+    </referencedImageSequence>
   </measurementInformation>
   <acquisitionSystemInformation>
     <systemVendor>SIEMENS</systemVendor>
@@ -190,14 +199,15 @@
       </userParameterDouble>
       <comment>This is an example description of a custom trajectory</comment>
     </trajectoryDescription>
+    <parallelImaging>
+      <accelerationFactor>
+	<kspace_encoding_step_1>1</kspace_encoding_step_1>
+	<kspace_encoding_step_2>2</kspace_encoding_step_2>
+      </accelerationFactor>
+      <calibrationMode>other</calibrationMode>
+    </parallelImaging>
+    <echoTrainLength>12</echoTrainLength>
   </encoding>
-  <parallelImaging>
-    <accelerationFactor>
-      <kspace_encoding_step_1>1</kspace_encoding_step_1>
-      <kspace_encoding_step_2>2</kspace_encoding_step_2>
-    </accelerationFactor>
-    <calibrationMode>other</calibrationMode>
-  </parallelImaging>
   <sequenceParameters>
     <TR>4.6</TR>
     <TE>2.35</TE>
@@ -205,29 +215,9 @@
     <TE>6.55</TE>
     <TE>9.22</TE>
     <TI>300.08</TI>
+    <flipAngle_deg>90.0</flipAngle_deg>
+    <flipAngle_deg>120.0</flipAngle_deg>
   </sequenceParameters>
-  <dicomParameters>
-    <studyInstanceUID>1.34.896.2789852.787873.9999</studyInstanceUID>
-    <seriesInstanceUIDRoot>1.34.896.2789852.787873</seriesInstanceUIDRoot>
-    <frameOfReferenceUID>1.34.896.2789852.787873.98788.78787</frameOfReferenceUID>
-    <referencedImageSequence>
-      <referencedSOPInstanceUID>1.34.896.2789852.787873.98788.78787.1</referencedSOPInstanceUID>
-      <referencedSOPInstanceUID>1.34.896.2789852.787873.98788.78787.2</referencedSOPInstanceUID>
-      <referencedSOPInstanceUID>1.34.896.2789852.787873.98788.78787.3</referencedSOPInstanceUID>
-      <referencedSOPInstanceUID>1.34.896.2789852.787873.98788.78787.4</referencedSOPInstanceUID>
-    </referencedImageSequence>
-    <MRImageModule>
-      <imageType>MAGNITUDE</imageType>
-      <scanningSequence>TSE</scanningSequence>
-      <sequenceVariant>HASTE</sequenceVariant>
-      <scanOptions>Pre-ON</scanOptions>
-      <mrAcquisitionType>SE</mrAcquisitionType>
-      <echoTrainLength>12</echoTrainLength>
-      <triggerTime>100.212</triggerTime>
-      <flipAngle_deg>90.0</flipAngle_deg>
-      <freqEncodingDirection>ROW</freqEncodingDirection>
-    </MRImageModule>
-  </dicomParameters>
   <userParameters>
     <userParameterLong>
       <name>dev_long_1</name>
diff --git a/utilities/generate_cartesian_shepp_logan.cpp b/utilities/generate_cartesian_shepp_logan.cpp
index 93988cc..43dae01 100644
--- a/utilities/generate_cartesian_shepp_logan.cpp
+++ b/utilities/generate_cartesian_shepp_logan.cpp
@@ -171,18 +171,19 @@ int main(int argc, char** argv)
 	el.repetition(ISMRMRD::limitType(0,repetitions*acc_factor,0));
 	ISMRMRD::encoding e(es,rs,el,ISMRMRD::trajectoryType::cartesian);
 
-	//Add the encoding section to the header
-	h.encoding().push_back(e);
-
-	//Add any additional fields that you may want would go here....
-
 	//e.g. parallel imaging
 	if (acc_factor > 1) {
 		ISMRMRD::parallelImagingType parallel(ISMRMRD::accelerationFactorType(acc_factor,1));
 		parallel.calibrationMode(ISMRMRD::calibrationModeType::interleaved);
-		h.parallelImaging(parallel);
+		e.parallelImaging(parallel);
 	}
 
+	//Add the encoding section to the header
+	h.encoding().push_back(e);
+
+	//Add any additional fields that you may want would go here....
+
+
 	//Serialize the header
 	xml_schema::namespace_infomap map;
 	map[""].name = "http://www.ismrm.org/ISMRMRD";
diff --git a/xml/ismrmrd_xml.cpp b/xml/ismrmrd_xml.cpp
index 09206b7..019446b 100644
--- a/xml/ismrmrd_xml.cpp
+++ b/xml/ismrmrd_xml.cpp
@@ -206,9 +206,7 @@ namespace ISMRMRD
       pugi::xml_node acquisitionSystemInformation = root.child("acquisitionSystemInformation");
       pugi::xml_node experimentalConditions = root.child("experimentalConditions");
       pugi::xml_node encoding = root.child("encoding");
-      pugi::xml_node parallelImaging = root.child("parallelImaging");
       pugi::xml_node sequenceParameters = root.child("sequenceParameters");
-      pugi::xml_node dicomParameters = root.child("dicomParameters");
       pugi::xml_node userParameters = root.child("userParameters");
       
       //Parsing experimentalConditions
@@ -279,6 +277,25 @@ namespace ISMRMRD
 	    
 	  }
 
+	  pugi::xml_node parallelImaging = encoding.child("parallelImaging");
+	  if (parallelImaging) {
+	    ParallelImaging info;
+	    
+	    pugi::xml_node accelerationFactor = parallelImaging.child("accelerationFactor");
+	    if (!accelerationFactor) {
+	      throw std::runtime_error("Unable to accelerationFactor section in parallelImaging");
+	    } else {
+	      info.accelerationFactor.kspace_encoding_step_1 = static_cast<unsigned short>(std::atoi(accelerationFactor.child_value("kspace_encoding_step_1")));
+	      info.accelerationFactor.kspace_encoding_step_2 = static_cast<unsigned short>(std::atoi(accelerationFactor.child_value("kspace_encoding_step_2")));
+	    }
+	    
+	    info.calibrationMode = parse_optional_string(parallelImaging,"calibrationMode");
+	    info.interleavingDimension = parse_optional_string(parallelImaging,"interleavingDimension");
+	    e.parallelImaging = info;
+	  }
+
+	  e.echoTrainLength = parse_optional_long(encoding, "echoTrainLength");
+
 	  h.encoding.push_back(e);
 	  encoding = encoding.next_sibling("encoding");
 	}
@@ -303,6 +320,7 @@ namespace ISMRMRD
 	info.accessionNumber = parse_optional_long(studyInformation,"accessionNumber");
 	info.referringPhysicianName = parse_optional_string(studyInformation,"referringPhysicianName");
 	info.studyDescription = parse_optional_string(studyInformation,"studyDescription");
+	info.studyInstanceUID = parse_optional_string(studyInformation,"studyInstanceUID");
 	h.studyInformation = info;
       }
 
@@ -329,6 +347,22 @@ namespace ISMRMRD
 	  } 
 	  measurementDependency = measurementDependency.next_sibling("measurementDependency");
 	}
+
+	info.seriesInstanceUIDRoot = parse_optional_string(measurementInformation,"seriesInstanceUIDRoot");
+	info.frameOfReferenceUID = parse_optional_string(measurementInformation,"frameOfReferenceUID");
+
+	//This part of the schema is totally messed up and needs to be fixed, but for now we will just read it. 
+	pugi::xml_node ri = measurementInformation.child("referencedImageSequemce");
+	if (ri) {
+	  pugi::xml_node ric = ri.child("referencedSOPInstanceUID");
+	  while (ric) {
+	    ReferencedImageSequence r;
+	    r.referencedSOPInstanceUID = ric.child_value();
+	    info.referencedImageSequence.push_back(r);
+	    ric = ric.next_sibling("referenceSOPInstanceIUID");
+	  }
+	}
+
 	h.measurementInformation = info;
       }
 
@@ -345,63 +379,14 @@ namespace ISMRMRD
 	h.acquisitionSystemInformation = info;
       }
 
-      if (parallelImaging) {
-	ParallelImaging info;
-	
-	pugi::xml_node accelerationFactor = parallelImaging.child("accelerationFactor");
-	if (!accelerationFactor) {
-	  throw std::runtime_error("Unable to accelerationFactor section in parallelImaging");
-	} else {
-	  info.accelerationFactor.kspace_encoding_step_1 = static_cast<unsigned short>(std::atoi(accelerationFactor.child_value("kspace_encoding_step_1")));
-	  info.accelerationFactor.kspace_encoding_step_2 = static_cast<unsigned short>(std::atoi(accelerationFactor.child_value("kspace_encoding_step_2")));
-	}
-
-	info.calibrationMode = parse_optional_string(parallelImaging,"calibrationMode");
-	info.interleavingDimension = parse_optional_string(parallelImaging,"interleavingDimension");
-	h.parallelImaging = info;
-      }
-
       if (sequenceParameters) {
 	SequenceParameters p;
 	p.TR = parse_vector_float(sequenceParameters,"TR");
 	p.TE = parse_vector_float(sequenceParameters,"TE");
 	p.TI = parse_vector_float(sequenceParameters,"TI");
-	h.sequenceParameters = p;
-      }
-
-      if (dicomParameters) { 
-	DicomParameters p;
-	p.studyInstanceUID = parse_string(dicomParameters,"studyInstanceUID");
-	p.seriesInstanceUIDRoot = parse_optional_string(dicomParameters,"seriesInstanceUIDRoot");
-	p.frameOfReferenceUID = parse_optional_string(dicomParameters,"frameOfReferenceUID");
+	p.flipAngle_deg = parse_vector_float(sequenceParameters, "flipAngle_deg");
 
-	//This part of the schema is totally messed up and needs to be fixed, but for now we will just read it. 
-	pugi::xml_node ri = dicomParameters.child("referencedImageSequemce");
-	if (ri) {
-	  pugi::xml_node ric = ri.child("referencedSOPInstanceUID");
-	  while (ric) {
-	    ReferencedImageSequence r;
-	    r.referencedSOPInstanceUID = ric.child_value();
-	    p.referencedImageSequence.push_back(r);
-	    ric = ric.next_sibling("referenceSOPInstanceIUID");
-	  }
-	}
-	
-	pugi::xml_node mrimageModule = dicomParameters.child("MRImageModule");
-	if (mrimageModule) {
-	  MRImageModule m;
-	  m.imageType = parse_optional_string(mrimageModule,"imageType");
-	  m.scanningSequence = parse_optional_string(mrimageModule, "scanningSequence");
-	  m.sequenceVariant = parse_optional_string(mrimageModule, "sequenceVariant");
-	  m.scanOptions = parse_optional_string(mrimageModule, "scanOptions");
-	  m.mrAcquisitionType = parse_optional_string(mrimageModule, "mrAcquisitionType");
-	  m.echoTrainLength = parse_optional_long(mrimageModule, "echoTrainLength");
-	  m.triggerTime = parse_optional_float(mrimageModule, "triggerTime");
-	  m.flipAngle_deg = parse_optional_float(mrimageModule, "flipAngle_deg");
-	  m.freqEncodingDirection = parse_optional_string(mrimageModule, "freqEncodingDirection");
-	  p.mrImageModule = m;
-	}
-	h.dicomParameters = p;
+	h.sequenceParameters = p;
       }
 
       if (userParameters) {
@@ -511,7 +496,7 @@ namespace ISMRMRD
   {
     pugi::xml_document doc;
     pugi::xml_node root = doc.append_child();
-    pugi::xml_node n1,n2;
+    pugi::xml_node n1,n2,n3;
     pugi::xml_attribute a;
 
     root.set_name("ismrmrdHeader");
@@ -547,6 +532,7 @@ namespace ISMRMRD
       append_optional_node(n1,"accessionNumber",h.studyInformation->accessionNumber);
       append_optional_node(n1,"referringPhysicianName",h.studyInformation->referringPhysicianName);
       append_optional_node(n1,"studyDescription",h.studyInformation->studyDescription);
+      append_optional_node(n1,"studyInstanceUID",h.studyInformation->studyInstanceUID);
     }
 
     if (h.measurementInformation) {
@@ -566,6 +552,18 @@ namespace ISMRMRD
 	append_node(n2,"dependencyType",h.measurementInformation->measurementDependency[i].dependencyType);
 	append_node(n2,"measurementID",h.measurementInformation->measurementDependency[i].measurementID);
       }
+      
+      append_optional_node(n1,"seriesInstanceUIDRoot",h.measurementInformation->seriesInstanceUIDRoot);
+      append_optional_node(n1,"frameOfReferenceUID",h.measurementInformation->frameOfReferenceUID);
+      
+      //TODO: Sort out stuff with this referenced image sequence. This is all messed up. 
+      if (h.measurementInformation->referencedImageSequence.size()) {
+	n2 = n1.append_child("referencedImageSequence");
+	for (size_t i = 0; i < h.measurementInformation->referencedImageSequence.size(); i++) {
+	  append_node(n2,"referencedSOPInstanceUID", h.measurementInformation->referencedImageSequence[i].referencedSOPInstanceUID);
+	}
+      }
+      
 
     }
 
@@ -613,15 +611,18 @@ namespace ISMRMRD
 	append_user_parameter(n2,"userParameterDouble",h.encoding[i].trajectoryDescription->userParameterDouble); 
 	append_optional_node(n2,"comment",h.encoding[i].trajectoryDescription->comment);
       }
-    }
 
-    if (h.parallelImaging) {
-      n1 = root.append_child("parallelImaging");
-      n2 = n1.append_child("accelerationFactor");
-      append_node(n2,"kspace_encoding_step_1",h.parallelImaging->accelerationFactor.kspace_encoding_step_1);
-      append_node(n2,"kspace_encoding_step_2",h.parallelImaging->accelerationFactor.kspace_encoding_step_2);
-      append_optional_node(n1, "calibrationMode", h.parallelImaging->calibrationMode);
-      append_optional_node(n1, "interleavingDimension", h.parallelImaging->interleavingDimension);
+      if (h.encoding[i].parallelImaging) {
+	n2 = n1.append_child("parallelImaging");
+	n3 = n2.append_child("accelerationFactor");
+	append_node(n3,"kspace_encoding_step_1",h.encoding[i].parallelImaging->accelerationFactor.kspace_encoding_step_1);
+	append_node(n3,"kspace_encoding_step_2",h.encoding[i].parallelImaging->accelerationFactor.kspace_encoding_step_2);
+	append_optional_node(n2, "calibrationMode", h.encoding[i].parallelImaging->calibrationMode);
+	append_optional_node(n2, "interleavingDimension", h.encoding[i].parallelImaging->interleavingDimension);
+      }
+
+      append_optional_node(n1, "echoTrainLength", h.encoding[i].echoTrainLength);
+
     }
 
     if (h.sequenceParameters) {
@@ -642,33 +643,8 @@ namespace ISMRMRD
       for (size_t i = 0; i < h.sequenceParameters->TI.size(); i++) {
 	append_node(n1,"TI",h.sequenceParameters->TI[i]);
       }
-    }
-
-    if (h.dicomParameters) {
-      n1 = root.append_child("dicomParameters");
-      append_node(n1, "studyInstanceUID", h.dicomParameters->studyInstanceUID);
-      append_optional_node(n1, "seriesInstanceUIDRoot",h.dicomParameters->seriesInstanceUIDRoot);
-      append_optional_node(n1, "frameOfReferenceUID", h.dicomParameters->frameOfReferenceUID);
-      
-      //TODO: Sort out stuff with this referenced image sequence. This is all messed up. 
-      if (h.dicomParameters->referencedImageSequence.size()) {
-	n2 = n1.append_child("referencedImageSequence");
-	for (size_t i = 0; i < h.dicomParameters->referencedImageSequence.size(); i++) {
-	  append_node(n2,"referencedSOPInstanceUID", h.dicomParameters->referencedImageSequence[i].referencedSOPInstanceUID);
-	}
-      }
-      
-      if (h.dicomParameters->mrImageModule) {
-	n2 = n1.append_child("MRImageModule");
-	append_optional_node(n2,"imageType",h.dicomParameters->mrImageModule->imageType);
-	append_optional_node(n2,"scanningSequence",h.dicomParameters->mrImageModule->scanningSequence);
-	append_optional_node(n2,"sequenceVariant",h.dicomParameters->mrImageModule->sequenceVariant);
-	append_optional_node(n2,"scanOptions",h.dicomParameters->mrImageModule->scanOptions);
-	append_optional_node(n2,"mrAcquisitionType",h.dicomParameters->mrImageModule->mrAcquisitionType);
-	append_optional_node(n2,"echoTrainLength",h.dicomParameters->mrImageModule->echoTrainLength);
-	append_optional_node(n2,"triggerTime",h.dicomParameters->mrImageModule->triggerTime);
-	append_optional_node(n2,"flipAngle_deg",h.dicomParameters->mrImageModule->flipAngle_deg);
-	append_optional_node(n2,"freqEncodingDirection",h.dicomParameters->mrImageModule->freqEncodingDirection);
+      for (size_t i = 0; i < h.sequenceParameters->flipAngle_deg.size(); i++) {
+	append_node(n1,"flipAngle_deg",h.sequenceParameters->flipAngle_deg[i]);
       }
     }
 
diff --git a/xml/ismrmrd_xml.h b/xml/ismrmrd_xml.h
index 0cc1365..1650c7b 100644
--- a/xml/ismrmrd_xml.h
+++ b/xml/ismrmrd_xml.h
@@ -100,6 +100,7 @@ namespace ISMRMRD
     Optional<long> accessionNumber;
     Optional<std::string> referringPhysicianName;
     Optional<std::string> studyDescription;
+    Optional<std::string> studyInstanceUID;
   };
 
   struct MeasurementDependency
@@ -108,6 +109,11 @@ namespace ISMRMRD
     std::string measurementID;
   };
 
+  struct ReferencedImageSequence
+  {
+    std::string referencedSOPInstanceUID;
+  };
+  
   struct MeasurementInformation
   {
     Optional<std::string> measurementID;
@@ -118,6 +124,9 @@ namespace ISMRMRD
     Optional<std::string> protocolName;
     Optional<std::string> seriesDescription;
     std::vector<MeasurementDependency> measurementDependency;
+    Optional<std::string> seriesInstanceUIDRoot;
+    Optional<std::string> frameOfReferenceUID;
+    std::vector<ReferencedImageSequence> referencedImageSequence;
   };
 
   
@@ -231,6 +240,19 @@ namespace ISMRMRD
     Optional<std::string> comment; 
   };
 
+  struct AccelerationFactor
+  {
+    unsigned short kspace_encoding_step_1;
+    unsigned short kspace_encoding_step_2;
+  };
+
+  struct ParallelImaging
+  {
+    AccelerationFactor accelerationFactor;
+    Optional<std::string> calibrationMode;
+    Optional<std::string> interleavingDimension;
+  };
+
   struct Encoding
   {
     EncodingSpace encodedSpace;
@@ -238,6 +260,8 @@ namespace ISMRMRD
     EncodingLimits encodingLimits;
     std::string trajectory;
     Optional<TrajectoryDescription> trajectoryDescription;
+    Optional<ParallelImaging> parallelImaging;
+    Optional<long> echoTrainLength;
   };
 
   struct SequenceParameters
@@ -245,51 +269,9 @@ namespace ISMRMRD
     std::vector<float> TR;
     std::vector<float> TE;
     std::vector<float> TI;
+    std::vector<float> flipAngle_deg;
   };
 
-  struct ReferencedImageSequence
-  {
-    std::string referencedSOPInstanceUID;
-  };
-  
-
-  struct MRImageModule
-  {
-    Optional<std::string> imageType;
-    Optional<std::string> scanningSequence;
-    Optional<std::string> sequenceVariant;
-    Optional<std::string> scanOptions;
-    Optional<std::string> mrAcquisitionType;
-    Optional<long> echoTrainLength;
-    Optional<float> triggerTime;
-    Optional<float> flipAngle_deg;
-    Optional<std::string> freqEncodingDirection;
-  };
-
-  struct DicomParameters
-  {
-    std::string studyInstanceUID;
-    Optional<std::string> seriesInstanceUIDRoot;
-    Optional<std::string> frameOfReferenceUID;
-    std::vector<ReferencedImageSequence> referencedImageSequence;
-    Optional<MRImageModule> mrImageModule;
-  };
-
-
-  struct AccelerationFactor
-  {
-    unsigned short kspace_encoding_step_1;
-    unsigned short kspace_encoding_step_2;
-  };
-
-  struct ParallelImaging
-  {
-    AccelerationFactor accelerationFactor;
-    Optional<std::string> calibrationMode;
-    Optional<std::string> interleavingDimension;
-  };
-
-
   struct IsmrmrdHeader
   {
     Optional<SubjectInformation> subjectInformation;
@@ -298,9 +280,7 @@ namespace ISMRMRD
     Optional<AcquisitionSystemInformation> acquisitionSystemInformation;
     ExperimentalConditions experimentalConditions;
     std::vector<Encoding> encoding;
-    Optional<ParallelImaging> parallelImaging;
     Optional<SequenceParameters> sequenceParameters;
-    Optional<DicomParameters> dicomParameters;
     Optional<UserParameters> userParameters;    
   };
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/ismrmrd.git



More information about the debian-science-commits mailing list