@Override public double getScore(FeatureMetadatum match, FeatureMetadatum reference) { if (match == null || reference == null || StringUtils.isEmpty(match.getId()) || StringUtils.isEmpty(reference.getId())) { // Not enough information return 0; } return (NEUTRAL_DIST - distance(match.getId(), reference.getId())) / NEUTRAL_DIST; }
@Override public JSONObject toJSON() { JSONObject result = super.toJSON(); result.put("observed", getObserved()); result.put("type", "phenotype"); // TODO: get ageOfOnset out of metadata if (!this.metadata.isEmpty()) { JSONArray metadataList = new JSONArray(); for (FeatureMetadatum metadatum : this.metadata.values()) { metadataList.put(metadatum.toJSON()); } result.put("metadata", metadataList); } return result; }
@Override public String getName() { return this.access.isOpenAccess() && this.match != null ? this.match.getName() : null; }
@Override public double getScore(FeatureMetadatum match, FeatureMetadatum reference) { if (reference == null || match == null || !StringUtils.equals(reference.getType(), match.getType())) { // Not enough information, or different metadata types return 0; } else if (StringUtils.equals(reference.getId(), match.getId())) { // Same term return 1; } else { // Different terms return -1; } } }
@Override public double getScore() { if (this.match == null || this.reference == null || StringUtils.isEmpty(this.match.getId()) || StringUtils.isEmpty(this.reference.getId())) { return Double.NaN; } ComponentManager cm = ComponentManagerRegistry.getContextComponentManager(); FeatureMetadatumSimilarityScorer scorer = null; try { scorer = cm.getInstance(FeatureMetadatumSimilarityScorer.class, this.match.getType()); } catch (ComponentLookupException ex) { try { scorer = cm.getInstance(FeatureMetadatumSimilarityScorer.class); } catch (ComponentLookupException e) { // This should not happen return Double.NaN; } } return scorer.getScore(this.match, this.reference); }
@Override public int compareTo(VocabularyProperty o) { if (o == null) { // Nulls at the end return -1; } if (!(o instanceof FeatureMetadatum)) { return super.compareTo(o); } return getType().compareTo(((FeatureMetadatum) o).getType()); } }
@Override public double getScore(FeatureMetadatum match, FeatureMetadatum reference) { if (match == null || reference == null || StringUtils.isEmpty(match.getId()) || StringUtils.isEmpty(reference.getId())) { // Not enough information return 0; } else if (VARIABLE_PROGRESSION.equals(match.getId()) || VARIABLE_PROGRESSION.equals(reference.getId())) { // Can't compare a variable progression against another known progression return 0; } return (NEUTRAL_DIST - distance(match.getId(), reference.getId())) / NEUTRAL_DIST; }
JSONArray metadataList = new JSONArray(); for (FeatureMetadatum metadatum : this.metadata.values()) { metadataList.put(metadatum.toJSON());
@Override public int compareTo(VocabularyProperty o) { if (o == null) { // Nulls at the end return -1; } if (!(o instanceof FeatureMetadatum)) { return super.compareTo(o); } return getType().compareTo(((FeatureMetadatum) o).getType()); } }
@Override public String getId() { return this.access.isOpenAccess() && this.match != null ? this.match.getId() : null; }
JSONArray metadataList = new JSONArray(); for (FeatureMetadatum metadatum : this.metadata.values()) { metadataList.put(metadatum.toJSON());
private JSONArray features(Patient patient) { JSONArray features = new JSONArray(); for (Feature patientFeature : patient.getFeatures()) { String featureId = patientFeature.getId(); if (featureId.isEmpty() || !this.hpoTerm.matcher(featureId).matches()) { this.logger.error("Patient feature parser: ignoring term with non-HPO id [{}]", featureId); continue; } JSONObject featureJson = new JSONObject(); featureJson.put(ApiConfiguration.JSON_FEATURE_ID, featureId); featureJson.put(ApiConfiguration.JSON_FEATURE_OBSERVED, observedStatusToJSONString(patientFeature)); Map<String, ? extends FeatureMetadatum> metadata = patientFeature.getMetadata(); FeatureMetadatum ageOfOnset = metadata.get(ApplicationConfiguration.FEATURE_METADATA_AGEOFONSET); if (ageOfOnset != null) { featureJson.put(ApiConfiguration.JSON_FEATURE_AGE_OF_ONSET, ageOfOnset.getId()); } features.put(featureJson); } return features; }
JSONArray metadataList = new JSONArray(); for (FeatureMetadatum metadatum : metadata.values()) { metadataList.add(metadatum.toJSON());
/** * Updates metadata for a {@code feature}. * * @param doc the {@link XWikiDocument} object for the patient * @param feature the {@link Feature} of interest * @param context the {@link XWikiContext} * @throws XWikiException if meta data cannot be updated */ private void updateMetaData( @Nonnull final XWikiDocument doc, @Nonnull final Feature feature, @Nonnull final XWikiContext context) throws XWikiException { @SuppressWarnings("unchecked") final Map<String, FeatureMetadatum> metadata = (Map<String, FeatureMetadatum>) feature.getMetadata(); if (!metadata.isEmpty() || !feature.getNotes().isEmpty()) { final BaseObject metaObject = doc.newXObject(FeatureMetadatum.CLASS_REFERENCE, context); metaObject.set(PhenoTipsFeature.META_PROPERTY_NAME, feature.getPropertyName(), context); metaObject.set(PhenoTipsFeature.META_PROPERTY_VALUE, feature.getValue(), context); metadata.forEach((type, metadatum) -> metaObject.set(type, metadatum.getId(), context)); metaObject.set("comments", feature.getNotes(), context); } }
@Override public JSONObject toJSON() { if (!this.access.isOpenAccess() || this.match == null && this.reference == null) { return new JSONObject(true); } JSONObject result = new JSONObject(); if (this.match != null) { result.element("id", getId()); result.element("name", getName()); } if (this.reference != null) { result.element("queryId", this.reference.getId()); } result.element("type", getType()); Double score = getScore(); if (!Double.isNaN(score)) { result.element("score", getScore()); } return result; }