예제 #1
0
        /// <summary>
        /// Get the blast service request object with all the request parameter set
        /// </summary>
        /// <param name="sequence">Input sequece</param>
        /// <param name="parameters">Blast parameters</param>
        /// <returns>Blast service request object</returns>
        private static BlastSerivceRequest GetRequestParameter(
            ISequence sequence,
            BlastParameters parameters)
        {
            BlastSerivceRequest blastParameter = new BlastSerivceRequest();

            // Sets the format of output expected from Azure Blast service
            blastParameter.OptionM = OPTIONMVALUE;

            // Sets the name of Job owner
            blastParameter.Owner          = Resources.OWNERVALUE;
            blastParameter.ParitionNumber = PARTITIONVALUE;

            // Convert string to byte
            ISequenceFormatter formatter     = new FastaFormatter();
            string             inputContent  = formatter.FormatString(sequence);
            ASCIIEncoding      asciiEncoding = new ASCIIEncoding();

            blastParameter.InputContent = asciiEncoding.GetBytes(inputContent);

            // Other parameters
            // Set the Title of Job
            blastParameter.Title = sequence.ID;

            // Name of the database to be searched in
            blastParameter.DatabaseName = parameters.Settings[PARAMETERDATABASE];

            // Type of search program to be executed
            blastParameter.ProgramName = parameters.Settings[PARAMETERPROGRAM];

            return(blastParameter);
        }
예제 #2
0
        /// <summary>
        /// Gets the search results for the pertinent request identifier.
        /// Implementation should have dedicated parsers to format the received results into MBF
        /// </summary>
        /// <remarks>An exception is thrown if the request does not succeed.</remarks>
        /// <param name="requestIdentifier">Identifier for the request of interest.</param>
        /// <param name="parameters">Blast input parameters</param>
        /// <returns>The search results</returns>
        public string GetResult(
            string requestIdentifier,
            BlastParameters parameters)
        {
            WSFile[] resultTypes = _blastClient.getResults(requestIdentifier);

            if (resultTypes == null)
            {
                throw new Exception(Resources.EBIWURESULTTYPEFAILED);
            }

            string response = string.Empty;

            foreach (WSFile resultType in resultTypes)
            {
                if (resultType.type == "appxmlfile")
                {
                    byte[]        content = _blastClient.poll(requestIdentifier, resultType.type);
                    ASCIIEncoding enc     = new ASCIIEncoding();
                    response = enc.GetString(content);
                }
            }

            if (string.IsNullOrEmpty(response))
            {
                throw new Exception(
                          String.Format(CultureInfo.InvariantCulture,
                                        Resources.EMPTYRESPONSE,
                                        requestIdentifier));
            }

            // we have XML results, parse them
            return(response);
        }
예제 #3
0
        /// <summary>
        /// Gets the search results for the pertinent request identifier.
        /// Implementation should have dedicated parsers to format the received results into MBF
        /// </summary>
        /// <remarks>An exception is thrown if the request does not succeed.</remarks>
        /// <param name="requestIdentifier">Identifier for the request of interest.</param>
        /// <param name="parameters">Blast input parameters</param>
        /// <returns>The search results</returns>
        public string GetResult(
            string requestIdentifier,
            BlastParameters parameters)
        {
            string resultUri = _blastClient.GetJobResult(new Guid(requestIdentifier));

            WebAccessor         accessor            = new WebAccessor();
            WebAccessorResponse webAccessorResponse = null;

            if (Configuration.UseBrowserProxy)
            {
                accessor.GetBrowserProxy();
            }

            webAccessorResponse = accessor.SubmitHttpRequest(
                new Uri(resultUri),
                false,          // POST request
                new Dictionary <string, string>());
            if (!webAccessorResponse.IsSuccessful)
            {
                // failure
                accessor.Close();
                return(null);
            }

            accessor.Close();
            return(webAccessorResponse.ResponseString);
        }
