package org.bioxsd.workflows; import java.io.FileNotFoundException; import java.io.PrintStream; import java.rmi.RemoteException; import org.apache.axis2.AxisFault; import org.apache.xmlbeans.XmlException; import org.bioxsd.bioxsd_0_4.AnnotatedSequence; import org.bioxsd.bioxsd_0_4.AminoacidSequenceRecord; import org.bioxsd.bioxsd_0_4.GeneralAminoacidSequenceRecord; import org.bioxsd.bioxsd_0_4.BiosequenceRecord; import org.bioxsd.bioxsd_0_4.SequenceReference; import fr.ibcp.gbio.clustalw.CancelClustalwDocument; import fr.ibcp.gbio.clustalw.CheckStatusClustalwDocument; import fr.ibcp.gbio.clustalw.ClustalWStub; import fr.ibcp.gbio.clustalw.GetResultsClustalwDocument; import fr.ibcp.gbio.clustalw.GetResultsClustalwResponseDocument; import fr.ibcp.gbio.clustalw.SubmitClustalwDocument; import fr.ibcp.gbio.goriv.CancelGorIVDocument; import fr.ibcp.gbio.goriv.CheckStatusGorIVDocument; import fr.ibcp.gbio.goriv.GetResultsGorIVDocument; import fr.ibcp.gbio.goriv.GorIVStub; import fr.ibcp.gbio.goriv.SubmitGorIVDocument; import no.uni.bccs.esysbio.schema.blastparameterschema.MatrixType; import no.uni.bccs.www.service.blast.BlastServiceStub; import no.uni.bccs.www.service.blast.BlastJobServiceStub; import no.uni.bccs.www.service.blast.BlastDbServiceStub; import no.uni.bccs.www.service.blast.GetResultDocument; import no.uni.bccs.www.service.blast.GetResultFaultException0; import no.uni.bccs.www.service.blast.GetResultResponseDocument; import no.uni.bccs.www.service.blast.GetSequencesDocument; import no.uni.bccs.www.service.blast.GetSequencesFaultException0; import no.uni.bccs.www.service.blast.GetStatusDocument; import no.uni.bccs.www.service.blast.GetStatusFaultException2; import no.uni.bccs.www.service.blast.RunBlastpDocument; import no.uni.bccs.www.service.blast.RunBlastpFaultException3; import dk.dtu.cbs.www.ws.ws_common.Jobstatus.Enum; import dk.dtu.cbs.www.ws.ws_common.PollQueue.Job; import dk.dtu.cbs.www.ws.wsmaxalign_1_1_ws1.MaxalignDocument; import dk.dtu.cbs.www.ws.wsmaxalign_1_1_ws1.MaxalignResponseDocument; import dk.dtu.cbs.www.ws.wsmaxalign_1_1_ws1.WSMaxAlign_1_1_ws1Stub; import dk.dtu.cbs.www.ws.wsprop_1_0_ws0.WSProP_1_0_ws0Stub; import dk.dtu.cbs.www.ws.wsnetnes_1_1_ws0.WSNetNES_1_1_ws0Stub; public class WorkflowNr1 { public class ResultException extends Exception { private static final long serialVersionUID = -5651350712038788788L; public String service, detail; public ResultException(String service, String detail) { this.service = service; this.detail = detail; } }//ResultException public class JobException extends Exception { private static final long serialVersionUID = 6981789948985964011L; }//JobException public static void main(String[] args) { PrintStream out = null; try { // Read input sequence record & output target String in = "MSSSGTPDLPVLLTDLKIQYTKIFINNEWHDSVSGKKFPVFNPATEEELCQVEEGDKEDVDKAVKAARQAFQIGSPWRTMDASERGRLLYKLADLIERDRLLLATMESMNGGKLYSNAYLNDLAGCIKTLRYCAGWADKIQGRTIPIDGNFFTYTRHEPIGVCGQIIPWNFPLVMLIWKIGPALSCGNTVVVKPAEQTPLTALHVASLIKEAGFPPGVVNIVPGYGPTAGAAISSHMDIDKVAFTGSTEVGKLIKEAAGKSNLKRVTLELGGKSPCIVLADADLDNAVEFAHHGVFYHQGQCCIAASRIFVEESIYDEFVRRSVERAKKYILGNPLTPGVTQGPQIDKEQYDKILDLIESGKKEGAKLECGGGPWGNKGYFVQPTVFSNVTDEMRIAKEEIFGPVQQIMKFKSLDDVIKRANNTFYGLSAGVFTKDIDKAITISSALQAGTVWXP_001143065"; AminoacidSequenceRecord mySeq = AminoacidSequenceRecord.Factory.parse(args.length == 0 ? in : args[0]); String outName = args.length < 2 ? "out" + /*System.currentTimeMillis() +*/ ".xml" : args[1]; System.out.println("Input sequence record:\n" + mySeq + "\n\nOutput file: " + outName + "\n\nWorkflow started"); out = new PrintStream(outName); out.println("\n\n" + mySeq + "\n\n\n\n\n"); // Submit CBU BLAST and get result BlastServiceStub blast1a = new BlastServiceStub(); blast1a._getServiceClient().getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.HTTP_PROTOCOL_VERSION, org.apache.axis2.transport.http.HTTPConstants.HEADER_PROTOCOL_10); RunBlastpDocument blast1In = RunBlastpDocument.Factory.newInstance(); blast1In.addNewRunBlastp().addNewQuerySequence(); blast1In.getRunBlastp().setQuerySequenceArray(0, mySeq); blast1In.getRunBlastp().setDatabaseURI("Swiss-Prot"); blast1In.getRunBlastp().setAlignmentNumber(5); blast1In.getRunBlastp().setExpectValue(10); blast1In.getRunBlastp().setWordSize(0); blast1In.getRunBlastp().setMatrix(MatrixType.Factory.newInstance().BLOSUM_62); blast1In.getRunBlastp().setGapOpenPenalty(-1); blast1In.getRunBlastp().setGapExtensionPenalty(-1); String jobId = blast1a.RunBlastp(blast1In).getRunBlastpResponse().getJobId(); System.out.println("\nBLAST submitted. Job id: " + jobId); BlastJobServiceStub blast1b = new BlastJobServiceStub(); GetStatusDocument blast1Job = GetStatusDocument.Factory.newInstance(); blast1Job.addNewGetStatus().setJobId(jobId); long t0 = System.currentTimeMillis(), t1, t = t0, wait = 2000, limit = 120000; String status; while (!(status = blast1b.GetStatus(blast1Job).getGetStatusResponse().getStatus()).equalsIgnoreCase("COMPLETE")) { System.out.println("BLAST status: " + status); if (t - t0 > limit) { System.out.println("WARNING: BLAST@CBU JOB IS TAKING TOO LONG [Status = \"" + status + "\"] ABORTED"); throw (new WorkflowNr1()).new JobException(); }//fi if (status.equalsIgnoreCase("INQUEUE") || status.equalsIgnoreCase("INPROGRESS")) { t1 = System.currentTimeMillis(); while (t - t1 < wait) t = System.currentTimeMillis(); } else // Abort in other cases { System.out.println("WARNING: BLAST@CBU JOB ABORTED [Status = \"" + status + "\"]"); throw (new WorkflowNr1()).new JobException(); }//fi(else) }//while System.out.println("BLAST finished. Status: " + status); GetResultDocument blast1JobRes = GetResultDocument.Factory.newInstance(); blast1JobRes.addNewGetResult().setJobId(jobId); GetResultResponseDocument blast1Out = blast1b.GetResult(blast1JobRes); if (blast1Out.getGetResultResponse().getBlastOutput().getBlastOutputIterations().getIterationArray().length == 0) throw (new WorkflowNr1()).new ResultException("BLAST@CBU", "NO ITERATIONS"); int n = blast1Out.getGetResultResponse().getBlastOutput().getBlastOutputIterations().getIterationArray(0).getIterationHits().sizeOfHitArray(); if (n == 0) throw (new WorkflowNr1()).new ResultException("BLAST@CBU", "NO HITS"); String[] ids = new String[n]; for (int i = 0; i < n; i++) ids[i] = blast1Out.getGetResultResponse().getBlastOutput().getBlastOutputIterations().getIterationArray(0).getIterationHits().getHitArray(i).getHitId(); BlastDbServiceStub blast1c = new BlastDbServiceStub(); GetSequencesDocument idsIn = GetSequencesDocument.Factory.newInstance(); idsIn.addNewGetSequences().setSequenceIdentifierArray(ids); idsIn.getGetSequences().setDatabaseURI("Swiss-Prot"); BiosequenceRecord[] similarSeqs = blast1c.GetSequences(idsIn).getGetSequencesResponse().getSequenceArray(); // Submit ClustalW and get result ClustalWStub clustalw = new ClustalWStub(); SubmitClustalwDocument clustalwIn = SubmitClustalwDocument.Factory.newInstance(); clustalwIn.addNewSubmitClustalw().addNewSequenceRecord(); clustalwIn.getSubmitClustalw().setSequenceRecordArray(0, mySeq); if (!clustalwIn.getSubmitClustalw().getSequenceRecordArray(0).isSetCustomName()) clustalwIn.getSubmitClustalw().getSequenceRecordArray(0).setCustomName("My sequence"); for (int i = 0; (i < n); i++) { clustalwIn.getSubmitClustalw().addNewSequenceRecord(); clustalwIn.getSubmitClustalw().setSequenceRecordArray(i + 1, similarSeqs[i]); if (!clustalwIn.getSubmitClustalw().getSequenceRecordArray(i + 1).isSetCustomName()) clustalwIn.getSubmitClustalw().getSequenceRecordArray(i + 1).setCustomName("Similar sequence " + (i + 1)); }//for jobId = clustalw.submitClustalw(clustalwIn).getSubmitClustalwResponse().getJobId(); System.out.println("\nClustalW submitted. Job id: " + jobId); CheckStatusClustalwDocument clustalwJob = CheckStatusClustalwDocument.Factory.newInstance(); clustalwJob.addNewCheckStatusClustalw().setJobId(jobId); t0 = System.currentTimeMillis(); wait = 3000; limit = 60000; while (!(status = clustalw.checkStatusClustalw(clustalwJob).getCheckStatusClustalwResponse().getStatus()).equalsIgnoreCase("done")) { System.out.println("ClustalW status: " + status); if (t - t0 > limit) { System.out.println("WARNING: ClustalW JOB IS TAKING TOO LONG [Status = \"" + status + "\"] ABORTED"); CancelClustalwDocument cancelJob = CancelClustalwDocument.Factory.newInstance(); cancelJob.addNewCancelClustalw().setJobId(jobId); clustalw.cancelClustalw(cancelJob); throw (new WorkflowNr1()).new JobException(); }//fi if (status.equalsIgnoreCase("running") || status.equalsIgnoreCase("waiting")) { t1 = System.currentTimeMillis(); while (t - t1 < wait) t = System.currentTimeMillis(); } else // Abort in other cases { System.out.println("WARNING: ClustalW JOB ABORTED [Status = \"" + status + "\"]"); throw (new WorkflowNr1()).new JobException(); }//fi(else) }//while System.out.println("ClustalW finished. Status: " + status); GetResultsClustalwDocument clustalwJobRes = GetResultsClustalwDocument.Factory.newInstance(); clustalwJobRes.addNewGetResultsClustalw().setJobId(jobId); GetResultsClustalwResponseDocument clustalwOut = clustalw.getResultsClustalw(clustalwJobRes); n = clustalwOut.getGetResultsClustalwResponse().getAlignment().sizeOfAlignedSequenceArray(); for (int i = 0; (i < n); i++) if (!clustalwOut.getGetResultsClustalwResponse().getAlignment().getAlignedSequenceArray(i).getSequenceRecord().isSetFormalReference() || !clustalwOut.getGetResultsClustalwResponse().getAlignment().getAlignedSequenceArray(i).getSequenceRecord().getFormalReference().isSetAccession()) { SequenceReference r; if (clustalwOut.getGetResultsClustalwResponse().getAlignment().getAlignedSequenceArray(i).getSequenceRecord().isSetFormalReference()) r = clustalwOut.getGetResultsClustalwResponse().getAlignment().getAlignedSequenceArray(i).getSequenceRecord().getFormalReference(); else r = SequenceReference.Factory.newInstance(); String nm = clustalwOut.getGetResultsClustalwResponse().getAlignment().getAlignedSequenceArray(i).getSequenceRecord().getCustomName(); String ac = ""; for (int j = 0; j < nm.length(); j++) ac = ac.concat(nm.charAt(j) == ' ' ? "" : nm.substring(j, j + 1)); r.setAccession(ac); clustalwOut.getGetResultsClustalwResponse().getAlignment().getAlignedSequenceArray(i).getSequenceRecord().setFormalReference(r); }//fi //for // Call MaxAlign and prepare inputs for feature predictions WSMaxAlign_1_1_ws1Stub maxalign = new WSMaxAlign_1_1_ws1Stub(); MaxalignDocument maxalignIn = MaxalignDocument.Factory.newInstance(); maxalignIn.addNewMaxalign().addNewParameters().addNewOriginalAlignment(); maxalignIn.getMaxalign().getParameters().setOriginalAlignment(clustalwOut.getGetResultsClustalwResponse().getAlignment()); MaxalignResponseDocument maxalignOut = maxalign.maxalign(maxalignIn); System.out.println("\nMaxAlign finished"); n = maxalignOut.getMaxalignResponse().getResultAlignment().sizeOfAlignedSequenceArray(); GeneralAminoacidSequenceRecord[] seq = new GeneralAminoacidSequenceRecord[n]; dk.dtu.cbs.www.ws.wsprop_1_0_ws0.RunServiceDocument propIn = dk.dtu.cbs.www.ws.wsprop_1_0_ws0.RunServiceDocument.Factory.newInstance(); propIn.addNewRunService().addNewParameters(); dk.dtu.cbs.www.ws.wsnetnes_1_1_ws0.RunServiceDocument netnesIn = dk.dtu.cbs.www.ws.wsnetnes_1_1_ws0.RunServiceDocument.Factory.newInstance(); netnesIn.addNewRunService().addNewParameters(); for (int i = 0; i < n; i++) { seq[i] = GeneralAminoacidSequenceRecord.Factory.parse(maxalignOut.getMaxalignResponse().getResultAlignment().getAlignedSequenceArray(i).getSequenceRecord().toString()); propIn.getRunService().getParameters().addNewSequenceRecord(); propIn.getRunService().getParameters().setSequenceRecordArray(i, seq[i]); netnesIn.getRunService().getParameters().addNewSequenceRecord(); netnesIn.getRunService().getParameters().setSequenceRecordArray(i, seq[i]); }//for // Submit ProP WSProP_1_0_ws0Stub prop = new WSProP_1_0_ws0Stub(); String propJobId = prop.runService(propIn).getRunServiceResponse().getQueueentry().getJobid(); System.out.println("\nProP submitted. Job id: " + propJobId); // Submit NetNES WSNetNES_1_1_ws0Stub netnes = new WSNetNES_1_1_ws0Stub(); String netnesJobId = netnes.runService(netnesIn).getRunServiceResponse().getQueueentry().getJobid(); System.out.println("NetNES submitted. Job id: " + netnesJobId); // Submit GorIV GorIVStub gor4 = new GorIVStub(); String[] gorJobId = new String[n]; for (int i = 0; i < n; i++) { SubmitGorIVDocument gor4In = SubmitGorIVDocument.Factory.newInstance(); gor4In.setSubmitGorIV(seq[i]); gorJobId[i] = gor4.submitGorIV(gor4In).getSubmitGorIVResponse().getJobId(); System.out.println("GorIV(" + i + ") submitted. Job id: " + gorJobId[i]); t0 = System.currentTimeMillis(); wait = 1000; while (t - t0 < wait) t = System.currentTimeMillis(); }//for // Get results ProP dk.dtu.cbs.www.ws.wsprop_1_0_ws0.PollQueueDocument propJob = dk.dtu.cbs.www.ws.wsprop_1_0_ws0.PollQueueDocument.Factory.newInstance(); Job insideJob = Job.Factory.newInstance(); insideJob.setJobid(propJobId); propJob.addNewPollQueue().setJob(insideJob); t0 = System.currentTimeMillis(); wait = 1500; limit = 30000; Enum enumStatus; while (!(enumStatus = prop.pollQueue(propJob).getPollQueueResponse().getQueueentry().getStatus()).toString().equalsIgnoreCase("FINISHED")) { System.out.println("ProP status: " + enumStatus); if (t - t0 > limit) { System.out.println("WARNING: ProP JOB IS TAKING TOO LONG [Status = \"" + enumStatus + "\"] ABORTED"); throw (new WorkflowNr1()).new JobException(); }//fi if (enumStatus.toString().equalsIgnoreCase("QUEUED") || enumStatus.toString().equalsIgnoreCase("PENDING") || enumStatus.toString().equalsIgnoreCase("ACTIVE") || enumStatus.toString().equalsIgnoreCase("WAITING")) { t1 = System.currentTimeMillis(); while (t - t1 < wait) t = System.currentTimeMillis(); } else // Abort in other cases: "UNKNOWN JOBID", "REJECTED", "QUEUE DOWN", "DATABASE DOWN", "FAILED" { System.out.println("WARNING: ProP JOB ABORTED [Status = \"" + enumStatus + "\"]"); throw (new WorkflowNr1()).new JobException(); }//fi(else) }//while System.out.println("ProP finished. Status: " + enumStatus); dk.dtu.cbs.www.ws.wsprop_1_0_ws0.FetchResultDocument propJobRes = dk.dtu.cbs.www.ws.wsprop_1_0_ws0.FetchResultDocument.Factory.newInstance(); propJobRes.addNewFetchResult().addNewJob().setJobid(propJobId); AnnotatedSequence[] propResult = prop.fetchResult(propJobRes).getFetchResultResponse().getAnnotatedSequenceArray(); // Get results NetNES dk.dtu.cbs.www.ws.wsnetnes_1_1_ws0.PollQueueDocument netnesJob = dk.dtu.cbs.www.ws.wsnetnes_1_1_ws0.PollQueueDocument.Factory.newInstance(); insideJob.setJobid(netnesJobId); netnesJob.addNewPollQueue().setJob(insideJob); t0 = System.currentTimeMillis(); t = t0; wait = 1500; limit = 20000; while (!(enumStatus = netnes.pollQueue(netnesJob).getPollQueueResponse().getQueueentry().getStatus()).toString().equalsIgnoreCase("FINISHED")) { System.out.println("NetNES status: " + enumStatus); if (t - t0 > limit) { System.out.println("WARNING: NetNES JOB IS TAKING TOO LONG [Status = \"" + enumStatus + "\"] ABORTED"); throw (new WorkflowNr1()).new JobException(); }//fi if (enumStatus.toString().equalsIgnoreCase("QUEUED") || enumStatus.toString().equalsIgnoreCase("PENDING") || enumStatus.toString().equalsIgnoreCase("ACTIVE") || enumStatus.toString().equalsIgnoreCase("WAITING")) { t1 = System.currentTimeMillis(); while (t - t1 < wait) t = System.currentTimeMillis(); } else // Abort in other cases: "UNKNOWN JOBID", "REJECTED", "QUEUE DOWN", "DATABASE DOWN", "FAILED" { System.out.println("WARNING: NetNES JOB ABORTED [Status = \"" + enumStatus + "\"]"); throw (new WorkflowNr1()).new JobException(); }//fi(else) }//while System.out.println("NetNES finished. Status: " + enumStatus); dk.dtu.cbs.www.ws.wsnetnes_1_1_ws0.FetchResultDocument netnesJobRes = dk.dtu.cbs.www.ws.wsnetnes_1_1_ws0.FetchResultDocument.Factory.newInstance(); netnesJobRes.addNewFetchResult().addNewJob().setJobid(netnesJobId); AnnotatedSequence[] netnesResult = netnes.fetchResult(netnesJobRes).getFetchResultResponse().getAnnotatedSequenceArray(); // Get results GorIV and merge with other predictions AnnotatedSequence[] result = new AnnotatedSequence[n]; for (int i = 0; i < n; i++) { CheckStatusGorIVDocument gor4Job = CheckStatusGorIVDocument.Factory.newInstance(); gor4Job.addNewCheckStatusGorIV().setJobId(gorJobId[i]); t0 = System.currentTimeMillis(); wait = 2000; limit = 30000; while (!(status = gor4.checkStatusGorIV(gor4Job).getCheckStatusGorIVResponse().getStatus()).equalsIgnoreCase("done")) { System.out.println("GorIV(" + i + ") status: " + status); if (t - t0 > limit) { System.out.println("WARNING: GorIV(" + i + ") JOB IS TAKING TOO LONG [Status = \"" + status + "\"] ABORTED"); CancelGorIVDocument cancelJob = CancelGorIVDocument.Factory.newInstance(); cancelJob.addNewCancelGorIV().setJobId(gorJobId[i]); gor4.cancelGorIV(cancelJob); throw (new WorkflowNr1()).new JobException(); }//fi if (status.equalsIgnoreCase("running") || status.equalsIgnoreCase("waiting")) { t1 = System.currentTimeMillis(); while (t - t1 < wait) t = System.currentTimeMillis(); } else // Abort in other cases { System.out.println("WARNING: GorIV(" + i + ") JOB ABORTED [Status = \"" + status + "\"]"); throw (new WorkflowNr1()).new JobException(); }//fi(else) }//while System.out.println("GorIV(" + i + ") finished. Status: " + status); GetResultsGorIVDocument gor4JobRes = GetResultsGorIVDocument.Factory.newInstance(); gor4JobRes.addNewGetResultsGorIV().setJobId(gorJobId[i]); AnnotatedSequence goriResult = gor4.getResultsGorIV(gor4JobRes).getGetResultsGorIVResponse().getSecondaryStructure(); int propiAnnsM = propResult[i].sizeOfAnnotationArray(); int nesiAnnsM = netnesResult[i].sizeOfAnnotationArray(); int goriAnnsM = goriResult.sizeOfAnnotationArray(); result[i] = propResult[i]; for (int j = 0; j < nesiAnnsM; j++) { result[i].addNewAnnotation(); result[i].setAnnotationArray(j + propiAnnsM, netnesResult[i].getAnnotationArray(j)); }//for for (int j = 0; j < goriAnnsM; j++) { result[i].addNewAnnotation(); result[i].setAnnotationArray(j + propiAnnsM + nesiAnnsM, goriResult.getAnnotationArray(j)); }//for int j = -1; if (propResult[i].sizeOfMethodArray() > 0) { result[i].addNewMethod(); j++; result[i].setMethodArray(j, propResult[i].getMethodArray(0)); }//fi if (netnesResult[i].sizeOfMethodArray() > 0) { result[i].addNewMethod(); j++; result[i].setMethodArray(j, netnesResult[i].getMethodArray(0)); }//fi if (goriResult.sizeOfMethodArray() > 0) { result[i].addNewMethod(); j++; result[i].setMethodArray(j, goriResult.getMethodArray(0)); }//fi out.println("\n\n" + result[i] + "\n\n"); }//for out.println("\n\n" + maxalignOut + "\n\n"); System.out.println("\nWorkflow completed. Output in \"" + outName + "\""); }//try catch (FileNotFoundException e) { System.out.println("-=Workflow1: FileNotFoundException=-"); e.printStackTrace(); } catch (XmlException e) { System.out.println("-=Workflow1: XMLException=-"); e.printStackTrace(); }//catch catch (AxisFault e) { System.out.println("-=Workflow1: AxisFault=-"); e.printStackTrace(); }//catch catch (RemoteException e) { System.out.println("-=Workflow1: RemoteException=-"); e.printStackTrace(); }//catch catch (JobException e) { System.out.println("-=Workflow1: JobException=-"); }//catch catch (ResultException e) { System.out.println(e.service + ": EMPTY OR INVALID RESULT [" + e.detail + "]\n"); }//catch catch (RunBlastpFaultException3 e) { System.out.println("-=BLAST@CBU: RunBlastp Fault=-"); e.printStackTrace(); }//catch catch (GetStatusFaultException2 e) { System.out.println("-=BLAST@CBU: GetStatus Fault=-"); e.printStackTrace(); }//catch catch (GetResultFaultException0 e) { System.out.println("-=BLAST@CBU: GetResult Fault=-"); e.printStackTrace(); }//catch catch (GetSequencesFaultException0 e) { System.out.println("-=BLAST@CBU: GetSequences Fault=-"); e.printStackTrace(); }//catch if (out != null) out.close(); }//main }//Workflow1