static void dumpAttributes(MDICOMWrapper& w, tagVector& v, ostream& o) { tagVector::iterator i = v.begin(); while (i != v.end()) { DCM_TAG t = *i; U16 group = DCM_TAG_GROUP(t); U16 element = DCM_TAG_ELEMENT(t); DCM_ELEMENT e; ::memset(&e, 0, sizeof(e)); e.tag = t; CONDITION cond = ::DCM_LookupElement(&e); if (cond != DCM_NORMAL) { ::COND_PopCondition(TRUE); e.description[0] = '\0'; } o << hex << setw(4) << setfill ('0') << group << " " << hex << setw(4) << element; o << setw (40) << setfill (' ') << e.description << ": "; MString s = w.getString(t); o << resetiosflags(0); o << s; o << endl; i++; } }
static void printElement(DCM_ELEMENT * element) { switch (element->representation) { case DCM_AS: /* Age string */ case DCM_CS: /* control string */ case DCM_DA: /* Date */ case DCM_DS: /* Decimal string */ case DCM_IS: /* Integer string */ case DCM_LO: /* Long string */ case DCM_LT: /* Long text */ case DCM_ST: /* Short text */ case DCM_SH: /* Short string */ case DCM_TM: /* Time */ case DCM_UI: /* UID */ case DCM_PN: /* Person name */ printf(" %08x, %2d, %s, %s\n", element->tag, element->length, element->description, element->d.string); break; case DCM_SS: /* Signed short */ printf(" %08x, %2d, %s, %d\n", element->tag, element->length, element->description, *element->d.us); break; case DCM_SL: /* signed long */ printf(" %08x, %2d, %s, %ld\n", element->tag, element->length, element->description, *element->d.sl); break; case DCM_US: /* unsigned short */ printf(" %08x, %2d, %s, %u\n", element->tag, element->length, element->description, *element->d.us); break; case DCM_UL: /* unsigned long */ printf(" %08x, %2d, %s, %lu\n", element->tag, element->length, element->description, *element->d.ul); break; case DCM_AT: /* attribute Tag */ { unsigned long i; printf(" %08x, %2d, %s,", element->tag, element->length, element->description); for (i = 0; i < (element->length / sizeof(DCM_TAG)); i++) { printf("<%04x,%04x> ", DCM_TAG_GROUP(element->d.at[i]), DCM_TAG_ELEMENT(element->d.at[i])); } printf("\n"); } break; default: break; } }
/* - search field '0x0029 1010' for string MosaicRefAcqTimes * - from there, find text formatted floats * - stop at AutoInlineImageFilterEnabled, if found */ static int check_for_mosaic_slice_times(PRV_ELEMENT_ITEM * elementItem) { unsigned el_gr = DCM_TAG_GROUP(elementItem->element.tag); unsigned el_el = DCM_TAG_ELEMENT(elementItem->element.tag); int el_len = elementItem->element.length; char start_txt[] = "MosaicRefAcqTimes"; char end_txt[] = "AutoInlineImageFilterEnabled"; siemens_slice_times_t * ST = & g_siemens_slice_times; /* global struct */ char * instr, * mstr; /* input string and Mosaic string addr */ char * s2; /* second search string, posn of AutoInline... */ char * pstr; /* position pointer, for reading times */ int rem, rem2 = 0; /* remainder counts */ int off, c, rv, diff; /* offset and counter vars */ float stime; /* any read slice time */ /* if this is not the correct element, nothing to do */ if( el_gr != 0x0029 || el_el != 0x1010 ) return 0; /* we are in the correct field, start by clearing old results */ ST->nused = 0; /* input string is field text, mstr is resulting MosaicRef text pointer */ instr = (char *)elementItem->element.d.ot; mstr = findstr(instr, start_txt, el_len); if( ! mstr ) { if( g_MDH_verb > 2 ) fprintf(stderr, "-- CFMST, no Mosaic string\n"); return 0; } off = mstr - instr; /* offset of Mosaic string into field */ rem = el_len - off; /* remaining length of field */ /* secondary remainder to be until any AutoInline... string */ s2 = findstr(mstr, end_txt, rem); if( s2 ) rem2 = s2 - mstr; else rem2 = 0; if( g_MDH_verb > 1 ) fprintf(stderr, "== found %s in 0x0029 1010\n" " off = %d of %d bytes (rem %d, %d)\n", start_txt, off, el_len, rem, rem2); if( s2 ) rem = rem2; /* after verbose, update remaining length */ if( rem <= 0 ) return 0; process_csa_data((unsigned char *)instr, el_len, g_MDH_verb, g_MDH_verb>3, start_txt); /* in really verbose mode, print out raw text */ if( g_MDH_verb > 3 ) { unsigned char * ucp = (unsigned char *)mstr; fprintf(stderr, "-- remaining spaced hex or digit or '.' :\n"); for(c=0; c<rem; c++) if( isdigit(mstr[c]) || mstr[c]=='.' ) fprintf(stderr," '%c'",mstr[c]); else fprintf(stderr," %02x", ucp[c]); fprintf(stderr, "(end)done\n"); } if( g_MDH_verb > 1 ) fprintf(stderr,"\n++ found %d slice times\n", ST->nused); return 0; }
static void browseSelectionCB_scrolledList3( Widget wgt, XtPointer cd, XtPointer cb) { Widget UxWidget = wgt; XtPointer UxClientData = cd; XtPointer UxCallbackArg = cb; { /* * scrolledList3 * * * Purpose: * This subroutine lists the description of the selected * attribute * in the text widgets. * * * Parameter Dictinary: * cbs input, pointer to the * selected attribute * * * Return Value: * Description of the element * * * Notes: * * * Algorithm: * Description of the algorithm (optional) and any * other notes. * * */ XmListCallbackStruct *cbs; char *atname; int i; char buf2[64], buf1[64]; CONDITION cond; unsigned short gg, ee; cbs = (XmListCallbackStruct *) UxCallbackArg; if ((atname = (char *) malloc(64)) == NULL) printf(" malloc atname failed\n"); XmStringGetLtoR(cbs->item, XmSTRING_DEFAULT_CHARSET, &atname); if (strlen(XmTextGetString(text1)) != 0) XmTextSetString(text1, NULL); if (strlen(XmTextGetString(text2)) != 0) XmTextSetString(text2, NULL); ieAttr = LST_Head(&attr_head); (void) LST_Position(&attr_head, ieAttr); for (i = 2; i <= cbs->item_position; i++) ieAttr = LST_Next(&attr_head); cond = DCM_LookupElement(&ieAttr->element); if (cond != DCM_NORMAL) { (void) COND_ExtractConditions(errorstackP); copyWtext(info); (void) COND_PopCondition(clearStack); free(info); } sprintf(buf1, " %s", atname); XmTextSetString(text1, buf1); if (ieAttr->element.length == 0) { strcpy(buf2, "<None>"); XmTextSetString(text2, buf2); } else { switch (ieAttr->element.representation) { case DCM_AS: /* Age String */ case DCM_CS: /* control string */ case DCM_DA: /* date */ case DCM_DS: /* decimal string */ case DCM_IS: /* integer string */ case DCM_LO: /* long string */ case DCM_LT: /* long text */ case DCM_ST: /* short text */ case DCM_SH: /* short string */ case DCM_TM: /* time */ case DCM_UI: /* uid */ case DCM_PN: /* person name */ gg = DCM_TAG_GROUP(ieAttr->element.tag); ee = DCM_TAG_ELEMENT(ieAttr->element.tag); sprintf(buf2, "%04x, %04x, %s", gg, ee, ieAttr->element.d.string); XmTextSetString(text2, buf2); break; case DCM_SS: /* signed short */ gg = DCM_TAG_GROUP(ieAttr->element.tag); ee = DCM_TAG_ELEMENT(ieAttr->element.tag); sprintf(buf2, "%04x, %04x, %d", gg, ee, *(ieAttr->element.d.us)); XmTextSetString(text2, buf2); break; case DCM_SL: /* signed long */ gg = DCM_TAG_GROUP(ieAttr->element.tag); ee = DCM_TAG_ELEMENT(ieAttr->element.tag); sprintf(buf2, " %04x, %04x, %d", gg, ee, *(ieAttr->element.d.sl)); XmTextSetString(text2, buf2); break; case DCM_US: /* unsigned short */ gg = DCM_TAG_GROUP(ieAttr->element.tag); ee = DCM_TAG_ELEMENT(ieAttr->element.tag); sprintf(buf2, " %04x, %04x, %d", gg, ee, *(ieAttr->element.d.us)); XmTextSetString(text2, buf2); break; case DCM_UL: /* unsigned long */ gg = DCM_TAG_GROUP(ieAttr->element.tag); ee = DCM_TAG_ELEMENT(ieAttr->element.tag); sprintf(buf2, " %04x, %04x, %d", gg, ee, *(ieAttr->element.d.ul)); XmTextSetString(text2, buf2); break; default: break; } } free(atname); } }
main(int argc, char **argv) { CONDITION cond; LST_HEAD *l, *elementList; DCM_ELEMENT_NODE *n, *elementNode; unsigned short group; CTNBOOLEAN uidDictionary = FALSE; while (--argc > 0 && (*++argv)[0] == '-') { switch (*(argv[0] + 1)) { case 'u': uidDictionary = TRUE; break; default: fprintf(stderr, "Unrecognized option: %s\n", *argv); exit(1); break; } } THR_Init(); if (uidDictionary) { UID_ScanDictionary(uidCallback, 0); THR_Shutdown(); return 0; } l = LST_Create(); if (l == NULL) { THR_Shutdown(); return 1; } elementList = LST_Create(); if (elementList == NULL) { THR_Shutdown(); return 1; } cond = DCM_GroupDictionary(0xffff, &l, groupCallback); if (cond != DCM_NORMAL) { COND_DumpConditions(); THR_Shutdown(); exit(1); } n = LST_Dequeue(&l); while (n != NULL) { group = DCM_TAG_GROUP(n->e.tag); printf("%04x %s\n", group, n->e.description); cond = DCM_ElementDictionary(DCM_MAKETAG(group, 0xffff), &elementList, elementCallback); if (cond != DCM_NORMAL) { COND_DumpConditions(); THR_Shutdown(); exit(1); } elementNode = LST_Dequeue(&elementList); while (elementNode != NULL) { printf(" %04x %04x %s %s\n", DCM_TAG_GROUP(elementNode->e.tag), DCM_TAG_ELEMENT(elementNode->e.tag), translate(elementNode->e.representation), elementNode->e.description); free(elementNode); elementNode = LST_Dequeue(&elementList); } free(n); n = LST_Dequeue(&l); } THR_Shutdown(); return 0; }
static CONDITION callback(const DCM_ELEMENT* e, void* ctx) { char txt[512] = ""; printf("<TR>\n"); printf("<TD>%04x %04x</TD>\n", DCM_TAG_GROUP(e->tag), DCM_TAG_ELEMENT(e->tag)); printf("<TD>%s\n", translate(e->representation)); printf("<TD ALIGN=RIGHT>%6d</TD>\n", e->length); printf("<TD ALIGN=CENTER>%s</TD>\n", e->description); if (e->d.ot == NULL) { strcpy(txt, "No data"); } else if (e->length == 0) { strcpy(txt, "0 length data"); } else { if (DCM_IsString(e->representation)) { int stringLength; stringLength = MIN(sizeof(txt)-1, e->length); strncpy(txt, e->d.string, stringLength); txt[stringLength] = '\0'; } else { switch (e->representation) { case DCM_AE: case DCM_AS: break; case DCM_AT: sprintf(txt, "%04x %04x", DCM_TAG_GROUP(*e->d.ul), DCM_TAG_ELEMENT(*e->d.ul)); break; case DCM_CS: case DCM_DA: break; case DCM_DD: strcpy(txt, "Unimplemented"); break; case DCM_DS: break; case DCM_FD: case DCM_FL: strcpy(txt, "Unimplemented"); break; case DCM_IS: case DCM_LO: case DCM_LT: case DCM_OT: case DCM_SH: break; case DCM_SL: sprintf(txt, "%d", *e->d.sl); break; case DCM_SQ: strcpy(txt, "Unimplemented"); break; case DCM_SS: sprintf(txt, "%d", *e->d.ss); break; case DCM_ST: case DCM_TM: case DCM_UI: break; case DCM_UL: sprintf(txt, "%d", *e->d.ul); break; case DCM_US: sprintf(txt, "%d", *e->d.us); break; case DCM_UNKNOWN: strcpy(txt, "Unknown"); break; case DCM_RET: strcpy(txt, "Retired"); break; case DCM_CTX: strcpy(txt, "Context sensitive"); break; case DCM_PN: break; case DCM_OB: case DCM_OW: strcpy(txt, "OB or OW"); break; case DCM_DT: break; case DCM_DLM: strcpy(txt, "Delimiter"); break; default: break; } } } printf("<TD>%s</TD></TR>\n", txt); return DCM_NORMAL; }
int MLMPPSEvaluator::evalPPSRelationshipUnscheduledFinal(const MString& dataSource) { // See PS 3.4, Table F.7.2-1 DCM_TAG tags[] = { 0x00100010, // Patient Name 0x00100020, // Patient ID 0x00100030, // Patient's Birth Date 0x00100040, // Patient's Sex 0}; U16 uGroup; U16 uElement; int rtnStatus = 0; int idx = 0; for (idx = 0; tags[idx] != 0; idx++) { MString t = mTestData.getString(tags[idx]); MString s = mStandardData.getString(tags[idx]); uGroup = DCM_TAG_GROUP(tags[idx]); uElement = DCM_TAG_ELEMENT(tags[idx]); if (t != s) { cout << MESA_ERROR_TEXT << " MPPS mismatch in PPS Relationship " << setw(4) << setfill ('0') << hex << uGroup << " " << setw(4) << setfill ('0') << hex << uElement << " (" << s << ":" << t << ")" << endl; rtnStatus = 1; } else if (mOutputLevel >= 3) { cout << MESA_CONTEXT_TEXT << " " << setw(4) << setfill ('0') << hex << uGroup << " " << setw(4) << setfill ('0') << hex << uElement << " " << s << " " << t << endl; } } // For the unscheduled case, these attributes should be of zero length. // That means, we can test for them (0-length strings). DCM_TAG scheduledStepAttributeSeqTags[] = { 0x00080050, // Accession Number 0x00401001, // Requested Procedure ID 0x00321060, // Requested Procedure Description, 0x00400009, // Scheduled Procedure Step ID 0x00400007, // Scheduled Procedure Step Description 0 }; for (idx = 0; scheduledStepAttributeSeqTags[idx] != 0; idx++) { MString t = mTestData.getString(0x00400270, scheduledStepAttributeSeqTags[idx]); MString s = mStandardData.getString(0x00400270, scheduledStepAttributeSeqTags[idx]); uGroup = DCM_TAG_GROUP(scheduledStepAttributeSeqTags[idx]); uElement = DCM_TAG_ELEMENT(scheduledStepAttributeSeqTags[idx]); if (t != s) { cout << MESA_ERROR_TEXT << " MPPS mismatch in PPS Relationship 00400270 " << setw(4) << setfill ('0') << hex << uGroup << " " << setw(4) << setfill ('0') << hex << uElement << " (" << s << ":" << t << ")" << endl; rtnStatus = 1; } else if (mOutputLevel >= 3) { cout << MESA_CONTEXT_TEXT << " " << "0040 0270 " << setw(4) << setfill ('0') << hex << uGroup << " " << setw(4) << setfill ('0') << hex << uElement << " " << s << " " << t << endl; } } return rtnStatus; }
int MLMPPSEvaluator::evalPPSImageAcqScheduledFinal(const MString& dataSource) { // See PS 3.4, Table F.7.2-1 DCM_TAG tags[] = { 0x00080060, // Modality //0x00200010, // Study ID 0}; U16 uGroup; U16 uElement; int rtnStatus = 0; int idx = 0; for (idx = 0; tags[idx] != 0; idx++) { MString t = mTestData.getString(tags[idx]); MString s = mStandardData.getString(tags[idx]); uGroup = DCM_TAG_GROUP(tags[idx]); uElement = DCM_TAG_ELEMENT(tags[idx]); if (t != s) { cout << MESA_ERROR_TEXT << " MPPS mismatch in PPS ImageAcq " << setw(4) << setfill ('0') << hex << uGroup << " " << setw(4) << setfill ('0') << hex << uElement << " (" << s << ":" << t << ")" << endl; rtnStatus = 1; } else if (mOutputLevel >= 3) { cout << MESA_CONTEXT_TEXT << " " << setw(4) << setfill ('0') << hex << uGroup << " " << setw(4) << setfill ('0') << hex << uElement << " " << s << " " << t << endl; } } DCM_TAG tag = 0x00200010; MString tStudyID = mTestData.getString(tag); MString sStudyID = mStandardData.getString(tag); uGroup = DCM_TAG_GROUP(tag); uElement = DCM_TAG_ELEMENT(tag); if (tStudyID != sStudyID) { cout << MESA_WARN_TEXT << " This is a warning only; Study ID is a recommended value, not required" << endl; cout << MESA_WARN_TEXT << " MPPS mismatch in PPS ImageAcq " << setw(4) << setfill ('0') << hex << uGroup << " " << setw(4) << setfill ('0') << hex << uElement << " (" << sStudyID << ":" << tStudyID << ")" << endl; //rtnStatus = 1; // This is not a failure, just a warning } else if (mOutputLevel >= 3) { cout << MESA_CONTEXT_TEXT << " " << setw(4) << setfill ('0') << hex << uGroup << " " << setw(4) << setfill ('0') << hex << uElement << " " << sStudyID << " " << tStudyID << endl; } if (this->mPerformedProtocolCodeFlag == false) { cout << MESA_CONTEXT_TEXT << " " << "You have decided not to evaluate the Performed Protocol Code Sequence" << endl; return rtnStatus; } DCM_TAG performedAICodeSeqTags[] = { 0x00080100, // Code Value 0x00080102, // Coding Scheme Designator 0x00080104, // Code Meaning 0 }; for (idx = 0; performedAICodeSeqTags[idx] != 0; idx++) { MString t = mTestData.getString(0x00400260, performedAICodeSeqTags[idx]); MString s = mStandardData.getString(0x00400260, performedAICodeSeqTags[idx]); uGroup = DCM_TAG_GROUP(performedAICodeSeqTags[idx]); uElement = DCM_TAG_ELEMENT(performedAICodeSeqTags[idx]); if (t != s) { cout << MESA_ERROR_TEXT << " MPPS mismatch in PPS ImageAcq 0040 0260 " << setw(4) << setfill ('0') << hex << uGroup << " " << setw(4) << setfill ('0') << hex << uElement << " (" << s << ":" << t << ")" << endl; rtnStatus = 1; } else if (mOutputLevel >= 3) { cout << MESA_CONTEXT_TEXT << " " << "0040 0260 " << setw(4) << setfill ('0') << hex << uGroup << " " << setw(4) << setfill ('0') << hex << uElement << " " << s << " " << t << endl; } } return rtnStatus; }
int MLMPPSEvaluator::evalPPSInformationScheduledFinal(const MString& dataSource) { // See PS 3.4, Table F.7.2-1 DCM_TAG tags[] = { 0x00400252, // PPS Status 0}; U16 uGroup; U16 uElement; int rtnStatus = 0; int idx = 0; for (idx = 0; tags[idx] != 0; idx++) { MString t = mTestData.getString(tags[idx]); MString s = mStandardData.getString(tags[idx]); uGroup = DCM_TAG_GROUP(tags[idx]); uElement = DCM_TAG_ELEMENT(tags[idx]); if (t != s) { cout << MESA_ERROR_TEXT << " MPPS mismatch in PPS Information " << setw(4) << setfill ('0') << hex << uGroup << " " << setw(4) << setfill ('0') << hex << uElement << " (" << s << ":" << t << ")" << endl; rtnStatus = 1; } else if (mOutputLevel >= 3) { cout << MESA_CONTEXT_TEXT << " " << setw(4) << setfill ('0') << hex << uGroup << " " << setw(4) << setfill ('0') << hex << uElement << " " << s << " " << t << endl; } } DCM_TAG procedureCodeSeqTags[] = { 0x00080100, // Code Value 0x00080102, // Coding Scheme Designator 0x00080104, // Code Meaning 0 }; int iStandard; int iTest; iStandard = 1; bool foundMatch = false; MString pCode = mStandardData.getString(0x00081032, 0x00080100, iStandard); while (pCode != "") { if (mOutputLevel >= 3) { cout << "CTX: Searching for code for (0008 1032) (0008 0100) " << pCode << endl; } foundMatch = false; iTest = 1; MString tCode; tCode = mTestData.getString(0x00081032, 0x00080100, iTest); while (foundMatch == false && tCode != "") { if (mOutputLevel >= 3) { cout << "CTX: Code in test message for (0008 1032) (0008 0100) " << tCode << endl; } if (pCode == tCode) { foundMatch = true; MString s; MString t; for (idx = 0; procedureCodeSeqTags[idx] != 0; idx++) { t = mTestData.getString(0x00081032, procedureCodeSeqTags[idx], iTest); s = mStandardData.getString(0x00081032, procedureCodeSeqTags[idx], iStandard); uGroup = DCM_TAG_GROUP(procedureCodeSeqTags[idx]); uElement = DCM_TAG_ELEMENT(procedureCodeSeqTags[idx]); if (t != s) { cout << MESA_ERROR_TEXT << " MPPS mismatch in PPS Information 0008 1032 " << setw(4) << setfill ('0') << hex << uGroup << " " << setw(4) << setfill ('0') << hex << uElement << " (" << s << ":" << t << ")" << endl; rtnStatus = 1; } else if (mOutputLevel >= 3) { cout << MESA_CONTEXT_TEXT << " " << "0008 1032 " << setw(4) << setfill ('0') << hex << uGroup << " " << setw(4) << setfill ('0') << hex << uElement << " " << s << " " << t << endl; } } } else { iTest++; tCode = mTestData.getString(0x00081032, 0x00080100, iTest); } } if (!foundMatch) { cout << "Found no matching code for (0008 1032) (0008 0100) " << pCode << endl; rtnStatus = 1; } iStandard++; pCode = mStandardData.getString(0x00081032, 0x00080100, iStandard); } return rtnStatus; }
int MLMPPSEvaluator::evalPPSRelationshipGroupCaseFinal(const MString& dataSource) { // See PS 3.4, Table F.7.2-1 U16 uGroup; U16 uElement; DCM_TAG tags[] = { 0x00100010, // Patient Name 0x00100020, // Patient ID 0x00100030, // Patient's Birth Date 0x00100040, // Patient's Sex 0}; int rtnStatus = 0; int idx = 0; for (idx = 0; tags[idx] != 0; idx++) { MString t = mTestData.getString(tags[idx]); MString s = mStandardData.getString(tags[idx]); uGroup = DCM_TAG_GROUP(tags[idx]); uElement = DCM_TAG_ELEMENT(tags[idx]); if (t != s) { cout << MESA_ERROR_TEXT << " MPPS mismatch in PPS Relationship " << setw(4) << setfill ('0') << hex << uGroup << " " << setw(4) << setfill ('0') << hex << uElement << " (" << s << ":" << t << ")" << endl; rtnStatus = 1; } else if (mOutputLevel >= 3) { cout << MESA_CONTEXT_TEXT << " " << setw(4) << setfill ('0') << hex << uGroup << " " << setw(4) << setfill ('0') << hex << uElement << " " << s << " " << t << endl; } } int countSPSStandard = 0; int countSPSTest = 0; MString sx = mStandardData.getString(0x00400270, 0x00400009, countSPSStandard + 1); while (sx != "") { countSPSStandard++; sx = mStandardData.getString(0x00400270, 0x00400009, countSPSStandard+1); } sx = mTestData.getString(0x00400270, 0x00400009, countSPSTest + 1); while (sx != "") { countSPSTest++; sx = mStandardData.getString(0x00400270, 0x00400009, countSPSTest + 1); } if (countSPSStandard != countSPSTest) { cout << MESA_ERROR_TEXT << " MPPS mismatch in PPS Relationship 0040 0270 " << endl << " Standard data has " << countSPSStandard << " SPS items" << endl << " Test data has " << countSPSTest << " SPS items" << endl; return 1; } DCM_TAG scheduledStepAttributeSeqTags[] = { 0x00080050, // Accession Number 0x00401001, // Requested Procedure ID 0x00321060, // Requested Procedure Description, 0x00400009, // Scheduled Procedure Step ID 0x00400007, // Scheduled Procedure Step Description 0 }; // We should add a test for 0020 000D Study Instance UID. // They are supposed to pick a Study Instance UID different // from what is in the MWL. int idxStandard = 0; int idxTest = 0; for (idxStandard = 0; idxStandard < countSPSStandard; idxStandard++) { MDICOMWrapper* wStandard = mStandardData.getSequenceWrapper(0x00400270, idxStandard+1); if (wStandard == 0) { cout << MESA_ERROR_TEXT << " MPPS mismatch in PPS Relationship 0040 0270 " << endl << " expected to find a sequence item in Standard Data at index: " << idxStandard+1 << endl << " but found no item" << endl; return 1; } sx = wStandard->getString(0x00400009); MDICOMWrapper* wTest = this->matchingScheduledStep(wStandard, sx); if (wTest == 0) { cout << MESA_ERROR_TEXT << " MPPS mismatch in PPS Relationship 0040 0270 " << endl << " expected to find a sequence item in test data for " << sx << " but found no item" << endl; return 1; } for (idx = 0; scheduledStepAttributeSeqTags[idx] != 0; idx++) { MString t = wTest->getString(scheduledStepAttributeSeqTags[idx]); MString s = wStandard->getString(scheduledStepAttributeSeqTags[idx]); uGroup = DCM_TAG_GROUP(scheduledStepAttributeSeqTags[idx]); uElement = DCM_TAG_ELEMENT(scheduledStepAttributeSeqTags[idx]); if (t != s) { cout << MESA_ERROR_TEXT << " MPPS mismatch in PPS Relationship 0040 0270 " << setw(4) << setfill ('0') << hex << uGroup << " " << setw(4) << setfill ('0') << hex << uElement << "(" << s << ":" << t << ")" << endl; rtnStatus = 1; } else if (mOutputLevel >= 3) { cout << MESA_CONTEXT_TEXT << " " << setw(4) << setfill ('0') << hex << uGroup << " " << setw(4) << setfill ('0') << hex << uElement << " " << s << " " << t << endl; } } delete wStandard; delete wTest; } #if 0 for (idx = 0; scheduledStepAttributeSeqTags[idx] != 0; idx++) { MString t = mTestData.getString(0x00400270, scheduledStepAttributeSeqTags[idx]); MString s = mStandardData.getString(0x00400270, scheduledStepAttributeSeqTags[idx]); uGroup = DCM_TAG_GROUP(scheduledStepAttributeSeqTags[idx]); uElement = DCM_TAG_ELEMENT(scheduledStepAttributeSeqTags[idx]); if (t != s) { cout << "MPPS mismatch in PPS Relationship 0040 0270 " << setw(4) << setfill ('0') << hex << uGroup << " " << setw(4) << setfill ('0') << hex << uElement << "(" << s << ":" << t << ")" << endl; rtnStatus = 1; } else if (mOutputLevel >= 3) { cout << setw(4) << setfill ('0') << hex << uGroup << " " << setw(4) << setfill ('0') << hex << uElement << " " << s << " " << t << endl; } } #endif return rtnStatus; }
int MLMPPSEvaluator::evalPPSRelationshipScheduledFinal(const MString& dataSource) { // See PS 3.4, Table F.7.2-1 U16 uGroup; U16 uElement; DCM_TAG tags[] = { 0x00100010, // Patient Name 0x00100020, // Patient ID 0x00100030, // Patient's Birth Date 0x00100040, // Patient's Sex 0}; MDICOMElementEval evl; int rtnStatus = 0; int idx = 0; if (mOutputLevel >= 3) { cout << MESA_CONTEXT_TEXT << " MPPS Relationship module (Scheduled case)" << endl; } for (idx = 0; tags[idx] != 0; idx++) { MString t = mTestData.getString(tags[idx]); // The string from the test object MString s = mStandardData.getString(tags[idx]); // The string from the gold std uGroup = DCM_TAG_GROUP(tags[idx]); // The group number of the attribute uElement = DCM_TAG_ELEMENT(tags[idx]); // The lement number of the attribute int eRtn = 0; // Return value from element evaluation MString lang = (tags[idx] == 0x00100010) ? mLanguage : ""; eRtn = evl.evalElement(mOutputLevel, mTestData, mStandardData, tags[idx], lang); if (eRtn < 0) { cout << MESA_ERROR_TEXT << " MPPS mismatch in PPS Relationship " << setw(4) << setfill ('0') << hex << uGroup << " " << setw(4) << setfill ('0') << hex << uElement << " (" << s << ":" << t << ")" << endl; rtnStatus = 1; } else if ((eRtn > 0) && (mOutputLevel >= 2)) { cout << MESA_WARN_TEXT << " " << setw(4) << setfill ('0') << hex << uGroup << " " << setw(4) << setfill ('0') << hex << uElement << " " << s; if (tags[idx] == 0x00100010){ cout << endl << MESA_WARN_TEXT << " " << setw(4) << setfill ('0') << hex << uGroup << " " << setw(4) << setfill ('0') << hex << uElement; } cout << " " << t << endl; } else if (mOutputLevel >= 3) { cout << MESA_CONTEXT_TEXT << " " << setw(4) << setfill ('0') << hex << uGroup << " " << setw(4) << setfill ('0') << hex << uElement << " STD " << s; if (tags[idx] == 0x00100010){ cout << endl << MESA_CONTEXT_TEXT << " " << setw(4) << setfill ('0') << hex << uGroup << " " << setw(4) << setfill ('0') << hex << uElement; } cout << " TEST " << t << endl; } } DCM_TAG scheduledStepAttributeSeqTags[] = { 0x0020000D, // Study Instance UID 0x00080050, // Accession Number 0x00401001, // Requested Procedure ID 0x00321060, // Requested Procedure Description, 0x00400009, // Scheduled Procedure Step ID 0x00400007, // Scheduled Procedure Step Description 0 }; if (mOutputLevel >= 3) { cout << MESA_CONTEXT_TEXT << " " << "Scheduled Step Attribute Sequence 0040 0270" << endl; } for (idx = 0; scheduledStepAttributeSeqTags[idx] != 0; idx++) { MString t = mTestData.getString(0x00400270, scheduledStepAttributeSeqTags[idx]); MString s = mStandardData.getString(0x00400270, scheduledStepAttributeSeqTags[idx]); uGroup = DCM_TAG_GROUP(scheduledStepAttributeSeqTags[idx]); uElement = DCM_TAG_ELEMENT(scheduledStepAttributeSeqTags[idx]); if (t != s) { cout << MESA_ERROR_TEXT << " MPPS mismatch in PPS Relationship 0040 0270 " << setw(4) << setfill ('0') << hex << uGroup << " " << setw(4) << setfill ('0') << hex << uElement << "(" << s << ":" << t << ")" << endl; rtnStatus = 1; } else if (mOutputLevel >= 3) { cout << MESA_CONTEXT_TEXT << " " << setfill ('0') << hex << uGroup << " " << setw(4) << setfill ('0') << hex << uElement << " " << s << " " << t << endl; } } return rtnStatus; }