예제 #4
0
        /// <summary>
        /// Fetch the search results synchronously for the pertinent request identifier.
        /// This is a synchronous method and will not return until the results are
        /// available.
        /// Implementation should have dedicated parsers to format the received results into
        /// MBF
        /// </summary>
        /// <remarks>
        /// An exception is thrown if the request does not succeed.
        /// </remarks>
        /// <param name="requestIdentifier">Identifier for the request of interest</param>
        /// <param name="parameters">Blast input parameters</param>
        /// <returns>The search results</returns>
        public IList <BlastResult> FetchResultsSync(
            string requestIdentifier,
            BlastParameters parameters)
        {
            IList <BlastResult> result = null;

            ServiceRequestInformation requestInfo = new ServiceRequestInformation();

            requestInfo.Status = ServiceRequestStatus.Queued;
            int retryCount = 0;

            do
            {
                requestInfo = GetRequestStatus(requestIdentifier);

                if (requestInfo.Status == ServiceRequestStatus.Ready ||
                    requestInfo.Status == ServiceRequestStatus.Error)
                {
                    break;
                }

                retryCount++;
                Thread.Sleep(RetryInterval * retryCount);
            }while (retryCount < RetryCount);

            string message;

            if (requestInfo.Status == ServiceRequestStatus.Ready)
            {
                string output = GetResult(
                    requestIdentifier,
                    parameters);

                result = Parser.Parse(new StringReader(output));
            }
            else if (requestInfo.Status == ServiceRequestStatus.Error)
            {
                message = String.Format(
                    Resources.BLASTREQUESTFAILED,
                    requestIdentifier,
                    requestInfo.Status,
                    requestInfo.StatusInformation);

                throw new Exception(message);
            }
            else
            {
                message = String.Format(
                    Resources.BLASTRETRIESEXCEEDED,
                    requestIdentifier,
                    requestInfo.Status,
                    requestInfo.StatusInformation);

                throw new Exception(message);
            }

            return(result);
        }
예제 #5
0
        /// <summary>
        /// Gets the search results for the pertinent request identifier.
        /// Implementation should have dedicated parsers to format the received results into MBF framework
        /// </summary>
        /// <remarks>An exception is thrown if the request does not succeed.</remarks>
        /// <param name="requestIdentifier">Identifier for the request of interest.</param>
        /// <param name="parameters">not needed - included only for compatibility with the interface</param>
        /// <returns>The search results</returns>
        public string GetResult(string requestIdentifier, BlastParameters parameters)
        {
            string  response   = string.Empty;
            JobInfo jobidcntrl = ConvertRequestId(requestIdentifier);

            response = _blastClient.GetOutputAsString(jobidcntrl.Jobid, jobidcntrl.Cntrl);

            return(response);
        }
예제 #6
0
 /// <summary>
 /// Initializes a new instance of the ThreadParameter class.
 /// </summary>
 /// <param name="requestIdentifier">Job identifier</param>
 /// <param name="sequence">Sequence Object</param>
 /// <param name="parameter">Blast Parameters</param>
 public ThreadParameter(
     string requestIdentifier,
     ISequence sequence,
     BlastParameters parameter)
 {
     _requestIdentifier = requestIdentifier;
     _sequence          = sequence;
     _parameter         = parameter;
 }
예제 #7
0
        /// <summary>
        /// Submit the search request with the user supplied configuration parameters
        /// and sequence. Implementation should make use of the MBF.IO formatters
        /// to convert the sequence into the web interface compliant sequence format.
        /// This method performs parameter validation and throw Exception on invalid input.
        /// </summary>
        /// <remarks>An exception is thrown if the request does not succeed.</remarks>
        /// <param name="sequence">The sequence to search with</param>
        /// <param name="parameters">Blast input parameters</param>
        /// <returns>Request Identifier</returns>
        public string SubmitRequest(ISequence sequence, BlastParameters parameters)
        {
            if (null == sequence)
            {
                throw new ArgumentNullException("sequence");
            }

            if (null == parameters)
            {
                throw new ArgumentNullException("parameters");
            }

            string requestIdentifier = string.Empty;

            // Validate the Parameter
            ParameterValidationResult valid = ValidateParameters(parameters);

            if (!valid.IsValid)
            {
                throw new Exception(valid.ValidationErrors);
            }

            // Submit the job to server
            inputParams blastRequest = GetRequestParameter(parameters);

            blastRequest.appxml = AppXmlYes;
            blastRequest.async  = true;

            data[] mydata = new data[1];
            mydata[0]         = new data();
            mydata[0].type    = SequenceType;
            mydata[0].content = sequence.ToString();

            requestIdentifier = _blastClient.runWUBlast(blastRequest, mydata);

            // Only if the event is registered, invoke the thread
            if (null != RequestCompleted)
            {
                ThreadParameter threadParameter = new ThreadParameter(
                    requestIdentifier,
                    sequence,
                    parameters);

                // Start the BackGroundThread to check the status of job
                _workerThread = new BackgroundWorker();
                _workerThread.WorkerSupportsCancellation = true;
                _workerThread.DoWork             += new DoWorkEventHandler(ProcessRequestThread);
                _workerThread.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompletedRequestThread);
                _workerThread.RunWorkerAsync(threadParameter);
            }

            return(requestIdentifier);
        }
