Web server

  • getting close:


  • Great to see this progression. Just as an additional feedback for your work, I see the focus is on OHIF by now, but I can see query results in weasis as well. When I try do download the series it shows a thumbnail with a question mark and no image.



    This is the log:



    16.08.2022 22:05:21.046 *INFO* [AWT-EventQueue-0] org.weasis.dicom.qr.DicomQrFactory: DICOM Q/R is activated

    16.08.2022 22:05:27.382 *DEBUG* [QIDO-RS] org.weasis.dicom.qr.RsQuery: QIDO-RS request: http://localhost:3002/api/dico…0200010&limit=10&offset=0

    16.08.2022 22:05:27.429 *DEBUG* [QIDO-RS] org.weasis.dicom.qr.RsQuery: QIDO-RS request: http://localhost:3002/api/dico…020000E,00200011,00081190

    16.08.2022 22:05:37.280 *DEBUG* [Dicom Q/R task-pool-3-thread-1] org.weasis.dicom.qr.RetrieveTask: QIDO-RS request: http://localhost:3002/api/dico…020000E,00200011,00081190

    16.08.2022 22:05:37.312 *DEBUG* [Dicom Q/R task-pool-3-thread-1] org.weasis.dicom.qr.RetrieveTask: QIDO-RS request: http://localhost:3002/api/dico…0080018,00200013,00081190

    16.08.2022 22:05:37.343 *WARN* [Dicom Q/R task-pool-3-thread-1] org.weasis.core.api.util.NetworkUtil: http Status 404 - Not Found

    16.08.2022 22:05:37.343 *ERROR* [Dicom Q/R task-pool-3-thread-1] org.weasis.dicom.explorer.wado.LoadSeries: Downloading thumbnail with http://localhost:3002/api/dico…mbnail?viewport=256%2C256 org.weasis.core.util.StreamIOException: Not Found

    at org.weasis.core.api.util.NetworkUtil.readResponse(NetworkUtil.java:184)

    at org.weasis.core.api.util.NetworkUtil.prepareConnection(NetworkUtil.java:157)

    at org.weasis.core.api.util.NetworkUtil.getHttpResponse(NetworkUtil.java:80)

    16.08.2022 22:05:37.361 *INFO* [Series Downloader-pool-4-thread-1] org.weasis.dicom.explorer.wado.LoadSeries: Downloading series of HEAD EXP2 [1]

    16.08.2022 22:05:37.361 *DEBUG* [Series Downloader-pool-4-thread-1] org.weasis.dicom.explorer.wado.LoadSeries: Download DICOM instance http://localhost:3002/api/dico…56913941.892665339.718742 index 0.

    16.08.2022 22:05:37.361 *DEBUG* [Series Downloader-pool-4-thread-1] org.weasis.dicom.explorer.wado.LoadSeries: Download DICOM instance http://localhost:3002/api/dico…56913941.892665340.475317 index 1.

    16.08.2022 22:05:37.361 *WARN* [Image Downloader-pool-7-thread-1] org.weasis.core.api.util.NetworkUtil: http Status 404 - Not Found

    16.08.2022 22:05:37.361 *ERROR* [Image Downloader-pool-7-thread-1] org.weasis.dicom.explorer.wado.LoadSeries: Downloading org.weasis.core.util.StreamIOException: Not Found

    at org.weasis.core.api.util.NetworkUtil.readResponse(NetworkUtil.java:184)

    at org.weasis.core.api.util.NetworkUtil.prepareConnection(NetworkUtil.java:157)

    at org.weasis.core.api.util.NetworkUtil.getHttpResponse(NetworkUtil.java:80)

    16.08.2022 22:05:37.361 *WARN* [Image Downloader-pool-8-thread-1] org.weasis.core.api.util.NetworkUtil: http Status 404 - Not Found

    16.08.2022 22:05:37.361 *ERROR* [Image Downloader-pool-8-thread-1] org.weasis.dicom.explorer.wado.LoadSeries: Downloading org.weasis.core.util.StreamIOException: Not Found

    at org.weasis.core.api.util.NetworkUtil.readResponse(NetworkUtil.java:184)

    at org.weasis.core.api.util.NetworkUtil.prepareConnection(NetworkUtil.java:157)

    at org.weasis.core.api.util.NetworkUtil.getHttpResponse(NetworkUtil.java:80)

    16.08.2022 22:05:37.376 *INFO* [AWT-EventQueue-0] org.weasis.dicom.explorer.DicomExplorer: Add series: 1

    16.08.2022 22:05:37.408 *INFO* [AWT-EventQueue-0] org.weasis.dicom.explorer.wado.LoadSeries: *PERF* type:DICOMDIR seriesUID:1.3.46.670589.5.2.10.2156913941.892665339.860724 modality:CT nbImages:0 size:0 time:47 rate:0 errors:2

    16.08.2022 22:06:51.921 *INFO* [FelixStartLevel] org.weasis.dicom.qr.DicomQrFactory: DICOM Q/R is deactivated

  • Hi, Marcel,


    A basic beginner doubt.

    What means the term "Instance" in dicom. I have used as if it were the dicom image.

    For sample. In this text from docs, from wado-rs, it says:

    "10.4.1.1 Target Resources

    10.4.1.1.1 Instance Resources

    Instance Resources (defined in Table 10.4.1-1 are used to retrieve Instances.


    Retrieving a Series Instances resource retrieves all the individual Instances contained in the Series. Retrieving a Study Instances resource retrieves all the individual Instances contained in all the Series."

  • Is these params, level and function of queryfunctions correct to wado-rs, in the code below?


    /*-------------------------Retrieve DICOM objects (WADO-RS)--------------------------------

    /studies/{study}

    -----------------------------------------------------------------------------------------*/

    router.get("/rs/studies/:study", async (req, res) => {

    const StudyInstanceUID = req.params.study;

    const query = url.parse(req.url, true).query;

    let params = { QueryRetrieveLevel: "SERIES", StudyInstanceUID };

    const tparams = getParams(params, tags, query);

    params = JSON.stringify(tparams);

    ...

    const cmd = `--dolua:dofile([[${APIFOLDER}/queryfunctions.lua]]);series([[${CQAE}]],[[${params}]],[[${dicomweb}]])`;

    ....

    });


    /*-------------------------Retrieve DICOM objects (WADO-RS)--------------------------------

    /studies/{study}/series/{series}

    -----------------------------------------------------------------------------------------*/

    router.get(

    "/rs/studies/:studyInstanceUid/series/:seriesInstanceUid",

    async (req, res) => {

    const query = url.parse(req.url, true).query;

    const StudyInstanceUID = req.params.studyInstanceUid;

    const SeriesInstanceUID = req.params.seriesInstanceUid;

    let params = {

    QueryRetrieveLevel: "IMAGE",

    StudyInstanceUID,

    SeriesInstanceUID,

    SOPInstanceUID,

    };

    ....

    const cmd = `--dolua:dofile([[${APIFOLDER}/queryfunctions.lua]]);images([[${CQAE}]],[[${params}]],[[${dicomweb}]])`;



    /*-------------------------Retrieve DICOM objects (WADO-RS)--------------------------------

    /studies/{study}/series/{series}/instances/{instance}

    -----------------------------------------------------------------------------------------*/

    router.get(

    "/rs/studies/:studyInstanceUid/series/:seriesInstanceUid/instances/:sopInstanceUid",

    async (req, res) => {

    const query = url.parse(req.url, true).query;

    const StudyInstanceUID = req.params.studyInstanceUid;

    const SeriesInstanceUID = req.params.seriesInstanceUid;

    const SOPInstanceUID = req.params.sopInstanceUid;

    let params = {

    QueryRetrieveLevel: "IMAGE",

    StudyInstanceUID,

    SeriesInstanceUID,

    SOPInstanceUID,

    };

    ....

    const cmd = `--dolua:dofile([[${APIFOLDER}/queryfunctions.lua]]);images([[${CQAE}]],[[${params}]],[[${dicomweb}]])`;

    ....

    );

  • Hi,


    I think you all retrieve them at the IMAGE level. Use dicomget and just pass study, study and series, and study, series and instance in the query object. See test_servercommand.lua for an example of dicomget, it returns an array of DicomObjects. However, pixeldata will not be serialised correctly I expect.


    I also think you should use different function names for query and retrieve.


    I expect to fix the metadata issue tonight.


    Marcel

  • Luiz based on your sample data these are the metadata items I think that need to be implemented:


    {"00080005":"0","00080016":"1","00080018":"1","00080020":"1",

    "00080023":"1","00080030":"1","00080033":"1","00080050":"1",

    "00080060":"1","00080064":"0","00080090":"1","00100010":"1",

    "00100020":"1","00100030":"1","00100040":"1","00180015":"1",

    "00181016":"0","00181018":"0","0020000D":"1","0020000E":"1",

    "00200010":"1","00200011":"1","00200013":"1","00200020":"0",

    "00280002":"1","00280004":"1","00280010":"1","00280011":"1",

    "00280100":"0","00280101":"1","00280102":"0","00280103":"0",

    "00280106":"0","00280107":"0","7FE00010":"0"

    }


    or:


    "SpecificCharacterSet|SOPClassUID|SOPInstanceUID|StudyDate|ContentDate|StudyTime|ContentTime|AccessionNumber|Modality|ConversionType|ReferringPhysicianName|PatientName|PatientID|PatientBirthDate|PatientSex|BodyPartExamined|SecondaryCaptureDeviceManufacturer|SecondaryCaptureDeviceManufacturerModelName|StudyInstanceUID|SeriesInstanceUID|StudyID|SeriesNumber|InstanceNumber|PatientOrientation|SamplesPerPixel|PhotometricInterpretation|Rows|Columns|BitsAllocated|BitsStored|HighBit|PixelRepresentation|SmallestImagePixelValue|LargestImagePixelValue|PixelData"


    Where items with "0" are not in the database and must be read from a sample object. I will write a nice short metadata function tonight.


    Marcel

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!