Clear Canvas Как преобразовать оцифрованные данные ЭКГ в файл формата dicom

Я пытаюсь преобразовать оцифрованные данные ЭКГ в файл dicom. Мой код выглядит так, как показано ниже

        DateTime today = DateTime.Today;

        DicomFile dicomFile = new DicomFile();
        dicomFile.TransferSyntax = TransferSyntax.ExplicitVrLittleEndian;

        dicomFile.DataSet[DicomTags.StudyDate].SetStringValue(today.ToString("yyyyMMdd"));
        dicomFile.DataSet[DicomTags.StudyTime].SetStringValue(today.ToString("HHmmss"));

        dicomFile.DataSet[DicomTags.PatientsBirthName].SetStringValue(patientName);
        dicomFile.DataSet[DicomTags.PatientId].SetStringValue(patientId);

        dicomFile.DataSet[DicomTags.StudyInstanceUid].SetStringValue(studyId);

        dicomFile.DataSet[DicomTags.SeriesInstanceUid].SetStringValue(seriesId);
        dicomFile.DataSet[DicomTags.Modality].SetStringValue(modality);
        dicomFile.DataSet[DicomTags.ConversionType].SetStringValue(conversionType);//Drawing

        string sopInstanceUid = DicomUid.GenerateUid().UID; // Should be unique for each image
        this.pacsAccessionNumber = (Functions.GetRandomString() + Functions.GetRandomString()).Substring(0, 16);

        dicomFile.DataSet[DicomTags.InstanceNumber].SetInt32(0, instanceNumber);//Series Instance Number
        dicomFile.DataSet[DicomTags.SopClassUid].SetStringValue(SopClass.Sop12LeadEcgWaveformStorage.Uid);
        dicomFile.DataSet[DicomTags.SopInstanceUid].SetStringValue(sopInstanceUid);
        dicomFile.DataSet[DicomTags.AccessionNumber].SetStringValue(this.pacsAccessionNumber);
        dicomFile.MediaStorageSopClassUid = SopClass.Sop12LeadEcgWaveformStorage.Uid;
        dicomFile.MediaStorageSopInstanceUid = sopInstanceUid;

        dicomFile.DataSet[DicomTags.Manufacturer].SetStringValue("MITS");// Manufacturer Name

        DicomSequenceItem waveFormSeq = new DicomSequenceItem();
        waveFormSeq[DicomTags.WaveformOriginality].SetStringValue("DERIVED");// Other option is ORIGINAL
        waveFormSeq[DicomTags.WaveformChannelNumber].SetUInt32(0, 1);//must be between 1-13
        waveFormSeq[DicomTags.NumberOfWaveformSamples].Values = samplingCount;//NumberOfWaveformSamples -- max value is 16384
        waveFormSeq[DicomTags.SamplingFrequency].SetFloat32(0, 1000);//frequency(must be dynamic) -- must be dynamic must be between 200-100
        waveFormSeq[DicomTags.WaveformSampleInterpretation].SetStringValue("SS");//signed
        waveFormSeq[DicomTags.WaveformBitsAllocated].SetInt32(0, 16);//16 bit
        waveFormSeq[DicomTags.WaveformData].Values = voltageValues;

        DicomSequenceItem channelSeq = new DicomSequenceItem();
        channelSeq[DicomTags.ChannelSensitivityCorrectionFactor].SetUInt32(0, 1);
        channelSeq[DicomTags.ChannelBaseline].SetUInt32(0, 0);
        channelSeq[DicomTags.ChannelTimeSkew].SetUInt32(0, 0);

        DicomSequenceItem channelSourceSeq = new DicomSequenceItem();
        channelSourceSeq[DicomTags.CodeValue].SetStringValue("5.6.3-9-1");
        channelSourceSeq[DicomTags.CodingSchemeDesignator].SetStringValue("SCPECG");
        channelSourceSeq[DicomTags.CodingSchemeVersion].SetStringValue("1.3");

        channelSeq[DicomTags.ChannelSourceSequence].AddSequenceItem(channelSourceSeq);

        DicomSequenceItem channelSensUnitSeq = new DicomSequenceItem();
        channelSensUnitSeq[DicomTags.CodeValue].SetStringValue("uV");
        channelSensUnitSeq[DicomTags.CodingSchemeDesignator].SetStringValue("UCUM");
        channelSensUnitSeq[DicomTags.CodingSchemeVersion].SetStringValue("1.4");

        channelSeq[DicomTags.ChannelSensitivityUnitsSequence].AddSequenceItem(channelSensUnitSeq);

        waveFormSeq[DicomTags.ChannelSequence].AddSequenceItem(channelSeq);

        dicomFile.DataSet[DicomTags.WaveformSequence].AddSequenceItem(waveFormSeq);

        SendFile(dicomFile);

