/// <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."); } }
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)); }
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); } }
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); }
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); }
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); } }
public JobResponse <int> Get(Guid jobId) { var response = SasClientObject.Getjob(jobId); return(new JobResponse <int>(response)); }
/// <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)); }