Esempio n. 1
0
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++;
  }
}
Esempio n. 2
0
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;
}
Esempio n. 4
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);

    }
}
Esempio n. 5
0
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;
}
Esempio n. 6
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;
}
Esempio n. 7
0
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;
}
Esempio n. 8
0
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;
}
Esempio n. 9
0
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;
}
Esempio n. 10
0
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;
}
Esempio n. 11
0
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;
}