예제 #8
0
        /// <summary>
        /// Check the currently set parameters for validity
        /// </summary>
        /// <param name="parameters">Blast input parameters</param>
        /// <returns>Validation result</returns>
        private static ParameterValidationResult ValidateParameters(BlastParameters parameters)
        {
            ParameterValidationResult result = new ParameterValidationResult();

            result.IsValid = true;

            // check required parameters:
            if (!parameters.Settings.ContainsKey(PARAMETERDATABASE))
            {
                result.IsValid           = false;
                result.ValidationErrors += Resources.PARAMETERDATABASEREQUIRED;
            }

            if (!parameters.Settings.ContainsKey(PARAMETERPROGRAM))
            {
                result.IsValid           = false;
                result.ValidationErrors += Resources.PARAMETERPROGRAMREQUIRED;
            }

            // check disallowed parameters:
            if (parameters.Settings.ContainsKey(PARAMETERFORMATTYPE))
            {
                result.IsValid           = false;
                result.ValidationErrors += Resources.PARAMETERFORMATTYPENOTALLOWED;
            }

            // Any other unknown parameters
            foreach (KeyValuePair <string, string> parameter in parameters.Settings)
            {
                switch (parameter.Key)
                {
                case PARAMETERDATABASE:
                case PARAMETERPROGRAM:
                case PARAMETERFORMATTYPE:
                    break;

                default:
                    result.IsValid           = false;
                    result.ValidationErrors += string.Format(CultureInfo.InvariantCulture,
                                                             Resources.PARAMETERUNKNOWNAZURE,
                                                             parameter.Key);
                    break;
                }
            }

            return(result);
        }
예제 #9
0
        /// <summary>
        /// Submit the search request with the user supplied configuration parameters
        /// and sequence. Implementation should make use of the MBF.IO formatters
        /// to convert the sequence into the web interface compliant sequence format.
        /// This method performs parameter validation and throw Exception on invalid input.
        /// </summary>
        /// <remarks>An exception is thrown if the request does not succeed.</remarks>
        /// <param name="sequence">The sequence to search with</param>
        /// <param name="parameters">Blast input parameters</param>
        /// <returns>Unique Search ID generated by MBF</returns>
        public string SubmitRequest(ISequence sequence, BlastParameters parameters)
        {
            if (null == sequence)
            {
                throw new ArgumentNullException("sequence");
            }

            if (null == parameters)
            {
                throw new ArgumentNullException("parameters");
            }

            List <ISequence> seqlist = new List <ISequence> {
                sequence
            };

            return(SubmitRequest(seqlist, parameters));
        }
예제 #10
0
        /// <summary>
        /// Get the blast service request object with all the request parameter set
        /// </summary>
        /// <param name="parameters">Blast parameters</param>
        /// <returns>Blast service request object</returns>
        private static inputParams GetRequestParameter(
            BlastParameters parameters)
        {
            inputParams blastParameter = new inputParams();

            // check required parameters:
            blastParameter.database = parameters.Settings[ParameterDatabase];

            // force program to uppercase, per EBI docs (though the service seems
            // to work fine regardless of the case of this parameter)
            blastParameter.program = parameters.Settings[ParameterProgram].ToUpperInvariant();

            // note: query is not part of the inputParams class, so the caller will
            // need to handle it separately.
            blastParameter.email = parameters.Settings[ParameterEmail];

            // apply any addition validation logic and set remaining supported parameters:
            // validate filters here, since QBLAST uses a different set:
            if (parameters.Settings.ContainsKey(ParameterFilter))
            {
                blastParameter.filter = parameters.Settings[ParameterFilter];
            }

            if (parameters.Settings.ContainsKey(ParameterAlignments))
            {
                blastParameter.numal = (int?)int.Parse(parameters.Settings[ParameterAlignments], CultureInfo.InvariantCulture);
            }

            if (parameters.Settings.ContainsKey(ParameterMatrixName))
            {
                blastParameter.matrix = parameters.Settings[ParameterMatrixName];
            }

            if (parameters.Settings.ContainsKey(ParameterExpect))
            {
                blastParameter.exp = (float?)float.Parse(parameters.Settings[ParameterExpect], CultureInfo.InvariantCulture);
            }

            return(blastParameter);
        }
