[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