⚠️ これは 非公式の翻訳サイトです。DCMTK / OFFIS とは無関係です。正確な情報は 原文(https://support.dcmtk.org/docs/mod_dcmtract.html) を参照してください。

dcmtract: トラクトグラフィ結果を扱うためのライブラリ

このモジュールには、DICOM Tractography Results オブジェクトを扱うためのクラスが含まれています。オブジェクトに含まれるファイバートラックや関連するメタ情報を、生成・読み込み・参照できます。

規格で定義されているとおり、Measurements と Statistics を、トラック単位とトラックセット単位の両方で完全にサポートします。

可能な範囲でいくつかのチェックを行い、有効な Tractography オブジェクトだけが書き出されるようにしています。ただしこのモジュールは、既存の Tractography Result オブジェクトを_変更_するためのものではなく、ゼロから生成することだけを目的としています。そのため、ファイルを読み込んでから変更すると、保存時に整合性のとれない DICOM オブジェクトになる_ことがあります_。

このモジュールは、Patient モジュール・General Study モジュール・General Series モジュールにある共通の IOD 属性を管理するために、dcmiod モジュールを多用します。

このモジュールの主要なクラスは次のとおりです。

次の(完全な)例は、DICOM Tractography Results オブジェクトを読み込み、含まれるデータの概要をダンプする方法を示します。

#include "dcmtk/config/osconfig.h" / make sure OS specific configuration is included first /

#include "dcmtk/dcmtract/trctractographyresults.h"

#include "dcmtk/dcmtract/trctrack.h"

// Main routine of test app

int main(int argc, char *argv[])

{

if (argc < 2)

{

CERR << "Usage: read " << OFendl;

return 1;

}

OFCondition result;

TrcTractographyResults *trc = NULL;

result = TrcTractographyResults::loadFile(argv[1], trc);

if (result.bad())

{

CERR << "Unable to load Tractography Results file: " << result.text();

return 1;

}

OFString val;

trc->getPatient().getPatientName(val);

COUT << "Patient Name: " << val << OFendl;

trc->getStudy().getStudyInstanceUID(val);

COUT << "Study : " << val << OFendl;

trc->getSeries().getSeriesInstanceUID(val);

COUT << "Series : " << val << OFendl;

trc->getSOPCommon().getSOPInstanceUID(val);

COUT << "Instance : " << val << OFendl;

COUT << "-------------------------------------------------------------------------" << OFendl;

size_t numTrackSets = trc->getNumberOfTrackSets();

COUT << "Track Sets (total: " << numTrackSets << ")" << OFendl;

OFVector& sets = trc->getTrackSets();

for (size_t ts = 0; ts < numTrackSets; ts++)

{

size_t numTracks = sets[ts]->getNumberOfTracks();

COUT << " Track Set #" << ts << ": " << numTracks << " Tracks, "

<< sets[ts]->getNumberOfTrackSetStatistics() << " Track Set Statistics, "

<< sets[ts]->getNumberOfTrackStatistics() << " Track Statistics, "

<< sets[ts]->getNumberOfMeasurements() << " Measurements " << OFendl;

for (size_t t = 0; t < numTracks; t++)

{

TrcTrack* track = sets[ts]->getTracks()[t];

const Float32* vals = NULL;

size_t numPoints = track->getTrackData(vals);

COUT << " Track #" << t << "'s first 3/" << numTracks << " points: ";

for (size_t v = 0; (v < 3) && (v < numPoints); v++)

{

COUT << "(" << vals[v] << "," << vals[v+1] << "," << vals[v+2] << ") " ;

}

COUT << OFendl;

}

}

delete trc;

return 0;

}

次の(完全な)例は、最小限の Tractography Results オブジェクト(1 つの Track だけを持ち、Statistics も Measurements も持たない単一の TrackSet)を生成する方法を示します。ID・UID・Track の値はすべて、当然ながら意味のない単なるサンプルです。

#include "dcmtk/config/osconfig.h" / make sure OS specific configuration is included first /

#include "dcmtk/dcmtract/trctractographyresults.h"

// Main routine of test app

int main(int argc, char *argv[])

{

// Create tractography results object

OFCondition result;

// Instance Number, Label, Description, Creator's Name

ContentIdentificationMacro id("1", "MINI_TRACT", "Minimal Tractography object for demonstration", "Open Connections GmbH");

// Manufacturer, model name, serial number, software version(s)

IODEnhGeneralEquipmentModule::EquipmentInfo equipment("Open Connections Gmbh", "dcmtract library", "0815", OFFIS_DCMTK_VERSION_STRING);

IODReferences refs;

// We need at least one image reference this Tractography Results object is based on.

// We provide: Patient ID, Study Instance UID, Series Instance UID, SOP Instance UID, SOP Class UID

IODImageReference* ref = new IODImageReference("PAT_ID_4711", "1.2.3", "4.5.6", "7.8.9", UID_MRImageStorage);

refs.add(ref);

OFString contentDate = "20160601";

OFString contentTime = "120000";

TrcTractographyResults *trc = NULL;

TrcTractographyResults::create(id, contentDate, contentTime, equipment, refs, trc);

// Create track set

CodeWithModifiers anatomy;

anatomy.set("T-A0095", "SRT", "White matter of brain and spinal cord");

// Every CodeSequenceMacro has: Code Value, Coding Scheme Designator, Code Meaning

CodeSequenceMacro diffusionModel("113231", "DCM", "Single Tensor");

CodeSequenceMacro algorithmId("113211", "DCM", "Deterministic");

TrcTrackSet *set = NULL;

trc->addTrackSet("First and last Track Set", "Mini description", anatomy, diffusionModel, algorithmId, set);

// Create track

Uint16 cieLabColor[3]; // color the whole track with this color; we use some blue

cieLabColor[0] = 30000; // L

cieLabColor[1] = 0 ; // a

cieLabColor[2] = 0 ; // b

Float32 pointData[30]; // actual data, 10 data points with x,y,z coordinates

for (size_t f = 0; f < 10; f++)

{

// x coordinate, varies

pointData[f*3] = f;

// static y coordinate

pointData[f*3+1] = 1;

// static z coordinate

pointData[f*3+2] = 2;

}

TrcTrack* track = NULL;

set->addTrack(pointData, 10, cieLabColor, 1 / numColors /, track);

// Frame of Reference is required; could be the same as from related MR series

trc->getFrameOfReference().setFrameOfReferenceUID("10.11.12");

// Set some optional data

trc->getPatient().setPatientID("4711");

trc->getPatient().setPatientName("Doe^John");

trc->getSeries().setSeriesDescription("This is just a test series with a single Tractography Results object inside");

// Save file

trc->saveFile("/tmp/create_demo.dcm");

delete trc;

return 0;

}