예제 #11
0
        /// <summary>
        /// Submit the search request with the user supplied configuration parameters and sequence list.
        /// Implementation should make use of the MBF.IO formatters to convert the sequence into
        /// the web interface compliant sequence format
        /// </summary>
        /// <remarks>An exception is thrown if the request does not succeed.</remarks>
        /// <param name="sequences">List of sequence to search with</param>
        /// <param name="parameters">Blast input parameters</param>
        /// <returns>Unique Search ID generated by MBF</returns>
        public string SubmitRequest(IList <ISequence> sequences, BlastParameters parameters)
        {
            if (sequences == null)
            {
                throw new Exception(Resources.BIOHPCNOSEQUENCE);
            }

            string requestIdentifier;

            // Start of BioHPC-specific code

            // we are submitting BLAST and give the job a name
            tAppId appID   = tAppId.P_BLAST;
            string jobname = BlastParameters.Parameters["JobName"].DefaultValue;

            if (parameters.Settings.ContainsKey(PARAMETERJOBNAME))
            {
                if (!String.IsNullOrEmpty(parameters.Settings[PARAMETERJOBNAME]))
                {
                    jobname = parameters.Settings[PARAMETERJOBNAME];
                }
            }

            // initialize input parameters with defaults
            AppInputData pars = _blastClient.InitializeApplicationParams(appID, jobname);

            // Retrieve database names for easy access by parameter validator
            dnaDatabases  = GetServiceMetadata(MetadataDatabasesDna);
            protDatabases = GetServiceMetadata(MetadataDatabasesProt);

            // Validate the parameter
            ParameterValidationResult valid = ValidateParameters(parameters, pars);

            if (!valid.IsValid)
            {
                throw new Exception(valid.ValidationErrors);
            }

            // ValidateParameters updated some of the entries in pars and put them
            // into its ParametersObject - we need to fetch the updated pars
            pars = valid.ParametersObject as AppInputData;

            // Set some remaining parameters...
            pars.blast.querysource = QuerySrcType.paste;

            // We request XML as format, since this is what we can parse...
            pars.blast.options.format = OutputFormat.XML;

            // Query sequence should be in full Fasta format.
            // We concatenate all the sequences from the list into a single string.
            pars.blast.query = String.Empty;
            foreach (ISequence auxseq in sequences)
            {
                pars.blast.query += ">" + auxseq.DisplayID + "\n" + auxseq.ToString() + "\n";
            }

            pars.blast.query = pars.blast.query.Substring(0, pars.blast.query.Length - 1); // remobe trailing newline...

            // Run parameters and query string are ready. Submit the job to server:
            // Create a new BLAST job.
            string jobid = String.Empty;
            string cntrl = String.Empty;

            try
            {
                string pswd = String.Empty;
                try
                {
                    pswd = Configuration.Password;
                }
                catch
                {
                }

                string[] outtab = _blastClient.CreateJob(appID, jobname, "1", Configuration.EmailAddress, pswd, "Auto");
                if (outtab[0].IndexOf(MsgError, StringComparison.Ordinal) != -1)
                {
                    throw new Exception(String.Format(CultureInfo.InvariantCulture, Resources.BIOHPCJOBNOTCREATED, outtab[0]));
                }

                jobid             = outtab[1];
                cntrl             = outtab[2];
                requestIdentifier = jobid + "_" + cntrl;
            }
            catch
            {
                throw new Exception(Resources.BIOHPCSERVERABSENT);
            }

            // Finally, we can submit the job
            try
            {
                string result = _blastClient.SubmitJob(jobid, cntrl, pars);
                if (result.IndexOf(MsgError, StringComparison.Ordinal) != -1)
                {
                    throw new Exception(String.Format(CultureInfo.InvariantCulture, Resources.BIOHPCJOBNOTSUBMITTED, jobid, result));
                }
            }
            catch
            {
                throw new Exception(Resources.BIOHPCSERVERABSENT);
            }

            // end of BioHPC-specific code

            // Only if the event is registered, invoke the thread
            if (null != RequestCompleted)
            {
                // ThreadParameter wants a single sequence - nor sure what this is for.
                // We'll give it the first sequence from the list, i.e., sequence[0]
                ThreadParameter threadParameter = new ThreadParameter(
                    requestIdentifier,
                    sequences[0],
                    parameters);

                // Start the BackGroundThread to check the status of job
                _workerThread = new BackgroundWorker();
                _workerThread.WorkerSupportsCancellation = true;
                _workerThread.DoWork             += new DoWorkEventHandler(ProcessRequestThread);
                _workerThread.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompletedRequestThread);
                _workerThread.RunWorkerAsync(threadParameter);
            }

            return(requestIdentifier);
        }
