DYTSrouce/Tool/3rdParty_x64/include/dcmtk/dcmsr/dsrdoc.h
2024-11-22 23:19:31 +08:00

1356 lines
69 KiB
C++

/*
*
* Copyright (C) 2000-2016, OFFIS e.V.
* All rights reserved. See COPYRIGHT file for details.
*
* This software and supporting documentation were developed by
*
* OFFIS e.V.
* R&D Division Health
* Escherweg 2
* D-26121 Oldenburg, Germany
*
*
* Module: dcmsr
*
* Author: Joerg Riesmeier
*
* Purpose:
* classes: DSRDocument
*
*/
#ifndef DSRDOC_H
#define DSRDOC_H
#include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */
#include "dcmtk/dcmsr/dsrdoctr.h"
#include "dcmtk/dcmsr/dsrrtpl.h"
#include "dcmtk/dcmsr/dsrsoprf.h"
#include "dcmtk/dcmsr/dsrrefin.h"
#include "dcmtk/dcmsr/dsrcsidl.h"
#include "dcmtk/dcmdata/dcvrcs.h"
#include "dcmtk/dcmdata/dcvrda.h"
#include "dcmtk/dcmdata/dcvris.h"
#include "dcmtk/dcmdata/dcvrlo.h"
#include "dcmtk/dcmdata/dcvrpn.h"
#include "dcmtk/dcmdata/dcvrsh.h"
#include "dcmtk/dcmdata/dcvrtm.h"
#include "dcmtk/dcmdata/dcvrui.h"
#include "dcmtk/ofstd/ofstream.h"
/*---------------------*
* class declaration *
*---------------------*/
/** Interface class for 'dcmsr' (DICOM Structured Reporting Documents).
* This class supports reading, writing, creation, printing and rendering of DICOM
* Structured Reporting (SR) documents.
* The list of supported SOP classes is available in file "dsrtypes.h". Also see
* DSRTypes::E_DocumentType.
*/
class DCMTK_DCMSR_EXPORT DSRDocument
: protected DSRTypes
{
public:
// --- constructors and destructor ---
/** (default) constructor.
* The parameter 'documentType' is optional and has a default value.
** @param documentType type of the SR document (see DSRTypes::E_DocumentType)
*/
DSRDocument(const E_DocumentType documentType = DT_BasicTextSR);
/** destructor
*/
virtual ~DSRDocument();
// --- misc routines ---
/** clear all internal member variables
*/
virtual void clear();
/** check whether the current internal state is valid.
* The SR document is valid if the corresponding document tree is valid and
* the SOP instance UID as well as the SOP class UID are not "empty".
** @return OFTrue if valid, OFFalse otherwise
*/
virtual OFBool isValid();
/** check whether the document is finalized.
* A new document is originally not finalized but can be finalized using the method
* finalizeDocument(). This flag is e.g. used to indicate whether the entire document
* is digitally signed and, therefore, each newly added verifying observer would corrupt
* all previous signatures.
** @return OFTrue if finalized, OFFalse otherwise
*/
virtual OFBool isFinalized() const;
// --- input and output ---
/** print current SR document to specified output stream.
* The output format is identical to that of the dsrdump command line tool.
** @param stream output stream (e.g.\ COUT from "ofconsol.h")
* @param flags optional flag used to customize the output (see DSRTypes::PF_xxx)
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition print(STD_NAMESPACE ostream &stream,
const size_t flags = 0);
/** read SR document from DICOM dataset.
* Please note that the current document is also deleted if the reading process fails.
* If logging is enabled, the reason for any error might be obtained from the log output.
* Also warning and debug messages are reported if the respective logger is enabled.
** @param dataset reference to DICOM dataset from which the document should be read
* @param flags optional flag used to customize the reading process (see DSRTypes::RF_xxx).
* E.g. RF_readDigitalSignatures indicates whether to read the digital
* signatures from the dataset or not. If set, the MACParametersSequence
* and the DigitalSignaturesSequence are read for the general document
* header (equivalent to top-level content item) and each content item
* of the document tree.
* If not removed manually (with DSRDocumentTree::removeSignatures())
* the signatures are written back to the dataset when the write() method
* is called.
* Please note that the two signature sequences for any other sequence
* (e.g. VerifyingObserver or PredecessorDocuments) are never read.
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition read(DcmItem &dataset,
const size_t flags = 0);
/** read patient data from DICOM dataset.
* The list of data elements that are read can be found under "Patient Module" in the
* member variable section of this class. Other data is not changed, so be careful
* when using this method.
* @param dataset reference to DICOM dataset from which the data should be read
* @param flags optional flag used to customize the reading process (see DSRTypes::RF_xxx)
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition readPatientData(DcmItem &dataset,
const size_t flags = 0);
/** read study data from DICOM dataset. Also reads patient data.
* The list of data elements that are read can be found under "Patient Module" and
* "General Study Module" in the member variable section of this class. Other data
* is not changed, so be careful when using this method.
* @param dataset reference to DICOM dataset from which the data should be read
* @param flags optional flag used to customize the reading process (see DSRTypes::RF_xxx)
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition readStudyData(DcmItem &dataset,
const size_t flags = 0);
/** write current SR document to DICOM dataset.
* Please note that the ContentTemplateSequence for the root content item is not written
* automatically for particular SOP Classes (e.g. Key Object Selection Document).
* Instead, the template identification has to be set manually for the root CONTAINER
* (see DSRDocumentTreeNode::setTemplateIdentification()). This is because the template
* constraints cannot be checked yet.
* If logging is enabled, warning and debug messages are reported to the log output.
** @param dataset reference to DICOM dataset to which the current document should be
* written. The 'dataset' is not cleared before writing to it!
* @param markedItems optional stack where pointers to all 'marked' content items
* (DICOM datasets/items) are added to during the write process.
* Can be used to digitally sign parts of the document tree.
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition write(DcmItem &dataset,
DcmStack *markedItems = NULL);
/** read SR document from XML file.
* The format (Schema) of the XML document is expected to conform to the output format
* of the writeXML() method. In addition, the document can be validated against an XML
* Schema by setting the flag XF_validateSchema.
* Digital signatures in the XML document are not yet supported.
* Please note that the current document is also deleted if the parsing process fails.
** @param filename name of the file from which the XML document is read ("-" for stdin)
* @param flags optional flag used to customize the reading process (see DSRTypes::XF_xxx)
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition readXML(const OFString &filename,
const size_t flags = 0);
/** write current SR document in XML format.
* The output format is identical to that of the dsr2xml command line tool. Digital
* signatures in the XML document are not yet supported.
** @param stream output stream to which the XML document is written
* @param flags optional flag used to customize the output (see DSRTypes::XF_xxx)
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition writeXML(STD_NAMESPACE ostream &stream,
const size_t flags = 0);
/** render current SR document in HTML/XHTML format.
* The output format is identical to that of the dsr2html command line tool.
** @param stream output stream to which the HTML/XHTML document is written
* @param flags optional flag used to customize the output (see DSRTypes::HF_xxx)
* @param styleSheet optional filename/URL of a Cascading Style Sheet (CSS)
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition renderHTML(STD_NAMESPACE ostream &stream,
const size_t flags = 0,
const char *styleSheet = NULL);
// --- get/set misc attributes ---
/** get the current SR document type
** @return document type (might be DT_invalid if read from dataset)
*/
virtual E_DocumentType getDocumentType() const;
/** get document tree
** @return reference to the document tree
*/
inline DSRDocumentTree &getTree()
{
return DocumentTree;
}
/** set document tree.
* Replace the currently stored document tree with the given one. Please note that the
* given 'tree' is checked before setting it, i.e. only a valid document tree is accepted.
* However, a new SOP instance is never created. If needed, this has to be done with
* createNewSOPInstance() in addition to or with createNewDocument() before this method
* is called.
** @param tree document tree to be set (content will be copied)
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setTree(const DSRDocumentTree &tree);
/** set document tree from root template.
* Replace the currently stored document tree with the one from the given root template.
* By default, this method expands the tree, i.e. instances of DSRIncludedTemplateTreeNode
* that were added to the tree with DSRDocumentSubTree::includeTemplate() are replaced by
* their content, i.e. by the internally managed subtree.
* Please note that the additional comments on the above setTree() method also apply.
** @param rootTemplate template specifying the document tree to be set (content will be
* copied). This parameter cannot be "const" because of
* DSRRootTemplate::getTree(), which is called internally and which
* modifies the tree.
* @param expandTree optional flag that allows for disabling the expanding of the
* document tree before setting it. Please note that various
* output methods like write() or renderHTML() do not yet work on
* such trees.
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setTreeFromRootTemplate(DSRRootTemplate &rootTemplate,
const OFBool expandTree = OFTrue);
/** get specific character set type.
* If the type is unknown, the original DICOM defined term can be retrieved
* with the method getSpecificCharacterSet().
** @return character set (might be CS_invalid/unknown if not supported)
*/
virtual E_CharacterSet getSpecificCharacterSetType() const;
/** set specific character set type.
* The DICOM defined term (see member variable SpecificCharacterSet) is set accordingly.
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setSpecificCharacterSetType(const E_CharacterSet characterSet);
/** get document preliminary flag.
* @note Not applicable to Key Object Selection Documents.
** @return preliminary flag (might be PF_invalid if not specified)
*/
virtual E_PreliminaryFlag getPreliminaryFlag() const;
/** set document preliminary flag.
* According to the DICOM standard, the concept of "completeness" is independent of the
* concept of "preliminary" or "final". Therefore, this flag can be specified separately.
* @note Not applicable to Key Object Selection Documents.
** @param flag preliminary flag to be set (use PF_invalid to omit this optional value)
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setPreliminaryFlag(const E_PreliminaryFlag flag);
/** get document completion flag.
* According to the DICOM standard, this flag describes the estimated degree of completeness
* of an SR Document. See DICOM standard for details.
* @note Not applicable to Key Object Selection Documents.
** @return completion flag (might be CF_invalid if read from dataset)
*/
virtual E_CompletionFlag getCompletionFlag() const;
/** get document verification flag.
* @note Not applicable to Key Object Selection Documents.
** @return verification flag (might be VF_invalid if read from dataset)
*/
virtual E_VerificationFlag getVerificationFlag() const;
/** get number of verifying observers.
* A document can be verified more than once. The verification flag should be VERIFIED
* if any verifying observer is specified. The details on the observer can be retrieved
* using the getVerifyingObserver() methods.
* @note Not applicable to Key Object Selection Documents.
** @return number of verifying observers (if any), 0 otherwise
*/
virtual size_t getNumberOfVerifyingObservers();
/** get information about a verifying observer.
* All reference variables are cleared before the information is retrieved, i.e. if an error
* occurs (return value != EC_Normal) non-empty variables do contain valid (empty) data.
* @note Not applicable to Key Object Selection Documents.
** @param idx index of the verifying observer to be retrieved (starting with 1).
* Use getNumberOfVerifyingObservers() to get the maximum value.
* @param dateTime reference to variable where the date and time when this document
* has been verified should be stored (required)
* @param observerName reference to variable where the name of the person who has verified
* this document should be stored (required)
* @param organization reference to variable where the name of the organization to which
* the observer belongs should be stored (required)
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getVerifyingObserver(const size_t idx,
OFString &dateTime,
OFString &observerName,
OFString &organization);
/** get information about a verifying observer.
* All reference variables are cleared before the information is retrieved, i.e. if an error
* occurs (return value != EC_Normal) non-empty variables do contain valid (empty) data.
* @note Not applicable to Key Object Selection Documents.
** @param idx index of the verifying observer to be retrieved (starting with 1).
* Use getNumberOfVerifyingObservers() to get the maximum value.
* @param dateTime reference to variable where the date and time when this document
* has been verified should be stored (required)
* @param observerName reference to variable where the name of the person who has verified
* this document should be stored (required)
* @param observerCode reference to variable where the observer code should be stored.
* code identifying the verifying observer (optional, see previous method)
* @param organization reference to variable where the name of the organization to which
* the observer belongs should be stored (required)
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getVerifyingObserver(const size_t idx,
OFString &dateTime,
OFString &observerName,
DSRCodedEntryValue &observerCode,
OFString &organization);
/** get list of predecessor documents.
* A document can have more than one (direct) predecessor document. This is e.g. the case
* when two or more documents have been merged to create it. The corresponding method
* createRevisedVersion() automatically adds a reference to the current document.
* The DICOM standard states: "[The Predecessor Documents Sequence] Shall refer to SR SOP
* Instances (e.g. prior or provisional reports) whose content has been wholly or partially
* included in this document with or without modification." and "[...] the use of the
* Predecessor Document Sequence allows tracing back to the input SR Document, which in this
* case is the previous version."
* @note Not applicable to Key Object Selection Documents.
** @return reference to list object
*/
virtual DSRSOPInstanceReferenceList &getPredecessorDocuments();
/** get list of identical documents.
* Please note that currently the user is responsible for filling and modifying the content of
* this list. However, the list is automatically cleared when a new instance is created (incl.
* a revised version of the current document). Possibly, there will be a createDuplicate()
* method or the like in the future which creates an identical copy of the current document in
* a new study/series.
* The DICOM standard states: "If identical copies of an SR Document are to be included in
* multiple Studies then the entire SR Document shall be duplicated with appropriate changes
* for inclusion into the different Studies (i.e. Study Instance UID, Series Instance UID, SOP
* Instance UID, Identical Documents Sequence etc.). The Identical Documents Sequence Attribute
* in each SOP Instance shall contain references to all other duplicate SOP Instances."
** @return reference to list object
*/
virtual DSRSOPInstanceReferenceList &getIdenticalDocuments();
/** get list of referenced SOP instances (Current Requested Procedure Evidence).
* The DICOM standard states: "The intent of the Current Requested Procedure Evidence Sequence
* is to reference all evidence created in order to satisfy the current Requested Procedure(s)
* for this SR Document. This shall include, but is not limited to, all current evidence
* referenced in the content tree." and "For a completed SR Document satisfying (i.e., being
* the final report for) the current Requested Procedure(s), this sequence shall list the full
* set of Composite SOP Instances created for the current Requested Procedure(s). For other
* SOP Instances that include the SR Document General Module, this sequence shall contain at
* minimum the set of Composite SOP Instances from the current Requested Procedure(s) that are
* referenced in the content tree." and "In the context of the Key Object Selection, the
* current evidence is considered to be only the set of instances referenced within the Key
* Object Selection."
** @return reference to list object
*/
virtual DSRSOPInstanceReferenceList &getCurrentRequestedProcedureEvidence();
/** get list of referenced SOP instances (Pertinent Other Evidence).
* The DICOM standard states: "The Pertinent Other Evidence Sequence attribute is used to
* reference all other evidence considered pertinent for this SR Document that is not listed
* in the Current Requested Procedure Evidence Sequence. This requires that the same SOP
* Instance shall not be referenced in both of these Sequences."
* @note Not applicable to Key Object Selection Documents.
** @return reference to list object
*/
virtual DSRSOPInstanceReferenceList &getPertinentOtherEvidence();
/** get list of referenced SOP instances significantly related to the current SOP instance.
* The DICOM standard states: "Such referenced Instances may include equivalent documents or
* renderings of this document. [...] Required if the identity of a CDA Document equivalent
* to the current SOP Instance is known at the time of creation of this SOP instance. May be
* present otherwise." Note: An equivalent rendering of the document might be provided as an
* "Encapsulated PDF" DICOM object.
* @note Not applicable to Key Object Selection Documents.
** @return reference to list object
*/
virtual DSRReferencedInstanceList &getReferencedInstances();
/** get list of coding schemes used (Coding Scheme Identification).
* The Coding Scheme Identification Sequence maps Coding Scheme Designators to an external coding
* system registration, or to a private or local coding scheme. See DICOM standard for details.
** @return reference to list object
*/
virtual DSRCodingSchemeIdentificationList &getCodingSchemeIdentification();
// --- get DICOM string attributes ---
/** get specific character set
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getSpecificCharacterSet(OFString &value,
const signed long pos = 0) const;
/** get completion flag description.
* @note Not applicable to Key Object Selection Documents.
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getCompletionFlagDescription(OFString &value,
const signed long pos = 0) const;
/** get modality
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getModality(OFString &value,
const signed long pos = 0) const;
/** get SOP class UID
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getSOPClassUID(OFString &value,
const signed long pos = 0) const;
/** get study instance UID
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getStudyInstanceUID(OFString &value,
const signed long pos = 0) const;
/** get series instance UID
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getSeriesInstanceUID(OFString &value,
const signed long pos = 0) const;
/** get SOP instance UID
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getSOPInstanceUID(OFString &value,
const signed long pos = 0) const;
/** get instance creator UID
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getInstanceCreatorUID(OFString &value,
const signed long pos = 0) const;
/** get patient's name
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getPatientName(OFString &value,
const signed long pos = 0) const;
/** get patient's birth date
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getPatientBirthDate(OFString &value,
const signed long pos = 0) const;
/** get patient's sex
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getPatientSex(OFString &value,
const signed long pos = 0) const;
/** get referring physician's name
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getReferringPhysicianName(OFString &value,
const signed long pos = 0) const;
/** get study description
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getStudyDescription(OFString &value,
const signed long pos = 0) const;
/** get series description
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getSeriesDescription(OFString &value,
const signed long pos = 0) const;
/** get protocol name
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getProtocolName(OFString &value,
const signed long pos = 0) const;
/** get manufacturer
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getManufacturer(OFString &value,
const signed long pos = 0) const;
/** get manufacturer's model name
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getManufacturerModelName(OFString &value,
const signed long pos = 0) const;
/** get device serial number
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getDeviceSerialNumber(OFString &value,
const signed long pos = 0) const;
/** get software version(s). Please note that only the first component is returned.
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getSoftwareVersions(OFString &value,
const signed long pos = 0) const;
/** get study date
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getStudyDate(OFString &value,
const signed long pos = 0) const;
/** get study time
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getStudyTime(OFString &value,
const signed long pos = 0) const;
/** get series date
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getSeriesDate(OFString &value,
const signed long pos = 0) const;
/** get series time
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getSeriesTime(OFString &value,
const signed long pos = 0) const;
/** get instance creation date
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getInstanceCreationDate(OFString &value,
const signed long pos = 0) const;
/** get instance creation time
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getInstanceCreationTime(OFString &value,
const signed long pos = 0) const;
/** get content date
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getContentDate(OFString &value,
const signed long pos = 0) const;
/** get content time
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getContentTime(OFString &value,
const signed long pos = 0) const;
/** get study ID
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getStudyID(OFString &value,
const signed long pos = 0) const;
/** get patient ID
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getPatientID(OFString &value,
const signed long pos = 0) const;
/** get series number
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getSeriesNumber(OFString &value,
const signed long pos = 0) const;
/** get instance number
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getInstanceNumber(OFString &value,
const signed long pos = 0) const;
/** get accession number
** @param value reference to variable in which the value should be stored
* @param pos index of the value to get (0..vm-1), -1 for all components
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition getAccessionNumber(OFString &value,
const signed long pos = 0) const;
// --- set DICOM string attributes ---
/** set specific character set. The internal enumerated value is set accordingly.
* Please note that this method does not return an error if the given 'value' is not
* defined by the DICOM standard or not supported by this class, e.g. when no mapping
* to the character set names needed for HTML/XHTML or XML output is defined.
* If needed, check the return value of the method getSpecificCharacterSetType() for
* DSRTypes::CS_invalid or DSRTypes::CS_unknown after calling this method.
** @param value value to be set (single or multiple values) or "" for no value
* @param check check 'value' for conformance with VR (CS) and VM (1-n) if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setSpecificCharacterSet(const OFString &value,
const OFBool check = OFTrue);
/** set completion flag description.
* @note Not applicable to Key Object Selection Documents.
** @param value explanation of the value that is set for completion flag. If an empty
* string is passed, the description is removed from the dataset (type 3).
* @param check check 'value' for conformance with VR (LO) and VM (1) if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setCompletionFlagDescription(const OFString &value,
const OFBool check = OFTrue);
/** set patient's name
** @param value value to be set (single value only) or "" for no value
* @param check check 'value' for conformance with VR (PN) and VM (1) if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setPatientName(const OFString &value,
const OFBool check = OFTrue);
/** set patient's birth date
** @param value value to be set (single value only) or "" for no value
* @param check check 'value' for conformance with VR (DA) and VM (1) if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setPatientBirthDate(const OFString &value,
const OFBool check = OFTrue);
/** set patient's sex
** @param value value to be set (single value only) or "" for no value
* @param check check 'value' for conformance with VR (CS) and VM (1) if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setPatientSex(const OFString &value,
const OFBool check = OFTrue);
/** set referring physician's name
** @param value value to be set (single value only) or "" for no value
* @param check check 'value' for conformance with VR (PN) and VM (1) if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setReferringPhysicianName(const OFString &value,
const OFBool check = OFTrue);
/** set study description
** @param value value to be set (single value only) or "" for no value
* @param check check 'value' for conformance with VR (LO) and VM (1) if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setStudyDescription(const OFString &value,
const OFBool check = OFTrue);
/** set series description
** @param value value to be set (single value only) or "" for no value
* @param check check 'value' for conformance with VR (LO) and VM (1) if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setSeriesDescription(const OFString &value,
const OFBool check = OFTrue);
/** set protocol name
** @param value value to be set (single value only) or "" for no value
* @param check check 'value' for conformance with VR (LO) and VM (1) if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setProtocolName(const OFString &value,
const OFBool check = OFTrue);
/** set manufacturer
** @param value value to be set (single value only) or "" for no value
* @param check check 'value' for conformance with VR (LO) and VM (1) if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setManufacturer(const OFString &value,
const OFBool check = OFTrue);
/** set manufacturer's model name
** @param value value to be set (single value only) or "" for no value
* @param check check 'value' for conformance with VR (LO) and VM (1) if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setManufacturerModelName(const OFString &value,
const OFBool check = OFTrue);
/** set device serial number
** @param value value to be set (single value only) or "" for no value
* @param check check 'value' for conformance with VR (LO) and VM (1) if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setDeviceSerialNumber(const OFString &value,
const OFBool check = OFTrue);
/** set software version(s)
** @param value value to be set (possibly multi-valued) or "" for no value
* @param check check 'value' for conformance with VR (LO) and VM (1-n) if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setSoftwareVersions(const OFString &value,
const OFBool check = OFTrue);
/** set content date
** @param value value to be set (single value only). If an empty string is passed,
* the current date is set when displaying or writing the document since
* the corresponding DICOM attribute is mandatory.
* @param check check 'value' for conformance with VR (DA) and VM (1) if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setContentDate(const OFString &value,
const OFBool check = OFTrue);
/** set content time
** @param value value to be set (single value only). If an empty string is passed,
* the current time is set when displaying or writing the document since
* the corresponding DICOM attribute is mandatory.
* @param check check 'value' for conformance with VR (TM) and VM (1) if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setContentTime(const OFString &value,
const OFBool check = OFTrue);
/** set study date
** @param value value to be set (single value only) or "" for no value
* @param check check 'value' for conformance with VR (DA) and VM (1) if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setStudyDate(const OFString &value,
const OFBool check = OFTrue);
/** set study time
** @param value value to be set (single value only) or "" for no value
* @param check check 'value' for conformance with VR (TM) and VM (1) if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setStudyTime(const OFString &value,
const OFBool check = OFTrue);
/** set series date
** @param value value to be set (single value only) or "" for no value
* @param check check 'value' for conformance with VR (DA) and VM (1) if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setSeriesDate(const OFString &value,
const OFBool check = OFTrue);
/** set series time
** @param value value to be set (single value only) or "" for no value
* @param check check 'value' for conformance with VR (TM) and VM (1) if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setSeriesTime(const OFString &value,
const OFBool check = OFTrue);
/** set study ID
** @param value value to be set (single value only) or "" for no value
* @param check check 'value' for conformance with VR (SH) and VM (1) if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setStudyID(const OFString &value,
const OFBool check = OFTrue);
/** set patient ID
** @param value value to be set (single value only) or "" for no value
* @param check check 'value' for conformance with VR (LO) and VM (1) if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setPatientID(const OFString &value,
const OFBool check = OFTrue);
/** set series number
** @param value value to be set (single value only). If an empty string is passed,
* the value "1" is set when displaying or writing the document since
* the corresponding DICOM attribute is mandatory.
* @param check check 'value' for conformance with VR (IS) and VM (1) if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setSeriesNumber(const OFString &value,
const OFBool check = OFTrue);
/** set instance number
** @param value value to be set (single value only). If an empty string is passed,
* the value "1" is set when displaying or writing the document since
* the corresponding DICOM attribute is mandatory.
* @param check check 'value' for conformance with VR (IS) and VM (1) if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setInstanceNumber(const OFString &value,
const OFBool check = OFTrue);
/** set accession number
** @param value value to be set (single value only) or "" for no value
* @param check check 'value' for conformance with VR (SH) and VM (1) if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition setAccessionNumber(const OFString &value,
const OFBool check = OFTrue);
// --- document management functions ---
/** create new study.
* After generating a new study instance UID the method createNewSeries() is called,
* i.e. also a new series instance UID and SOP instance UID are generated. This is
* a requirement of the DICOM standard. All other study-related attributes are
* cleared.
*/
virtual void createNewStudy();
/** create a new series.
* After generating a new series instance UID the method createNewSOPInstance() is
* called, i.e. also a new SOP instance UID is generated. This is a requirement of
* the DICOM standard. All other series-related attributes are cleared.
*/
virtual void createNewSeries();
/** create a new series within a given study.
* After generating a new series instance UID within the given study the method
* createNewSOPInstance() is called, i.e. also a SOP instance UID is generated.
* This is a requirement of the DICOM standard.
* NB: There is no mechanism that makes sure that the study-related attributes are
* consistent for all series of a study. This either has to be done manually
* or readStudyData() should be used in combination with createNewSeries().
** @param studyUID study instance UID to be set (should be a valid UID)
* @param check check 'studyUID' for conformance with VR and VM if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition createNewSeriesInStudy(const OFString &studyUID,
const OFBool check = OFTrue);
/** create a new SOP instance.
* Generate a new SOP instance UID, set the instance creation date/time and reset the
* finalized flag (OFFalse).
* This method is used internally for createNewDocument(), createRevisedVersion()
* and during object initialization.
* It could also be used explicitly from the calling application if a new UID should
* be created (this is the case if the study instance UID or series instance UID has
* changed as well as any other attribute within the SR Document General Module or
* SR Document Content Module, see DICOM standard for details).
* This method also updates other DICOM header attributes (by calling updateAttributes()).
* However, instance-level attributes other than the SOP instance UID are usually not
* changed (if already set), e.g. the current instance number or content date/time.
*/
virtual void createNewSOPInstance();
/** create a new document.
* A new SOP instance is only created if the current document type was valid/supported.
* Please note that the current document is deleted (cleared).
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition createNewDocument();
/** create a new document of the specified type.
* A new SOP instance is only created if the current document type was valid/supported.
* Please note that the current document is deleted by this method.
** @param documentType type of the new SR document (see DSRTypes::E_DocumentType)
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition createNewDocument(const E_DocumentType documentType);
/** change the type of the current document.
* Please note that only the type of the SR document is changed (if possible) but no new
* SOP instance is created. If needed, this has to be done with createNewSOPInstance()
* in addition to this method or by calling createNewDocument() instead of this method.
* Before changing the document type, it is checked whether the currently stored document
* tree complies with the relationship content constraints of the new SR IOD.
** @param documentType new type of the SR document (see DSRTypes::E_DocumentType)
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition changeDocumentType(const E_DocumentType documentType);
/** create a revised version of the current document.
* A revised version can only be created if the current document is already completed
* (see completion flag). If so, a reference to the current document is added to the
* predecessor documents sequence. If all revised versions of a SR document are
* stored (written to datasets/files) it is possible to trace back the full chain of
* previous versions.
* A new SOP instance is created and the content date/time are set automatically.
* Furthermore, the verifying observer and identical documents sequence are deleted,
* the verification flag is set to UNVERIFIED, the completion flag is set to PARTIAL
* (i.e. not complete), the completion flag description is deleted, all digital
* signatures contained in the document tree are deleted and the finalized flag is
* reset (OFFalse). The preliminary flag is not modified by this method. Also the
* various lists of referenced instances remain unchanged, i.e. they have to be
* adapted manually if needed.
* @note Not applicable to Key Object Selection Documents.
* @param clearList clear list of predecessor documents before adding the current
* document if OFTrue. Append current document to existing list
* otherwise.
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition createRevisedVersion(const OFBool clearList = OFTrue);
/** complete the current document.
* Sets the completion flag to COMPLETE if not already done (fails otherwise). This flag
* describes the estimated degree of completeness of an SR Document (see DICOM standard
* for details). The completion flag description is set to an empty string (i.e. absent
* in DICOM dataset).
* @note Not applicable to Key Object Selection Documents.
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition completeDocument();
/** complete the current document and set a completion description.
* Sets the completion flag to COMPLETE if not already done (fails otherwise). This flag
* describes the estimated degree of completeness of an SR Document (see DICOM standard
* for details). The completion flag description can be modified independently from the
* flag by means of the method setCompletionFlagDescription() - see above.
* @note Not applicable to Key Object Selection Documents.
** @param description explanation of the value set for completion flag.
* (optional, see previous method, VR=LO)
* @param check check 'description' for conformance with VR and VM if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition completeDocument(const OFString &description,
const OFBool check = OFTrue);
/** verify the current document by a specific observer.
* A document can be verified more than once. The observer information is added to a
* sequence stored in the dataset. The verification flag is automatically set to
* VERIFIED (if not already done) and the finalized flag is reset (set to OFFalse).
* Please note that only completed documents (see completion flag) can be verified and that
* a new SOP instance UID has to be generated (manually) according to the DICOM standard when
* creating a dataset/file from this document.
* @note Not applicable to Key Object Selection Documents.
** @param observerName name of the person who has verified this document (required, VR=PN)
* @param organization name of the organization to which the observer belongs (required, VR=LO)
* @param dateTime verification date time (optional). If empty/absent the current date and
* time are used.
* @param check check 'observerName', 'organization' and 'dateTime' for conformance with
* VR and VM if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition verifyDocument(const OFString &observerName,
const OFString &organization,
const OFString &dateTime = "",
const OFBool check = OFTrue);
/** verify the current document by a specific observer.
* A document can be verified more than once. The observer information is added to a
* sequence stored in the dataset. The verification flag is automatically set to
* VERIFIED (if not already done) and the finalized flag is reset (set to OFFalse).
* Please note that only completed documents (see completion flag) can be verified and that
* a new SOP instance UID has to be generated (manually) according to the DICOM standard when
* creating a dataset/file from this document.
* @note Not applicable to Key Object Selection Documents.
** @param observerName name of the person who has verified this document (required, VR=PN)
* @param observerCode code identifying the verifying observer (optional, see previous method)
* @param organization name of the organization to which the observer belongs (required, VR=LO)
* @param dateTime verification date time (optional). If empty/absent the current date and
* time are used.
* @param check check 'observerName', 'observerCode', 'organization' and 'dateTime' for
* conformance with VR and VM if enabled
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition verifyDocument(const OFString &observerName,
const DSRCodedEntryValue &observerCode,
const OFString &organization,
const OFString &dateTime = "",
const OFBool check = OFTrue);
/** remove verification information.
* The list of verifying observers is cleared, the verification flag is set to UNVERIFIED and
* the finalized flag is reset (set to OFFalse).
* Normally, there should be no need to call this method. On the other hand, it is useful to
* guarantee a consistent state when processing documents which have not been created with this
* module/toolkit.
*/
virtual void removeVerification();
/** finalize the current state of the document.
* A new document is originally not finalized but can be finalized using this method.
* This internal flag is e.g. used to indicate whether the entire document is digitally signed
* and, therefore, each newly added verifying observer would corrupt all previous signatures.
* NB: A document needs to be completed first in order to be finalized. Some of the above
* document management functions do reset the flag (i.e. set the FinalizedFlag to OFFalse),
* other methods (e.g. setXXX) do not change the flag though the state of the document is
* not finalized any more after they have been called.
* @note Not applicable to Key Object Selection Documents since there's no completion flag in
* this type of SR document. Please note that this method has nothing to do with the
* preliminary flag.
** @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition finalizeDocument();
protected:
/** read XML document header
** @param doc document containing the XML file content
* @param cursor cursor pointing to the starting node
* @param flags flag used to customize the reading process (see DSRTypes::XF_xxx)
** @return status, EC_Normal if successful, an error code otherwise
*/
OFCondition readXMLDocumentHeader(DSRXMLDocument &doc,
DSRXMLCursor cursor,
const size_t flags);
/** read XML "patient" data
** @param doc document containing the XML file content
* @param cursor cursor pointing to the starting node
* @param flags flag used to customize the reading process (see DSRTypes::XF_xxx)
** @return status, EC_Normal if successful, an error code otherwise
*/
OFCondition readXMLPatientData(const DSRXMLDocument &doc,
DSRXMLCursor cursor,
const size_t flags);
/** read XML "study" data
** @param doc document containing the XML file content
* @param cursor cursor pointing to the starting node
* @param flags flag used to customize the reading process (see DSRTypes::XF_xxx)
** @return status, EC_Normal if successful, an error code otherwise
*/
OFCondition readXMLStudyData(const DSRXMLDocument &doc,
DSRXMLCursor cursor,
const size_t flags);
/** read XML "series" data
** @param doc document containing the XML file content
* @param cursor cursor pointing to the starting node
* @param flags flag used to customize the reading process (see DSRTypes::XF_xxx)
** @return status, EC_Normal if successful, an error code otherwise
*/
OFCondition readXMLSeriesData(const DSRXMLDocument &doc,
DSRXMLCursor cursor,
const size_t flags);
/** read XML "instance" data
** @param doc document containing the XML file content
* @param cursor cursor pointing to the starting node
* @param flags flag used to customize the reading process (see DSRTypes::XF_xxx)
** @return status, EC_Normal if successful, an error code otherwise
*/
OFCondition readXMLInstanceData(const DSRXMLDocument &doc,
DSRXMLCursor cursor,
const size_t flags);
/** read XML "document" data
** @param doc document containing the XML file content
* @param cursor cursor pointing to the starting node
* @param flags flag used to customize the reading process (see DSRTypes::XF_xxx)
** @return status, EC_Normal if successful, an error code otherwise
*/
OFCondition readXMLDocumentData(const DSRXMLDocument &doc,
DSRXMLCursor cursor,
const size_t flags);
/** read XML verifying observer data
** @param doc document containing the XML file content
* @param cursor cursor pointing to the starting node
* @param flags flag used to customize the reading process (see DSRTypes::XF_xxx)
** @return status, EC_Normal if successful, an error code otherwise
*/
OFCondition readXMLVerifyingObserverData(const DSRXMLDocument &doc,
DSRXMLCursor cursor,
const size_t flags);
/** render patient name, sex, birthdate and ID in HTML/XHTML format
** @param stream output stream to which the HTML/XHTML document is written
* @param flags flag used to customize the output (see DSRTypes::HF_xxx)
*/
void renderHTMLPatientData(STD_NAMESPACE ostream &stream,
const size_t flags);
/** render list of referenced SOP instances in HTML/XHTML format
** @param stream output stream to which the HTML/XHTML document is written
* @param refList list of referenced SOP instances to be rendered
* @param flags flag used to customize the output (see DSRTypes::HF_xxx)
*/
void renderHTMLReferenceList(STD_NAMESPACE ostream &stream,
DSRSOPInstanceReferenceList &refList,
const size_t flags);
/** render list of referenced SOP instances in HTML/XHTML format
** @param stream output stream to which the HTML/XHTML document is written
* @param refList list of referenced SOP instances to be rendered
* @param flags flag used to customize the output (see DSRTypes::HF_xxx)
*/
void renderHTMLReferenceList(STD_NAMESPACE ostream &stream,
DSRReferencedInstanceList &refList,
const size_t flags);
/** check the given dataset before reading.
* This methods checks whether the dataset contains at least the DICOM attributes SOP class UID
* and modality. Any incorrectness regarding these two attributes is reported to the logger.
* Currently unsupported SOP classes are also reported as an error.
** @param dataset DICOM dataset to be checked
* @param documentType SR document type retrieved from the SOP class UID
** @return status, EC_Normal if successful, an error code otherwise
*/
OFCondition checkDatasetForReading(DcmItem &dataset,
E_DocumentType &documentType);
/** get current value of specific character set
** @return pointer to character string (never NULL)
*/
const char *getSpecificCharacterSet() const;
/** update various DICOM attributes.
* (e.g. set the modality and SOP class UID, generate a new Study, Series and SOP instance UID
* if required, set date/time values, etc.)
** @param updateAll flag indicating whether all DICOM attributes should be updated or only
* the IOD-specific ones. (e.g. set DICOM defined terms from enum values)
*/
void updateAttributes(const OFBool updateAll = OFTrue);
private:
/// SR document tree
DSRDocumentTree DocumentTree;
/// flag indicating whether this document is finalized or not
OFBool FinalizedFlag;
/// enumerated value: preliminary, final
E_PreliminaryFlag PreliminaryFlagEnum;
/// enumerated value: partial, complete
E_CompletionFlag CompletionFlagEnum;
/// enumerated value: unverified, verified
E_VerificationFlag VerificationFlagEnum;
/// defined term: see class DSRTypes
E_CharacterSet SpecificCharacterSetEnum;
// DICOM attributes are listed ordered by Module.
// The comments for each attribute describe "Name: (VR, VM, Type)".
// Please note that for particular SR documents (e.g. Key Object Selection)
// other rules might apply. See DICOM standard for further reference.
// --- SOP Common Module (M) ---
// (see SR Document General Module)
/// SOP Class UID: (UI, 1, 1)
DcmUniqueIdentifier SOPClassUID;
/// SOP Instance UID: (UI, 1, 1)
DcmUniqueIdentifier SOPInstanceUID;
/// Specific Character Set: (CS, 1-n, 1C)
DcmCodeString SpecificCharacterSet;
/// Instance Creation Date: (DA, 1, 3)
DcmDate InstanceCreationDate;
/// Instance Creation Time: (TM, 1, 3)
DcmTime InstanceCreationTime;
/// Instance Creator UID: (UI, 1, 3)
DcmUniqueIdentifier InstanceCreatorUID;
/// Coding Scheme Identification Sequence: (SQ, 1-n, 3)
DSRCodingSchemeIdentificationList CodingSchemeIdentification;
// --- General Study Module (M) ---
/// Study Instance UID: (UI, 1, 1)
DcmUniqueIdentifier StudyInstanceUID;
/// Study Date: (DA, 1, 2)
DcmDate StudyDate;
/// Study Time: (TM, 1, 2)
DcmTime StudyTime;
/// Referring Physician's Name: (PN, 1, 2)
DcmPersonName ReferringPhysicianName;
/// Study ID: (SH, 1, 2)
DcmShortString StudyID;
/// Accession Number: (SH, 1, 2)
DcmShortString AccessionNumber;
/// Study Description: (LO, 1, 3)
DcmLongString StudyDescription;
// --- Patient Module (M) ---
/// Patient's Name: (PN, 1, 2)
DcmPersonName PatientName;
/// Patient ID: (LO, 1, 2)
DcmLongString PatientID;
/// Patient's Birth Date: (DA, 1, 2)
DcmDate PatientBirthDate;
/// Patient's Sex: (CS, 1, 2)
DcmCodeString PatientSex;
// --- General Equipment Module (M) ---
/// Manufacturer: (LO, 1, 2)
DcmLongString Manufacturer;
/// Manufacturer's Model Name: (LO, 1, 3)
DcmLongString ManufacturerModelName;
/// Device Serial Number: (LO, 1, 3)
DcmLongString DeviceSerialNumber;
/// Software Version(s): (LO, 1-n, 3)
DcmLongString SoftwareVersions;
// --- Enhanced General Equipment Module (M - for some IODs) ---
// Manufacturer: (LO, 1, 1)
// - see 'General Equipment Module'
// Manufacturer's Model Name: (LO, 1, 1)
// - see 'General Equipment Module'
// Device Serial Number: (LO, 1, 1)
// - see 'General Equipment Module'
// Software Version(s): (LO, 1-n, 1)
// - see 'General Equipment Module'
// --- Synchronization Module (C/U - for some IODs) ---
// tbd: conditional/optional module not yet supported
// --- SR Document Series / Key Object Document Series Module (M) ---
/// Modality: (CS, 1, 1)
DcmCodeString Modality;
/// Series Instance Number: (UI, 1, 1)
DcmUniqueIdentifier SeriesInstanceUID;
/// Series Number: (IS, 1, 1)
DcmIntegerString SeriesNumber;
/// Series Date: (DA, 1, 3)
DcmDate SeriesDate;
/// Series Time: (TM, 1, 3)
DcmTime SeriesTime;
/// Protocol Name: (LO, 1, 3)
DcmLongString ProtocolName;
/// Series Description: (LO, 1, 3)
DcmLongString SeriesDescription;
/// Series Description Code Sequence: (SQ, 1, 3)
// - tbd: optional attribute not yet supported
/// Referenced Performed Procedure Step Sequence: (SQ, 1, 2)
DcmSequenceOfItems ReferencedPerformedProcedureStep;
// --- SR Document General Module (M) ---
/// Instance Number: (IS, 1, 1)
DcmIntegerString InstanceNumber;
/// Preliminary Flag: (CS, 1, 3)
DcmCodeString PreliminaryFlag;
/// Completion Flag: (CS, 1, 1)
DcmCodeString CompletionFlag;
/// Completion Flag Description: (LO, 1, 3)
DcmLongString CompletionFlagDescription;
/// Verification Flag: (CS, 1, 1)
DcmCodeString VerificationFlag;
/// Content Date: (DA, 1, 1)
DcmDate ContentDate;
/// Content Time: (TM, 1, 1)
DcmTime ContentTime;
/// Verifying Observer Sequence: (SQ, 1-n, 1C)
DcmSequenceOfItems VerifyingObserver;
/// Author Observer Sequence: (SQ, 1-n, 3)
// - tbd: optional attribute not yet supported
/// Participant Sequence: (SQ, 1-n, 3)
// - tbd: optional attribute not yet supported
/// Custodial Organization Sequence: (SQ, 1, 3)
// - tbd: optional attribute not yet supported
/// Predecessor Documents Sequence: (SQ, 1-n, 1C)
DSRSOPInstanceReferenceList PredecessorDocuments;
/// Identical Documents Sequence: (SQ, 1-n, 1C)
DSRSOPInstanceReferenceList IdenticalDocuments;
// Referenced Request Sequence: (SQ, 1-n, 1C)
// - tbd: conditional attribute not yet supported
/// Performed Procedure Code Sequence: (SQ, 1-n, 2)
DcmSequenceOfItems PerformedProcedureCode;
/// Current Requested Procedure Evidence Sequence: (SQ, 1-n, 1C)
DSRSOPInstanceReferenceList CurrentRequestedProcedureEvidence;
/// Pertinent Other Evidence Sequence: (SQ, 1-n, 1C)
DSRSOPInstanceReferenceList PertinentOtherEvidence;
/// Referenced Instance Sequence: (SQ, 1-n, 1C)
DSRReferencedInstanceList ReferencedInstances;
// --- declaration of copy constructor and assignment operator ---
DSRDocument(const DSRDocument &);
DSRDocument &operator=(const DSRDocument &);
};
#endif