@Override public QueryResult<ClinicalAnalysis> create(String studyStr, ClinicalAnalysis clinicalAnalysis, QueryOptions options, String sessionId) throws CatalogException { String userId = catalogManager.getUserManager().getUserId(sessionId); Study study = catalogManager.getStudyManager().resolveId(studyStr, userId); authorizationManager.checkStudyPermission(study.getUid(), userId, StudyAclEntry.StudyPermissions.WRITE_CLINICAL_ANALYSIS); options = ParamUtils.defaultObject(options, QueryOptions::new); ParamUtils.checkObj(clinicalAnalysis, "clinicalAnalysis"); ParamUtils.checkAlias(clinicalAnalysis.getId(), "id"); ParamUtils.checkObj(clinicalAnalysis.getType(), "type"); ParamUtils.checkObj(clinicalAnalysis.getDueDate(), "dueDate"); if (TimeUtils.toDate(clinicalAnalysis.getDueDate()) == null) { throw new CatalogException("Unrecognised due date. Accepted format is: yyyyMMddHHmmss"); } clinicalAnalysis.setProband(getFullValidatedMember(clinicalAnalysis.getProband(), study, sessionId)); clinicalAnalysis.setFamily(getFullValidatedFamily(clinicalAnalysis.getFamily(), study, sessionId)); validateClinicalAnalysisFields(clinicalAnalysis, study, sessionId); clinicalAnalysis.setCreationDate(TimeUtils.getTime()); clinicalAnalysis.setDescription(ParamUtils.defaultString(clinicalAnalysis.getDescription(), "")); clinicalAnalysis.setStatus(new ClinicalAnalysis.ClinicalStatus()); clinicalAnalysis.setRelease(catalogManager.getStudyManager().getCurrentRelease(study, userId)); clinicalAnalysis.setAttributes(ParamUtils.defaultObject(clinicalAnalysis.getAttributes(), Collections.emptyMap())); clinicalAnalysis.setInterpretations(ParamUtils.defaultObject(clinicalAnalysis.getInterpretations(), ArrayList::new)); clinicalAnalysis.setPriority(ParamUtils.defaultObject(clinicalAnalysis.getPriority(), ClinicalAnalysis.Priority.MEDIUM)); clinicalAnalysis.setUuid(UUIDUtils.generateOpenCGAUUID(UUIDUtils.Entity.CLINICAL)); QueryResult<ClinicalAnalysis> queryResult = clinicalDBAdaptor.insert(study.getUid(), clinicalAnalysis, options); return queryResult; }
private QueryResult<ClinicalAnalysis> createDummyEnvironment(boolean createFamily) throws CatalogException { createDummyFamily(); ClinicalAnalysis clinicalAnalysis = new ClinicalAnalysis() .setId("analysis").setDescription("My description").setType(ClinicalAnalysis.Type.FAMILY) .setDueDate("20180510100000") .setProband(new Individual().setId("child1").setSamples(Arrays.asList(new Sample().setId("sample2")))); if (createFamily) { clinicalAnalysis.setFamily(new Family().setId("family")); } return catalogManager.getClinicalAnalysisManager().create(STUDY, clinicalAnalysis, QueryOptions.empty(), sessionIdUser); }
filterList.add(Filters.eq(QueryParams.ID.key(), clinicalAnalysis.getId())); filterList.add(Filters.eq(PRIVATE_STUDY_ID, studyId)); filterList.add(Filters.eq(QueryParams.STATUS_NAME.key(), Status.READY)); if (count.getResult().get(0) > 0) { throw new CatalogDBException("Cannot create clinical analysis. A clinical analysis with { name: '" + clinicalAnalysis.getId() + "'} already exists."); clinicalAnalysis.setUid(clinicalAnalysisId); clinicalAnalysis.setStudyUid(studyId); if (StringUtils.isEmpty(clinicalAnalysis.getUuid())) { clinicalAnalysis.setUuid(UUIDUtils.generateOpenCGAUUID(UUIDUtils.Entity.CLINICAL)); if (StringUtils.isNotEmpty(clinicalAnalysis.getCreationDate())) { clinicalObject.put(PRIVATE_CREATION_DATE, TimeUtils.toDate(clinicalAnalysis.getCreationDate())); } else { clinicalObject.put(PRIVATE_CREATION_DATE, TimeUtils.getDate());
@Override public Document convertToStorageType(ClinicalAnalysis clinicalAnalysis) { Document document = super.convertToStorageType(clinicalAnalysis); document.put("uid", clinicalAnalysis.getUid()); document.put("studyUid", clinicalAnalysis.getStudyUid()); document.put("interpretations", convertInterpretations(clinicalAnalysis.getInterpretations())); validateDocumentToUpdate(document); return document; }
private void validateFamilyAndProband(ClinicalAnalysis clinicalAnalysis, Study study, String sessionId) throws CatalogException { if (clinicalAnalysis.getFamily() != null && StringUtils.isNotEmpty(clinicalAnalysis.getFamily().getId())) { MyResource<Family> familyResource = catalogManager.getFamilyManager().getUid(clinicalAnalysis.getFamily().getId(), study.getFqn(), sessionId); clinicalAnalysis.setFamily(familyResource.getResource()); // Check the proband is an actual member of the family Query query = new Query() .append(FamilyDBAdaptor.QueryParams.UID.key(), familyResource.getResource().getUid()) .append(FamilyDBAdaptor.QueryParams.MEMBER_UID.key(), clinicalAnalysis.getProband().getUid()); QueryResult<Family> count = catalogManager.getFamilyManager().count(study.getFqn(), query, sessionId); if (count.getNumTotalResults() == 0) { throw new CatalogException("The member " + clinicalAnalysis.getProband().getId() + " does not belong to the family " + clinicalAnalysis.getFamily().getId()); } } }
@Test public void createClinicalAnalysisTest() throws CatalogException { QueryResult<ClinicalAnalysis> dummyEnvironment = createDummyEnvironment(true); assertEquals(1, dummyEnvironment.getNumResults()); assertEquals(0, dummyEnvironment.first().getInterpretations().size()); assertEquals("family", dummyEnvironment.first().getFamily().getId()); assertEquals(5, dummyEnvironment.first().getFamily().getMembers().size()); assertNotNull(dummyEnvironment.first().getProband()); assertEquals("child1", dummyEnvironment.first().getProband().getId()); assertEquals(1, dummyEnvironment.first().getProband().getSamples().size()); assertEquals("sample2", dummyEnvironment.first().getProband().getSamples().get(0).getId()); assertEquals(catalogManager.getSampleManager().getUid("sample2", STUDY, sessionIdUser).getResource().getUid(), dummyEnvironment.first().getProband().getSamples().get(0).getUid()); }
if (clinicalAnalysis.getFamily() == null || StringUtils.isEmpty(clinicalAnalysis.getFamily().getId())) { throw new AnalysisException("Missing family in clinical analysis " + clinicalAnalysisId); if (clinicalAnalysis.getProband() == null || StringUtils.isEmpty(clinicalAnalysis.getProband().getId())) { throw new AnalysisException("Missing proband in clinical analysis " + clinicalAnalysisId); org.opencb.opencga.core.models.Individual proband = clinicalAnalysis.getProband(); if (ListUtils.isEmpty(proband.getSamples())) { throw new AnalysisException("Missing samples in proband " + proband.getId() + " in clinical analysis " + clinicalAnalysisId); probandSampleId = clinicalAnalysis.getProband().getSamples().get(0).getId(); OntologyTerm disease = clinicalAnalysis.getDisorder(); phenotype = new Phenotype(disease.getId(), disease.getName(), disease.getSource(), Phenotype.Status.UNKNOWN);
if (clinicalAnalysis.getFamily() != null && ListUtils.isNotEmpty(clinicalAnalysis.getFamily().getMembers())) { for (Individual member : clinicalAnalysis.getFamily().getMembers()) { if (member.getId().equals(clinicalAnalysis.getProband().getId())) { proband = member; List<Long> probandSample = clinicalAnalysis.getProband().getSamples().stream().map(Sample::getUid).collect(Collectors.toList()); if (clinicalAnalysis.getFiles() != null && !clinicalAnalysis.getFiles().isEmpty()) { if (clinicalAnalysis.getFamily() != null && clinicalAnalysis.getFamily().getMembers() != null) { for (Individual member : clinicalAnalysis.getFamily().getMembers()) { if (member.getSamples() != null) { for (Sample sample : member.getSamples()) { } else if (clinicalAnalysis.getProband() != null && clinicalAnalysis.getProband().getSamples() != null) { for (Sample sample : clinicalAnalysis.getProband().getSamples()) { sampleMap.put(sample.getId(), sample.getUid()); for (String sampleKey : clinicalAnalysis.getFiles().keySet()) { if (!sampleMap.containsKey(sampleKey)) { throw new CatalogException("Missing association from individual to sample " + sampleKey); for (Map.Entry<String, List<File>> entry : clinicalAnalysis.getFiles().entrySet()) { Query query = new Query() .append(FileDBAdaptor.QueryParams.ID.key(), entry.getValue().stream().map(File::getId).collect(Collectors.toList())) clinicalAnalysis.getFiles().put(entry.getKey(), fileQueryResult.getResult());
@Test public void createClinicalAnalysisNoFamilyTest() throws CatalogException { QueryResult<ClinicalAnalysis> dummyEnvironment = createDummyEnvironment(false); assertEquals(1, dummyEnvironment.getNumResults()); assertEquals(0, dummyEnvironment.first().getInterpretations().size()); assertEquals(catalogManager.getIndividualManager().getUid("child1", STUDY, sessionIdUser).getResource().getUid(), dummyEnvironment.first().getProband().getUid()); assertEquals(1, dummyEnvironment.first().getProband().getSamples().size()); assertEquals(catalogManager.getSampleManager().getUid("sample2", STUDY, sessionIdUser).getResource().getUid(), dummyEnvironment.first().getProband().getSamples().get(0).getUid()); }
String sessionId) throws CatalogException { MyResource<ClinicalAnalysis> resource = getUid(entryStr, studyStr, sessionId); authorizationManager.checkClinicalAnalysisPermission(resource.getStudy().getUid(), resource.getResource().getUid(), resource.getUser(), ClinicalAnalysisAclEntry.ClinicalAnalysisPermissions.UPDATE); Query query = new Query(ClinicalAnalysisDBAdaptor.QueryParams.UID.key(), resource.getResource().getUid()); QueryResult<ClinicalAnalysis> clinicalAnalysisQueryResult = get(studyStr, query, new QueryOptions(), sessionId); ClinicalAnalysis clinicalAnalysis = clinicalAnalysisQueryResult.first(); Family family = parameters.get(ClinicalAnalysisDBAdaptor.QueryParams.FAMILY.key(), Family.class); family = getFullValidatedFamily(family, resource.getStudy(), sessionId); clinicalAnalysis.setFamily(family); parameters.put(ClinicalAnalysisDBAdaptor.QueryParams.FAMILY.key(), family); Individual proband = parameters.get(ClinicalAnalysisDBAdaptor.QueryParams.PROBAND.key(), Individual.class); proband = getFullValidatedMember(proband, resource.getStudy(), sessionId); clinicalAnalysis.setProband(proband); parameters.put(ClinicalAnalysisDBAdaptor.QueryParams.PROBAND.key(), proband); clinicalAnalysis.setFiles(files); parameters.put(ClinicalAnalysisDBAdaptor.QueryParams.FILES.key(), clinicalAnalysis.getFiles()); return clinicalDBAdaptor.update(resource.getResource().getUid(), parameters, QueryOptions.empty());
void processDeNovo(ClinicalAnalysis clinicalAnalysis, Pedigree pedigree, Phenotype phenotype, Query query, Map<String, ReportedVariant> reportedVariantMap, Panel diseasePanel) throws CatalogException, StorageEngineException, IOException { VariantQueryResult<Variant> variantQueryResult; Map<String, List<String>> probandGenotype = new HashMap<>(); probandGenotype.put(clinicalAnalysis.getProband().getId(), Arrays.asList(ModeOfInheritance.toGenotypeString(ModeOfInheritance.GENOTYPE_0_0))); putGenotypesNegated(probandGenotype, query); variantQueryResult = variantStorageManager.get(query, QueryOptions.empty(), token); List<Variant> deNovoVariantList = ModeOfInheritance.deNovoVariants(pedigree.getProband(), variantQueryResult.getResult().iterator()); // TODO: We need to create another ReportedModeOfInheritance for de novo!!?? generateReportedVariants(deNovoVariantList, phenotype, diseasePanel, ClinicalProperty.ModeOfInheritance.DE_NOVO, reportedVariantMap); }
public QueryResult<ReportedVariant> index(String study, String token) throws IOException, ClinicalVariantException, CatalogException { DBIterator<ClinicalAnalysis> clinicalAnalysisDBIterator = clinicalAnalysisManager.iterator(study, new Query(), QueryOptions.empty(), token); while (clinicalAnalysisDBIterator.hasNext()) { ClinicalAnalysis clinicalAnalysis = clinicalAnalysisDBIterator.next(); for (Interpretation interpretation : clinicalAnalysis.getInterpretations()) { interpretation.getInterpretation().getAttributes().put("OPENCGA_CLINICAL_ANALYSIS", clinicalAnalysis); this.clinicalVariantEngine.insert(interpretation.getInterpretation(), database); } } return null; }
@Test public void updateSubjectsAndFamilyTest() throws CatalogException { createDummyEnvironment(false); ObjectMap params = new ObjectMap() .append(ClinicalAnalysisDBAdaptor.QueryParams.PROBAND.key(), new Individual().setId("child1").setSamples(Arrays.asList(new Sample().setId("sample2")))) .append(ClinicalAnalysisDBAdaptor.QueryParams.FAMILY.key(), new Family().setId("family")); QueryResult<ClinicalAnalysis> updateResult = catalogManager.getClinicalAnalysisManager().update(STUDY, "analysis", params, QueryOptions.empty(), sessionIdUser); assertEquals(1, updateResult.getNumResults()); assertEquals(0, updateResult.first().getInterpretations().size()); assertEquals(catalogManager.getFamilyManager().getUid("family", STUDY, sessionIdUser).getResource().getUid(), updateResult.first().getFamily().getUid()); assertEquals(catalogManager.getIndividualManager().getUid("child1", STUDY, sessionIdUser).getResource().getUid(), updateResult.first().getProband().getUid()); assertEquals(1, updateResult.first().getProband().getSamples().size()); assertEquals(catalogManager.getSampleManager().getUid("sample2", STUDY, sessionIdUser).getResource().getUid(), updateResult.first().getProband().getSamples().get(0).getUid()); }
if (clinicalAnalysis.getFamily() == null || StringUtils.isEmpty(clinicalAnalysis.getFamily().getId())) { throw new AnalysisException("Missing family in clinical analysis " + clinicalAnalysisId); if (clinicalAnalysis.getProband() == null || StringUtils.isEmpty(clinicalAnalysis.getProband().getId())) { throw new AnalysisException("Missing proband in clinical analysis " + clinicalAnalysisId); org.opencb.opencga.core.models.Individual proband = clinicalAnalysis.getProband(); if (ListUtils.isEmpty(proband.getSamples())) { throw new AnalysisException("Missing samples in proband " + proband.getId() + " in clinical analysis " + clinicalAnalysisId); Pedigree pedigree = FamilyManager.getPedigreeFromFamily(clinicalAnalysis.getFamily()); OntologyTerm disease = clinicalAnalysis.getDisorder(); Phenotype phenotype = new Phenotype(disease.getId(), disease.getName(), disease.getSource(), Phenotype.Status.UNKNOWN); .append(FileDBAdaptor.QueryParams.SAMPLES.key(), clinicalAnalysis.getProband().getSamples().get(0).getId()) .append(FileDBAdaptor.QueryParams.FORMAT.key(), File.Format.BAM), new QueryOptions(QueryOptions.INCLUDE, FileDBAdaptor.QueryParams.UUID.key()), token);
@Test public void updateSubjectsNoFamilyTest() throws CatalogException { createDummyEnvironment(false); ObjectMap params = new ObjectMap(ClinicalAnalysisDBAdaptor.QueryParams.PROBAND.key(), new Individual().setId("child1").setSamples(Arrays.asList(new Sample().setId("sample2")))); QueryResult<ClinicalAnalysis> updateResult = catalogManager.getClinicalAnalysisManager().update(STUDY, "analysis", params, QueryOptions.empty(), sessionIdUser); assertEquals(1, updateResult.getNumResults()); assertEquals(0, updateResult.first().getInterpretations().size()); assertEquals(catalogManager.getIndividualManager().getUid("child1", STUDY, sessionIdUser).getResource().getUid(), updateResult.first().getProband().getUid()); assertEquals(1, updateResult.first().getProband().getSamples().size()); assertEquals(catalogManager.getSampleManager().getUid("sample2", STUDY, sessionIdUser).getResource().getUid(), updateResult.first().getProband().getSamples().get(0).getUid()); }
void processCompoundHeterozygous(ClinicalAnalysis clinicalAnalysis, Pedigree pedigree, Phenotype phenotype, Query query, Map<String, ReportedVariant> reportedVariantMap, Panel diseasePanel) throws Exception { VariantQueryResult<Variant> variantQueryResult; Map<String, List<String>> probandGenotype; // Calculate compound heterozygous probandGenotype = new HashMap<>(); probandGenotype.put(clinicalAnalysis.getProband().getId(), Arrays.asList(ModeOfInheritance.toGenotypeString(ModeOfInheritance.GENOTYPE_0_1))); putGenotypes(probandGenotype, query); for (GenePanel gene : diseasePanel.getDiseasePanel().getGenes()) { query.put(VariantQueryParam.ANNOT_XREF.key(), gene); variantQueryResult = variantStorageManager.get(query, QueryOptions.empty(), token); List<Variant> compoundHetVariantList = ModeOfInheritance.compoundHeterozygosity(pedigree, variantQueryResult.getResult().iterator()); // TODO: We need to create another ReportedModeOfInheritance for compound heterozygous!!?? generateReportedVariants(compoundHetVariantList, phenotype, diseasePanel, ClinicalProperty.ModeOfInheritance.COMPOUND_HETEROZYGOUS, reportedVariantMap); } }
if (clinicalAnalysis.getProband() != null && clinicalAnalysis.getProband().getSamples() != null && !clinicalAnalysis.getProband().getSamples().isEmpty()) { samples.add(getClinicalAnalysis().getProband().getSamples().get(0).getId());
private void validateMembers(ClinicalAnalysis clinicalAnalysis, Study study, String sessionId) throws CatalogException { Individual proband = clinicalAnalysis.getProband();