예제 #12
0
        /// <summary>
        /// Check the currently set parameters for validity
        /// </summary>
        /// <param name="parameters">Blast input parameters</param>
        /// <returns>Validation result</returns>
        public static ParameterValidationResult ValidateParameters(BlastParameters parameters)
        {
            ParameterValidationResult result = new ParameterValidationResult();

            result.IsValid = true;

            // check required parameters:
            if (!parameters.Settings.ContainsKey(ParameterDatabase))
            {
                result.IsValid           = false;
                result.ValidationErrors += Resources.PARAMETERDATABASEREQUIRED;
            }

            if (!parameters.Settings.ContainsKey(ParameterProgram))
            {
                result.IsValid           = false;
                result.ValidationErrors += Resources.PARAMETERPROGRAMREQUIRED;
            }

            // note: query is not part of the inputParams class, so the caller will
            // need to handle it separately.
            if (!parameters.Settings.ContainsKey(ParameterEmail))
            {
                result.IsValid           = false;
                result.ValidationErrors += Resources.PARAMETEREMAILREQUIRED;
            }

            if (parameters.Settings.ContainsKey(ParameterFilter))
            {
                string filter = parameters.Settings[ParameterFilter];
                if (!Helper.StringHasMatch(filter, "none", "seg", "xnu", "seg+xnu", "dust"))
                {
                    result.IsValid           = false;
                    result.ValidationErrors += string.Format(CultureInfo.InvariantCulture, Resources.INVALIDBLASTFILTER, filter, "'none, 'seg', 'xnu', 'seg+xnu', 'dust'");
                }
            }

            // Any other unknown parameters
            foreach (KeyValuePair <string, string> parameter in parameters.Settings)
            {
                switch (parameter.Key)
                {
                case ParameterDatabase:
                case ParameterProgram:
                case ParameterEmail:
                case ParameterFilter:
                case ParameterAlignments:
                case ParameterMatrixName:
                case ParameterExpect:
                    // These are valid parameter, so allow them.
                    break;

                default:
                    result.IsValid           = false;
                    result.ValidationErrors += string.Format(CultureInfo.InvariantCulture,
                                                             Resources.PARAMETERUNKNOWNEBIWU,
                                                             parameter.Key);
                    break;
                }
            }

            return(result);
        }
예제 #13
0
        /// <summary>
        /// Gets the search results for the pertinent request identifier.
        /// Implementation should have dedicated parsers to format the received results into MBF
        /// </summary>
        /// <remarks>An exception is thrown if the request does not succeed.</remarks>
        /// <param name="requestIdentifier">Identifier for the request of interest.</param>
        /// <param name="parameters">Blast input parameters</param>
        /// <returns>The search results</returns>
        public string GetResult(
            string requestIdentifier,
            BlastParameters parameters)
        {
            string              status              = string.Empty;
            string              information         = string.Empty;
            WebAccessor         accessor            = new WebAccessor();
            WebAccessorResponse webAccessorResponse = null;

            parameters.Add(PARAMETERCOMMAND, COMMANDGET);
            parameters.Add(PARAMETERJOBID, requestIdentifier);
            parameters.Add(PARAMETERFORMAT, FORMATXML);

            if (Configuration.UseBrowserProxy)
            {
                accessor.GetBrowserProxy();
            }

            webAccessorResponse = accessor.SubmitHttpRequest(
                ServiceUri,
                true,           // POST request
                parameters.Settings);
            if (!webAccessorResponse.IsSuccessful)
            {
                // failure
                accessor.Close();
                return(null);
            }

            accessor.Close();

            information = ExtractInfoSection(webAccessorResponse.ResponseString);

            if (!String.IsNullOrEmpty(information))
            {
                int statusStart = information.IndexOf("Status=", StringComparison.OrdinalIgnoreCase);
                if (statusStart >= 0)
                {
                    statusStart += "Status=".Length;
                    int statusEnd = information.IndexOf('\n', statusStart);
                    if (statusEnd >= 0)
                    {
                        status = information.Substring(statusStart, statusEnd - statusStart);
                    }
                }
            }

            if (!string.IsNullOrEmpty(status))
            {
                if (status == STATUSWAITING)
                {
                    return(null);
                }
                else
                {
                    string message = String.Format(CultureInfo.InvariantCulture,
                                                   Resources.INVALIDNCBISTATUS,
                                                   status);
                    throw new Exception(message);
                }
            }

            return(webAccessorResponse.ResponseString);
        }
예제 #14
0
        /// <summary>
        /// Submit the search request with the user supplied configuration parameters
        /// and sequence. Implementation should make use of the MBF.IO formatters
        /// to convert the sequence into the web interface compliant sequence format.
        /// This method performs parameter validation and throw Exception on invalid input.
        /// </summary>
        /// <remarks>An exception is thrown if the request does not succeed.</remarks>
        /// <param name="sequence">The sequence to search with</param>
        /// <param name="parameters">Blast input parameters</param>
        /// <returns>Request Identifier</returns>
        public string SubmitRequest(ISequence sequence, BlastParameters parameters)
        {
            if (null == sequence)
            {
                throw new ArgumentNullException("sequence");
            }

            if (null == parameters)
            {
                throw new ArgumentNullException("parameters");
            }

            string requestIdentifier;

            // Create blast client object if not created already or if connection string has changed.
            if (_blastClient == null)
            {
                InitializeBlastClient();
            }
            else
            {
                if (_blastClient.Endpoint.Address.Uri != _configuration.Connection)
                {
                    // re-initialize if the uri has changed.
                    InitializeBlastClient();
                }
            }

            // Validate the Parameter
            ParameterValidationResult valid = ValidateParameters(parameters);

            if (!valid.IsValid)
            {
                throw new Exception(valid.ValidationErrors);
            }

            // Submit the job to server
            BlastSerivceRequest blastRequest = GetRequestParameter(
                sequence,
                parameters);

            try
            {
                requestIdentifier = _blastClient.SubmitJob(blastRequest).ToString();
            }
            catch (FaultException <BlastFault> fault)
            {
                throw new Exception(fault.Message);
            }

            // Only if the event is registered, invoke the thread
            if (null != RequestCompleted)
            {
                ThreadParameter threadParameter = new ThreadParameter(
                    requestIdentifier,
                    sequence,
                    parameters);

                // Start the BackGroundThread to check the status of job
                _workerThread = new BackgroundWorker();
                _workerThread.WorkerSupportsCancellation = true;
                _workerThread.DoWork             += new DoWorkEventHandler(ProcessRequestThread);
                _workerThread.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompletedRequestThread);
                _workerThread.RunWorkerAsync(threadParameter);
            }

            return(requestIdentifier);
        }
