comparison OrthancFramework/UnitTestsSources/FromDcmtkTests.cpp @ 4683:7182f5732480

use of DicomPath in ParsedDicomFile
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 08 Jun 2021 12:37:48 +0200
parents d38a7040474a
children 693f049729ba
comparison
equal deleted inserted replaced
4682:d38a7040474a 4683:7182f5732480
2356 ASSERT_THROW(DicomPath::Parse("(0010,0010)[.PatientID"), OrthancException); 2356 ASSERT_THROW(DicomPath::Parse("(0010,0010)[.PatientID"), OrthancException);
2357 ASSERT_THROW(DicomPath::Parse("(0010,0010)[].PatientID"), OrthancException); 2357 ASSERT_THROW(DicomPath::Parse("(0010,0010)[].PatientID"), OrthancException);
2358 ASSERT_THROW(DicomPath::Parse("(0010,0010[].PatientID"), OrthancException); 2358 ASSERT_THROW(DicomPath::Parse("(0010,0010[].PatientID"), OrthancException);
2359 ASSERT_THROW(DicomPath::Parse("(0010,0010)0].PatientID"), OrthancException); 2359 ASSERT_THROW(DicomPath::Parse("(0010,0010)0].PatientID"), OrthancException);
2360 ASSERT_THROW(DicomPath::Parse("(0010,0010)[-1].PatientID"), OrthancException); 2360 ASSERT_THROW(DicomPath::Parse("(0010,0010)[-1].PatientID"), OrthancException);
2361 } 2361
2362 2362 ASSERT_TRUE(DicomPath::IsMatch(DicomPath::Parse("(0010,0010)"),
2363 2363 DicomPath::Parse("(0010,0010)")));
2364 2364 ASSERT_FALSE(DicomPath::IsMatch(DicomPath::Parse("(0010,0010)"),
2365 TEST(ParsedDicomFile, RemovePath) 2365 DicomPath::Parse("(0010,0020)")));
2366 { 2366 ASSERT_TRUE(DicomPath::IsMatch(DicomPath::Parse("(0010,0010)"),
2367 { 2367 DicomPath::Parse("(0010,0010)[1].(0010,0020)")));
2368 Json::Value v = Json::arrayValue; 2368 ASSERT_FALSE(DicomPath::IsMatch(DicomPath::Parse("(0010,0010)[1].(0010,0020)"),
2369 2369 DicomPath::Parse("(0010,0010)")));
2370 Json::Value item = Json::objectValue; 2370 ASSERT_TRUE(DicomPath::IsMatch(DicomPath::Parse("(0010,0010)[1].(0010,0020)"),
2371 item["PatientID"] = "HELLO"; 2371 DicomPath::Parse("(0010,0010)[1].(0010,0020)")));
2372 v.append(item); 2372 ASSERT_TRUE(DicomPath::IsMatch(DicomPath::Parse("(0010,0010)[*].(0010,0020)"),
2373 2373 DicomPath::Parse("(0010,0010)[1].(0010,0020)")));
2374 std::unique_ptr<DcmElement> d(FromDcmtkBridge::FromJson(DICOM_TAG_SOURCE_IMAGE_SEQUENCE, 2374 ASSERT_FALSE(DicomPath::IsMatch(DicomPath::Parse("(0010,0010)[2].(0010,0020)"),
2375 v, false, Encoding_Latin1, "")); 2375 DicomPath::Parse("(0010,0010)[1].(0010,0020)")));
2376 d->writeXML(std::cout); 2376 ASSERT_THROW(DicomPath::IsMatch(DicomPath::Parse("(0010,0010)[1].(0010,0020)"),
2377 } 2377 DicomPath::Parse("(0010,0010)[*].(0010,0020)")), OrthancException);
2378 2378 ASSERT_TRUE(DicomPath::IsMatch(DicomPath::Parse("(0010,0010)[*].(0010,0020)[*].(0010,0030)"),
2379 { 2379 DicomPath::Parse("(0010,0010)[1].(0010,0020)[2].(0010,0030)[3].(0010,0040)")));
2380 Json::Value v = "Hello"; 2380 ASSERT_TRUE(DicomPath::IsMatch(DicomPath::Parse("(0010,0010)[1].(0010,0020)[2].(0010,0030)"),
2381 std::unique_ptr<DcmElement> d(FromDcmtkBridge::FromJson(DICOM_TAG_PATIENT_ID, 2381 DicomPath::Parse("(0010,0010)[1].(0010,0020)[2].(0010,0030)[3].(0010,0040)")));
2382 v, false, Encoding_Latin1, "")); 2382 ASSERT_FALSE(DicomPath::IsMatch(DicomPath::Parse("(0010,0010)[1].(0010,0020)[3].(0010,0030)"),
2383 d->writeXML(std::cout); 2383 DicomPath::Parse("(0010,0010)[1].(0010,0020)[2].(0010,0030)[3].(0010,0040)")));
2384 } 2384 ASSERT_FALSE(DicomPath::IsMatch(DicomPath::Parse("(0010,0010)[2].(0010,0020)[2].(0010,0030)"),
2385 2385 DicomPath::Parse("(0010,0010)[1].(0010,0020)[2].(0010,0030)[3].(0010,0040)")));
2386 printf("\n"); 2386 }
2387 2387
2388 { 2388
2389 Json::Value v = Json::objectValue; 2389
2390 v["PatientID"] = "Hello"; 2390 TEST(ParsedDicomFile, DicomPath)
2391 {
2392 Json::Value v = Json::objectValue;
2393 v["PatientName"] = "Hello";
2394 v["ReferencedSOPClassUID"] = "1.2.840.10008.5.1.4.1.1.4";
2395
2396 {
2397 Json::Value a = Json::arrayValue;
2391 2398
2392 { 2399 {
2393 Json::Value a = Json::arrayValue; 2400 Json::Value item = Json::objectValue;
2401 item["ReferencedSOPClassUID"] = "1.2.840.10008.5.1.4.1.1.4";
2402 item["ReferencedSOPInstanceUID"] = "1.2.840.113619.2.176.2025.1499492.7040.1171286241.719";
2403 a.append(item);
2404 }
2405
2406 {
2407 Json::Value item = Json::objectValue;
2408 item["ReferencedSOPClassUID"] = "1.2.840.10008.5.1.4.1.1.4"; // ReferencedSOPClassUID
2409 item["ReferencedSOPInstanceUID"] = "1.2.840.113619.2.176.2025.1499492.7040.1171286241.726";
2410 a.append(item);
2411 }
2412
2413 v["ReferencedImageSequence"] = a;
2414 }
2415
2416 {
2417 Json::Value a = Json::arrayValue;
2418
2419 {
2420 Json::Value item = Json::objectValue;
2421 item["StudyInstanceUID"] = "1.2.840.113704.1.111.7016.1342451220.40";
2394 2422
2395 { 2423 {
2396 Json::Value item = Json::objectValue; 2424 Json::Value b = Json::arrayValue;
2397 item["ReferencedSOPClassUID"] = "1.2.840.10008.5.1.4.1.1.4"; 2425
2398 item["ReferencedSOPInstanceUID"] = "1.2.840.113619.2.176.2025.1499492.7040.1171286241.719"; 2426 {
2399 a.append(item); 2427 Json::Value c = Json::objectValue;
2428 c["CodeValue"] = "122403";
2429 c["0010,0010"] = "WORLD"; // Patient name
2430 b.append(c);
2431 }
2432
2433 item["PurposeOfReferenceCodeSequence"] = b;
2400 } 2434 }
2435
2436 a.append(item);
2437 }
2401 2438
2402 { 2439 v["RelatedSeriesSequence"] = a;
2403 Json::Value item = Json::objectValue; 2440 }
2404 item["ReferencedSOPClassUID"] = "1.2.840.10008.5.1.4.1.1.4"; 2441
2405 item["ReferencedSOPInstanceUID"] = "1.2.840.113619.2.176.2025.1499492.7040.1171286241.726"; 2442 static const char* CODE_VALUE = "0008,0100";
2406 a.append(item); 2443 static const char* PATIENT_ID = "0010,0020";
2407 } 2444 static const char* PATIENT_NAME = "0010,0010";
2445 static const char* PURPOSE_CODE_SEQ = "0040,a170";
2446 static const char* REF_IM_SEQ = "0008,1140";
2447 static const char* REF_SOP_CLASS = "0008,1150";
2448 static const char* REF_SOP_INSTANCE = "0008,1155";
2449 static const char* REL_SERIES_SEQ = "0008,1250";
2450
2451 {
2452 std::unique_ptr<ParsedDicomFile> dicom(ParsedDicomFile::CreateFromJson(v, DicomFromJsonFlags_None, ""));
2453
2454 Json::Value vv;
2455 dicom->DatasetToJson(vv, DicomToJsonFormat_Short, DicomToJsonFlags_None, 0);
2456
2457 ASSERT_EQ(5u, vv.size());
2458 ASSERT_TRUE(vv.isMember(PATIENT_NAME));
2459 ASSERT_EQ(2u, vv[REF_IM_SEQ].size());
2460 ASSERT_EQ(1u, vv[REL_SERIES_SEQ].size());
2461 ASSERT_EQ(2u, vv[REF_IM_SEQ][0].size());
2462 ASSERT_EQ(2u, vv[REL_SERIES_SEQ][0].size());
2463 ASSERT_EQ(1u, vv[REL_SERIES_SEQ][0][PURPOSE_CODE_SEQ].size());
2464
2465 ASSERT_TRUE(vv[REF_IM_SEQ][0].isMember(REF_SOP_CLASS));
2466 ASSERT_TRUE(vv[REF_IM_SEQ][1].isMember(REF_SOP_CLASS));
2467 ASSERT_TRUE(vv[REL_SERIES_SEQ][0][PURPOSE_CODE_SEQ][0].isMember(CODE_VALUE));
2468 }
2469
2470 {
2471 std::unique_ptr<ParsedDicomFile> dicom(ParsedDicomFile::CreateFromJson(v, DicomFromJsonFlags_None, ""));
2472
2473 dicom->RemovePath(DicomPath::Parse("ReferencedImageSequence[*].ReferencedSOPClassUID"));
2474
2475 Json::Value vv;
2476 dicom->DatasetToJson(vv, DicomToJsonFormat_Short, DicomToJsonFlags_None, 0);
2477
2478 ASSERT_EQ(2u, vv[REF_IM_SEQ].size());
2479 ASSERT_EQ(1u, vv[REF_IM_SEQ][0].size());
2480 ASSERT_EQ(1u, vv[REF_IM_SEQ][1].size());
2481 ASSERT_FALSE(vv[REF_IM_SEQ][0].isMember(REF_SOP_CLASS));
2482 ASSERT_FALSE(vv[REF_IM_SEQ][1].isMember(REF_SOP_CLASS));
2483 }
2484
2485 {
2486 std::unique_ptr<ParsedDicomFile> dicom(ParsedDicomFile::CreateFromJson(v, DicomFromJsonFlags_None, ""));
2487
2488 dicom->RemovePath(DicomPath::Parse("ReferencedImageSequence[0].ReferencedSOPClassUID"));
2489
2490 Json::Value vv;
2491 dicom->DatasetToJson(vv, DicomToJsonFormat_Short, DicomToJsonFlags_None, 0);
2492
2493 ASSERT_EQ(2u, vv[REF_IM_SEQ].size());
2494 ASSERT_EQ(1u, vv[REF_IM_SEQ][0].size());
2495 ASSERT_EQ(2u, vv[REF_IM_SEQ][1].size());
2496 ASSERT_FALSE(vv[REF_IM_SEQ][0].isMember(REF_SOP_CLASS));
2497 ASSERT_TRUE(vv[REF_IM_SEQ][1].isMember(REF_SOP_CLASS));
2498 }
2499
2500 {
2501 std::unique_ptr<ParsedDicomFile> dicom(ParsedDicomFile::CreateFromJson(v, DicomFromJsonFlags_None, ""));
2502
2503 dicom->RemovePath(DicomPath::Parse("ReferencedImageSequence[1].ReferencedSOPClassUID"));
2504
2505 Json::Value vv;
2506 dicom->DatasetToJson(vv, DicomToJsonFormat_Short, DicomToJsonFlags_None, 0);
2507
2508 ASSERT_EQ(2u, vv[REF_IM_SEQ].size());
2509 ASSERT_EQ(2u, vv[REF_IM_SEQ][0].size());
2510 ASSERT_EQ(1u, vv[REF_IM_SEQ][1].size());
2511 ASSERT_TRUE(vv[REF_IM_SEQ][0].isMember(REF_SOP_CLASS));
2512 ASSERT_FALSE(vv[REF_IM_SEQ][1].isMember(REF_SOP_CLASS));
2513 }
2514
2515 {
2516 std::unique_ptr<ParsedDicomFile> dicom(ParsedDicomFile::CreateFromJson(v, DicomFromJsonFlags_None, ""));
2517
2518 dicom->RemovePath(DicomPath::Parse("RelatedSeriesSequence[0].PurposeOfReferenceCodeSequence[0].CodeValue"));
2519
2520 Json::Value vv;
2521 dicom->DatasetToJson(vv, DicomToJsonFormat_Short, DicomToJsonFlags_None, 0);
2522
2523 ASSERT_EQ("WORLD", vv[REL_SERIES_SEQ][0][PURPOSE_CODE_SEQ][0][PATIENT_NAME].asString());
2524 ASSERT_FALSE(vv[REL_SERIES_SEQ][0][PURPOSE_CODE_SEQ][0].isMember(CODE_VALUE));
2525 }
2526
2527 {
2528 std::unique_ptr<ParsedDicomFile> dicom(ParsedDicomFile::CreateFromJson(v, DicomFromJsonFlags_None, ""));
2529
2530 dicom->RemovePath(DicomPath::Parse("RelatedSeriesSequence[0].PurposeOfReferenceCodeSequence"));
2531
2532 Json::Value vv;
2533 dicom->DatasetToJson(vv, DicomToJsonFormat_Short, DicomToJsonFlags_None, 0);
2408 2534
2409 v["ReferencedImageSequence"] = a; 2535 ASSERT_EQ(1u, vv[REL_SERIES_SEQ][0].size());
2410 } 2536 ASSERT_FALSE(vv[REL_SERIES_SEQ][0].isMember(PURPOSE_CODE_SEQ));
2537 }
2411 2538
2412 { 2539 {
2413 Json::Value a = Json::arrayValue; 2540 std::unique_ptr<ParsedDicomFile> dicom(ParsedDicomFile::CreateFromJson(v, DicomFromJsonFlags_None, ""));
2414 2541
2415 { 2542 dicom->RemovePath(DicomPath::Parse("RelatedSeriesSequence"));
2416 Json::Value item = Json::objectValue; 2543
2417 item["StudyInstanceUID"] = "1.2.840.113704.1.111.7016.1342451220.40"; 2544 Json::Value vv;
2418 2545 dicom->DatasetToJson(vv, DicomToJsonFormat_Short, DicomToJsonFlags_None, 0);
2419 {
2420 Json::Value b = Json::arrayValue;
2421
2422 {
2423 Json::Value c = Json::objectValue;
2424 c["CodeValue"] = "122403";
2425 b.append(c);
2426 }
2427
2428 item["PurposeOfReferenceCodeSequence"] = b;
2429 }
2430
2431 a.append(item);
2432 }
2433 2546
2434 v["RelatedSeriesSequence"] = a; 2547 ASSERT_FALSE(vv.isMember(REL_SERIES_SEQ));
2435 } 2548 }
2436 2549
2437 std::unique_ptr<DcmDataset> d(FromDcmtkBridge::FromJson(v, false /* generate UID */, false, Encoding_Latin1, "")); 2550 {
2438 2551 std::unique_ptr<ParsedDicomFile> dicom(ParsedDicomFile::CreateFromJson(v, DicomFromJsonFlags_None, ""));
2439 static const DicomTag DICOM_TAG_REFERENCED_SOP_CLASS_UID(0x0008, 0x1150); 2552
2440 static const DicomTag DICOM_TAG_REFERENCED_IMAGE_SEQUENCE(0x0008, 0x1140); 2553 dicom->RemovePath(DicomPath(DICOM_TAG_PATIENT_NAME));
2441 2554 dicom->ReplacePath(DicomPath::Parse("ReferencedImageSequence[*].ReferencedSOPClassUID"),
2442 DicomPath path(DICOM_TAG_REFERENCED_SOP_CLASS_UID); 2555 "Hello1", false, DicomReplaceMode_ThrowIfAbsent, "");
2443 path.AddIndexedTagToPrefix(DICOM_TAG_REFERENCED_IMAGE_SEQUENCE, 2); 2556 ASSERT_THROW(dicom->ReplacePath(DicomPath::Parse("ReferencedImageSequence[*].PatientID"),
2444 //path.AddUniversalTagToPrefix(DICOM_TAG_REFERENCED_IMAGE_SEQUENCE); 2557 "Hello2", false, DicomReplaceMode_ThrowIfAbsent, ""), OrthancException);
2445 2558 dicom->ReplacePath(DicomPath::Parse("ReferencedImageSequence[*].PatientID"),
2446 //DicomPath path(DicomTag(0x0008, 0x0100)); 2559 "Hello3", false, DicomReplaceMode_InsertIfAbsent, "");
2447 //path.AddIndexedTagToPrefix(DicomTag(0x0008, 0x1250), 0); 2560 dicom->ReplacePath(DicomPath::Parse("ReferencedImageSequence[*].PatientName"),
2448 //path.AddIndexedTagToPrefix(DicomTag(0x0040, 0xa170), 1); 2561 "Hello4", false, DicomReplaceMode_IgnoreIfAbsent, "");
2449 2562 dicom->ReplacePath(DicomPath::Parse("RelatedSeriesSequence[*].PurposeOfReferenceCodeSequence[*].CodeValue"),
2450 //FromDcmtkBridge::RemovePath(*d, DicomPath::Parse("ReferencedImageSequence[*].ReferencedSOPClassUID")); 2563 "Hello5", false, DicomReplaceMode_ThrowIfAbsent, "");
2451 //FromDcmtkBridge::RemovePath(*d, DicomPath::Parse("ReferencedImageSequence[0].ReferencedSOPClassUID")); 2564
2452 //FromDcmtkBridge::RemovePath(*d, DicomPath::Parse("ReferencedImageSequence[1].ReferencedSOPClassUID"));
2453 FromDcmtkBridge::RemovePath(*d, DicomPath::Parse("RelatedSeriesSequence[0].PurposeOfReferenceCodeSequence[0].CodeValue"));
2454 //FromDcmtkBridge::RemovePath(*d, DicomPath::Parse("RelatedSeriesSequence[0].PurposeOfReferenceCodeSequence"));
2455 //FromDcmtkBridge::RemovePath(*d, DicomPath::Parse("RelatedSeriesSequence"));
2456
2457 {
2458 Json::Value v = "Hello";
2459 std::unique_ptr<DcmElement> e(FromDcmtkBridge::FromJson(DicomTag(0x0008, 0x0100), v, false, Encoding_Latin1, ""));
2460 FromDcmtkBridge::ReplacePath(*d, DicomPath::Parse("RelatedSeriesSequence[0].PurposeOfReferenceCodeSequence[0].CodeValue"), *e);
2461 }
2462
2463 {
2464 Json::Value v = "Hello";
2465 std::unique_ptr<DcmElement> e(FromDcmtkBridge::FromJson(DicomTag(0x0008, 0x1150), v, false, Encoding_Latin1, ""));
2466 FromDcmtkBridge::ReplacePath(*d, DicomPath::Parse("ReferencedImageSequence[*].ReferencedSOPClassUID"), *e);
2467 }
2468
2469 Json::Value vv; 2565 Json::Value vv;
2470 std::set<DicomTag> ignoreTagLength; 2566 dicom->DatasetToJson(vv, DicomToJsonFormat_Short, DicomToJsonFlags_None, 0);
2471 FromDcmtkBridge::ExtractDicomAsJson(vv, *d, DicomToJsonFormat_Short, DicomToJsonFlags_None, 0, ignoreTagLength); 2567
2472 std::cout << vv.toStyledString(); 2568 ASSERT_EQ(4u, vv.size());
2569 ASSERT_FALSE(vv.isMember(PATIENT_NAME));
2570 ASSERT_EQ("Hello1", vv[REF_IM_SEQ][0][REF_SOP_CLASS].asString());
2571 ASSERT_EQ("Hello3", vv[REF_IM_SEQ][0][PATIENT_ID].asString());
2572 ASSERT_EQ("Hello1", vv[REF_IM_SEQ][1][REF_SOP_CLASS].asString());
2573 ASSERT_EQ("Hello3", vv[REF_IM_SEQ][1][PATIENT_ID].asString());
2574 ASSERT_EQ("Hello5", vv[REL_SERIES_SEQ][0][PURPOSE_CODE_SEQ][0][CODE_VALUE].asString());
2575 }
2576
2577 {
2578 std::unique_ptr<ParsedDicomFile> dicom(ParsedDicomFile::CreateFromJson(v, DicomFromJsonFlags_None, ""));
2579
2580 dicom->ReplacePath(DicomPath::Parse("ReferencedImageSequence[1].ReferencedSOPClassUID"),
2581 "Hello1", false, DicomReplaceMode_ThrowIfAbsent, "");
2582 dicom->ReplacePath(DicomPath::Parse("RelatedSeriesSequence[0].PurposeOfReferenceCodeSequence[0].CodeValue"),
2583 "Hello2", false, DicomReplaceMode_ThrowIfAbsent, "");
2584
2585 Json::Value vv;
2586 dicom->DatasetToJson(vv, DicomToJsonFormat_Short, DicomToJsonFlags_None, 0);
2587
2588 ASSERT_EQ("1.2.840.10008.5.1.4.1.1.4", vv[REF_IM_SEQ][0][REF_SOP_CLASS].asString());
2589 ASSERT_EQ("Hello1", vv[REF_IM_SEQ][1][REF_SOP_CLASS].asString());
2590 ASSERT_EQ("Hello2", vv[REL_SERIES_SEQ][0][PURPOSE_CODE_SEQ][0][CODE_VALUE].asString());
2591 }
2592
2593 {
2594 std::unique_ptr<ParsedDicomFile> dicom(ParsedDicomFile::CreateFromJson(v, DicomFromJsonFlags_None, ""));
2595
2596 dicom->ClearPath(DicomPath::Parse("ReferencedImageSequence[1].ReferencedSOPClassUID"), true);
2597 dicom->ClearPath(DicomPath::Parse("RelatedSeriesSequence[0].PurposeOfReferenceCodeSequence[0].CodeValue"), true);
2598 dicom->ClearPath(DicomPath::Parse("ReferencedImageSequence[0].PatientID"), false);
2599 dicom->ClearPath(DicomPath::Parse("ReferencedImageSequence[0].PatientName"), true);
2600
2601 Json::Value vv;
2602 dicom->DatasetToJson(vv, DicomToJsonFormat_Short, DicomToJsonFlags_None, 0);
2603
2604 ASSERT_EQ(3u, vv[REF_IM_SEQ][0].size());
2605 ASSERT_EQ(2u, vv[REF_IM_SEQ][1].size());
2606
2607 ASSERT_EQ("1.2.840.10008.5.1.4.1.1.4", vv[REF_IM_SEQ][0][REF_SOP_CLASS].asString());
2608 ASSERT_EQ("1.2.840.113619.2.176.2025.1499492.7040.1171286241.719", vv[REF_IM_SEQ][0][REF_SOP_INSTANCE].asString());
2609 ASSERT_EQ("", vv[REF_IM_SEQ][0][PATIENT_ID].asString());
2610
2611 ASSERT_EQ("", vv[REF_IM_SEQ][1][REF_SOP_CLASS].asString());
2612 ASSERT_EQ("1.2.840.113619.2.176.2025.1499492.7040.1171286241.726", vv[REF_IM_SEQ][1][REF_SOP_INSTANCE].asString());
2613
2614 ASSERT_EQ("", vv[REL_SERIES_SEQ][0][PURPOSE_CODE_SEQ][0][CODE_VALUE].asString());
2473 } 2615 }
2474 } 2616 }
2475 2617
2476 2618
2477 2619