Но на сервере pacs я не смог открыть файл dcm.

Есть ли что-то, что мне не хватает?

Ссылка на файл dicom http://www.ikincidoktor.com/NonDicomRepository/8/testecg.dcm


person Ozan Deniz    schedule 02.03.2015    source источник
comment
Действительно ли система PACS поддерживает классы поддержки сигналов? Можете ли вы открыть полученный файл с помощью средства просмотра Clunie pixelmed: pixelmed.com/index.html#PixelMedJavaDICOMToolkit   -  person Brett Okken    schedule 07.03.2015
comment
Я использую приложение EcgViewer для проверки данных. Пишет, что не удалось получить сигнал. Но я поместил оцифрованную ЭКГ в правильный тег. Где может быть ошибка? @БреттОккен   -  person Ozan Deniz    schedule 09.03.2015
comment
Это файл: ikincidoktor.com/NonDicomRepository/8/testecg.dcm   -  person Ozan Deniz    schedule 09.03.2015


Ответы (1)


В стандарте DICOM определено 9 различных классов IOD, относящихся к форме волны, и 2 из них предназначены для аудио. Многие атрибуты зависят от выборок данных сигнала, с которыми вы имеете дело, и невозможно просто перечислить необходимые элементы. Итак, вот предложение, которое поможет вам решить вашу проблему.

Пожалуйста, начните со стандарта DICOM PS 3.3 (здесь) приложение A.34 и выберите соответствующий IOD, который вы хотите использовать. В каждом определении класса IOD вы увидите таблицу, в которой перечислены необходимые модули для IOD со ссылкой на расположение определения модуля (C.?.?.?). В этом разделе также будут указаны любые конкретные требования IOD.

Например, определение IOD электрокардиограммы в 12 отведениях находится в Приложении A.34.3, а в таблице A.34.3-1 в качестве обязательных модулей для этого IOD перечислены следующие модули:

  • Пациент (C.7.1.1)
  • Общее исследование (C.7.2.1)
  • Общая серия (C.7.3.1)
  • Общее оборудование (C.7.5.1)
  • Идентификация формы сигнала (C.10.8)
  • Форма волны (C.10.9)
  • Контекст приобретения (C.7.6.14)
  • Аннотация сигнала (C.10.10 (условно и требуется, если аннотация присутствует))

Затем вы хотите просмотреть каждый необходимый модуль в Приложении C. Здесь вы найдете таблицу со списком элементов DICOM, из которых состоит модуль. Столбец Тип указывает, является ли элемент обязательным, необязательным или условным. Описание различных типов элементов данных находится в PS 3.5 раздел 7.4. Короче говоря, тип 1 обязателен и не должен быть пустым. Тип 2 является обязательным и может быть пустым, а тип 3 необязательным. Тип 1C или Тип 2C являются условными и должны присутствовать, если они соответствуют условию.

Правило кодирования выборок данных для элемента Waveform Data (5400,1010) определено в разделе C.10.9.1.7.

Если вы работаете только с одним каналом, вы можете посмотреть на общую электрокардиограмму IOD (A.34.4).

Надеюсь, это поможет.

person LEADTOOLS Support    schedule 03.03.2015
comment
Ты прав. Я пытаюсь добавить оцифрованные данные ЭКГ, а не пиксельные. Я исправил это, но каковы обязательные теги для файла ЭКГ dicom и каков формат необработанных данных для ЭКГ? Я отредактировал вопрос, можете ли вы еще раз проверить фрагмент кода? - person Ozan Deniz; 04.03.2015
comment
У меня также есть значения напряжения в минивольтах, и у меня есть значения только для одного канала. - person Ozan Deniz; 04.03.2015
comment
Я думаю, что проблема в значениях напряжения. У меня есть один канал, и значения такие, как 1,4545 1,4354 1,4928 1,4737 1,4545 1,4928 1,4737 1,4545 1,4354 Я умножил их на 1000 и преобразовал в ushort, чем байтовый массив (2 байта - 16 бит для одного значения напряжения). Согласно документам, все в порядке, но должно быть что-то, что мне не хватает. - person Ozan Deniz; 09.03.2015