예제 #15
0
        /// <summary>
        /// Check the currently set parameters for validity
        /// </summary>
        /// <param name="parameters">Blast input parameters</param>
        /// <returns>Validation result</returns>
        private static ParameterValidationResult ValidateParameters(BlastParameters parameters)
        {
            ParameterValidationResult result = new ParameterValidationResult();

            result.IsValid = true;

            // check required parameters:
            if (!parameters.Settings.ContainsKey(PARAMETERDATABASE))
            {
                result.IsValid           = false;
                result.ValidationErrors += Resources.PARAMETERDATABASEREQUIRED;
            }

            if (!parameters.Settings.ContainsKey(PARAMETERPROGRAM))
            {
                result.IsValid           = false;
                result.ValidationErrors += Resources.PARAMETERPROGRAMREQUIRED;
            }
            else
            {
                // force program to lowercase (NCBI QBlast does require this)
                parameters.Settings[PARAMETERPROGRAM] =
                    parameters.Settings[PARAMETERPROGRAM].ToLowerInvariant();
            }

            // verify that we have a valid query
            if (parameters.Settings.ContainsKey(PARAMETERQUERY))
            {
                if (string.IsNullOrEmpty(parameters.Settings[PARAMETERQUERY]))
                {
                    result.IsValid           = false;
                    result.ValidationErrors += Resources.PARAMETERSEQUENCEEMPTY;
                }
            }
            else
            {
                result.IsValid           = false;
                result.ValidationErrors += Resources.PARAMETERSEQUENCEREQUIRED;
            }

            // apply any addition validation logic to the set of parameters:
            // validate filters here, since EBI BLAST uses a different set:
            if (parameters.Settings.ContainsKey(PARAMETERFILTER))
            {
                string filter = parameters.Settings[PARAMETERFILTER];
                if (!Helper.StringHasMatch(filter, "T", "F", "m", "L", "R", "S", "D"))
                {
                    result.IsValid           = false;
                    result.ValidationErrors += string.Format(CultureInfo.InvariantCulture,
                                                             Resources.INVALIDBLASTFILTER,
                                                             filter,
                                                             "'T', 'F', 'm', 'L', 'R', 'S', 'D'");
                }
            }

            if (parameters.Settings.ContainsKey(PARAMETERGENETICCODE))
            {
                int geneticCode = int.Parse(parameters.Settings[PARAMETERGENETICCODE], CultureInfo.InvariantCulture);
                if (geneticCode < 1 || geneticCode > 22 ||
                    (geneticCode > 16 && geneticCode < 21))
                {
                    result.IsValid           = false;
                    result.ValidationErrors += Resources.INVALIDGENETICCODE;
                }
            }

            int queryFrom = 0;

            if (parameters.Settings.ContainsKey(PARAMETERQUERYFROM))
            {
                if (!int.TryParse(parameters.Settings[PARAMETERQUERYFROM], out queryFrom))
                {
                    result.IsValid = false;
                }
            }

            int queryTo = 0;

            if (parameters.Settings.ContainsKey(PARAMETERQUERYTO))
            {
                if (!int.TryParse(parameters.Settings[PARAMETERQUERYTO], out queryTo))
                {
                    result.IsValid = false;
                }
            }

            if (((queryFrom == queryTo) && (queryFrom != 0)) ||
                (queryFrom > queryTo))
            {
                result.IsValid           = false;
                result.ValidationErrors += Resources.PARAMETERQUERYTOINVALID;
            }

            // check disallowed parameters:
            foreach (KeyValuePair <string, string> parameter in parameters.Settings)
            {
                switch (parameter.Key)
                {
                case PARAMETERCMD:
                case PARAMETERRID:
                case PARAMETEREMAIL:
                case PARAMETERSTRAND:
                case PARAMETERSENSITIVITY:
                case PARAMETERFORMATTYPE:
                    result.IsValid           = false;
                    result.ValidationErrors += string.Format(CultureInfo.InvariantCulture,
                                                             Resources.PARAMETERUNKNOWNNCBI,
                                                             parameter.Key);
                    break;

                default:
                    break;
                }
            }

            return(result);
        }
