diff --git a/SivStudies/resources/etls/idr-data.xml b/SivStudies/resources/etls/idr-data.xml
index 909ee84e..f686476f 100644
--- a/SivStudies/resources/etls/idr-data.xml
+++ b/SivStudies/resources/etls/idr-data.xml
@@ -100,8 +100,8 @@
-
-
+
+
@@ -155,6 +155,11 @@
+
+
+
+
+
diff --git a/SivStudies/resources/queries/study/demographics/Expanded.qview.xml b/SivStudies/resources/queries/study/demographics/Expanded.qview.xml
index 1598334f..9e3d0a62 100644
--- a/SivStudies/resources/queries/study/demographics/Expanded.qview.xml
+++ b/SivStudies/resources/queries/study/demographics/Expanded.qview.xml
@@ -6,11 +6,14 @@
+
+
-
+
+
diff --git a/SivStudies/resources/queries/study/demographics/Project Summary.qview.xml b/SivStudies/resources/queries/study/demographics/Project Summary.qview.xml
index 30c79c60..8f20b4a7 100644
--- a/SivStudies/resources/queries/study/demographics/Project Summary.qview.xml
+++ b/SivStudies/resources/queries/study/demographics/Project Summary.qview.xml
@@ -9,8 +9,6 @@
-
-
diff --git a/SivStudies/resources/queries/study/demographics/SIV and ART Info.qview.xml b/SivStudies/resources/queries/study/demographics/SIV and ART Info.qview.xml
new file mode 100644
index 00000000..43f68638
--- /dev/null
+++ b/SivStudies/resources/queries/study/demographics/SIV and ART Info.qview.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SivStudies/resources/queries/study/demographicsChallengeAndArt.query.xml b/SivStudies/resources/queries/study/demographicsChallengeAndArt.query.xml
index 135d018b..db95fd32 100644
--- a/SivStudies/resources/queries/study/demographicsChallengeAndArt.query.xml
+++ b/SivStudies/resources/queries/study/demographicsChallengeAndArt.query.xml
@@ -10,12 +10,31 @@
SIV Infection
+ /query/executeQuery.view?schemaName=study&query.queryName=treatments&query.Id~eq=${Id}&query.category~eq=SIV Infection
+ _blank
ART
+ /query/executeQuery.view?schemaName=study&query.queryName=treatments&query.Id~eq=${Id}&query.category~eq=ART
+ _blank
Infection Date
+ Date
+
+
+ ART Initiation
+ Date
+
+
+ ART Initiation (DPI)
+
+
+ ART Release
+ Date
+
+
+ ART Release (WPI)
allInfections
diff --git a/SivStudies/resources/queries/study/demographicsChallengeAndArt.sql b/SivStudies/resources/queries/study/demographicsChallengeAndArt.sql
index 4e4f9fc7..e9ed1f28 100644
--- a/SivStudies/resources/queries/study/demographicsChallengeAndArt.sql
+++ b/SivStudies/resources/queries/study/demographicsChallengeAndArt.sql
@@ -1,17 +1,35 @@
SELECT
- t.Id,
- group_concat(DISTINCT CASE
- WHEN t.category = 'SIV Infection' THEN (cast(month(t.date) as varchar) || '/' || cast(dayofmonth(t.date) as varchar) || '/' || cast(year(t.date) as varchar) || ' (' || t.treatment || ')')
- ELSE NULL
- END, char(10)) as allInfections,
- group_concat(DISTINCT CASE
- WHEN t.category = 'ART' THEN (cast(month(t.date) as varchar) || '/' || cast(dayofmonth(t.date) as varchar) || '/' || cast(year(t.date) as varchar) || ' (' || t.treatment || ')')
- ELSE NULL
- END, char(10)) as allART,
- min(CASE
- WHEN t.category = 'SIV Infection' THEN t.date
- ELSE NULL
- END) as infectionDate,
+ t.*,
+ TIMESTAMPDIFF('SQL_TSI_WEEK', t.infectionDate, t.artReleaseDate) as artReleaseWPI
+FROM (
+ SELECT
+ t.Id,
+ group_concat(DISTINCT CASE
+ WHEN t.category = 'SIV Infection' THEN (cast(month(t.date) as varchar) || '/' || cast(dayofmonth(t.date) as varchar) || '/' || cast(year(t.date) as varchar) || ' (' || t.treatment || ')')
+ ELSE NULL
+ END, char(10)) as allInfections,
+ min(floor(age(t.DataSets.Demographics.birth, CASE WHEN t.category = 'SIV Infection' THEN t.date ELSE NULL END))) AS ageAtInfection,
-FROM study.treatments t
-GROUP BY t.Id
\ No newline at end of file
+ group_concat(DISTINCT CASE
+ WHEN t.category = 'ART' THEN (cast(month(t.date) as varchar) || '/' || cast(dayofmonth(t.date) as varchar) || '/' || cast(year(t.date) as varchar) || ' (' || t.treatment || ')')
+ ELSE NULL
+ END, char(10)) as allART,
+ min(CASE
+ WHEN t.category = 'SIV Infection' THEN t.date
+ ELSE NULL
+ END) as infectionDate,
+ min(CASE
+ WHEN t.category = 'ART' THEN t.date
+ ELSE NULL
+ END) as artInitiationDate,
+ min(CASE
+ WHEN t.category = 'ART' THEN t.timePostSivChallenge.daysPostInfection
+ ELSE NULL
+ END) as artInitiationDPI,
+ min(CASE
+ WHEN t.category = 'ART' THEN t.artInformation.artRelease
+ ELSE NULL
+ END) as artReleaseDate
+ FROM study.treatments t
+ GROUP BY t.Id
+) t
\ No newline at end of file
diff --git a/SivStudies/resources/queries/study/demographicsImmunizations.query.xml b/SivStudies/resources/queries/study/demographicsImmunizations.query.xml
index 20e1fe98..bd3587c5 100644
--- a/SivStudies/resources/queries/study/demographicsImmunizations.query.xml
+++ b/SivStudies/resources/queries/study/demographicsImmunizations.query.xml
@@ -10,9 +10,13 @@
Immunizations
+ /query/executeQuery.view?schemaName=study&query.queryName=immunizations&query.Id~eq=${Id}
+ _blank
Immunization Types
+ /query/executeQuery.view?schemaName=study&query.queryName=immunizations&query.Id~eq=${Id}
+ _blank
immunizations
diff --git a/SivStudies/resources/queries/study/demographicsImmunizations.sql b/SivStudies/resources/queries/study/demographicsImmunizations.sql
index a31a58ce..4f28d89b 100644
--- a/SivStudies/resources/queries/study/demographicsImmunizations.sql
+++ b/SivStudies/resources/queries/study/demographicsImmunizations.sql
@@ -1,6 +1,6 @@
SELECT
s.Id,
- group_concat(DISTINCT s.treatment, char(10)) as immunizations,
+ group_concat(DISTINCT COALESCE(s.backbone, s.treatment), char(10)) as immunizations,
group_concat(DISTINCT s.category, char(10)) as immunizationTypes,
FROM study.immunizations s
diff --git a/SivStudies/resources/queries/study/demographicsInterventions.query.xml b/SivStudies/resources/queries/study/demographicsInterventions.query.xml
new file mode 100644
index 00000000..c41a1cc7
--- /dev/null
+++ b/SivStudies/resources/queries/study/demographicsInterventions.query.xml
@@ -0,0 +1,30 @@
+
+
+
+
+ Interventions/Treatments Summary
+
+
+ true
+ true
+
+
+ Interventions/Treatments
+ /query/executeQuery.view?schemaName=study&query.queryName=treatments&query.Id~eq=${Id}&query.category~eq=Intervention
+ _blank
+
+
+ Date of First Intervention
+
+
+ First Intervention (DPI)
+
+
+ First Intervention (WPI)
+
+
+ allInterventions
+
+
+
+
diff --git a/SivStudies/resources/queries/study/demographicsInterventions.sql b/SivStudies/resources/queries/study/demographicsInterventions.sql
new file mode 100644
index 00000000..306ac17a
--- /dev/null
+++ b/SivStudies/resources/queries/study/demographicsInterventions.sql
@@ -0,0 +1,20 @@
+SELECT
+ t.Id,
+ group_concat(DISTINCT CASE
+ WHEN t.category = 'Intervention' THEN (t.treatment || ' (' || t.timePostSivChallenge.timePostInfection || ')')
+ ELSE NULL
+ END, char(10)) as allInterventions,
+ min(CASE
+ WHEN t.category = 'Intervention' THEN t.date
+ ELSE NULL
+ END) as firstInterventionDate,
+ min(CASE
+ WHEN t.category = 'Intervention' THEN t.timePostSivChallenge.daysPostInfection
+ ELSE NULL
+ END) as firstInterventionDPI,
+ min(CASE
+ WHEN t.category = 'Intervention' THEN t.timePostSivChallenge.weeksPostInfection
+ ELSE NULL
+ END) as firstInterventionWPI
+FROM study.treatments t
+GROUP BY t.Id
\ No newline at end of file
diff --git a/SivStudies/resources/queries/study/demographicsPVL.query.xml b/SivStudies/resources/queries/study/demographicsPVL.query.xml
new file mode 100644
index 00000000..b097b00a
--- /dev/null
+++ b/SivStudies/resources/queries/study/demographicsPVL.query.xml
@@ -0,0 +1,65 @@
+
+
+
+
+ PVL Summary
+
+
+ true
+ true
+
+
+ SIV Challenge
+ Date
+
+
+ # PVLs
+ /query/executeQuery.view?schemaName=study&query.queryName=viralLoads&query.Id~eq=${Id}&query.sampleType~eq=Plasma&query.target~eq=SIV
+ _blank
+
+
+ First PVL
+
+
+ Last PVL
+
+
+ DPI of First PVL
+
+
+ DPI of Last PVL
+
+
+ WPI of First PVL
+
+
+ WPI of Last PVL
+
+
+ ART Release
+ Date
+
+
+
+ # PVLs Post-ART Release
+ /query/executeQuery.view?schemaName=study&query.queryName=viralLoads&query.Id~eq=${Id}&query.sampleType~eq=Plasma&query.target~eq=SIV&query.date~dategte=${artRelease}
+ _blank
+
+
+ First PVL Post-ART Release (Weeks)
+
+
+ Last PVL Post-ART Release (Weeks)
+
+
+ First PVL Post-ART Release (Months)
+
+
+ Last PVL Post-ART Release (Months)
+
+
+ numPVL
+
+
+
+
diff --git a/SivStudies/resources/queries/study/demographicsPVL.sql b/SivStudies/resources/queries/study/demographicsPVL.sql
new file mode 100644
index 00000000..e83aa354
--- /dev/null
+++ b/SivStudies/resources/queries/study/demographicsPVL.sql
@@ -0,0 +1,32 @@
+SELECT
+ t.Id,
+ count(*) AS numPVL,
+ min(sivChallenge) as sivChallenge,
+ min(t.date) as dateOfFirstPvl,
+ max(t.date) as dateOfLastPvl,
+
+ min(CONVERT(CASE WHEN t.sivChallenge IS NULL THEN NULL WHEN t.date <= t.sivChallenge THEN NULL ELSE TIMESTAMPDIFF('SQL_TSI_DAY', t.sivChallenge, t.date) END, INTEGER)) as firstPvlDPI,
+ max(CONVERT(CASE WHEN t.sivChallenge IS NULL THEN NULL WHEN t.date <= t.sivChallenge THEN NULL ELSE TIMESTAMPDIFF('SQL_TSI_DAY', t.sivChallenge, t.date) END, INTEGER)) as lastPvlDPI,
+
+ min(CONVERT(CASE WHEN t.sivChallenge IS NULL THEN NULL WHEN t.date <= t.sivChallenge THEN NULL ELSE TIMESTAMPDIFF('SQL_TSI_WEEK', t.sivChallenge, t.date) END, INTEGER)) as firstPvlWPI,
+ max(CONVERT(CASE WHEN t.sivChallenge IS NULL THEN NULL WHEN t.date <= t.sivChallenge THEN NULL ELSE TIMESTAMPDIFF('SQL_TSI_WEEK', t.sivChallenge, t.date) END, INTEGER)) as lastPvlWPI,
+
+ min(artRelease) as artRelease,
+ sum(CASE WHEN (t.artRelease IS NOT NULL AND t.date > t.artRelease) THEN 1 ELSE 0 END) as numPVLPostArtRelease,
+
+ min(CONVERT(CASE WHEN t.artRelease IS NULL THEN NULL WHEN t.date <= t.artRelease THEN NULL ELSE age_in_months(t.artRelease, t.date) END, FLOAT)) as firstPvlPostArtReleaseMonths,
+ max(CONVERT(CASE WHEN t.artRelease IS NULL THEN NULL WHEN t.date <= t.artRelease THEN NULL ELSE age_in_months(t.artRelease, t.date) END, FLOAT)) as lastPvlPostArtReleaseMonths,
+
+ min(CONVERT(CASE WHEN t.artRelease IS NULL THEN NULL WHEN t.date <= t.artRelease THEN NULL ELSE TIMESTAMPDIFF('SQL_TSI_WEEK', t.artRelease, t.date) END, INTEGER)) as firstPvlPostArtReleaseWeeks,
+ max(CONVERT(CASE WHEN t.artRelease IS NULL THEN NULL WHEN t.date <= t.artRelease THEN NULL ELSE TIMESTAMPDIFF('SQL_TSI_WEEK', t.artRelease, t.date) END, INTEGER)) as lastPvlPostArtReleaseWeeks
+
+FROM (SELECT
+ vl.Id,
+ vl.date,
+ (SELECT min(tr.date) as sivChallenge FROM study.treatments tr WHERE tr.category = 'SIV Infection' AND tr.Id = vl.Id) as sivChallenge,
+ (SELECT max(tr.enddate) as artRelease FROM study.treatments tr WHERE tr.category = 'ART' AND tr.Id = vl.Id) as artRelease
+
+FROM study.viralLoads vl
+WHERE vl.target = 'SIV' AND vl.sampleType = 'Plasma'
+) t
+GROUP BY t.Id
\ No newline at end of file
diff --git a/SivStudies/resources/queries/study/demographicsProjects.query.xml b/SivStudies/resources/queries/study/demographicsProjects.query.xml
index ec3dddc0..40389751 100644
--- a/SivStudies/resources/queries/study/demographicsProjects.query.xml
+++ b/SivStudies/resources/queries/study/demographicsProjects.query.xml
@@ -17,12 +17,6 @@
Subgroups/Treatments
-
- RhCMV Vaccines?
-
-
- SIV/ART Projects?
-
categories
diff --git a/SivStudies/resources/queries/study/demographicsProjects.sql b/SivStudies/resources/queries/study/demographicsProjects.sql
index 853db7d1..d1a8689e 100644
--- a/SivStudies/resources/queries/study/demographicsProjects.sql
+++ b/SivStudies/resources/queries/study/demographicsProjects.sql
@@ -2,10 +2,9 @@ SELECT
s.Id,
count(s.Id) as totalProjects,
group_concat(DISTINCT s.study, char(10)) as allStudies,
+ group_concat(DISTINCT s.cohortId.studyId.description, char(10)) as studyDescription,
group_concat(DISTINCT s.category, char(10)) as categories,
- group_concat(DISTINCT s.subgroup, char(10)) as subgroups,
+ group_concat(DISTINCT s.subgroup, char(10)) as subgroups
- GROUP_CONCAT(distinct CASE WHEN s.category = 'RhCMV-Vaccines' THEN 'Yes' ELSE null END, char(10)) as rhCmvVaccines,
- GROUP_CONCAT(distinct CASE WHEN s.category = 'SIV/ART' THEN 'Yes' ELSE null END, char(10)) as sivArt
FROM study.assignment s
GROUP BY s.Id
\ No newline at end of file
diff --git a/SivStudies/resources/queries/study/flow.query.xml b/SivStudies/resources/queries/study/flow.query.xml
index 63a7946a..3ca630fe 100644
--- a/SivStudies/resources/queries/study/flow.query.xml
+++ b/SivStudies/resources/queries/study/flow.query.xml
@@ -9,6 +9,9 @@
Start Date
Date
+
+ Tissue
+
Sample Type
@@ -18,8 +21,14 @@
Population
-
- Result
+
+ Parent Population
+
+
+ % of Parent
+
+
+ Absolute Count
Units
diff --git a/SivStudies/resources/queries/study/flow/.qview.xml b/SivStudies/resources/queries/study/flow/.qview.xml
index 7c9abe0b..1413e211 100644
--- a/SivStudies/resources/queries/study/flow/.qview.xml
+++ b/SivStudies/resources/queries/study/flow/.qview.xml
@@ -2,10 +2,13 @@
-
+
+
-
+
+
+
diff --git a/SivStudies/resources/queries/study/immunizations.query.xml b/SivStudies/resources/queries/study/immunizations.query.xml
index 7e1a7a60..2fc7f169 100644
--- a/SivStudies/resources/queries/study/immunizations.query.xml
+++ b/SivStudies/resources/queries/study/immunizations.query.xml
@@ -15,6 +15,12 @@
Treatment
+
+ Vector Backbone
+
+
+ Antigens
+
Route
@@ -27,6 +33,12 @@
Reason
+
+ Vector ID
+
+
+ Is Mock?
+
Comments
textarea
diff --git a/SivStudies/resources/queries/study/immunizations/.qview.xml b/SivStudies/resources/queries/study/immunizations/.qview.xml
index 575150b0..bc9ac8dc 100644
--- a/SivStudies/resources/queries/study/immunizations/.qview.xml
+++ b/SivStudies/resources/queries/study/immunizations/.qview.xml
@@ -7,6 +7,10 @@
+
+
+
+
diff --git a/SivStudies/resources/referenceStudy/study/datasets/datasets_metadata.xml b/SivStudies/resources/referenceStudy/study/datasets/datasets_metadata.xml
index 802e195f..2aaf20ea 100644
--- a/SivStudies/resources/referenceStudy/study/datasets/datasets_metadata.xml
+++ b/SivStudies/resources/referenceStudy/study/datasets/datasets_metadata.xml
@@ -110,13 +110,18 @@
entityid
true
-
varchar
+
+ varchar
+
varchar
+
+ varchar
+
varchar
@@ -129,6 +134,12 @@
varchar
+
+ boolean
+
+
+ integer
+
varchar
@@ -509,13 +520,22 @@
varchar
+
+ varchar
+
varchar
varchar
-
+
+ varchar
+
+
+ double
+
+
double
diff --git a/SivStudies/src/org/labkey/sivstudies/etl/PerformManualIdrStepsTask.java b/SivStudies/src/org/labkey/sivstudies/etl/PerformManualIdrStepsTask.java
new file mode 100644
index 00000000..8ef3bcb9
--- /dev/null
+++ b/SivStudies/src/org/labkey/sivstudies/etl/PerformManualIdrStepsTask.java
@@ -0,0 +1,273 @@
+package org.labkey.sivstudies.etl;
+
+import org.apache.xmlbeans.XmlException;
+import org.jetbrains.annotations.NotNull;
+import org.labkey.api.collections.CaseInsensitiveHashMap;
+import org.labkey.api.data.CompareType;
+import org.labkey.api.data.SimpleFilter;
+import org.labkey.api.data.TableInfo;
+import org.labkey.api.data.TableSelector;
+import org.labkey.api.di.TaskRefTask;
+import org.labkey.api.pipeline.PipelineJob;
+import org.labkey.api.pipeline.PipelineJobException;
+import org.labkey.api.pipeline.RecordedActionSet;
+import org.labkey.api.query.BatchValidationException;
+import org.labkey.api.query.DuplicateKeyException;
+import org.labkey.api.query.FieldKey;
+import org.labkey.api.query.InvalidKeyException;
+import org.labkey.api.query.QueryService;
+import org.labkey.api.query.QueryUpdateServiceException;
+import org.labkey.api.util.PageFlowUtil;
+import org.labkey.api.writer.ContainerUser;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class PerformManualIdrStepsTask implements TaskRefTask
+{
+ protected ContainerUser _containerUser;
+
+ @Override
+ public RecordedActionSet run(@NotNull PipelineJob pipelineJob) throws PipelineJobException
+ {
+ pruneSivChallenges(pipelineJob);
+ updateVaccineInformation(pipelineJob);
+ updateChallengeAnchorDates(pipelineJob);
+ updateArtInitiationAnchorDates(pipelineJob);
+
+ return new RecordedActionSet();
+ }
+
+ private void pruneSivChallenges(PipelineJob pipelineJob) throws PipelineJobException
+ {
+ TableInfo ti = QueryService.get().getUserSchema(_containerUser.getUser(), _containerUser.getContainer(), "study").getTable("treatments");
+
+ Map> existingRecords = new HashMap<>();
+ new TableSelector(ti, PageFlowUtil.set("Id", "date", "lsid"), new SimpleFilter(FieldKey.fromString("treatment"), "SIV - Unknown", CompareType.NEQ_OR_NULL).addCondition(FieldKey.fromString("category"), "SIV Infection"), null).forEachResults(rs -> {
+ String id = rs.getString(FieldKey.fromString("Id"));
+ if (!existingRecords.containsKey(id))
+ {
+ existingRecords.put(id, new HashSet<>());
+ }
+
+ existingRecords.get(id).add(rs.getDate(FieldKey.fromString("date")));
+ });
+
+ final List