dcmrt: biblioteca de radioterapia e aplicativos utilitários
Este módulo contém classes para ler, escrever, criar, modificar e acessar diversos objetos DICOM de radioterapia (RT). Essas classes são geradas automaticamente a partir da versão oficial em DocBook/XML do padrão DICOM.
As principais classes de interface são:
- DRTDoseIOD
- DRTImageIOD
- DRTPlanIOD
- DRTStructureSetIOD
- DRTTreatmentSummaryRecordIOD
- DRTIonPlanIOD
- DRTIonBeamsTreatmentRecordIOD
Para facilitar o trabalho com essa interface de baixo nível, há algumas classes escritas manualmente que fornecem funcionalidades comumente necessárias.
Essas classes são:
Ferramentas
Este módulo contém as seguintes ferramentas de linha de comando:
Exemplos
O exemplo a seguir mostra como carregar um arquivo RT Dose e exibir o nome do paciente:
DcmFileFormat fileformat;
OFCondition status = fileformat.loadFile("rtdose.dcm");
if (status.good())
{
DRTDoseIOD rtdose;
status = rtdose.read(*fileformat.getDataset());
if (status.good())
{
OFString patientName;
status = rtdose.getPatientName(patientName);
if (status.good())
{
cout << "Patient's Name: " << patientName << endl;
} else
cerr << "Error: cannot access Patient's Name (" << status.text() << ")" << endl;
} else
cerr << "Error: cannot read RT Dose object (" << status.text() << ")" << endl;
} else
cerr << "Error: cannot load DICOM file (" << status.text() << ")" << endl;
O exemplo a seguir mostra como carregar um arquivo RT Dose e acessar a imagem de dose com escala aplicada:
DRTDose rtdose;
OFCondition status = rtdose.loadFile("rtdose.dcm");
if (status.good())
{
const unsigned int frame = 0;
OFVector
status = rtdose.getDoseImage(doseImage, frame);
if (status.good())
{
OFVector
for (int y = 0; y < doseImage.getDoseImageHeight(); ++y)
{
for (int x = 0; x < doseImage.getDoseImageWidth(); ++x)
{
double value = *it++;
/ do something useful with the dose image pixel /
}
}
} else
cerr << "Error: cannot read RT Dose image (" << status.text() << ")" << endl;
} else
cerr << "Error: cannot load RT Dose object (" << status.text() << ")" << endl;
O exemplo a seguir mostra como carregar um arquivo RT Plan, alterar o nome do paciente e salvá-lo em um novo arquivo:
DcmFileFormat fileformat;
OFCondition status = fileformat.loadFile("rtplan.dcm");
if (status.good())
{
DRTPlanIOD rtplan;
status = rtplan.read(*fileformat.getDataset());
if (status.good())
{
status = rtplan.setPatientName("Doe^John");
if (status.good())
{
fileformat.clear();
status = rtplan.write(*fileformat.getDataset());
if (status.good())
{
status = fileformat.saveFile("rtplan_new.dcm");
if (status.bad())
cerr << "Error: cannot save DICOM file (" << status.text() << ")" << endl;
} else
cerr << "Error: cannot write RT Plan object (" << status.text() << ")" << endl;
} else
cerr << "Error: cannot change Patient's Name (" << status.text() << ")" << endl;
} else
cerr << "Error: cannot read RT Plan object (" << status.text() << ")" << endl;
} else
cerr << "Error: cannot load DICOM file (" << status.text() << ")" << endl;
Problemas conhecidos
Como a maioria das classes deste módulo é gerada automaticamente a partir de uma versão legível por máquina do padrão DICOM, e sabe-se que os objetos RT "reutilizam" os mesmos atributos de sequência com conteúdos diferentes em vários pontos, ainda podem existir alguns problemas de definições incorretas em algumas subsequências. Por exemplo, a Referenced Beam Sequence (300C,0004) e a Referenced SOP Sequence (0008,1199) são candidatas que talvez ainda não sejam tratadas 100% corretamente.