⚠️ これは 非公式の翻訳サイトです。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 <inputfile>" << 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<TrcTrackSet*>& 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;
}