use of org.monarchinitiative.loinc2hpo.codesystems.Code in project loinc2hpo by monarch-initiative.
the class AnnotateTabController method editCurrentAnnotation.
/**
* This method is called from the pop up window
* @param loincAnnotation passed from the pop up window
*/
protected void editCurrentAnnotation(UniversalLoinc2HPOAnnotation loincAnnotation) {
setLoincIdSelected(loincAnnotation.getLoincId());
model.setLoincUnderEditing(model.getLoincEntryMap().get(loincAnnotation.getLoincId()));
// populate annotation textfields for basic mode
Map<String, Code> internalCode = CodeSystemConvertor.getCodeContainer().getCodeSystemMap().get(Loinc2HPOCodedValue.CODESYSTEM);
Code codeLow = internalCode.get("L");
Code codeHigh = internalCode.get("H");
Code codeNormal = internalCode.get("N");
HpoTermId4LoincTest hpoLow = loincAnnotation.loincInterpretationToHPO(codeLow);
HpoTermId4LoincTest hpoHigh = loincAnnotation.loincInterpretationToHPO(codeHigh);
HpoTermId4LoincTest hpoNormal = loincAnnotation.loincInterpretationToHPO(codeNormal);
if (hpoLow != null) {
String hpoLowTermName = hpoLow.getHpoTerm().getName();
annotationTextFieldLeft.setText(hpoLowTermName);
}
if (hpoHigh != null) {
String hpoHighTermName = hpoHigh.getHpoTerm().getName();
annotationTextFieldRight.setText(hpoHighTermName);
}
if (hpoNormal != null) {
String hpoNormalTermName = hpoNormal.getHpoTerm().getName();
boolean isnegated = hpoNormal.isNegated();
annotationTextFieldMiddle.setText(hpoNormalTermName);
inverseChecker.setSelected(isnegated);
}
// remember: advanced annotation == not using internal codes
for (Map.Entry<Code, HpoTermId4LoincTest> entry : loincAnnotation.getCandidateHpoTerms().entrySet()) {
if (!entry.getKey().getSystem().equals(Loinc2HPOCodedValue.CODESYSTEM)) {
tempAdvancedAnnotations.add(new Annotation(entry.getKey(), entry.getValue()));
}
}
boolean flag = loincAnnotation.getFlag();
flagForAnnotation.setSelected(flag);
String comment = loincAnnotation.getNote();
annotationNoteField.setText(comment);
createAnnotationButton.setText("Save");
clearButton.setText("Cancel");
}
use of org.monarchinitiative.loinc2hpo.codesystems.Code in project loinc2hpo by monarch-initiative.
the class AnnotateTabController method handleAnnotateCodedValue.
@FXML
private void handleAnnotateCodedValue(ActionEvent e) {
e.consume();
// do nothing if it is the basic mode
if (!advancedAnnotationModeSelected)
return;
Annotation annotation = null;
String system = annotationTextFieldLeft.getText().trim().toLowerCase();
// case sensitive
String codeId = annotationTextFieldMiddle.getText().trim();
Code code = null;
if (system != null && !system.isEmpty() && codeId != null && !codeId.isEmpty()) {
code = Code.getNewCode().setSystem(system).setCode(codeId);
}
String candidateHPO = annotationTextFieldRight.getText();
HpoTerm hpoterm = model.getTermMap().get(stripEN(candidateHPO));
if (hpoterm == null)
logger.error("hpoterm is null");
if (code != null && hpoterm != null) {
annotation = new Annotation(code, new HpoTermId4LoincTest(hpoterm, inverseChecker.isSelected()));
}
tempAdvancedAnnotations.add(annotation);
// add annotated value to the advanced table view
// initadvancedAnnotationTable();
accordion.setExpandedPane(advancedAnnotationTitledPane);
inverseChecker.setSelected(false);
model.setTempAdvancedAnnotation(new HashMap<>());
model.setInversedAdvancedMode(false);
}
use of org.monarchinitiative.loinc2hpo.codesystems.Code in project loinc2hpo by monarch-initiative.
the class AnnotateTabController method initialize.
@FXML
private void initialize() {
if (model != null) {
// weird line. model is set by main controller; this line never runs
setModel(model);
// currentAnnotationController.setModel(model); //let current annotation stage have access to model
}
// currentAnnotationController.setModel(model); //let current annotation stage have access to model
suggestHPOButton.setTooltip(new Tooltip("Suggest new HPO terms"));
filterButton.setTooltip(new Tooltip("Filter Loinc by providing a Loinc list in txt file"));
addCodedAnnotationButton.setTooltip(new Tooltip("Add current annotation"));
flagForAnnotation.setTooltip(new Tooltip("Check if you are not confident"));
clearButton.setTooltip(new Tooltip("Clear all textfields"));
allAnnotationsButton.setTooltip(new Tooltip("Display annotations for currently selected Loinc code"));
initLOINCtableButton.setTooltip(new Tooltip("Initialize Loinc Core Table. Download it first."));
IntializeHPOmodelbutton.setTooltip(new Tooltip("Load hp.owl as a RDF model for query"));
searchForLOINCIdButton.setTooltip(new Tooltip("Search Loinc with a Loinc code or name"));
modeButton.setTooltip(new Tooltip("Switch between basic and advanced annotation mode"));
autoQueryButton.setTooltip(new Tooltip("Find candidate HPO terms with automatically generated keys"));
manualQueryButton.setTooltip(new Tooltip("Find candidate HPO terms with manually typed keys"));
hpoListView.setCellFactory(new Callback<ListView<HPO_Class_Found>, ListCell<HPO_Class_Found>>() {
@Override
public ListCell<HPO_Class_Found> call(ListView<HPO_Class_Found> param) {
return new ListCell<HPO_Class_Found>() {
@Override
public void updateItem(HPO_Class_Found hpo, boolean empty) {
super.updateItem(hpo, empty);
if (hpo != null) {
setText(hpo.toString());
Tooltip tooltip = new Tooltip(hpo.getDefinition());
tooltip.setPrefWidth(300);
tooltip.setWrapText(true);
setTooltip(tooltip);
} else {
setText(null);
}
}
};
}
});
treeView.setCellFactory(new Callback<TreeView<HPO_TreeView>, TreeCell<HPO_TreeView>>() {
@Override
public TreeCell<HPO_TreeView> call(TreeView<HPO_TreeView> param) {
return new TreeCell<HPO_TreeView>() {
@Override
public void updateItem(HPO_TreeView hpo, boolean empty) {
super.updateItem(hpo, empty);
if (empty) {
setText(null);
setGraphic(null);
} else {
if (hpo != null && hpo.hpo_class_found == null) {
setText("root");
}
if (hpo != null && hpo.hpo_class_found != null) {
setText(hpo.toString());
if (hpo.hpo_class_found.getDefinition() != null) {
Tooltip tooltip = new Tooltip(hpo.hpo_class_found.getDefinition());
tooltip.setPrefWidth(300);
tooltip.setWrapText(true);
setTooltip(tooltip);
}
}
}
}
};
}
});
// if user creates a new Loinc group, add two menuitems for it, and specify the actions when those menuitems are
// clicked
userCreatedLoincLists.addListener(new ListChangeListener<String>() {
@Override
public void onChanged(Change<? extends String> c) {
while (c.next()) {
if (c.wasAdded()) {
logger.trace(c + " was added");
c.getAddedSubList().stream().filter(p -> !model.getUserCreatedLoincLists().containsKey(p)).forEach(p -> {
model.addUserCreatedLoincList(p, new LinkedHashSet<>());
MenuItem newListMenuItem = new MenuItem(p);
userCreatedLoincListsButton.getItems().add(newListMenuItem);
newListMenuItem.setOnAction((event -> {
logger.trace("action detected");
if (loincTableView.getSelectionModel().getSelectedItem() != null) {
LoincId loincId = loincTableView.getSelectionModel().getSelectedItem().getLOINC_Number();
if (model.getUserCreatedLoincLists().get(p).contains(loincId)) {
model.getUserCreatedLoincLists().get(p).remove(loincId);
logger.trace(String.format("LOINC: %s removed from %s", loincId, p));
} else {
model.getUserCreatedLoincLists().get(p).add(loincId);
logger.trace(String.format("LOINC: %s added to %s", loincId, p));
}
changeColorLoincTableView();
model.setSessionChanged(true);
}
}));
MenuItem newExportMenuItem = new MenuItem(p);
exportLoincListButton.getItems().add(newExportMenuItem);
newExportMenuItem.setOnAction((event -> {
logger.trace("action detected");
if (loincTableView.getSelectionModel().getSelectedItem() != null) {
Set<LoincId> loincIds = model.getUserCreatedLoincLists().get(p);
if (loincIds.isEmpty()) {
return;
}
FileChooser chooser = new FileChooser();
chooser.setTitle("Save Loinc List: ");
chooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("TSV files (*.txt)", "*.txt"));
chooser.setInitialFileName(p);
File f = chooser.showSaveDialog(null);
String filepath;
if (f == null) {
return;
} else {
filepath = f.getAbsolutePath();
}
StringBuilder builder = new StringBuilder();
loincIds.forEach(l -> {
builder.append(l);
builder.append("\n");
});
WriteToFile.writeToFile(builder.toString().trim(), filepath);
}
}));
MenuItem newImportMenuItem = new MenuItem(p);
importLoincGroupButton.getItems().add(newImportMenuItem);
newImportMenuItem.setOnAction((event) -> {
logger.trace("user wants to import " + p);
FileChooser chooser = new FileChooser();
chooser.setTitle("Select file to import from");
File f = chooser.showOpenDialog(null);
if (f == null) {
return;
}
List<String> malformed = new ArrayList<>();
List<String> notFound = new ArrayList<>();
try {
LoincOfInterest loincSet = new LoincOfInterest(f.getAbsolutePath());
Set<String> loincIds = loincSet.getLoincOfInterest();
loincIds.forEach(l -> {
LoincId loincId = null;
try {
loincId = new LoincId(l);
} catch (MalformedLoincCodeException e) {
malformed.add(l);
}
if (model.getLoincEntryMap().containsKey(loincId)) {
model.getUserCreatedLoincLists().get(p).add(loincId);
} else {
notFound.add(l);
}
changeColorLoincTableView();
});
} catch (FileNotFoundException e) {
logger.error("File not found. Should never happen");
}
if (!malformed.isEmpty() || !notFound.isEmpty()) {
String malformedString = String.join("\n", malformed);
String notFoundString = String.join("\n", notFound);
PopUps.showInfoMessage(String.format("Malformed Loinc: %d\n%s\nNot Found: %d\n%s", malformed.size(), malformedString, notFound.size(), notFoundString), "Error during importing");
}
});
});
} else {
logger.error("This should never happen");
}
}
}
});
initadvancedAnnotationTable();
}
use of org.monarchinitiative.loinc2hpo.codesystems.Code in project loinc2hpo by monarch-initiative.
the class ObservationAnalysisFromCodedValues method getHPOforObservation.
@Override
public HpoTermId4LoincTest getHPOforObservation() throws AmbiguousResultsFoundException, UnrecognizedCodeException, AnnotationNotFoundException {
if (annotationMap.get(loincId) == null)
throw new AnnotationNotFoundException();
Set<HpoTermId4LoincTest> results = new HashSet<>();
codedValue.getCoding().stream().filter(p -> annotationMap.get(loincId).getCodes().contains(new Code(p))).forEach(p -> results.add(annotationMap.get(loincId).loincInterpretationToHPO(new Code(p))));
if (results.size() > 1) {
throw new AmbiguousResultsFoundException();
}
if (results.size() == 1) {
return results.iterator().next();
} else {
throw new UnrecognizedCodeException();
}
}
use of org.monarchinitiative.loinc2hpo.codesystems.Code in project loinc2hpo by monarch-initiative.
the class ObservationAnalysisFromInterpretation method getHPOforObservation.
@Override
public HpoTermId4LoincTest getHPOforObservation() throws UnsupportedCodingSystemException, AmbiguousResultsFoundException, AnnotationNotFoundException, UnrecognizedCodeException {
// here we use a map to store the results: since there could be more than one interpretation coding system,
// we try them all and store the results in a map <external code, result in internal code>
Map<Code, Code> results = new HashMap<>();
// get the annotation class for this loinc code
UniversalLoinc2HPOAnnotation annotationForLoinc = annotationMap.get(this.loincId);
if (annotationForLoinc == null)
throw new AnnotationNotFoundException();
// all interpretation codes in different coding systems. Expect one in most cases.
Set<Code> interpretationCodes = getInterpretationCodes();
interpretationCodes.stream().filter(p -> CodeSystemConvertor.getCodeContainer().getCodeSystemMap().containsKey(p.getSystem())).forEach(p -> {
Code internalCode = null;
try {
internalCode = CodeSystemConvertor.convertToInternalCode(p);
results.put(p, internalCode);
} catch (InternalCodeNotFoundException e) {
e.printStackTrace();
}
});
List<Code> distinct = results.values().stream().distinct().collect(Collectors.toList());
if (distinct.size() == 1) {
HpoTermId4LoincTest hpoTermId4LoincTest = annotationForLoinc.loincInterpretationToHPO(distinct.get(0));
if (hpoTermId4LoincTest == null)
throw new UnrecognizedCodeException();
return hpoTermId4LoincTest;
} else {
throw new AmbiguousResultsFoundException();
}
}
Aggregations