comparison OrthancServer/RadiotherapyRestApi.cpp @ 538:505d6deb9947 dicom-rt

access contours by instances
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 03 Sep 2013 17:45:26 +0200
parents da8e064d0d49
children c8347eef225b
comparison
equal deleted inserted replaced
535:da8e064d0d49 538:505d6deb9947
387 { 387 {
388 if (contour[i].isMember(CONTOUR_IMAGE_SEQUENCE) && 388 if (contour[i].isMember(CONTOUR_IMAGE_SEQUENCE) &&
389 contour[i].isMember(CONTOUR_GEOMETRIC_TYPE) && 389 contour[i].isMember(CONTOUR_GEOMETRIC_TYPE) &&
390 contour[i].isMember(NUMBER_OF_CONTOUR_POINTS) && 390 contour[i].isMember(NUMBER_OF_CONTOUR_POINTS) &&
391 contour[i].isMember(CONTOUR_DATA) && 391 contour[i].isMember(CONTOUR_DATA) &&
392 contour[i].isMember(CONTOUR_SLAB_THICKNESS) &&
393 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"].size() == 1 && 392 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"].size() == 1 &&
394 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"][0].isMember(REFERENCED_SOP_INSTANCE_UID) && 393 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"][0].isMember(REFERENCED_SOP_INSTANCE_UID) &&
395 contour[i][CONTOUR_GEOMETRIC_TYPE]["Value"].asString() == "CLOSED_PLANAR") 394 contour[i][CONTOUR_GEOMETRIC_TYPE]["Value"].asString() == "CLOSED_PLANAR")
396 { 395 {
397 result.append(i); 396 result.append(i);
463 } 462 }
464 } 463 }
465 } 464 }
466 465
467 466
468 static void GetRtStructuresClosedPlanarInstance(RestApi::GetCall& call) 467 static void GetRtStructuresInstanceOfClosedPlanar(RestApi::GetCall& call)
469 { 468 {
470 RETRIEVE_CONTEXT(call); 469 RETRIEVE_CONTEXT(call);
471 470
472 Json::Value roi, contour; 471 Json::Value roi, contour;
473 std::string instanceId; 472 std::string instanceId;
496 } 495 }
497 } 496 }
498 } 497 }
499 498
500 499
500 static void GetRtStructuresListOfInstances(RestApi::GetCall& call)
501 {
502 RETRIEVE_CONTEXT(call);
503
504 Json::Value roi, contour;
505 std::string instanceId;
506
507 if (GetRtStructuresRoi(roi, contour, instanceId, context,
508 call.GetUriComponent("id", ""),
509 call.GetUriComponent("roi", "")))
510 {
511 Json::Value result = Json::arrayValue;
512
513 for (Json::Value::ArrayIndex i = 0; i < contour.size(); i++)
514 {
515 if (contour[i].isMember(CONTOUR_IMAGE_SEQUENCE) &&
516 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"].size() == 1 &&
517 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"][0].isMember(REFERENCED_SOP_INSTANCE_UID))
518 {
519 std::string uid = contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"][0][REFERENCED_SOP_INSTANCE_UID]["Value"].asString();
520
521 std::list<std::string> instance;
522 context.GetIndex().LookupTagValue(instance, DICOM_TAG_SOP_INSTANCE_UID, uid);
523
524 if (instance.size() == 1)
525 {
526 result.append(instance.front());
527 }
528 }
529 }
530
531 call.GetOutput().AnswerJson(result);
532 }
533 }
534
535
536
537 static void GetRtStructuresClosedPlanarsOfInstance(RestApi::GetCall& call)
538 {
539 RETRIEVE_CONTEXT(call);
540
541 Json::Value roi, contour, instance;
542 std::string instanceId;
543
544 if (context.GetIndex().LookupResource(instance, call.GetUriComponent("instance", ""), ResourceType_Instance) &&
545 GetRtStructuresRoi(roi, contour, instanceId, context,
546 call.GetUriComponent("id", ""),
547 call.GetUriComponent("roi", "")))
548 {
549 boost::mutex::scoped_lock lock(context.GetDicomFileMutex());
550 ParsedDicomFile& dicom = context.GetDicomFile(instanceId);
551
552 Json::Value result = Json::arrayValue;
553
554 for (Json::Value::ArrayIndex i = 0; i < contour.size(); i++)
555 {
556 if (contour[i].isMember(CONTOUR_DATA) &&
557 contour[i].isMember(CONTOUR_IMAGE_SEQUENCE) &&
558 contour[i].isMember(NUMBER_OF_CONTOUR_POINTS) &&
559 contour[i].isMember(CONTOUR_GEOMETRIC_TYPE) &&
560 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"].size() == 1 &&
561 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"][0].isMember(REFERENCED_SOP_INSTANCE_UID) &&
562 contour[i][CONTOUR_GEOMETRIC_TYPE]["Value"].asString() == "CLOSED_PLANAR")
563 {
564 std::string uid = contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"][0][REFERENCED_SOP_INSTANCE_UID]["Value"].asString();
565
566 if (uid == instance["MainDicomTags"]["SOPInstanceUID"].asString())
567 {
568 ParsedDicomFile::SequencePath path;
569 path.push_back(std::make_pair(DicomTag(0x3006, 0x0039 /* ROIContourSequence */), roi["InternalIndex"].asInt()));
570 path.push_back(std::make_pair(DicomTag(0x3006, 0x0040 /* ContourSequence */), i));
571
572 Json::Value points;
573 std::string contourData;
574 std::string numberOfPoints;
575
576 if (dicom.GetTagValue(contourData, path, DicomTag(0x3006, 0x0050 /* ContourData */)) &&
577 dicom.GetTagValue(numberOfPoints, path, DicomTag(0x3006, 0x0046 /* NumberOfContourPoints */)) &&
578 ContourToPoints(points, contourData) &&
579 points.size() == boost::lexical_cast<unsigned int>(numberOfPoints))
580 {
581 result.append(points);
582 }
583 }
584 }
585 }
586
587 call.GetOutput().AnswerJson(result);
588 }
589 }
590
591
592
593 static void GetRtStructuresPointsOfInstance(RestApi::GetCall& call)
594 {
595 RETRIEVE_CONTEXT(call);
596
597 Json::Value roi, contour, instance;
598 std::string instanceId;
599
600 if (context.GetIndex().LookupResource(instance, call.GetUriComponent("instance", ""), ResourceType_Instance) &&
601 GetRtStructuresRoi(roi, contour, instanceId, context,
602 call.GetUriComponent("id", ""),
603 call.GetUriComponent("roi", "")))
604 {
605 Json::Value result = Json::arrayValue;
606
607 for (Json::Value::ArrayIndex i = 0; i < contour.size(); i++)
608 {
609 if (contour[i].isMember(CONTOUR_DATA) &&
610 contour[i].isMember(CONTOUR_IMAGE_SEQUENCE) &&
611 contour[i].isMember(CONTOUR_GEOMETRIC_TYPE) &&
612 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"].size() == 1 &&
613 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"][0].isMember(REFERENCED_SOP_INSTANCE_UID) &&
614 contour[i][CONTOUR_GEOMETRIC_TYPE]["Value"].asString() == "POINT")
615 {
616 std::string uid = contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"][0][REFERENCED_SOP_INSTANCE_UID]["Value"].asString();
617
618 if (uid == instance["MainDicomTags"]["SOPInstanceUID"].asString())
619 {
620 Json::Value p;
621 if (ContourToPoints(p, contour[i][CONTOUR_DATA]["Value"].asString()) &&
622 p.size() == 1)
623 {
624 result.append(p[0]);
625 }
626 }
627 }
628 }
629
630 call.GetOutput().AnswerJson(result);
631 }
632 }
633
634
635
636
501 RadiotherapyRestApi::RadiotherapyRestApi(ServerContext& context) : OrthancRestApi(context) 637 RadiotherapyRestApi::RadiotherapyRestApi(ServerContext& context) : OrthancRestApi(context)
502 { 638 {
503 Register("/series/{id}/rt-structures", GetRtStructuresInfo); 639 Register("/series/{id}/rt-structures", GetRtStructuresInfo);
504 Register("/series/{id}/rt-structures/roi", GetRtStructuresListOfROIs); 640 Register("/series/{id}/rt-structures/roi", GetRtStructuresListOfROIs);
505 Register("/series/{id}/rt-structures/roi/{roi}/info", GetRtStructuresROI); 641 Register("/series/{id}/rt-structures/roi/{roi}/info", GetRtStructuresROI);
506 Register("/series/{id}/rt-structures/roi/{roi}/points", GetRtStructuresROIPoints); 642 Register("/series/{id}/rt-structures/roi/{roi}/points", GetRtStructuresROIPoints);
507 Register("/series/{id}/rt-structures/roi/{roi}/closed-planar", GetRtStructuresListOfClosedPlanars); 643 Register("/series/{id}/rt-structures/roi/{roi}/closed-planar", GetRtStructuresListOfClosedPlanars);
508 Register("/series/{id}/rt-structures/roi/{roi}/closed-planar/{polygon}/points", GetRtStructuresSingleClosedPlanar); 644 Register("/series/{id}/rt-structures/roi/{roi}/closed-planar/{polygon}/vertices", GetRtStructuresSingleClosedPlanar);
509 Register("/series/{id}/rt-structures/roi/{roi}/closed-planar/{polygon}/thickness", GetRtStructuresClosedPlanarThickness); 645 Register("/series/{id}/rt-structures/roi/{roi}/closed-planar/{polygon}/thickness", GetRtStructuresClosedPlanarThickness);
510 Register("/series/{id}/rt-structures/roi/{roi}/closed-planar/{polygon}/instance", GetRtStructuresClosedPlanarInstance); 646 Register("/series/{id}/rt-structures/roi/{roi}/closed-planar/{polygon}/instance", GetRtStructuresInstanceOfClosedPlanar);
647 Register("/series/{id}/rt-structures/roi/{roi}/instances", GetRtStructuresListOfInstances);
648 Register("/series/{id}/rt-structures/roi/{roi}/instances/{instance}/closed-planar", GetRtStructuresClosedPlanarsOfInstance);
649 Register("/series/{id}/rt-structures/roi/{roi}/instances/{instance}/points", GetRtStructuresPointsOfInstance);
511 } 650 }
512 651
513 } 652 }
514 653
515 654