예제 #16
0
 /// <summary>
 /// Submit the search request with the user supplied configuration parameters and sequence
 /// Implementation should make use of the MBF.IO formatters to convert the sequence into
 /// the web interface compliant sequence format
 /// </summary>
 /// <remarks>An exception is thrown if the request does not succeed.</remarks>
 /// <param name="sequences">List of sequence to search with</param>
 /// <param name="parameters">Blast input parameters</param>
 /// <returns>Request Identifier</returns>
 public string SubmitRequest(IList <ISequence> sequences, BlastParameters parameters)
 {
     throw new NotImplementedException();
 }
예제 #17
0
        /// <summary>
        /// Check the currently set parameters for validity
        /// </summary>
        /// <param name="parameters">Blast input parameters</param>
        /// <param name="pars">BLAST parameters in the BioHPC service format</param>
        /// <returns>Validation result</returns>
        private ParameterValidationResult ValidateParameters(BlastParameters parameters, AppInputData pars)
        {
            ParameterValidationResult result = new ParameterValidationResult();

            result.IsValid = true;

            // Make sure e-mail address is configured
            if (string.IsNullOrEmpty(Configuration.EmailAddress))
            {
                result.IsValid           = false;
                result.ValidationErrors += Resources.PARAMETEREMAILREQUIRED;
            }

            // check required BLAST parameters
            if (!parameters.Settings.ContainsKey(PARAMETERPROGRAM))
            {
                result.IsValid           = false;
                result.ValidationErrors += Resources.PARAMETERPROGRAMREQUIRED;
            }
            else
            {
                string prgm = parameters.Settings[PARAMETERPROGRAM].ToLower();
                if (Helper.StringHasMatch(prgm, Enum.GetNames(typeof(BLASTprogram))))
                {
                    pars.blast.program = (BLASTprogram)Enum.Parse(typeof(BLASTprogram), prgm);
                }
                else
                {
                    result.IsValid           = false;
                    result.ValidationErrors += Resources.PARAMETERPROGRAMREQUIRED;
                }
            }

            if (!parameters.Settings.ContainsKey(PARAMETERDATABASE))
            {
                result.IsValid           = false;
                result.ValidationErrors += Resources.PARAMETERDATABASEREQUIRED;
            }
            else
            {
                string dbname = parameters.Settings[PARAMETERDATABASE];
                if (IsProgramDna(pars.blast.program))
                {
                    if (IsDbstringDNA(dbname))
                    {
                        pars.blast.database.database = dbname;
                    }
                    else
                    {
                        result.IsValid           = false;
                        result.ValidationErrors += Resources.BIOHPCNODNADB;
                    }
                }
                else
                {
                    if (IsDbstringProt(dbname))
                    {
                        pars.blast.database.database = dbname;
                    }
                    else
                    {
                        result.IsValid           = false;
                        result.ValidationErrors += Resources.BIOHPCNOPROTDB;
                    }
                }
            }

            // Allowed parameters
            if (parameters.Settings.ContainsKey(PARAMETERFILTER))
            {
                // If the supplied filter parameter makes sense, use it; otherwise the default will be used.
                string fltr = parameters.Settings[PARAMETERFILTER];
                if (Helper.StringHasMatch(fltr, Enum.GetNames(typeof(LowCompFilter))))
                {
                    pars.blast.options.lcompfilter = (LowCompFilter)Enum.Parse(typeof(LowCompFilter), fltr);
                }
            }

            if (parameters.Settings.ContainsKey(PARAMETERALIGNMENTS))
            {
                pars.blast.options.maxtargets = int.Parse(parameters.Settings[PARAMETERALIGNMENTS], CultureInfo.InvariantCulture);
            }

            if (parameters.Settings.ContainsKey(PARAMETERMATRIXNAME))
            {
                // If the supplied matrix parameter makes sense, use it; otherwise the default will be used.
                string mtrx = parameters.Settings[PARAMETERMATRIXNAME].ToUpper(CultureInfo.InvariantCulture);
                if (Helper.StringHasMatch(mtrx, Enum.GetNames(typeof(MBF.Web.BioHPC.Matrix))))
                {
                    pars.blast.options.matrix = (MBF.Web.BioHPC.Matrix)Enum.Parse(typeof(MBF.Web.BioHPC.Matrix), mtrx);
                }
            }

            if (parameters.Settings.ContainsKey(PARAMETEREXPECT))
            {
                pars.blast.options.ecut = double.Parse(parameters.Settings[PARAMETEREXPECT], CultureInfo.InvariantCulture);
            }

            if (parameters.Settings.ContainsKey(PARAMETERMINQUERYLENGTH))
            {
                pars.blast.options.minquerylength = int.Parse(parameters.Settings[PARAMETERMINQUERYLENGTH], CultureInfo.InvariantCulture);
            }

            if (parameters.Settings.ContainsKey(PARAMETEREMAILNOTIFY))
            {
                pars.blast.runparams.email_notify = parameters.Settings[PARAMETEREMAILNOTIFY] == "yes";
            }

            // Any other unknown parameters
            foreach (KeyValuePair <string, string> parameter in parameters.Settings)
            {
                switch (parameter.Key)
                {
                // These are either handled above, or allowed
                case PARAMETERDATABASE:
                case PARAMETERPROGRAM:
                case PARAMETERFORMATTYPE:
                case PARAMETERFILTER:
                case PARAMETERALIGNMENTS:
                case PARAMETERMATRIXNAME:
                case PARAMETEREXPECT:
                case PARAMETERMINQUERYLENGTH:
                case PARAMETEREMAILNOTIFY:
                case PARAMETERJOBNAME:
                    break;

                default:
                    result.IsValid           = false;
                    result.ValidationErrors += string.Format(
                        CultureInfo.InvariantCulture,
                        Resources.PARAMETRUNKNOWNBIOHPC,
                        parameter.Key);
                    break;
                }
            }

            if (result.IsValid)
            {
                result.ParametersObject = pars;
            }

            return(result);
        }
