private AimTemplateTreeNode AimTemplateTreeNodeFromXsdComponent(TemplateComponent component)
        {
            AimTemplateTreeNode node = null;

            var allowedTerms = new List<AimTemplateTreeAllowedTerm>();

            if (component.Items != null)
            {
                foreach (object item in component.Items)
                {
                    if (item.GetType() == typeof(TemplateComponentAnatomicEntity))
                    {
                        node = AimTemplateTreeAnatomicEntityNodeFromXsdAnatomicEntity(component, (TemplateComponentAnatomicEntity)item);
                    }

                    if (item.GetType() == typeof(TemplateComponentImagingObservation))
                    {
                        node = AimTemplateTreeImagingObservationNodeFromXsdImagingObservation(component, (TemplateComponentImagingObservation)item);
                    }

                    if (item.GetType() == typeof(TemplateComponentInference))
                    {
                        node = AimTemplateTreeInferenceNodeFromXsdInference(component, (TemplateComponentInference)item);
                    }

                    if (item.GetType() == typeof(TemplateComponentGeometricShape))
                    {
                        node = AimTemplateTreeGeometricShapeNodeFromXsdGeometricShape(component,
                                                                                 (TemplateComponentGeometricShape)item);
                    }

                    if (item.GetType() == typeof(TemplateComponentCalculation))
                    {
                        node = AimTemplateTreeCalculationNodeFromXsdCalculation(component,
                                                                              (TemplateComponentCalculation)item);
                    }

                    if (item.GetType() == typeof(TemplateComponentAllowedTerm))
                    {
                        //AllowedTerm term = AllowedTermFromXsdAllowedTerm((TemplateComponentAllowedTerm)item);
                        //allowedTerms.Add(term);
                    }

                }
            }

            return node;
        }
        private AimTemplateTreeInferenceNode AimTemplateTreeInferenceNodeFromXsdInference(TemplateComponent component, TemplateComponentInference inference)
        {
            var allowedTerms = new List<AimTemplateTreeAllowedTerm>();
            for (int index = 0; index < component.Items.Length; index++)
            {
                object item = component.Items[index];
                if (item.GetType() == typeof(TemplateComponentAllowedTerm))
                {
                    var term = AllowedTermFromXsdAllowedTerm((TemplateComponentAllowedTerm)item);
                    if (term != null)
                    {
                        term.PresentationIndex = index;
                        allowedTerms.Add(term);
                    }
                }
            }

            int itemNumber;
            int.TryParse(component.itemNumber, out itemNumber);

            int minCardinality;
            int.TryParse(component.minCardinality, out minCardinality);

            int maxCardinality;
            int.TryParse(component.maxCardinality, out maxCardinality);

            string label = component.label;
            if (component.QuestionType != null)
                label = component.QuestionType.codeMeaning;

            var node = new AimTemplateTreeInferenceNode(
                label,
                itemNumber,
                component.explanatoryText,
                minCardinality,
                maxCardinality,
                component.shouldDisplay,
                component.groupLabel,
                ValidTermFromXsdValidTerm(component.QuestionType),
                inference.annotatorConfidence,
                allowedTerms,
                component.id
                );
            return node;
        }
        private AimTemplateTreeGeometricShapeNode AimTemplateTreeGeometricShapeNodeFromXsdGeometricShape(TemplateComponent component, TemplateComponentGeometricShape geometricShape)
        {
            int itemNumber;
            int.TryParse(component.itemNumber, out itemNumber);

            int minCardinality;
            int.TryParse(component.minCardinality, out minCardinality);

            int maxCardinality;
            int.TryParse(component.maxCardinality, out maxCardinality);

            string label = component.label;
            if (component.QuestionType != null)
                label = component.QuestionType.codeMeaning;

            var node = new AimTemplateTreeGeometricShapeNode(
                label,
                itemNumber,
                component.explanatoryText,
                minCardinality,
                maxCardinality,
                component.shouldDisplay,
                component.groupLabel,
                ValidTermFromXsdValidTerm(component.QuestionType),
                geometricShape.noMoreQuestions,
                geometricShape.nextId,
                component.id,
                GeometricShapesFromXsdGeometricShapeValue(geometricShape.Value)
                );
            return node;
        }
        private AimTemplateTreeImagingObservationNode AimTemplateTreeImagingObservationNodeFromXsdImagingObservation(TemplateComponent component, TemplateComponentImagingObservation imagingObservation)
        {
            var allowedTerms = new List<AimTemplateTreeAllowedTerm>();
            for (int index = 0; index < component.Items.Length; index++)
            {
                object item = component.Items[index];
                if (item.GetType() == typeof(TemplateComponentAllowedTerm))
                {
                    var term = AllowedTermFromXsdAllowedTerm((TemplateComponentAllowedTerm)item);
                    if (term != null)
                    {
                        term.PresentationIndex = index;
                        allowedTerms.Add(term);
                    }
                }
            }

            var imagingObservationCharacteristics = new List<AimTemplateTreeImagingObservationCharacteristicNode>();
            if (imagingObservation.ImagingObservationCharacteristic != null)
            {
                imagingObservationCharacteristics.AddRange(imagingObservation.ImagingObservationCharacteristic.Select(
                anatomicEntityCharacteristic => AimTemplateTreeImagingObservationCharacteristicNodeFromXsdImagingObservationCharacteristic(anatomicEntityCharacteristic)).ToList());
            }

            int itemNumber;
            int.TryParse(component.itemNumber, out itemNumber);

            int minCardinality;
            int.TryParse(component.minCardinality, out minCardinality);

            int maxCardinality;
            int.TryParse(component.maxCardinality, out maxCardinality);

            string label = component.label;
            if (component.QuestionType != null)
                label = component.QuestionType.codeMeaning;

            var node = new AimTemplateTreeImagingObservationNode(
                label,
                itemNumber,
                component.explanatoryText,
                minCardinality,
                maxCardinality,
                component.shouldDisplay,
                component.groupLabel,
                ValidTermFromXsdValidTerm(component.QuestionType),
                imagingObservation.annotatorConfidence,
                allowedTerms,
                imagingObservationCharacteristics,
                component.id
                );
            return node;
        }
        private AimTemplateTreeCalculationNode AimTemplateTreeCalculationNodeFromXsdCalculation(TemplateComponent component, TemplateComponentCalculation calculation)
        {
            int itemNumber;
            int.TryParse(component.itemNumber, out itemNumber);

            var calculationTypes = calculation.CalculationType.Select(calc => AimTemplateTreeCalculationTypeFromXsdCalculationType(calc)).ToList();

            int minCardinality;
            int.TryParse(component.minCardinality, out minCardinality);

            int maxCardinality;
            int.TryParse(component.maxCardinality, out maxCardinality);

            string label = component.label;
            if (component.QuestionType != null)
                label = component.QuestionType.codeMeaning;

            return new AimTemplateTreeCalculationNode(
                label,
                itemNumber,
                component.explanatoryText,
                minCardinality,
                maxCardinality,
                component.shouldDisplay,
                component.groupLabel,
                ValidTermFromXsdValidTerm(component.QuestionType),
                calculation.noMoreQuestions,
                calculation.nextId,
                calculationTypes,
                component.id
                );
        }