package org.nextprot.api.blast.service.impl; import org.nextprot.api.blast.dao.BlastDAO; import org.nextprot.api.blast.domain.*; import org.nextprot.api.blast.domain.gen.Description; import org.nextprot.api.blast.domain.gen.Report; import org.nextprot.api.blast.service.*; import org.nextprot.api.commons.utils.ExceptionWithReason; import org.nextprot.api.core.domain.Isoform; import org.nextprot.api.core.service.EntryBuilderService; import org.nextprot.api.core.service.fluent.EntryConfig; import org.nextprot.api.core.utils.IsoformUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class BlastServiceImpl implements BlastService { @Autowired private EntryBuilderService entryBuilderService; @Autowired private BlastDAO blastDAO; @Autowired private BlastResultUpdaterService blastResultUpdaterService; @Override public BlastProgramOutput blastProteinSequence(BlastSequenceInput params) { try { BlastPRunner.FastaEntry fastaEntry = new BlastPRunner.FastaEntry(params.getTitle(), params.getSequence()); Report result = new BlastPRunner(params).run(fastaEntry); blastResultUpdaterService.update(result, fastaEntry.getSequence()); return new BlastProgramSuccess(params, result); } catch (ExceptionWithReason exceptionWithReason) { return new BlastProgramFailure(params, exceptionWithReason); } } @Override public BlastProgramOutput blastIsoformSequence(BlastIsoformInput params) { String isoformAccession = params.getIsoformAccession(); String entryAccession = isoformAccession.split("-")[0]; try { Isoform isoform = getIsoform(isoformAccession, entryAccession); params.setSequence(isoform.getSequence()); params.validateSequencePositions(); params.setSequence(params.getSequence().substring(params.getBeginPos()-1, params.getEndPos())); params.setTitle(buildTitle(params, isoform, entryAccession)); params.setEntryAccession(entryAccession); Description queryDescription = new Description(); blastResultUpdaterService.updateDescription(queryDescription, isoformAccession, entryAccession); params.setDescription(queryDescription); return blastProteinSequence(params); } catch (ExceptionWithReason exceptionWithReason) { return new BlastProgramFailure(params, exceptionWithReason); } } @Override public BlastProgramOutput makeNextprotBlastDb(BlastProgram.Params params) { BlastDbMaker runner = new BlastDbMaker(params); try { String result = runner.run(blastDAO.getAllIsoformSequences()); return new BlastProgramSuccess(params, result); } catch (ExceptionWithReason exceptionWithReason) { return new BlastProgramFailure(params, exceptionWithReason); } } private Isoform getIsoform(String isoformAccession, String entryAccession) throws ExceptionWithReason { Isoform isoform = IsoformUtils.getIsoformByName(entryBuilderService.build(EntryConfig.newConfig(entryAccession).withTargetIsoforms()), isoformAccession); if (isoform == null) { throw ExceptionWithReason.withReason("unknown isoform", isoformAccession+": could not find isoform from entry "+entryAccession); } return isoform; } private String buildTitle(BlastIsoformInput config, Isoform isoform, String entryAccession) { StringBuilder title = new StringBuilder(); if (config.calcQuerySeqLength() < isoform.getSequenceLength()) { title.append("Selection of ").append(config.getQuerySeqBegin()).append("-").append(config.getQuerySeqEnd()).append(" "); } title.append("from protein ").append(entryAccession).append(", isoform ").append(isoform.getMainEntityName().getName()); return title.toString(); } }