예제 #18
0
        /// <summary>
        /// Submit the search request with the user supplied configuration parameters
        /// and sequence. Implementation should make use of the MBF.IO formatters
        /// to convert the sequence into the web interface compliant sequence format.
        /// This method performs parameter validation and throw Exception on invalid input.
        /// </summary>
        /// <remarks>An exception is thrown if the request does not succeed.</remarks>
        /// <param name="sequence">The sequence to search with</param>
        /// <param name="parameters">Blast input parameters</param>
        /// <returns>Request Identifier</returns>
        public string SubmitRequest(ISequence sequence, BlastParameters parameters)
        {
            if (null != sequence)
            {
                parameters.Add("Query", sequence.ToString());
            }

            if (null == parameters)
            {
                throw new ArgumentNullException("parameters");
            }

            string requestIdentifier = string.Empty;

            // Validate the Parameter
            ParameterValidationResult valid = ValidateParameters(parameters);

            if (!valid.IsValid)
            {
                throw new Exception(valid.ValidationErrors);
            }

            parameters.Add(PARAMETERCOMMAND, COMMANDPUT);

            WebAccessor         accessor = new WebAccessor();
            WebAccessorResponse webAccessorResponse;

            if (Configuration.UseBrowserProxy)
            {
                accessor.GetBrowserProxy();
            }

            webAccessorResponse = accessor.SubmitHttpRequest(
                ServiceUri,
                true,                       // do POST
                parameters.Settings);       // request parameters
            if (!webAccessorResponse.IsSuccessful)
            {
                // failed
                accessor.Close();
                throw new Exception(String.Format(CultureInfo.InvariantCulture,
                                                  Resources.HTTPSUBMITFAILED,
                                                  webAccessorResponse.StatusDescription));
            }

            string info = ExtractInfoSection(webAccessorResponse.ResponseString);

            if (!String.IsNullOrEmpty(info))
            {
                int ridStart = info.IndexOf("RID = ", StringComparison.OrdinalIgnoreCase);
                if (ridStart >= 0)
                {
                    ridStart += "RID = ".Length;
                    int ridEnd = info.IndexOf('\n', ridStart);
                    if (ridEnd >= 0)
                    {
                        requestIdentifier = info.Substring(ridStart, ridEnd - ridStart);
                    }
                }
            }

            accessor.Close();
            if (string.IsNullOrEmpty(requestIdentifier))
            {
                string message = String.Format(CultureInfo.InvariantCulture,
                                               Resources.RIDEXTRACTFAILED,
                                               ExtractError(webAccessorResponse.ResponseString));
                throw new Exception(message);
            }

            // Only if the event is registered, invoke the thread
            if (null != RequestCompleted)
            {
                ThreadParameter threadParameter = new ThreadParameter(
                    requestIdentifier,
                    sequence,
                    parameters);

                // Start the BackGroundThread to check the status of job
                _workerThread = new BackgroundWorker();
                _workerThread.WorkerSupportsCancellation = true;
                _workerThread.DoWork             += new DoWorkEventHandler(ProcessRequestThread);
                _workerThread.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompletedRequestThread);
                _workerThread.RunWorkerAsync(threadParameter);
            }

            return(requestIdentifier);
        }