Ejemplo n.º 1
0
        /// <summary>
        /// Create a new Clinical Data File object loading the data from the server
        /// </summary>
        /// <param name="path"></param>
        public ClinicalDataFile(string path)
        {
            // Start a new sas job to retrieve the file
            var id = SasClientObject.NewJob("RunDatasetTransfer", new
            {
                filepath  = path,
                timestamp = DateTime.Now.ToString("yyyyMMddHHmmssffff")
            }); // Timestamp added to avoid caching in the backend

            // Poll the server until we get a response other than 'running'
            JobResponse response;

            do
            {
                Thread.Sleep(500);
                response = SasClientObject.Getjob(id);
            } while (response.Status == SasJobs.Messages.StatusCode.Running);

            // Store the data on success, otherwise throw an exception
            if (response.Status == SasJobs.Messages.StatusCode.Done)
            {
                this.data = response.Data.Tables[0];
            }
            else
            {
                throw new Exception("The system was unable to read the specified xpt file.");
            }
        }
Ejemplo n.º 2
0
        public JobResponse <AnalysisResults> Get(Guid jobId)
        {
            var response = SasClientObject.Getjob(jobId);

            // If no data was received the process is still running, return an empty list
            if (response.Status != SasJobs.Messages.StatusCode.Done)
            {
                return(new JobResponse <AnalysisResults>(response, null));
            }

            // no data was returned
            if (response.Data.Tables.Count == 0)
            {
                return(new JobResponse <AnalysisResults>(response, null));
            }

            // Save analysis results
            var     resultData = new AnalysisResults(response.Data);
            Project project    = this.projectRepository.Find(resultData.SubmissionId, resultData.Profile ?? "");

            if (project != null)
            {
                var study = project.Studies.FirstOrDefault(s =>
                                                           s.SupplementNumber.Equals(resultData.SupplementId, StringComparison.InvariantCultureIgnoreCase) &&
                                                           s.StudyCode.Equals(resultData.StudyId, StringComparison.InvariantCultureIgnoreCase));
                if (study != null)
                {
                    var revision = new ProjectRevision
                    {
                        RevisionId = project.RevisionHistory.Last().RevisionId + 1,
                        Name       = project.ProjectName,
                        Date       = DateTime.Now,
                        Owner      = Users.GetCurrentUserName(),
                        Action     = ActionTypes.Save
                    };
                    project.RevisionHistory.Add(revision);

                    study.RevisionId       = revision.RevisionId;
                    study.Concentration    = resultData.Concentration;
                    study.Pharmacokinetics = resultData.Pharmacokinetics;
                    study.Analytes         = null; // deprecated
                    study.Parameters       = null; // deprecated

                    this.projectRepository.CreateOrUpdate(project);
                }
            }

            // Clear individual data before sending the response back
            if (resultData.Concentration != null && resultData.Concentration.Sections != null)
            {
                resultData.Concentration.Sections.ForEach(s => s.SubSections = null);
            }
            if (resultData.Pharmacokinetics != null && resultData.Pharmacokinetics.Sections != null)
            {
                resultData.Pharmacokinetics.Sections.ForEach(s => s.SubSections = null);
            }

            return(new JobResponse <AnalysisResults>(response, resultData));
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Start initialization of a study in the backend and return the job id
        /// </summary>
        /// <param name="submissionId"></param>
        /// <param name="supplementNumber"></param>
        /// <param name="studyCode"></param>
        /// <returns></returns>
        public string Initialize(string submissionId, string supplementNumber, string studyCode)
        {
            string studyFolder = getStudyFolder(submissionId, supplementNumber, studyCode).FullName;
            int    hash        = StudySettings.GetFilesHash(studyFolder);

            // Run the 'RunMappings' stored procedure in the SAS server. This procedure will extract
            // The variables and make the initial mappings for the user to review.
            return(SasClientObject.NewJob("RunStudyMappings", new { StudyFolder = studyFolder, NdaHash = hash }).ToString());
        }
Ejemplo n.º 4
0
        public DateTime?GenerateReport([FromBody] StudySettings revisedMappings, int reportId)
        {
            // Apply Ex setting for reference computation
            revisedMappings.UseEx = revisedMappings.UseExRef;
            DataSet     data      = revisedMappings.ToReportGenerationDataSet(reportId);
            Report      newReport = revisedMappings.Reports[reportId];
            JobResponse response;
            Guid        id;

            // Clean up old report files first
            DeleteReportFiles(revisedMappings, newReport.Name);

            // Use different SAS Api calls for different types of report
            switch (newReport.Type)
            {
            case 1: id = SasClientObject.NewJob(data, "GenerateReport"); break;

            case 2: id = SasClientObject.NewJob(data, "GenerateForestPlot"); break;

            case 3: id = SasClientObject.NewJob(data, "GenerateNcaAnalysis"); break;

            default: return(null);
            }

            // Wait for job response
            do
            {
                System.Threading.Thread.Sleep(500);
                response = SasClientObject.Getjob(id);
            } while (response.Status == SasJobs.Messages.StatusCode.Running);

            // if done save report and return creation date
            if (response.Status == SasJobs.Messages.StatusCode.Done)
            {
                // Set the creation date
                newReport.CreationDate = DateTime.Now;
                newReport.Generated    = true;

                // If success, save the settings and return the creation date
                DoSaveReport(revisedMappings.NDAName, revisedMappings.SupplementNumber,
                             revisedMappings.StudyCode, revisedMappings.ProfileName, newReport);

                // If nca, generate script
                if (newReport.Type == 3)
                {
                    var scriptBuilder = new NcaBuilder(revisedMappings, newReport);
                    scriptBuilder.Create();
                }

                return(newReport.CreationDate);
            }
            else
            {
                return(null);
            }
        }
Ejemplo n.º 5
0
        public string Run([FromBody] StudySettings revisedMappings)
        {
            // Apply Ex setting used for reference computation
            revisedMappings.UseEx = revisedMappings.UseExRef;

            DataSet data = revisedMappings.ToMappingDataSet(true);

            // Delete old analysis results
            DeleteAnalysisResults(revisedMappings);

            // Run the analysis code
            return(SasClientObject.NewJob(data, "RunStudyAnalysis").ToString());
        }
Ejemplo n.º 6
0
        public string Get(string ndaFolderName, string profileName = null)
        {
            var userName = HttpContext.Current.User.Identity.Name ?? "DEFAULT";

            userName = userName.Substring(userName.LastIndexOfAny(new[] { '/', '\\' }) + 1);

            // Run the 'CreatePackage' stored procedure in the SAS server. This procedure will create a
            // zip files with the results of the individual study analyses
            return(SasClientObject.NewJob("CreatePackage", new {
                NDAName = ndaFolderName,
                userName = userName,
                profileName = profileName,
                timestamp = DateTime.Now.ToString("yyyyMMddHHmmssffff"), // Timestamp added to avoid caching in the backend
            }).ToString());
        }
        public IDictionary <string, IEnumerable <string> > GetReference([FromBody] StudySettings revisedMappings)
        {
            // Apply Ex setting for reference computation
            revisedMappings.UseEx = revisedMappings.UseExRef;

            DataSet     data = revisedMappings.ToMappingDataSet();
            JobResponse response;

            var id = SasClientObject.NewJob(data, "ListReferences");

            do
            {
                System.Threading.Thread.Sleep(500);
                response = SasClientObject.Getjob(id);
            } while (response.Status == SasJobs.Messages.StatusCode.Running);

            // return the potential references
            if (response.Status == SasJobs.Messages.StatusCode.Done)
            {
                var resultsTable = response.Data.Tables[0];
                if (resultsTable.Rows.Count > 0)
                {
                    var referenceTable = new Dictionary <string, IEnumerable <string> >();
                    foreach (var row in resultsTable.AsEnumerable())
                    {
                        var cohort = row["CohortDescription"].ToString();

                        if (!referenceTable.ContainsKey(cohort))
                        {
                            referenceTable.Add(cohort, new List <string>());
                        }

                        var reference = row["Reference"].ToString().Trim();
                        if (!String.IsNullOrWhiteSpace(reference))
                        {
                            ((List <string>)referenceTable[cohort])
                            .Add(reference);
                        }
                    }
                    return(referenceTable);
                }
            }

            return(null);
        }
Ejemplo n.º 8
0
        public int GenerateDemographicSummary([FromBody] StudySettings revisedMappings)
        {
            // Apply Ex setting for reference computation
            revisedMappings.UseEx = revisedMappings.UseExRef;

            DataSet     data = revisedMappings.ToMappingDataSet(true);
            JobResponse response;
            Guid        id;

            id = SasClientObject.NewJob(data, "Reports_DemographicSummary");

            // Wait for job response
            do
            {
                System.Threading.Thread.Sleep(500);
                response = SasClientObject.Getjob(id);
            } while (response.Status == SasJobs.Messages.StatusCode.Running);

            // Return the completion code
            return(response.Status == SasJobs.Messages.StatusCode.Done ? 0 : -1);
        }
        public int?DetermineStudyDesign([FromBody] StudySettings revisedMappings)
        {
            DataSet     data = revisedMappings.ToMappingDataSet();
            JobResponse response;

            var id = SasClientObject.NewJob(data, "DetermineStudyDesign");

            //var id = SasClientObject.NewJob(data, "variabilitytest4");
            do
            {
                System.Threading.Thread.Sleep(500);
                response = SasClientObject.Getjob(id);
            } while (response.Status == SasJobs.Messages.StatusCode.Running);

            // return the potential references
            if (response.Status == SasJobs.Messages.StatusCode.Done)
            {
                var resultsTable = response.Data.Tables[0];
                if (resultsTable.Rows.Count > 0)
                {
                    var studyDesign = resultsTable.AsEnumerable().First()["StudyDesign"].ToString();
                    switch (studyDesign.ToLower())
                    {
                    case "unknown": return(1);

                    case "sequential": return(2);

                    case "parallel": return(3);

                    case "crossover": return(4);

                    default: return(0);
                    }
                }
            }

            return(null);
        }
Ejemplo n.º 10
0
        public DateTime?VariabilityMetaAnalysis([FromBody] List <StudySettings> revisedMappingsList, int reportId)
        {
            // Apply Ex setting for reference computation
            //revisedMappings.UseEx = revisedMappings.UseExRef;
            Report        newReport0      = revisedMappingsList[0].Reports[reportId];
            StudySettings revisedMappings = revisedMappingsList[0];
            DataSet       data            = new DataSet();

            for (int i = 0; i < revisedMappingsList.Count; i++)
            {
                DataSet data1 = revisedMappingsList[i].ToVariabilityMetaAnalysisGenerationDataSet(reportId);
                if (data1 != null)
                {
                    data.Merge(data1);
                }
            }

            JobResponse response;
            Guid        id;

            //// Clean up old report files first
            //DeleteReportFiles(revisedMappings, newReport.Name);

            // Use different SAS Api calls for different types of report
            id = SasClientObject.NewJob(data, "GenerateMetaVariability");
            //id = SasClientObject.NewJob(data, "variabilitytest4");

            // Wait for job response
            do
            {
                System.Threading.Thread.Sleep(500);
                response = SasClientObject.Getjob(id);
            } while (response.Status == SasJobs.Messages.StatusCode.Running);

            // if done save report and return creation date
            if (response.Status == SasJobs.Messages.StatusCode.Done)
            {
                // Set the creation date


                // If success, save the settings and return the creation date
                for (int i = 0; i < revisedMappingsList.Count; i++)
                {
                    Report newReport = revisedMappingsList[i].Reports[reportId];
                    newReport.CreationDate = DateTime.Now;
                    newReport.Generated    = true;
                    DoSaveVariabilityMetaAnalysisReport(revisedMappingsList[i].NDAName, revisedMappingsList[i].SupplementNumber, revisedMappingsList[i].StudyCode, revisedMappingsList[i].ProfileName, newReport);
                }

                //var scriptBuilder = new MetaBuilder(revisedMappings, newReport0);
                //scriptBuilder.Create();



                return(DateTime.Now);
            }
            else
            {
                return(null);
            }
        }
Ejemplo n.º 11
0
        public JobResponse <int> Get(Guid jobId)
        {
            var response = SasClientObject.Getjob(jobId);

            return(new JobResponse <int>(response));
        }
Ejemplo n.º 12
0
        public string Run(string jsonPlot)
        {
            JavaScriptSerializer jss = new JavaScriptSerializer();
            Plot revisedPlot         = jss.Deserialize <Plot>(jsonPlot);

            // Use the iportal database context
            using (OCPSQLEntities db = new OCPSQLEntities())
            {
                // For each project, update the plot data in the database
                //FPTOOLS_PROJECT project = new FPTOOLS_PROJECT();
                var plot = new IPORTAL_FP();

                // retrieve plot data from the database
                plot = db.IPORTAL_FP.SingleOrDefault(p => p.FP_ID == revisedPlot.Id);
                // if the plot does not exist return error TODO improve
                if (plot == null)
                {
                    throw new Exception();
                }

                //  Update plot setting data into database
                plot.DRUGNAME     = revisedPlot.Settings.DrugName;
                plot.TITLE        = revisedPlot.Settings.Title;
                plot.RANGE_BOTTOM = (double)revisedPlot.Settings.RangeBottom;
                plot.RANGE_TOP    = (double)revisedPlot.Settings.RangeTop;
                plot.RANGE_STEP   = (double)revisedPlot.Settings.RangeStep;
                plot.XLABEL       = revisedPlot.Settings.Xlabel;
                plot.FOOTNOTE     = revisedPlot.Settings.FootNote;
                plot.SCALE_ID     = revisedPlot.Settings.Scale;
                plot.FP_STYLE_ID  = revisedPlot.Settings.Style;

                db.SaveChanges();
            }

            // Run the analysis code
            var filename = "Forest_plot_" + revisedPlot.Id;

            try
            {
                SasClientObject.RunJob("GenForestPlot",
                                       (new { IdName = "FP_ID", IdVal = revisedPlot.Id, PlotId = "Forest_plot" }));
                //    new SasGenericClient.RunOptions {
                //    AbortExisting = true, RunId = "GenForestPlot" + revisedPlot.Id
                //  });
            }
            catch (Exception ex)
            {
                return("");
            }

            // Download the plot as a base64 encoded string
            try
            {
                var    result    = new HttpResponseMessage(HttpStatusCode.OK);
                var    stream    = new FileStream(ForestPlotConfig.OutputFolder + filename + ".png", FileMode.Open);
                byte[] filebytes = new byte[stream.Length];
                stream.Read(filebytes, 0, Convert.ToInt32(stream.Length));
                var encodedImage = Convert.ToBase64String(filebytes);
                return("data:image/png;base64," + encodedImage);
            }
            catch (Exception ex)
            {
                return("");
            }
        }
Ejemplo n.º 13
0
        /// <summary>
        /// Poll the server for the results of a study initialization
        /// </summary>
        /// <param name="submissionId"></param>
        /// <param name="supplementNumber"></param>
        /// <param name="studyCode"></param>
        /// <param name="jobId"></param>
        /// <returns></returns>
        public JobResponse <StudySettings> GetInitializationResult(string submissionId, string supplementNumber, string studyCode, string jobId)
        {
            var response = SasClientObject.Getjob(new Guid(jobId));

            // If no data was received the process is still running, return an empty list
            if (response.Status != SasJobs.Messages.StatusCode.Done)
            {
                var noDataResponse = new JobResponse <StudySettings>(response, null);

                // Give a better response when the process is stuck at 1%
                if (response.PercentComplete == 1)
                {
                    noDataResponse.FeedbackMessage =
                        String.Format(@"Determining file structure and study design for study {0}", studyCode);
                }

                return(noDataResponse);
            }

            // If no data was returned
            if (response.Data.Tables.Count == 0)
            {
                return(new JobResponse <StudySettings>(response, null));
            }

            // Check if an error code was received
            var errorTable = response.Data.Tables["errorstudy"];
            int errorCode  = (errorTable != null && errorTable.Rows.Count > 0) ?
                             Convert.ToInt32(errorTable.Rows[0]["error_code"]) : 0;

            // Retrieve datasets
            var rawStudies    = response.Data.Tables["design"].AsEnumerable();
            var mappings      = response.Data.Tables["mapping"].AsEnumerable();
            var arms          = response.Data.Tables["arms"].AsEnumerable();
            var ppvisit       = response.Data.Tables["ppvisit"].AsEnumerable();
            var pcvisit       = response.Data.Tables["pcvisit"].AsEnumerable();
            var fileVariables = response.Data.Tables["out"].AsEnumerable();

            // Initialize study profile
            var study = new StudySettings
            {
                NDAName          = submissionId,
                SupplementNumber = supplementNumber,
                StudyCode        = studyCode,
                StudyError       = errorCode
            };

            // Retrieve study mapping information (FIXME simplify sas-C# interface)
            var studyRow = rawStudies.FirstOrDefault();

            if (studyRow != null)
            {
                // study type
                study.StudyType = Convert.ToInt32(studyRow["Study_Type"]);

                // Arms
                study.Arms = arms.Where(arow => arow["Study_Code"].ToString().Equals(study.StudyCode))
                             .Select(arow => arow["arm"].ToString()).ToList();

                // PP:Visit
                study.PpVisit = ppvisit.Where(pprow => pprow["Study_Code"].ToString().Equals(study.StudyCode))
                                .Select(pprow => pprow["visit"].ToString()).ToList();

                // PC:Visit
                study.PcVisit = pcvisit.Where(pcrow => pcrow["Study_Code"].ToString().Equals(study.StudyCode))
                                .Select(pcrow => pcrow["visit"].ToString()).ToList();

                // Mappings
                study.StudyMappings = mappings
                                      .Where(mrow => mrow["Study_Code"].ToString().Equals(study.StudyCode))
                                      .GroupBy(mrow => mrow["Source"]).Select(mrows => new Domain
                {
                    Type           = mrows.First()["Source"].ToString(),
                    DomainMappings = mrows.Select(mrow => new Mapping
                    {
                        FileVariable   = mrow["File_Variable"].ToString(),
                        SdtmVariable   = mrow["SDTM_Variable"].ToString(),
                        MappingQuality = Convert.ToInt32(mrow["Mapping_Quality"])
                    }).Where(m => m.MappingQuality >= 0).ToList(),     // Filter out mappings with quality -1 (dummy mappings)

                    // The way sas returns the data, the variables will be listed in the first table of the dataset.
                    FileVariables = fileVariables.Where(frow =>
                                                        frow["study"].ToString().Equals(study.StudyCode) &&
                                                        frow["source"].Equals(mrows.First()["Source"]))
                                    .Select(frow => new FileVariable
                    {
                        Name        = frow["variable"].ToString(),
                        Description = frow["variableDescription"].ToString(),
                        Label       = String.Format("{0} - {1}", frow["variable"].ToString(), frow["variableDescription"].ToString())
                    }).ToList(),
                    FileId = mrows.First()["Path"].ToString()
                }).ToList();
            }


            // If no studies have been retrieved return null
            return(new JobResponse <StudySettings>(response, study));
        }