private ExportFileDefinition GetSampleFileDefinition(CombinedQuery query) { AssayPanelQuery assayPanelQuery = query.AssayPanels.Single(); // This is for the subject to sample mapping var assaySampleDataset = new ExportFileDefinition { ProjectId = query.ProjectId, ContentType = "BIOSAMPLES", Name = assayPanelQuery.AssayName + " Samples", QueryId = query.Id }; //CREATE DATAFIELDS // 1. ADD SubjectId Field assaySampleDataset.Fields.Add(CreateSubjectIdField()); // 2.ADD sample Id Field assaySampleDataset.Fields.Add(CreateSampleIdField()); // 3. ADD Study Id assaySampleDataset.Fields.Add(CreateStudyIdField()); // 4. ADD Sample characteristics assaySampleDataset.Fields.AddRange(assayPanelQuery.SampleQueries.Select(qObj => new DatasetField() { QueryObjectType = nameof(SampleCharacteristic), QueryObject = qObj, ColumnHeader = qObj.QueryObjectName })); return(assaySampleDataset); }
private ExportFileDefinition GetAssayDataFileDefinition(CombinedQuery query) { AssayPanelQuery assayPanelQuery = query.AssayPanels.Single(); var assayPanelDataset = new ExportFileDefinition { ProjectId = query.ProjectId, ContentType = "ASSAY", Name = assayPanelQuery.AssayName + " Data File", QueryId = query.Id }; return(assayPanelDataset); }
private async Task <FileInfo> ExportAssayTable(DataExportObject exportData, ExportFileDefinition fileDefinition, string filePath) // FEATURE BY FEATURE MAIN QUICK { return(await Task.Factory.StartNew(() => { var projectId = fileDefinition.ProjectId; var activityId = exportData.Samples.First().AssayId; // GET sampleIds, observations, and features var sampleIds = exportData.Samples.OrderBy(o => o.BiosampleStudyId).Select(s => s.BiosampleStudyId).ToList(); var assayObservations = _queryService.GetAssayObservations(projectId, activityId, sampleIds); var orderObservations = assayObservations.OrderBy(o => o.FeatureName).ThenBy(o => o.SubjectOfObservationName); //////var features = orderObservations.Select(a => a.FeatureName).Distinct().ToList(); //////var values = orderObservations.Select(c => ((NumericalValue)c.ObservedValue).Value); var features = orderObservations.Select(a => a.FeatureName).Distinct().ToList(); var values = orderObservations.Select(a => a.Value).ToList(); var samples = orderObservations.Select(a => a.SubjectOfObservationName).Distinct().ToList(); StreamWriter writer = File.CreateText(filePath); // First write the header (which are samples' Ids) writer.WriteLine("features" + "," + string.Join(",", samples)); var sb = new StringBuilder(); var i = 0; var j = 0; foreach (var value in values) { i++; sb.Append(value + ","); if (i == exportData.Samples.Count) { writer.WriteLine(features[j] + "," + sb); sb.Clear(); i = 0; writer.Flush(); j++; } } writer.Dispose(); return new FileInfo(filePath); })); }
private ExportFileDefinition GetSubjectFileDefinition(CombinedQuery query) { var phenoDataset = new ExportFileDefinition() { ProjectId = query.ProjectId, ContentType = "PHENO", Name = "Subjects", QueryId = query.Id }; bool _hasLongitudinalData = false, _hasTpt = false; //ADD SUBJECTID & STUDYID DATAFIELD phenoDataset.Fields.Add(CreateSubjectIdField()); phenoDataset.Fields.Add(CreateStudyIdField()); //ADD DESIGN ELEMENT FIELDS (STUDY, VISIT, ARM...etc) phenoDataset.Fields.AddRange(query.DesignElements.Select(qObj => new DatasetField() { QueryObject = qObj, QueryObjectType = qObj.QueryFor, ColumnHeader = qObj.QueryObjectName })); //ADD SUBJECT CHARACTERISTICS (AGE, RACE, SEX ...etc) phenoDataset.Fields.AddRange(query.SubjectCharacteristics.Select(qObj => new DatasetField() { QueryObject = qObj, QueryObjectType = nameof(SubjectCharacteristic), ColumnHeader = qObj.QueryObjectName//.ObservationName })); //ADD CLINICAL OBSERVATIONS foreach (var co in query.ClinicalObservations) { phenoDataset.Fields.Add(new DatasetField() { QueryObject = co, QueryObjectType = nameof(SdtmRow), ColumnHeader = co.ObservationName }); if (co.HasLongitudinalData) { _hasLongitudinalData = true; } if (co.HasTPT) { _hasTpt = true; } } //ADD GROUPED CLINICAL OBSERVATIONS phenoDataset.Fields.AddRange(query.GroupedObservations.Select(gObs => new DatasetField() { QueryObject = gObs, QueryObjectType = nameof(SdtmRow), ColumnHeader = gObs.ObservationName })); //ADD longitudinal data columns if (_hasLongitudinalData && !phenoDataset.Fields.Exists(f => f.ColumnHeader == "visit")) { phenoDataset.Fields.Add(new DatasetField() { QueryObject = new Query() { QueryFor = nameof(Visit), QueryFrom = nameof(SdtmRow), QuerySelectProperty = "Name" }, QueryObjectType = nameof(Visit), ColumnHeader = "visit" }); } if (_hasTpt && !phenoDataset.Fields.Exists(f => f.ColumnHeader == "timepoint")) { phenoDataset.Fields.Add(new DatasetField() { QueryObject = new Query() { QueryFor = nameof(SdtmRow.CollectionStudyTimePoint), QueryFrom = nameof(SdtmRow), QuerySelectProperty = "Name" }, QueryObjectType = nameof(RelativeTimePoint), ColumnHeader = "timepoint" }); } return(phenoDataset); }
private async Task <DataTable> ExportSampleTable(DataExportObject exportData, ExportFileDefinition fileDefinition) // FEATURE BY FEATURE MAIN QUICK { return(await Task.Factory.StartNew(() => { var datatable = new DataTable(); datatable.TableName = fileDefinition.Name; foreach (var field in fileDefinition.Fields) { datatable.Columns.Add(field.ColumnHeader.ToLower()); } foreach (var biosample in exportData.Samples) { var row = datatable.NewRow(); row["subjectid"] = biosample.Subject.UniqueSubjectId; row["sampleid"] = biosample.BiosampleStudyId; foreach (var samplePropField in fileDefinition.Fields) { var charVal = _queryService.GetSubjectOrSampleProperty(biosample, samplePropField.QueryObject); if (charVal != null) { row[samplePropField.ColumnHeader.ToLower()] = charVal; } } datatable.Rows.Add(row); } return datatable; })); }
private async Task <DataTable> ExportSubjectClinicalTable(DataExportObject exportData, ExportFileDefinition fileDefinition) // FEATURE BY FEATURE MAIN QUICK { return(await Task.Factory.StartNew(() => { #region Create Table Columns var datatable = new DataTable(); datatable.TableName = fileDefinition.Name; foreach (var field in fileDefinition.Fields) { datatable.Columns.Add(field.ColumnHeader.ToLower()); } #endregion //var subjGroupedObservations = exportData.Observations.GroupBy(ob => new { subjId = ob.USubjId }); var fieldsByO3Id = fileDefinition.Fields.FindAll(f => f.QueryObjectType == nameof(SdtmRow)).GroupBy(f => f.QueryObject.QueryObjectName).ToList(); var subjPropertiesFields = fileDefinition.Fields.FindAll(f => f.QueryObjectType != nameof(SdtmRow)).ToList(); foreach (var subject in exportData.Subjects) { var uniqSubjectId = subject.UniqueSubjectId; var subjectObservations = exportData.Observations.FindAll(o => o.USubjId == uniqSubjectId).ToList(); var subjectCharacteristics = exportData.SubjChars.FindAll(sc => sc.SubjectId == subject.Id).ToList(); var firstRow = true; while (subjectObservations.Any() || firstRow) { var row = datatable.NewRow(); firstRow = false; #region Design Elements // row["studyid"] = subject.Study.Name; #endregion #region Subject Properties foreach (var subjPropField in subjPropertiesFields) { var charVal = _queryService.GetSubjectOrSampleProperty(subject, subjPropField.QueryObject); if (charVal != null) { row[subjPropField.ColumnHeader.ToLower()] = charVal; } } #endregion #region WRITE CLINICAL OBSERVATIONS foreach (var fieldgrp in fieldsByO3Id)//HEADACHE //BMI (EVENTS AND FINDINGS TOGETHER)//NOTE .. TIMEING ARE NOT synchronized YET { SdtmRow obs = null; foreach (var field in fieldgrp) //AEOCCUR / AESEV { //ONTOLOGY TERM REQUEST var query = (ObservationQuery)field.QueryObject; if (query.IsOntologyEntry) { obs = subjectObservations.FirstOrDefault( o => o.QualifierQualifiers.ContainsKey(query.TermCategory) && ((ObservationQuery)field.QueryObject).TermId.ToString() == o.QualifierQualifiers[query.TermCategory]); } //GROUP OF OBSERVATIONS else if (field.QueryObject.GetType() == typeof(GroupedObservationsQuery)) { //ASSUMPTION: GROUPS AREONLY COMPOSED OF ONTOLOGY ENTRY //ASSUMPTION: string v; foreach (var obsQuery in ((GroupedObservationsQuery)field.QueryObject).GroupedObservations) { obs = subjectObservations.FirstOrDefault( o => o.QualifierQualifiers.TryGetValue(obsQuery.TermCategory, out v) && obsQuery.TermId.ToString() == o.QualifierQualifiers[obsQuery.TermCategory]); if (obs != null) { break; } } } //SINGLE OBSERVATION OBJECT TERM REQUEST else { obs = subjectObservations.FirstOrDefault( o => ((ObservationQuery)field.QueryObject).TermId == o.DBTopicId); } string val = ""; //WRITE OBSERVATION INSTANCE TO ROW obs?.Qualifiers.TryGetValue(((ObservationQuery)field.QueryObject).PropertyName, out val); if (val == null) { obs?.ResultQualifiers.TryGetValue(((ObservationQuery)field.QueryObject).PropertyName, out val); } //Write //if (val == null) //if (((ObservationQuery)field.QueryObject).PropertyName.ToLower().Equals("visit")) //val = obs.VisitName; //if (val==null && ((ObservationQuery)field.QueryObject).PropertyName.EndsWith("DY") && obs.CollectionStudyDay.Number!=null) //{ // val = obs.CollectionStudyDay.Number.HasValue ? obs.CollectionStudyDay.Number.ToString() : ""; // //row[field.ColumnHeader.ToLower()] = val; //} row[field.ColumnHeader.ToLower()] = val ?? ""; } var visitField = fileDefinition.Fields.Find(f => f.QueryObjectType == nameof(Visit)); if (visitField != null && obs != null) { row[visitField.ColumnHeader.ToLower()] = obs?.VisitName ?? ""; } var timepointField = fileDefinition.Fields.FirstOrDefault(f => f.QueryObject.QueryFor != null && f.QueryObject.QueryFor.Equals(nameof(SdtmRow.CollectionStudyTimePoint))); if (timepointField != null && obs != null) { row[timepointField.ColumnHeader.ToLower()] = obs?.CollectionStudyTimePoint?.Name ?? ""; } subjectObservations.Remove(obs); } #endregion #region Write Timing Variables #endregion datatable.Rows.Add(row); } } return datatable; })); }