package org.molgenis.mutation.service; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.apache.commons.collections.CollectionUtils; import org.molgenis.core.Publication; import org.molgenis.framework.db.Database; import org.molgenis.mutation.dto.CafeVariomeDTO; import org.molgenis.pheno.AlternateId; import org.molgenis.pheno.ObservedValue; import org.molgenis.variant.Patient; import org.molgenis.variant.Variant; import org.springframework.stereotype.Service; @Service public class CafeVariomeService { private Database db; // @Autowired public void setDatabase(Database db) { this.db = db; } public List<CafeVariomeDTO> export() { try { List<Variant> variantList = this.db.query(Variant.class).find(); List<CafeVariomeDTO> cafeVariomeDTOList = this.variantListToCafeVariomeDTOList(variantList); return cafeVariomeDTOList; } catch (Exception e) { e.printStackTrace(); throw new CafeVariomeServiceException(e.getMessage()); } } private List<CafeVariomeDTO> variantListToCafeVariomeDTOList(List<Variant> variantList) { List<CafeVariomeDTO> cafeVariomeDTOList = new ArrayList<CafeVariomeDTO>(); for (Variant variant : variantList) { if (variant.getMutationsPatientCollection().size() > 0) { cafeVariomeDTOList.add(this.variantToCafeVariomeDTO(variant)); } } return cafeVariomeDTOList; } private CafeVariomeDTO variantToCafeVariomeDTO(Variant variant) { List<ObservedValue> variantValueList = Arrays.asList(variant.getTargetObservedValueCollection().toArray(new ObservedValue[0])); List<AlternateId> variantAltIdList = variant.getAlternateId(); List<Patient> patientList = Arrays.asList(variant.getMutationsPatientCollection().toArray(new Patient[0])); //TODO: How to describe multiple patients (phenotypes, publications etc.) in CafeVariome? Patient patient = patientList.get(0); List<AlternateId> patientAltIdList = patient.getAlternateId(); List<ObservedValue> phenoValueList = Arrays.asList(patient.getTargetObservedValueCollection().toArray(new ObservedValue[0])); Publication publication = patient.getPatientreferences().get(0); CafeVariomeDTO cafeVariomeDTO = new CafeVariomeDTO(); for (ObservedValue phenoValue : phenoValueList) { if (phenoValue.getFeature().getName().equals("Detection method")) { cafeVariomeDTO.setDetection(phenoValue.getValue()); } else if (phenoValue.getFeature().getName().equals("Ethnicity")) { cafeVariomeDTO.setEthnicity(phenoValue.getValue()); } else if (phenoValue.getFeature().getName().equals("Gender")) { cafeVariomeDTO.setGender(phenoValue.getValue()); } } for (ObservedValue variantValue : variantValueList) { if (variantValue.getFeature().getName().equals("Germline")) { cafeVariomeDTO.setGermline(variantValue.getValue()); } else if (variantValue.getFeature().getName().equals("Pathogenicity")) { cafeVariomeDTO.setPatientPathogenicity(variantValue.getValue()); } else if (variantValue.getFeature().getName().equals("Zygosity")) { cafeVariomeDTO.setZygosity(variantValue.getValue()); } } for (AlternateId alternateId : patientAltIdList) { if (alternateId.getDefinition().equals("molgenis_patient_id")) { cafeVariomeDTO.setPatientIdentifier(alternateId.getName()); } } for (AlternateId alternateId : variantAltIdList) { if (alternateId.getDefinition().equals("molgenis_variant_id")) { cafeVariomeDTO.setVariantIdentifier(alternateId.getName()); } } if (publication.getPubmedID() != null) { cafeVariomeDTO.setReference("PM:" + publication.getPubmedID().getName()); } if (variant.getGene() != null && CollectionUtils.isNotEmpty(variant.getGene().getAlternateId())) { for (AlternateId alternateId : variant.getGene().getAlternateId()) { if ("genbank_id".equals(alternateId.getDefinition())) { cafeVariomeDTO.setRefnum(alternateId.getName()); } } } cafeVariomeDTO.setName(variant.getNameCdna()); cafeVariomeDTO.setPhenotype(patient.getPhenotype()); cafeVariomeDTO.setPolicy("openAccess"); cafeVariomeDTO.setPositionGdna(variant.getStartGdna().toString()); cafeVariomeDTO.setSymbol(variant.getGene().getName()); return cafeVariomeDTO; } }