package org.molgenis.mutation.service; import java.io.Serializable; import java.sql.ResultSet; import java.sql.SQLException; import java.text.ParseException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Join; import javax.persistence.criteria.JoinType; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.apache.regexp.RE; import org.apache.regexp.RESyntaxException; import org.molgenis.auth.MolgenisUser; import org.molgenis.core.Publication; import org.molgenis.core.service.PublicationService; import org.molgenis.core.vo.PublicationVO; import org.molgenis.framework.db.Database; import org.molgenis.framework.db.DatabaseException; import org.molgenis.framework.db.Query; import org.molgenis.framework.db.QueryRule; import org.molgenis.framework.db.jdbc.JDBCDatabase; import org.molgenis.framework.db.jpa.JpaDatabase; import org.molgenis.mutation.Exon; import org.molgenis.mutation.Mutation; import org.molgenis.mutation.MutationGene; import org.molgenis.mutation.Patient; import org.molgenis.mutation.ProteinDomain; import org.molgenis.mutation.util.SequenceUtils; import org.molgenis.mutation.vo.ExonSearchCriteriaVO; import org.molgenis.mutation.vo.ExonSummaryVO; import org.molgenis.mutation.vo.MutationSearchCriteriaVO; import org.molgenis.mutation.vo.MutationSummaryVO; import org.molgenis.mutation.vo.MutationUploadVO; import org.molgenis.mutation.vo.PatientSearchCriteriaVO; import org.molgenis.mutation.vo.PatientSummaryVO; import org.molgenis.pheno.ObservableFeature; import org.molgenis.pheno.ObservedValue; import org.molgenis.submission.Submission; public class MutationService implements Serializable { private static final long serialVersionUID = -5234460093223923754L; private Database db = null; private HashMap<Integer, MutationSummaryVO> cache = new HashMap<Integer, MutationSummaryVO>(); private static final transient Logger logger = Logger.getLogger(MutationService.class.getSimpleName()); public void setDatabase(Database db) { this.db = db; } public List<MutationSummaryVO> findMutations(MutationSearchCriteriaVO criteria) throws DatabaseException { List<Mutation> mutations = this._findMutations(criteria); if (mutations.size() > 0) return this.toMutationSummaryVOList(mutations); else return new ArrayList<MutationSummaryVO>(); } public List<PatientSummaryVO> findPatients(MutationSearchCriteriaVO criteria) throws DatabaseException { List<Mutation> mutations = this._findMutations(criteria); if (mutations.size() > 0) { PatientService patientService = new PatientService(); patientService.setDatabase(db); List<PatientSummaryVO> result = new ArrayList<PatientSummaryVO>(); for (Mutation mutation : mutations) { PatientSearchCriteriaVO criteria2 = new PatientSearchCriteriaVO(); criteria2.setMutationId(mutation.getId()); List<PatientSummaryVO> patientSummaryVOs = patientService.findPatients(criteria2); result.addAll(patientSummaryVOs); } return result; } else return new ArrayList<PatientSummaryVO>(); } protected List<Mutation> _findMutations(MutationSearchCriteriaVO criteria) throws DatabaseException { if (this.db instanceof JDBCDatabase) { Query<Mutation> query = this.db.query(Mutation.class); if (criteria.getCdnaPosition() != null) query = query.equals(Mutation.CDNA_POSITION, criteria.getCdnaPosition()); if (criteria.getCodonChangeNumber() != null) query = query.equals(Mutation.AA_POSITION, criteria.getCodonChangeNumber()); if (StringUtils.length(criteria.getConsequence()) > 2) query = query.like(Mutation.CONSEQUENCE, criteria.getConsequence() + "%"); if (criteria.getExonId() != null) query = query.equals(Mutation.EXON, criteria.getExonId()); if (criteria.getExonName() != null) query = query .equals(Mutation.EXON_NAME, "Exon " + criteria.getExonName()).or() .equals(Mutation.EXON_NAME, "IVS" + criteria.getExonName()); if (criteria.getExonNumber() != null) query = query .equals(Mutation.EXON_NAME, "Exon " + criteria.getExonNumber()).or() .equals(Mutation.EXON_NAME, "IVS" + criteria.getExonNumber()); if (criteria.getMid() != null) query = query.equals(Mutation.IDENTIFIER, criteria.getMid()); if (StringUtils.length(criteria.getInheritance()) > 2) query = query.like(Mutation.INHERITANCE, criteria.getInheritance() + "%"); if (criteria.getMutationId() != null) query = query.equals(Mutation.ID, criteria.getMutationId()); if (StringUtils.length(criteria.getPhenotypeName()) > 2) { // TODO: add proper join capability List<ObservedValue> phenotypes = this.db.query(ObservedValue.class) .equals(ObservedValue.VALUE, criteria.getPhenotypeName()).find(); for (ObservedValue phenotype : phenotypes) { Patient patient = this.db.findById(Patient.class, phenotype.getTarget_Id()); List<Integer> mutationIds = patient.getMutations_Id(); if (mutationIds.size() > 0) query = query.in(Mutation.ID, mutationIds); } } // if (StringUtils.length(criteria.getPhenotypeName()) > 2) // { // //TODO: add proper join capability // List<MutationPhenotype> phenotypes = // this.db.query(MutationPhenotype.class) // .like(MutationPhenotype.NAME, criteria.getPhenotypeName() + // "%").or() // .like(MutationPhenotype.MAJORTYPE, criteria.getPhenotypeName() + // "%").or() // .like(MutationPhenotype.SUBTYPE, criteria.getPhenotypeName() + // "%") // .find(); // List<Integer> phenotypeIds = new ArrayList<Integer>(); // for (MutationPhenotype phenotype : phenotypes) // phenotypeIds.add(phenotype.getId()); // if (phenotypeIds.size() > 0) // { // List<Patient> patients = // this.db.query(Patient.class).in(Patient.PHENOTYPE, // phenotypeIds).find(); // List<Integer> mutationIds = new ArrayList<Integer>(); // for (Patient patient : patients) // { // mutationIds.add(patient.getMutation1_Id()); // mutationIds.add(patient.getMutation2_Id()); // } // if (mutationIds.size() > 0) // query = query.in(Mutation.ID, mutationIds); // } // } if (criteria.getPid() != null) { // TODO: add proper join capability List<Patient> patients = this.db.query(Patient.class).equals(Patient.IDENTIFIER, criteria.getPid()) .find(); List<Integer> mutationIds = new ArrayList<Integer>(); for (Patient patient : patients) { mutationIds.addAll(patient.getMutations_Id()); } if (mutationIds.size() > 0) query = query.in(Mutation.ID, mutationIds); } if (criteria.getProteinDomainId() != null) { // TODO: add proper join capability // List<Exon_ProteinDomain> epds = // this.db.query(Exon_ProteinDomain.class).equals(Exon_ProteinDomain.PROTEINDOMAIN, // criteria.getProteinDomainId()).find(); // //List<Tuple> epds = // this.db.sql(String.format("SELECT Exon FROM Exon_proteinDomain WHERE proteinDomain = %d", // criteria.getProteinDomainId())); // List<Integer> exonIds = new ArrayList<Integer>(); // for (Exon_ProteinDomain epd : epds) // exonIds.add(epd.getExon_Id()); // if (exonIds.size() > 0) // query = query.in(Mutation.EXON, exonIds); List<Exon> exons = this.db.query(Exon.class).equals(Exon.PROTEINDOMAIN, criteria.getProteinDomainId()) .find(); List<Integer> exonIds = new ArrayList<Integer>(); for (Exon exon : exons) exonIds.add(exon.getId()); if (exonIds.size() > 0) query = query.in(Mutation.EXON, exonIds); } if (StringUtils.length(criteria.getPublication()) > 2) { List<Publication> publications = this.db.query(Publication.class) .like(Publication.NAME, criteria.getPublication() + "%").or() .like(Publication.TITLE, "%" + criteria.getPublication() + "%").find(); List<Integer> publicationIds = new ArrayList<Integer>(); for (Publication publication : publications) publicationIds.add(publication.getId()); if (publicationIds.size() > 0) { List<Patient> patients = this.db.query(Patient.class).in(Patient.PATIENTREFERENCES, publicationIds) .find(); List<Integer> mutationIds = new ArrayList<Integer>(); for (Patient patient : patients) { mutationIds.addAll(patient.getMutations_Id()); } if (mutationIds.size() > 0) query = query.in(Mutation.ID, mutationIds); } } if (criteria.getReportedAsSNP() != null) query = query.equals(Mutation.REPORTEDSNP, criteria.getReportedAsSNP()); if (StringUtils.length(criteria.getType()) > 2) query = query .like(Mutation.TYPE_, criteria.getType() + "%"); if (StringUtils.length(criteria.getVariation()) > 0) query = query .equals(Mutation.CDNA_NOTATION, criteria.getVariation()).or() .equals(Mutation.CDNA_NOTATION, "c." + criteria.getVariation()).or() .equals(Mutation.AA_NOTATION, criteria.getVariation()).or() .equals(Mutation.AA_NOTATION, "p." + criteria.getVariation()); if (query.getRules().length > 0) return query.sortASC(Mutation.IDENTIFIER).find(); else return new ArrayList<Mutation>(); } else if (this.db instanceof JpaDatabase) { CriteriaBuilder cb = this.db.getEntityManager().getCriteriaBuilder(); CriteriaQuery<Mutation> query = cb.createQuery(Mutation.class); // Metamodel metaModel = this.db.getEntityManager().getMetamodel(); // EntityType<Mutation> Mutation_ = // metaModel.entity(Mutation.class); Root<Mutation> mutation = query.from(Mutation.class); query.select(mutation); List<Predicate> mutationCriteria = new ArrayList<Predicate>(); if (criteria.getCdnaPosition() != null) mutationCriteria.add(cb.equal(mutation.get("cdna_position"), criteria.getCdnaPosition())); if (criteria.getCodonChangeNumber() != null) mutationCriteria.add(cb.equal(mutation.get("aa_position"), criteria.getCodonChangeNumber())); if (StringUtils.length(criteria.getConsequence()) > 2) mutationCriteria.add(cb.like( mutation.<String> get("consequence"), criteria.getConsequence() + "%")); if (criteria.getExonId() != null || criteria.getExonName() != null || criteria.getExonNumber() != null || criteria.getProteinDomainId() != null) { Join<Mutation, Exon> exon = mutation.join("exon", JoinType.LEFT); if (criteria.getExonId() != null) mutationCriteria.add(cb.equal(exon.get("id"), criteria.getExonId())); if (criteria.getExonName() != null) mutationCriteria.add(cb.or( cb.like(exon.<String> get("name"), "Exon " + criteria.getExonName()), cb.like(exon.<String> get("name"), "IVS" + criteria.getExonName()))); if (criteria.getExonNumber() != null) mutationCriteria.add(cb.or( cb.like(exon.<String> get("name"), "Exon " + criteria.getExonNumber()), cb.like(exon.<String> get("name"), "IVS" + criteria.getExonNumber()))); if (criteria.getProteinDomainId() != null) { Join<Exon, ProteinDomain> proteinDomain = exon.join("proteinDomain", JoinType.LEFT); mutationCriteria.add(cb.equal(proteinDomain.get("id"), criteria.getProteinDomainId())); } } if (criteria.getMid() != null) mutationCriteria .add(cb.equal(mutation.get("identifier"), criteria.getMid())); if (StringUtils.length(criteria.getInheritance()) > 2) mutationCriteria.add(cb.like( mutation.<String> get("inheritance"), criteria.getInheritance() + "%")); if (criteria.getMutationId() != null) mutationCriteria.add(cb.equal(mutation.get("id"), criteria.getMutationId())); if (criteria.getPid() != null || criteria.getPhenotypeId() != null || StringUtils.length(criteria.getPhenotypeName()) > 2 || StringUtils.length(criteria.getPublication()) > 2) { Join<Mutation, Patient> patient = mutation.join("mutationsCollection", JoinType.LEFT); if (criteria.getPid() != null) mutationCriteria.add(cb.equal(patient.get("identifier"), criteria.getPid())); if (criteria.getPhenotypeId() != null) { } if (StringUtils.length(criteria.getPhenotypeName()) > 2) { Join<Patient, ObservedValue> observedValues = patient.join("targetObservedValueCollection", JoinType.LEFT); Join<ObservedValue, ObservableFeature> observableFeatures = observedValues.join("feature", JoinType.LEFT); mutationCriteria.add(cb.or( cb.and(cb.equal(observableFeatures.get("name"), "Phenotype"), cb.equal(observedValues.get("value"), criteria.getPhenotypeName())), cb.and(cb.equal(observableFeatures.get("name"), criteria.getPhenotypeName()), cb.equal(observedValues.get("value"), "yes")))); } if (StringUtils.length(criteria.getPublication()) > 2) { Join<Patient, Publication> publication = patient.join("patientreferences", JoinType.LEFT); mutationCriteria.add(cb.or( cb.like(publication.<String> get("name"), "%" + criteria.getPublication() + "%"), cb.like(publication.<String> get("title"), "%" + criteria.getPublication() + "%"))); } } if (criteria.getReportedAsSNP() != null) mutationCriteria.add(cb.equal(mutation.get("reportedsnp"), criteria.getMutationId())); if (StringUtils.length(criteria.getType()) > 2) mutationCriteria.add(cb.like( mutation.<String> get("type_"), criteria.getType() + "%")); if (StringUtils.length(criteria.getVariation()) > 0) mutationCriteria.add(cb.or( cb.equal(mutation.get("cdna_notation"), criteria.getVariation()), cb.equal(mutation.<String> get("cdna_notation"), "c." + criteria.getVariation()), cb.equal(mutation.get("aa_notation"), criteria.getVariation()), cb.equal(mutation.get("cdna_notation"), "p." + criteria.getVariation()))); if (mutationCriteria.size() > 0) { query.where(cb.and(mutationCriteria.toArray(new Predicate[0]))); query.orderBy(cb.asc(mutation.get("identifier"))); return this.db.getEntityManager().createQuery(query).getResultList(); } else return new ArrayList<Mutation>(); } else throw new DatabaseException("Unsupported database mapper"); } private MutationSummaryVO toMutationSummaryVO(Mutation mutation) throws DatabaseException { if (this.cache.containsKey(mutation.getId())) return this.cache.get(mutation.getId()); MutationSummaryVO mutationSummaryVO = new MutationSummaryVO(); mutationSummaryVO.setIdentifier(mutation.getIdentifier()); mutationSummaryVO.setCdnaNotation(mutation.getCdna_Notation()); mutationSummaryVO.setCdnaPosition(mutation.getCdna_Position()); mutationSummaryVO.setGdnaNotation(mutation.getGdna_Notation()); mutationSummaryVO.setGdnaPosition(mutation.getGdna_Position()); mutationSummaryVO.setAaNotation(mutation.getAa_Notation()); mutationSummaryVO.setAaPosition(mutation.getAa_Position()); if (StringUtils.isNotEmpty(mutation.getAa_Notation())) mutationSummaryVO.setNiceNotation(mutation .getCdna_Notation() + " (" + mutation.getAa_Notation() + ")"); else mutationSummaryVO.setNiceNotation(mutation.getCdna_Notation()); mutationSummaryVO.setCodonChange(this.getCodonChange(mutation)); mutationSummaryVO.setConsequence(mutation.getConsequence()); mutationSummaryVO.setType(mutation.getType()); mutationSummaryVO.setInheritance(mutation.getInheritance()); mutationSummaryVO.setReportedSNP(mutation.getReportedSNP()); mutationSummaryVO.setPathogenicity(mutation.getPathogenicity()); Exon exon = this.db.findById(Exon.class, mutation.getExon_Id()); mutationSummaryVO.setExonId(exon.getId()); mutationSummaryVO.setExonNumber(exon.getNumber()); mutationSummaryVO.setExonName(exon.getName()); List<ProteinDomain> proteinDomains = this.db.query(ProteinDomain.class) .in(ProteinDomain.ID, exon.getProteinDomain_Id()).find(); // helper hash to get distinct protein domain names HashMap<Integer, String> domainNameHash = new HashMap<Integer, String>(); for (ProteinDomain domain : proteinDomains) domainNameHash.put(domain.getId(), domain.getName()); mutationSummaryVO.setProteinDomainNameList(new ArrayList<String>()); mutationSummaryVO.getProteinDomainNameList().addAll(domainNameHash.values()); mutationSummaryVO.setPatientSummaryVOList(new ArrayList<PatientSummaryVO>()); // helper hash to get distinct phenotypes HashMap<String, String> phenotypeNameHash = new HashMap<String, String>(); // helper hash to get distinct publications HashMap<Integer, PublicationVO> publicationVOHash = new HashMap<Integer, PublicationVO>(); List<Patient> patients = this.db.query(Patient.class).equals(Patient.MUTATIONS, mutation.getId()).find(); List<ObservableFeature> features = this.db.query(ObservableFeature.class) .equals(ObservableFeature.NAME, "Phenotype").find(); if (features.size() != 1) throw new DatabaseException( "Not exactly one ObservableFeature with name 'Phenotype' found."); for (Patient patient : patients) { PatientSummaryVO patientSummaryVO = new PatientSummaryVO(); patientSummaryVO.setPatientIdentifier(patient.getIdentifier()); patientSummaryVO.setVariantComment(patient.getMutation2remark()); List<ObservedValue> phenotypes = this.db.query(ObservedValue.class) .equals(ObservedValue.FEATURE, features.get(0).getId()) .equals(ObservedValue.TARGET, patient.getId()).find(); List<String> phenotypeNames = new ArrayList<String>(); for (ObservedValue phenotype : phenotypes) { phenotypeNames.add(phenotype.getValue()); phenotypeNameHash.put(phenotype.getValue(), phenotype.getValue()); } patientSummaryVO.setPhenotypeMajor(StringUtils.join(phenotypeNames, ", ")); patientSummaryVO.setPhenotypeSub(""); // String phenotypeName = phenotype.getMajortype() + // (StringUtils.isNotEmpty(phenotype.getSubtype()) ? ", " + // phenotype.getSubtype() : ""); // phenotypeNameHash.put(phenotype.getId(), phenotypeName); patientSummaryVO.setVariantSummaryVOList(new ArrayList<MutationSummaryVO>()); // TODO: How to generalize this in future? List<Mutation> otherVariants = this.db.query(Mutation.class).in(Mutation.ID, patient.getMutations_Id()) .find(); Mutation remove = new Mutation(); for (Mutation patientMutation : otherVariants) { if (mutation.getId().equals(patientMutation.getId())) remove = patientMutation; } otherVariants.remove(remove); for (Mutation otherVariant : otherVariants) { MutationSummaryVO otherVariantVO = new MutationSummaryVO(); otherVariantVO.setIdentifier(otherVariant.getIdentifier()); otherVariantVO.setCdnaNotation(otherVariant.getCdna_Notation()); otherVariantVO.setAaNotation(otherVariant.getAa_Notation()); otherVariantVO.setConsequence(otherVariant.getConsequence()); otherVariantVO.setInheritance(otherVariant.getInheritance()); otherVariantVO.setExonId(otherVariant.getExon_Id()); otherVariantVO.setExonName(otherVariant.getExon_Name()); patientSummaryVO.getVariantSummaryVOList().add(otherVariantVO); } patientSummaryVO.setVariantComment(patient.getMutation2remark()); Submission submission = this.db.findById(Submission.class, patient.getSubmission_Id()); MolgenisUser submitter = this.db.findById(MolgenisUser.class, submission.getSubmitters_Id().get(0)); patientSummaryVO.setSubmitterDepartment(submitter.getDepartment()); patientSummaryVO.setSubmitterInstitute(submitter.getAffiliation_Name()); patientSummaryVO.setSubmitterCity(submitter.getCity()); patientSummaryVO.setSubmitterCountry(submitter.getCountry()); patientSummaryVO.setPublicationVOList(new ArrayList<PublicationVO>()); if (CollectionUtils.isNotEmpty(patient.getPatientreferences_Id())) { List<Publication> publications = this.db.query(Publication.class) .in(Publication.ID, patient.getPatientreferences_Id()).find(); for (Publication publication : publications) { PublicationVO publicationVO = new PublicationVO(); publicationVO.setName(publication.getName()); publicationVO.setTitle(publication.getTitle()); publicationVO.setPubmedId(publication.getPubmedID_Name()); patientSummaryVO.getPublicationVOList().add(publicationVO); publicationVOHash.put(publication.getId(), publicationVO); } } mutationSummaryVO.getPatientSummaryVOList().add(patientSummaryVO); } mutationSummaryVO.setPhenotypeNameList(new ArrayList<String>()); mutationSummaryVO.getPhenotypeNameList().addAll(phenotypeNameHash.values()); mutationSummaryVO.setPublicationVOList(new ArrayList<PublicationVO>()); mutationSummaryVO.getPublicationVOList().addAll(publicationVOHash.values()); mutationSummaryVO.setPubmedURL(PublicationService.PUBMED_URL); // cache value this.cache.put(mutation.getId(), mutationSummaryVO); return mutationSummaryVO; } private List<MutationSummaryVO> toMutationSummaryVOList(List<Mutation> mutations) throws DatabaseException { List<MutationSummaryVO> result = new ArrayList<MutationSummaryVO>(); for (Mutation mutation : mutations) { MutationSummaryVO mutationSummaryVO = this.toMutationSummaryVO(mutation); result.add(mutationSummaryVO); } return result; } private MutationSummaryVO findPrevMutation(Mutation mutation) throws DatabaseException { List<Mutation> mutations = this.db.query(Mutation.class) .lt(Mutation.CDNA_POSITION, mutation.getCdna_Position()).sortDESC(Mutation.CDNA_POSITION).limit(1) .find(); if (mutations.size() > 0) return this.toMutationSummaryVO(mutations.get(0)); else return this.toMutationSummaryVO(mutation); } private MutationSummaryVO findNextMutation(Mutation mutation) throws DatabaseException { List<Mutation> mutations = this.db.query(Mutation.class) .gt(Mutation.CDNA_POSITION, mutation.getCdna_Position()).sortASC(Mutation.CDNA_POSITION).limit(1) .find(); if (mutations.size() > 0) return this.toMutationSummaryVO(mutations.get(0)); else return this.toMutationSummaryVO(mutation); } public MutationSummaryVO getFirstMutation() throws DatabaseException { return this.toMutationSummaryVO(this.db.query(Mutation.class).sortASC(Mutation.CDNA_POSITION).limit(1).find() .get(0)); } public MutationSummaryVO getPrevMutation(String identifier) throws DatabaseException { Mutation mutation = this.db.query(Mutation.class).equals(Mutation.IDENTIFIER, identifier).find().get(0); return this.findPrevMutation(mutation); } public MutationSummaryVO getNextMutation(String identifier) throws DatabaseException { Mutation mutation = this.db.query(Mutation.class).equals(Mutation.IDENTIFIER, identifier).find().get(0); return this.findNextMutation(mutation); } public MutationSummaryVO getLastMutation() throws DatabaseException { return this.toMutationSummaryVO(this.db.query(Mutation.class).sortDESC(Mutation.CDNA_POSITION).limit(1).find() .get(0)); } public List<MutationSummaryVO> findPositionMutations(MutationSummaryVO mutationSummaryVO) throws DatabaseException { List<MutationSummaryVO> result = new ArrayList<MutationSummaryVO>(); List<Mutation> positionMutations = this.db.query(Mutation.class) .equals(Mutation.CDNA_POSITION, mutationSummaryVO.getCdnaPosition()).find(); for (Mutation positionMutation : positionMutations) { if (!positionMutation.getId().equals(mutationSummaryVO.getId())) { MutationSummaryVO tmp = new MutationSummaryVO(); tmp.setIdentifier(positionMutation.getIdentifier()); tmp.setCdnaNotation(positionMutation.getCdna_Notation()); result.add(tmp); } } return result; } public List<MutationSummaryVO> findCodonMutations(MutationSummaryVO mutationSummaryVO) throws DatabaseException { List<MutationSummaryVO> result = new ArrayList<MutationSummaryVO>(); if (mutationSummaryVO.getAaPosition() != null) { List<Mutation> codonMutations = this.db.query(Mutation.class) .equals(Mutation.AA_POSITION, mutationSummaryVO.getAaPosition()).find(); for (Mutation codonMutation : codonMutations) { if (!codonMutation.getId().equals(mutationSummaryVO.getId())) { MutationSummaryVO tmp = new MutationSummaryVO(); tmp.setIdentifier(codonMutation.getIdentifier()); tmp.setCdnaNotation(codonMutation.getCdna_Notation()); result.add(tmp); } } } return result; } /** * Get all mutations sorted by their position * * @return mutations * @throws DatabaseException * @throws ParseException */ public List<MutationSummaryVO> getAllMutationSummaries() throws DatabaseException, ParseException { return this.toMutationSummaryVOList(this.db.query(Mutation.class).sortASC(Mutation.CDNA_POSITION).find()); } /** * Get all mutation consequences * * @return mutation consequences * @throws SQLException * @throws DatabaseException */ public List<String> getConsequences() throws SQLException, DatabaseException { if (this.db instanceof JDBCDatabase) { ArrayList<String> consequences = new ArrayList<String>(); ResultSet rs = ((JDBCDatabase) this.db).executeQuery("SELECT DISTINCT consequence FROM Mutation", (QueryRule[]) null); while (rs.next()) consequences.add(rs.getString(1)); return consequences; } else if (this.db instanceof JpaDatabase) { javax.persistence.Query q = this.db.getEntityManager().createNativeQuery( "SELECT DISTINCT consequence FROM Mutation"); return q.getResultList(); } else throw new DatabaseException("Unsupported database mapper"); } /** * Get all mutation types * * @return mutation types * @throws DatabaseException * @throws SQLException */ public List<String> getMutationTypes() throws SQLException, DatabaseException { if (this.db instanceof JDBCDatabase) { ArrayList<String> types = new ArrayList<String>(); ResultSet rs = ((JDBCDatabase) this.db).executeQuery("SELECT DISTINCT type_ FROM Mutation", (QueryRule[]) null); while (rs.next()) types.add(rs.getString(1)); return types; } else if (this.db instanceof JpaDatabase) { javax.persistence.Query q = this.db.getEntityManager().createNativeQuery( "SELECT DISTINCT type_ FROM Mutation"); return q.getResultList(); } else throw new DatabaseException("Unsupported database mapper"); } /** * get the notation of the codon change for a given mutation * * @param mutation * @return codon change * @throws DatabaseException */ private String getCodonChange(Mutation mutation) throws DatabaseException { if (mutation.getAa_Position() == null || mutation.getAa_Position() == 0 || StringUtils.isEmpty(mutation.getCodonchange())) return ""; MutationGene gene = this.db.findById(MutationGene.class, mutation.getGene_Id()); String splicedSeq = SequenceUtils.splice(gene.getSeq()); return SequenceUtils.getCodon(splicedSeq, mutation.getAa_Position()) + ">" + mutation.getCodonchange(); } public void assignValuesFromNotation(MutationUploadVO mutationUploadVO) throws DatabaseException, ParseException, RESyntaxException { // logger.debug(">>> assignValuesFromNotation: cdnaNotation==" + // mutationUploadVO.getMutation().getCdna_notation()); if (mutationUploadVO.getMutation().getCdna_Notation() != null) { String cdnaNotation = mutationUploadVO.getMutation().getCdna_Notation(); // RE reIndel = new // RE("^c.([\\d+-]+)([_]*)([\\d+-]*)del([ACGTacgt\\d]*)ins([ACGTacgt]*)$"); RE reIndel = new RE("^c.([\\d+-_]+)del([ACGTacgt\\d]*)ins([ACGTacgt]*)$"); RE reDeletion = new RE("^c.([\\d+-_]+)del([ACGTacgt\\d]*)$"); RE reDuplication = new RE("^c.([\\d+-_]+)dup([ACGTacgt\\d]*)$"); // RE reInsertion = new // RE("^c.([\\d+-]+)([_]*)([\\d+-]*)ins([ACGTacgt]*)$"); RE reInsertion = new RE("^c.([\\d+-_]+)ins([ACGTacgt]*)$"); RE reSubstitution = new RE("^c.([\\d+-]+)([ACGTacgt]+)>([ACGTacgt]+)$"); if (reIndel.match(cdnaNotation)) { mutationUploadVO.getMutation().setEvent("insertion/deletion"); // deletion String[] position = reIndel.getParen(1).split("_"); String deletion = reIndel.getParen(2); String insertion = reIndel.getParen(3); // logger.debug(">>> position==" + position + ", deletion==" + // deletion + ", insertion==" + insertion); mutationUploadVO.getMutation().setMutationPosition(position[0]); if (position.length == 2) mutationUploadVO.getMutation().setLength( Integer.valueOf(position[1]) - Integer.valueOf(position[0]) + 1); else if (StringUtils.isNotEmpty(deletion)) if (StringUtils.isNumeric(deletion)) mutationUploadVO .getMutation().setLength(Integer.valueOf(deletion)); else mutationUploadVO.getMutation().setLength(deletion.length()); else mutationUploadVO.getMutation().setLength(1); // insertion mutationUploadVO.getMutation().setNtchange(insertion); } else if (reDeletion.match(cdnaNotation)) { String[] position = reDeletion.getParen(1).split("_"); String deletion = reDeletion.getParen(2); mutationUploadVO.getMutation().setEvent("deletion"); mutationUploadVO.getMutation().setMutationPosition(position[0]); if (position.length == 2) mutationUploadVO.getMutation().setLength( Integer.valueOf(position[1]) - Integer.valueOf(position[0]) + 1); else if (StringUtils.isNotEmpty(deletion)) if (StringUtils.isNumeric(deletion)) mutationUploadVO .getMutation().setLength(Integer.valueOf(deletion)); else mutationUploadVO.getMutation().setLength(deletion.length()); else mutationUploadVO.getMutation().setLength(1); // mutationUploadVO.getMutation().setPosition(reDeletion.getParen(1)); // if (StringUtils.isNotEmpty(reDeletion.getParen(3))) // mutationUploadVO.getMutation().setLength(Integer.valueOf(reDeletion.getParen(3)) // - Integer.valueOf(reDeletion.getParen(1)) + 1); // else if (StringUtils.isNotEmpty(reDeletion.getParen(4))) // if (StringUtils.isNumeric(reDeletion.getParen(4))) // mutationUploadVO.getMutation().setLength(Integer.valueOf(reDeletion.getParen(4))); // else // mutationUploadVO.getMutation().setLength(reDeletion.getParen(4).length()); // else // mutationUploadVO.getMutation().setLength(1); } else if (reDuplication.match(cdnaNotation)) { String[] position = reDuplication.getParen(1).split("_"); String duplication = reDuplication.getParen(2); mutationUploadVO.getMutation().setEvent("duplication"); mutationUploadVO.getMutation().setMutationPosition(position[0]); if (position.length == 2) mutationUploadVO.getMutation().setLength( Integer.valueOf(position[1]) - Integer.valueOf(position[0]) + 1); else if (StringUtils.isNotEmpty(duplication)) if (StringUtils.isNumeric(duplication)) mutationUploadVO .getMutation().setLength(Integer.valueOf(duplication)); else mutationUploadVO.getMutation().setLength(duplication.length()); else mutationUploadVO.getMutation().setLength(1); // if (StringUtils.isNotEmpty(reDuplication.getParen(3))) // mutationUploadVO.getMutation().setLength(Integer.valueOf(reDuplication.getParen(3)) // - Integer.valueOf(reDuplication.getParen(1)) + 1); // else if (StringUtils.isNotEmpty(reDuplication.getParen(4))) // if (StringUtils.isNumeric(reDeletion.getParen(4))) // mutationUploadVO.getMutation().setLength(Integer.valueOf(reDeletion.getParen(4))); // else // mutationUploadVO.getMutation().setLength(reDuplication.getParen(4).length()); // else // mutationUploadVO.getMutation().setLength(1); } else if (reInsertion.match(cdnaNotation)) { String[] position = reInsertion.getParen(1).split("_"); String insertion = reInsertion.getParen(2); mutationUploadVO.getMutation().setEvent("insertion"); mutationUploadVO.getMutation().setMutationPosition(position[0]); mutationUploadVO.getMutation().setLength(insertion.length()); mutationUploadVO.getMutation().setNtchange(insertion); } else if (reSubstitution.match(cdnaNotation)) { mutationUploadVO.getMutation().setEvent("point mutation"); mutationUploadVO.getMutation().setMutationPosition(reSubstitution.getParen(1)); mutationUploadVO.getMutation().setLength(reSubstitution.getParen(2).length()); mutationUploadVO.getMutation().setNtchange(reSubstitution.getParen(3)); } // logger.debug(">>> assignValuesFromNotation: cdnaNotation==" + // cdnaNotation + ", event==" + // mutationUploadVO.getMutation().getEvent() + ", pos==" + // mutationUploadVO.getMutation().getPosition() + ", len==" + // mutationUploadVO.getMutation().getLength() + ", ntchange==" + // mutationUploadVO.getMutation().getNtchange()); } this.assignValuesFromPosition(mutationUploadVO); } public void assignValuesFromPosition(MutationUploadVO mutationUploadVO) throws DatabaseException, RESyntaxException { if (StringUtils.isEmpty(mutationUploadVO.getMutation().getMutationPosition()) || "0".equals(mutationUploadVO.getMutation().getMutationPosition())) return; MutationGene gene = this.db.query(MutationGene.class) .equals(MutationGene.NAME, mutationUploadVO.getGeneSymbol()).find().get(0); mutationUploadVO.setGeneBpStart(gene.getBpStart().intValue()); mutationUploadVO.setGeneOrientation(gene.getOrientation()); mutationUploadVO.setGeneSeq(gene.getSeq()); mutationUploadVO.setGeneSymbol(gene.getSymbol()); mutationUploadVO.getMutation().setGene(gene); // logger.debug("gene==" + this.mutationVO.getGene()); // HashMap<String, String> aminoAcidHash = // this.mutationService.getAminoAcids(); String nuclSequence = mutationUploadVO.getGeneSeq(); StringBuffer mutSequence = new StringBuffer(nuclSequence); // find corresponding exon ExonSearchCriteriaVO criteria = new ExonSearchCriteriaVO(); criteria.setPosition(mutationUploadVO.getMutation().getMutationPosition()); if (mutationUploadVO.getMutation().getMutationPosition().indexOf("+") > -1 || mutationUploadVO.getMutation().getMutationPosition().indexOf("-") > -1) criteria.setIsIntron(true); else criteria.setIsIntron(false); // logger.debug(">>> assignValues: vor findExons"); ExonService exonService = new ExonService(); exonService.setDatabase(db); // logger.debug(">>> position==" + // mutationUploadVO.getMutation().getPosition() + ", criteria==" + // criteria.toString()); List<ExonSummaryVO> exonSummaryVOs = exonService.findExons(criteria); // logger.debug(">>> assignValues: nach findExons: exonSummaryVOs==" + // exonSummaryVOs.size()); Exon exon = exonSummaryVOs.get(0).getExon(); // logger.debug(">>> exon==" + exon.toString()); mutationUploadVO.setExonId(exon.getId()); mutationUploadVO.setExonIsIntron(exon.getIsIntron()); mutationUploadVO.getMutation().setExon(exon); // this is crap, use // navigable objects System.out.println(">>> assignValuesFromPosition: mut.pos==" + mutationUploadVO.getMutation().getMutationPosition() + ", exon==" + exon.getName()); mutationUploadVO.getMutation().setCdna_Position( SequenceUtils.getCDNAPosition(mutationUploadVO.getMutation().getMutationPosition())); mutationUploadVO.getMutation().setGdna_Position( SequenceUtils.getGDNAPosition(mutationUploadVO.getMutation().getMutationPosition(), exon, gene.getOrientation())); int mutationStart; // System.out.println(">>> assignValuesFromPosition: mut.gdna==" + // mutationUploadVO.getMutation().getGdna_Position() + ", gene.start==" // + mutationUploadVO.getGene().getBpStart()); if ("F".equals(mutationUploadVO.getGeneOrientation())) mutationStart = mutationUploadVO.getMutation() .getGdna_Position() - mutationUploadVO.getGeneBpStart().intValue(); else mutationStart = mutationUploadVO.getGeneBpStart().intValue() - mutationUploadVO.getMutation().getGdna_Position(); if (mutationUploadVO.getMutation().getLength() == null) mutationUploadVO.getMutation().setLength(1); // default // value // logger.debug(">>> vor assignNt: mutationStart==" + mutationStart); this.assignNt(mutationUploadVO, nuclSequence, mutationStart); // logger.debug(">>> nt==" + mutationUploadVO.getNt()); // this.mutationVO.setNt(nuclSequence.substring(mutationStart, // mutationStart + 1).toUpperCase()); // logger.debug("mutationStart==" + mutationStart + "."); // logger.debug("nt==" + nuclSequence.substring(mutationStart, // mutationStart + 1).toUpperCase() + "."); if (mutationUploadVO.getMutation().getEvent().equals("deletion")) { int mutationEnd = mutationStart + mutationUploadVO.getMutation().getLength(); // this.mutationVO.setNt(nuclSequence.substring(mutationStart, // mutationEnd).toUpperCase()); this.assignNt(mutationUploadVO, nuclSequence, mutationStart); // logger.debug(">>> nt==" + mutationUploadVO.getNt()); mutSequence.delete(mutationStart, mutationEnd); mutationUploadVO.getMutation().setNtchange(""); } else if (mutationUploadVO.getMutation().getEvent().equals("duplication")) { // int mutationEnd = mutationStart + // mutationUploadVO.getMutation().getLength(); this.assignNt(mutationUploadVO, nuclSequence, mutationStart); mutSequence.insert(mutationStart, mutationUploadVO.getNt()); mutationUploadVO.getMutation().setNtchange(""); } else if (mutationUploadVO.getMutation().getEvent().equals("insertion")) { mutationStart++; // insert *after* position mutSequence.insert(mutationStart, mutationUploadVO.getMutation().getNtchange()); mutationUploadVO.getMutation().setLength(mutationUploadVO.getMutation().getNtchange().length()); } else if (mutationUploadVO.getMutation().getEvent().equals("point mutation")) { int mutationEnd = mutationStart + mutationUploadVO.getMutation().getNtchange().length(); // this.mutationVO.setNt(nuclSequence.substring(mutationStart, // mutationEnd).toUpperCase()); if (mutationUploadVO.getMutation().getNtchange() != null) mutSequence.replace(mutationStart, mutationEnd, mutationUploadVO.getMutation().getNtchange()); mutationUploadVO.getMutation().setLength(mutationUploadVO.getMutation().getNtchange().length()); } else if (mutationUploadVO.getMutation().getEvent().equals("insertion/deletion")) { // deletion int mutationEnd = mutationStart + mutationUploadVO.getMutation().getLength(); // this.mutationVO.setNt(nuclSequence.substring(mutationStart, // mutationEnd).toUpperCase()); this.assignNt(mutationUploadVO, nuclSequence, mutationStart); // logger.debug(">>> nt==" + mutationUploadVO.getNt()); mutSequence.delete(mutationStart, mutationEnd); // insertion mutationStart++; // insert *after* position mutSequence.insert(mutationStart, mutationUploadVO.getMutation().getNtchange()); } logger.debug(">>> assignValuesFromPosition: mutation==" + mutationUploadVO.getMutation().toString()); this.assignCdna_notation(mutationUploadVO); this.assignGdna_notation(mutationUploadVO); // Calculations for transcribed part if (exon.getIsIntron()) { mutationUploadVO.setCodon(""); mutationUploadVO.setAa(""); mutationUploadVO.setAachange(""); mutationUploadVO.getMutation().setCodonchange(""); mutationUploadVO.getMutation().setAa_Position(0); mutationUploadVO.getMutation().setAa_Notation(""); } else { // splice the sequences String splNuclSeq = SequenceUtils.splice(nuclSequence); String splMutSeq = SequenceUtils.splice(mutSequence.toString()); int mutTripletPos = SequenceUtils.getFirstTripletChange(splNuclSeq, splMutSeq); int changeCodonPos = StringUtils.indexOfDifference(splNuclSeq, splMutSeq) + 1; int changeCodonNum = SequenceUtils.getCodonNum(changeCodonPos); // new // Double(Math.ceil(changePos // / // 3.0)).intValue(); // translate the sequences String trlNuclSeq = SequenceUtils.translate(splNuclSeq); String trlMutSeq = SequenceUtils.translate(splMutSeq); int trlTripletPos = SequenceUtils.getFirstTripletChange(trlNuclSeq, trlMutSeq); int changeAaPos = StringUtils.indexOfDifference(trlNuclSeq, trlMutSeq) + 1; int changeAaNum = SequenceUtils.getCodonNum(changeAaPos); // new // Double(Math.ceil(changePos // / // 3.0)).intValue(); // calculate position of first changed amino acid // int changePos = StringUtils.indexOfDifference(trlNuclSeq, // trlMutSeq) + 1; // calculate position of first changed codon mutationUploadVO.setCodon(SequenceUtils.getCodonByPosition(splNuclSeq, mutTripletPos)); // StringUtils.substring(splNuclSeq, // mutTripletPos, // mutTripletPos // + // 3)); mutationUploadVO.getMutation().setCodonchange(SequenceUtils.getCodonByPosition(splMutSeq, mutTripletPos)); // StringUtils.substring(splMutSeq, // mutTripletPos, // mutTripletPos // + // 3)); mutationUploadVO.setAa(SequenceUtils.getCodonByPosition(trlNuclSeq, trlTripletPos)); // StringUtils.substring(trlNuclSeq, // trlTripletPos, // trlTripletPos // + // 3)); mutationUploadVO.setAachange(SequenceUtils.getCodonByPosition(trlMutSeq, trlTripletPos)); // StringUtils.substring(trlMutSeq, // trlTripletPos, // trlTripletPos // + // 3)); mutationUploadVO.getMutation().setAa_Position(changeCodonNum); this.assignAa_notation(mutationUploadVO, trlMutSeq, changeAaNum); } this.assignType(mutationUploadVO); this.assignConsequence(mutationUploadVO); // logger.debug(">>> assignValuesFromPosition: mutation==" + // mutationUploadVO.getMutation().toString()); // logger.debug(">>> end of assignValues: nt==" + // mutationUploadVO.getNt()); } public void setDefaults(MutationUploadVO mutationUploadVO) throws DatabaseException { // set default gene MutationGene gene = this.db.query(MutationGene.class) .equals(MutationGene.NAME, mutationUploadVO.getGeneSymbol()).find().get(0); mutationUploadVO.setGeneBpStart(gene.getBpStart().intValue()); mutationUploadVO.setGeneOrientation(gene.getOrientation()); mutationUploadVO.setGeneSeq(gene.getSeq()); mutationUploadVO.setGeneSymbol(gene.getSymbol()); mutationUploadVO.getMutation().setGene(gene); mutationUploadVO.getMutation().setEvent("NA"); } public int getNumMutations() throws DatabaseException { return this.db.count(Mutation.class); } public int getNumMutationsByPathogenicity(String pathogenicity) throws DatabaseException { return this.db.query(Mutation.class).equals(Mutation.PATHOGENICITY, pathogenicity).count(); } private void assignNt(MutationUploadVO mutationUploadVO, String nuclSequence, int mutationStart) { // System.out.println(">>> assignNt: mutationStart==" + mutationStart); // System.out.println(">>> assignNt: start: mutation==" + // this.getMutation()); Integer length = mutationUploadVO.getMutation().getLength(); // System.out.println(">>> assignNt: length==" + length); if (length == null) length = 1; // System.out.println(">>> assignNt: vor setNt, seqlen==" + // nuclSequence.length() + ", seq==" + nuclSequence); mutationUploadVO.setNt(nuclSequence.substring(mutationStart, mutationStart + length).toUpperCase()); // System.out.println(">>> assignNt: nach setNt"); } private void assignConsequence(MutationUploadVO mutationUploadVO) { // default: missense, no effect on splicing mutationUploadVO.getMutation().setConsequence("Missense codon"); mutationUploadVO.getMutation().setEffectOnSplicing(false); if (mutationUploadVO.getExonIsIntron()) { mutationUploadVO.getMutation().setConsequence("Altered splicing -> premature termination codon"); mutationUploadVO.getMutation().setEffectOnSplicing(true); } else if (mutationUploadVO.getMutation().getAa_Notation().indexOf("fsX") > -1 || mutationUploadVO.getMutation().getAa_Notation().indexOf("Ter") > -1) mutationUploadVO.getMutation() .setConsequence("Premature termination codon"); else if (mutationUploadVO.getMutation().getAa_Position() != null && mutationUploadVO.getMutation().getAa_Position() == 1) mutationUploadVO.getMutation().setConsequence( "No initiation of transcription/translation"); } private void assignType(MutationUploadVO mutationUploadVO) { if (mutationUploadVO.getExonIsIntron()) mutationUploadVO.getMutation().setType("splice-site mutation"); else if (mutationUploadVO.getMutation().getEvent().equals("deletion")) if (mutationUploadVO.getMutation() .getLength() <= 20) if (mutationUploadVO.getMutation().getAa_Notation().indexOf("fsX") > -1) mutationUploadVO .getMutation().setType("small deletion frame-shift"); else mutationUploadVO.getMutation().setType("small deletion in-frame"); else if (mutationUploadVO.getMutation().getAa_Notation().indexOf("fsX") > -1) mutationUploadVO.getMutation() .setType("large deletion frame-shift"); else mutationUploadVO.getMutation().setType("large deletion in-frame"); else if (mutationUploadVO.getMutation().getEvent().equals("duplication")) if (mutationUploadVO.getMutation() .getLength() <= 20) if (mutationUploadVO.getMutation().getAa_Notation().indexOf("fsX") > -1) mutationUploadVO .getMutation().setType("small duplication frame-shift"); else mutationUploadVO.getMutation().setType("small duplication in-frame"); else if (mutationUploadVO.getMutation().getAa_Notation().indexOf("fsX") > -1) mutationUploadVO.getMutation() .setType("large duplication frame-shift"); else mutationUploadVO.getMutation().setType("large duplication in-frame"); else if (mutationUploadVO.getMutation().getEvent().equals("insertion")) if (mutationUploadVO.getMutation() .getLength() <= 20) if (mutationUploadVO.getMutation().getAa_Notation().indexOf("fsX") > -1) mutationUploadVO .getMutation().setType("small insertion frame-shift"); else mutationUploadVO.getMutation().setType("small insertion in-frame"); else if (mutationUploadVO.getMutation().getAa_Notation().indexOf("fsX") > -1) mutationUploadVO.getMutation() .setType("large insertion frame-shift"); else mutationUploadVO.getMutation().setType("large insertion in-frame"); else if (mutationUploadVO.getMutation().getAa_Notation().indexOf("fsX") > -1 || mutationUploadVO.getMutation().getAa_Notation().indexOf("Ter") > -1) mutationUploadVO.getMutation() .setType("nonsense mutation"); else mutationUploadVO.getMutation().setType("missense mutation"); } private String getNotation(MutationUploadVO mutationUploadVO, String position) throws RESyntaxException { if (mutationUploadVO.getMutation().getLength() == null) return ""; String notation = position; if (mutationUploadVO.getMutation().getEvent().equals("insertion")) notation += "_" + SequenceUtils.getAddedPosition(position, 1); else if (mutationUploadVO.getMutation().getLength() > 1) notation += "_" + SequenceUtils.getAddedPosition(position, mutationUploadVO.getMutation().getLength() - 1); if (mutationUploadVO.getMutation().getEvent().equals("deletion")) { notation += "del"; if (mutationUploadVO.getMutation().getLength() <= 2) notation += mutationUploadVO.getNt(); } else if (mutationUploadVO.getMutation().getEvent().equals("duplication")) { notation += "dup"; if (mutationUploadVO.getMutation().getLength() <= 2) notation += mutationUploadVO.getNt(); } else if (mutationUploadVO.getMutation().getEvent().equals("insertion")) notation += "ins" + mutationUploadVO.getMutation().getNtchange(); else if (mutationUploadVO.getMutation().getEvent().equals("point mutation")) notation += mutationUploadVO .getNt() + ">" + mutationUploadVO.getMutation().getNtchange(); else if (mutationUploadVO.getMutation().getEvent().equals("insertion/deletion")) { // deletion notation += "del"; if (mutationUploadVO.getMutation().getLength() <= 2) notation += mutationUploadVO.getNt(); // insertion notation += "ins" + mutationUploadVO.getMutation().getNtchange(); } return notation; } private void assignGdna_notation(MutationUploadVO mutationUploadVO) throws RESyntaxException { if (mutationUploadVO.getMutation().getLength() != null) mutationUploadVO.getMutation() .setGdna_Notation( "g." + this.getNotation(mutationUploadVO, mutationUploadVO.getMutation().getGdna_Position() .toString())); else mutationUploadVO.getMutation().setGdna_Notation(""); } private void assignCdna_notation(MutationUploadVO mutationUploadVO) throws RESyntaxException { if (mutationUploadVO.getMutation().getLength() != null) mutationUploadVO.getMutation().setCdna_Notation( "c." + this.getNotation(mutationUploadVO, mutationUploadVO.getMutation().getMutationPosition())); else mutationUploadVO.getMutation().setCdna_Notation(""); } private void assignAa_notation(MutationUploadVO mutationUploadVO, String trlMutSeq, int codonNum) { if (codonNum == 1) mutationUploadVO.getMutation().setAa_Notation("p.0"); else if (codonNum > 1) { mutationUploadVO.getMutation().setAa_Notation( "p." + mutationUploadVO.getAa() + codonNum + mutationUploadVO.getAachange()); if (mutationUploadVO.getMutation().getLength() % 3 != 0 && !mutationUploadVO.getMutation().getEvent().equals("point mutation")) { mutationUploadVO.getMutation().setAa_Notation(mutationUploadVO.getMutation().getAa_Notation() + "fs"); int terPos = SequenceUtils.indexOfCodon(trlMutSeq, "Ter", codonNum); if (terPos > -1) mutationUploadVO.getMutation().setAa_Notation( mutationUploadVO.getMutation().getAa_Notation() + "X" + (terPos - codonNum + 1)); // + // " DEBUG: " // + // terPos // + // "-" // + // codonNum // + // ", "+ // trlMutSeq); // //StringUtils.substring(trlMutSeq, // (codonNum // - // 1) // * // 3)); } } else mutationUploadVO.getMutation().setAa_Notation(""); } }