use of org.monarchinitiative.loinc2hpo.loinc.LoincId in project loinc2hpo by monarch-initiative.
the class ObservationDownloader method iteratorHapiFHIRServer.
public static void iteratorHapiFHIRServer() {
// printObservationInfo();
// printPatientInfo();
// BufferedReader bufferedReader = new BufferedReader(new FileReader(""));
// find20CompleteRecordOfEachType();
String path = null;
HashMap<String, StringBuilder> completeObservations = new HashMap<>();
completeObservations.put("Qn", new StringBuilder());
completeObservations.put("Ord", new StringBuilder());
completeObservations.put("Nom", new StringBuilder());
completeObservations.put("Nar", new StringBuilder());
completeObservations.put("OrdQn", new StringBuilder());
completeObservations.put("unkown", new StringBuilder());
HashMap<String, Integer> countComplete = new HashMap<>();
countComplete.put("Qn", 0);
countComplete.put("Ord", 0);
countComplete.put("Nom", 0);
countComplete.put("Nar", 0);
countComplete.put("OrdQn", 0);
countComplete.put("unknown", 0);
HashMap<String, StringBuilder> accetableObservations = new HashMap<>();
accetableObservations.put("Qn", new StringBuilder());
accetableObservations.put("Ord", new StringBuilder());
accetableObservations.put("Nom", new StringBuilder());
accetableObservations.put("Nar", new StringBuilder());
accetableObservations.put("OrdQn", new StringBuilder());
accetableObservations.put("unknown", new StringBuilder());
HashMap<String, Integer> countAccetable = new HashMap<>();
countAccetable.put("Qn", 0);
countAccetable.put("Ord", 0);
countAccetable.put("Nom", 0);
countAccetable.put("Nar", 0);
countAccetable.put("OrdQn", 0);
countAccetable.put("unknown", 0);
JFileChooser chooser = new JFileChooser();
int returnVal = chooser.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
path = chooser.getSelectedFile().getAbsolutePath();
System.out.println(path);
Map<LoincId, LoincEntry> loincEntryMap = LoincEntry.getLoincEntryList(path);
System.out.println("size of loinc table: " + loincEntryMap.size());
for (LoincEntry loincEntry : loincEntryMap.values()) {
if (countComplete.containsKey(loincEntry.getScale()) && countComplete.get(loincEntry.getScale()) < 50) {
try {
List<Observation> results = ObservationDownloader.retrieveObservation(loincEntry.getLOINC_Number().toString());
if (results != null && !results.isEmpty()) {
for (Observation observation : results) {
if (isComplte(observation)) {
String aCompleteRecord = jsonParser.setPrettyPrint(true).encodeResourceToString(observation);
if (completeObservations.containsKey(loincEntry.getScale())) {
completeObservations.get(loincEntry.getScale()).append(aCompleteRecord);
completeObservations.get(loincEntry.getScale()).append("\n\n");
completeObservations.get(loincEntry.getScale()).append(Character.toString((char) 12));
countComplete.put(loincEntry.getScale(), countComplete.get(loincEntry.getScale()) + 1);
} else {
completeObservations.get("unknown").append(aCompleteRecord);
completeObservations.get("unknown").append("\n\n");
completeObservations.get("unknown").append(Character.toString((char) 12));
countComplete.put("unknown", countAccetable.get("unknown") + 1);
}
continue;
}
if (isAcceptable(observation)) {
String aAcceptableRecord = jsonParser.setPrettyPrint(true).encodeResourceToString(observation);
if (accetableObservations.containsKey(loincEntry.getScale()) && countAccetable.get(loincEntry.getScale()) < 50) {
accetableObservations.get(loincEntry.getScale()).append(aAcceptableRecord);
accetableObservations.get(loincEntry.getScale()).append("\n\n");
accetableObservations.get(loincEntry.getScale()).append(Character.toString((char) 12));
countAccetable.put(loincEntry.getScale(), countAccetable.get(loincEntry.getScale()) + 1);
} else if (countAccetable.get("unknown") < 50) {
accetableObservations.get("unknown").append(aAcceptableRecord);
accetableObservations.get("unknown").append("\n\n");
accetableObservations.get("unknown").append(Character.toString((char) 12));
countAccetable.put("unknown", countAccetable.get("unknown") + 1);
}
}
}
}
} catch (Exception e) {
continue;
}
}
}
}
for (String scale : completeObservations.keySet()) {
if (!completeObservations.get(scale).toString().isEmpty()) {
WriteToFile.writeToFile(completeObservations.get(scale).toString(), scale + "_complteObservations.txt");
} else {
System.out.println("No complete observations were found for loinc scale type: " + scale);
}
}
for (String scale : accetableObservations.keySet()) {
if (!accetableObservations.get(scale).toString().isEmpty()) {
WriteToFile.writeToFile(accetableObservations.get(scale).toString(), scale + "_acceptableObservations.txt");
} else {
System.out.println("No acceptable observations were found for loinc scale type: " + scale);
}
}
}
use of org.monarchinitiative.loinc2hpo.loinc.LoincId 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.loinc.LoincId in project loinc2hpo by monarch-initiative.
the class ObservationAnalysisFromQnValue method getHPOforObservation.
@Override
public HpoTermId4LoincTest getHPOforObservation() throws ReferenceNotFoundException, AmbiguousReferenceException, UnrecognizedCodeException {
HpoTermId4LoincTest hpoTermId4LoincTest = null;
// find applicable reference range
List<Observation.ObservationReferenceRangeComponent> references = this.references.stream().filter(p -> withinAgeRange(p)).collect(Collectors.toList());
if (references.size() < 1) {
throw new ReferenceNotFoundException();
} else if (references.size() == 1) {
Observation.ObservationReferenceRangeComponent targetReference = references.get(0);
double low = targetReference.hasLow() ? targetReference.getLow().getValue().doubleValue() : Double.MIN_VALUE;
double high = targetReference.hasHigh() ? targetReference.getHigh().getValue().doubleValue() : Double.MAX_VALUE;
double observed = valueQuantity.getValue().doubleValue();
Loinc2HPOCodedValue result;
if (observed < low) {
result = Loinc2HPOCodedValue.fromCode("L");
} else if (observed > high) {
result = Loinc2HPOCodedValue.fromCode("H");
} else {
result = Loinc2HPOCodedValue.fromCode("N");
}
Code resultCode = Code.getNewCode().setSystem(Loinc2HPOCodedValue.CODESYSTEM).setCode(result.toCode());
hpoTermId4LoincTest = annotationMap.get(loincId).loincInterpretationToHPO(resultCode);
} else if (references.size() == 2) {
// what does it mean with multiple references
throw new AmbiguousReferenceException();
} else if (references.size() == 3) {
// it can happen when there is actually one range but coded in three ranges
// e.g. normal 20-30
// in this case, one range ([20, 30]) is sufficient;
// however, it is written as three ranges: ( , 20) [20, 30] (30, )
// We should handle this case
} else {
throw new AmbiguousReferenceException();
}
// if we can still not find an answer, it is probably that we did not have the annotation
if (hpoTermId4LoincTest == null)
throw new UnrecognizedCodeException();
return hpoTermId4LoincTest;
}
use of org.monarchinitiative.loinc2hpo.loinc.LoincId in project loinc2hpo by monarch-initiative.
the class WriteToFile method fromTSV.
/**
* A method to deserialize annotation map from a TSV file.
* @param path filepath to the TSV
* @param hpoTermMap a HPO map from TermId to HpoTerm. Note: the key is TermId, instead of TermName
* @return an annotation map
* @throws FileNotFoundException
*/
public static Map<LoincId, UniversalLoinc2HPOAnnotation> fromTSV(String path, Map<TermId, HpoTerm> hpoTermMap) throws FileNotFoundException {
Map<LoincId, UniversalLoinc2HPOAnnotation> deserializedMap = new LinkedHashMap<>();
Map<LoincId, UniversalLoinc2HPOAnnotation.Builder> builderMap = new HashMap<>();
Map<String, Code> internalCode = CodeSystemConvertor.getCodeContainer().getCodeSystemMap().get(Loinc2HPOCodedValue.CODESYSTEM);
BufferedReader reader = new BufferedReader(new FileReader(path));
reader.lines().forEach(serialized -> {
String[] elements = serialized.split("\\t");
if (elements.length == 13 && !serialized.startsWith("loincId")) {
try {
LoincId loincId = new LoincId(elements[0]);
LoincScale loincScale = LoincScale.string2enum(elements[1]);
String codeSystem = elements[2];
String codeId = elements[3];
TermPrefix prefix = new ImmutableTermPrefix(elements[4].substring(0, 2));
String id = elements[4].substring(3);
HpoTerm hpoTerm = hpoTermMap.get(new ImmutableTermId(prefix, id));
boolean inverse = Boolean.parseBoolean(elements[5]);
String note = elements[6].equals(MISSINGVALUE) ? null : elements[6];
boolean flag = Boolean.parseBoolean(elements[7]);
double version = Double.parseDouble(elements[8]);
LocalDateTime createdOn = elements[9].equals(MISSINGVALUE) ? null : LocalDateTime.parse(elements[9]);
String createdBy = elements[10].equals(MISSINGVALUE) ? null : elements[10];
LocalDateTime lastEditedOn = elements[11].equals(MISSINGVALUE) ? null : LocalDateTime.parse(elements[11]);
String lastEditedBy = elements[12].equals(MISSINGVALUE) ? null : elements[12];
if (!builderMap.containsKey(loincId)) {
UniversalLoinc2HPOAnnotation.Builder builder = new UniversalLoinc2HPOAnnotation.Builder().setLoincId(loincId).setLoincScale(loincScale).setNote(note).setFlag(flag).setVersion(version).setCreatedOn(createdOn).setCreatedBy(createdBy).setLastEditedOn(lastEditedOn).setLastEditedBy(lastEditedBy);
builderMap.put(loincId, builder);
}
Code code = Code.getNewCode().setSystem(codeSystem).setCode(codeId);
HpoTermId4LoincTest hpoTermId4LoincTest = new HpoTermId4LoincTest(hpoTerm, inverse);
if (code.equals(internalCode.get("L"))) {
builderMap.get(loincId).setLowValueHpoTerm(hpoTermId4LoincTest.getHpoTerm());
}
if (code.equals(internalCode.get("N"))) {
builderMap.get(loincId).setIntermediateValueHpoTerm(hpoTermId4LoincTest.getHpoTerm());
builderMap.get(loincId).setIntermediateNegated(hpoTermId4LoincTest.isNegated());
}
if (code.equals(internalCode.get("H"))) {
builderMap.get(loincId).setHighValueHpoTerm(hpoTermId4LoincTest.getHpoTerm());
}
if (code.equals(internalCode.get("A")) || code.equals(internalCode.get("P")) || code.equals(internalCode.get("NP"))) {
// currently, we neglect those codes
// it will be wrong to do so if the user has manually changed what map to them
logger.info("!!!!!!!!!!!annotation neglected. MAY BE WRONG!!!!!!!!!!!!!!!");
} else {
builderMap.get(loincId).addAdvancedAnnotation(code, hpoTermId4LoincTest);
}
} catch (MalformedLoincCodeException e) {
logger.error("Malformed loinc code line: " + serialized);
}
} else {
if (elements.length != 13) {
logger.error(String.format("line does not have 13 elements, but has %d elements. Line: %s", elements.length, serialized));
} else {
logger.info("line is header: " + serialized);
}
}
});
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
builderMap.entrySet().forEach(b -> deserializedMap.put(b.getKey(), b.getValue().build()));
return deserializedMap;
}
use of org.monarchinitiative.loinc2hpo.loinc.LoincId in project loinc2hpo by monarch-initiative.
the class MainController method openSession.
protected void openSession(String pathToOpen) {
// This is deprecated. keep this only temperoly
// there should be one default file, "annotations.tsv",
// one default folder "LOINC category", which should have two files "require_new_HPO_terms.txt", "unable_to_annotate.txt" by default (and possibility others)
/**
* String annotationsFilePath = pathToOpen + File.separator + "annotations.tsv";
* if (new File(annotationsFilePath).exists()) {
* loinc2HpoAnnotationsTabController.tempimportLoincAnnotation(annotationsFilePath);
* }
*/
loinc2HpoAnnotationsTabController.importLoincAnnotation(pathToOpen);
File loinc_category_folder = new File(pathToOpen + File.separator + LOINC_CATEGORY_folder);
if (!loinc_category_folder.exists() || !loinc_category_folder.isDirectory()) {
return;
}
File[] files = loinc_category_folder.listFiles();
if (files == null) {
return;
} else {
for (File file : files) {
try {
LoincOfInterest loincCategory = new LoincOfInterest(file.getAbsolutePath());
Set<String> loincIdStrings = loincCategory.getLoincOfInterest();
String categoryName = file.getName();
if (categoryName.endsWith(".txt")) {
categoryName = categoryName.substring(0, file.getName().length() - 4);
}
Set<LoincId> loincIds = loincIdStrings.stream().map(p -> {
try {
return new LoincId(p);
} catch (MalformedLoincCodeException e1) {
logger.error("This should never happen since the loincids are automatically saved");
}
return null;
}).collect(Collectors.toSet());
if (!annotateTabController.userCreatedLoincLists.contains(categoryName)) {
annotateTabController.userCreatedLoincLists.add(categoryName);
}
model.addUserCreatedLoincList(categoryName, loincIds);
} catch (FileNotFoundException e1) {
logger.error("This should never happen since the folder is autogenerated.");
}
}
annotateTabController.changeColorLoincTableView();
}
}
Aggregations