3505 |
23 Sep 15 |
olle |
1 |
package net.sf.basedb.meludi.servlet; |
3505 |
23 Sep 15 |
olle |
2 |
|
3505 |
23 Sep 15 |
olle |
3 |
import java.io.IOException; |
3505 |
23 Sep 15 |
olle |
4 |
import java.text.SimpleDateFormat; |
3505 |
23 Sep 15 |
olle |
5 |
import java.util.Collections; |
3505 |
23 Sep 15 |
olle |
6 |
import java.util.Date; |
3505 |
23 Sep 15 |
olle |
7 |
import java.util.HashMap; |
3505 |
23 Sep 15 |
olle |
8 |
import java.util.ArrayList; |
3505 |
23 Sep 15 |
olle |
9 |
import java.util.List; |
3505 |
23 Sep 15 |
olle |
10 |
|
3505 |
23 Sep 15 |
olle |
11 |
import javax.servlet.ServletException; |
3505 |
23 Sep 15 |
olle |
12 |
import javax.servlet.http.HttpServlet; |
3505 |
23 Sep 15 |
olle |
13 |
import javax.servlet.http.HttpServletRequest; |
3505 |
23 Sep 15 |
olle |
14 |
import javax.servlet.http.HttpServletResponse; |
3505 |
23 Sep 15 |
olle |
15 |
|
3505 |
23 Sep 15 |
olle |
16 |
import net.sf.basedb.clients.web.util.HTML; |
3505 |
23 Sep 15 |
olle |
17 |
import net.sf.basedb.core.Application; |
3505 |
23 Sep 15 |
olle |
18 |
import net.sf.basedb.core.BioMaterial; |
3505 |
23 Sep 15 |
olle |
19 |
import net.sf.basedb.core.DbControl; |
3505 |
23 Sep 15 |
olle |
20 |
import net.sf.basedb.core.Extract; |
3505 |
23 Sep 15 |
olle |
21 |
import net.sf.basedb.core.ItemQuery; |
3505 |
23 Sep 15 |
olle |
22 |
import net.sf.basedb.core.ItemSubtype; |
4175 |
24 Oct 16 |
olle |
23 |
import net.sf.basedb.core.Project; |
3505 |
23 Sep 15 |
olle |
24 |
import net.sf.basedb.core.Sample; |
3505 |
23 Sep 15 |
olle |
25 |
import net.sf.basedb.core.SessionControl; |
3505 |
23 Sep 15 |
olle |
26 |
import net.sf.basedb.core.query.Annotations; |
3505 |
23 Sep 15 |
olle |
27 |
import net.sf.basedb.core.query.Expressions; |
3505 |
23 Sep 15 |
olle |
28 |
import net.sf.basedb.core.query.Hql; |
3505 |
23 Sep 15 |
olle |
29 |
import net.sf.basedb.core.query.Orders; |
3505 |
23 Sep 15 |
olle |
30 |
import net.sf.basedb.core.query.Restrictions; |
3505 |
23 Sep 15 |
olle |
31 |
import net.sf.basedb.core.snapshot.SnapshotManager; |
3505 |
23 Sep 15 |
olle |
32 |
import net.sf.basedb.meludi.JsonUtil; |
3505 |
23 Sep 15 |
olle |
33 |
import net.sf.basedb.meludi.Meludi; |
3505 |
23 Sep 15 |
olle |
34 |
import net.sf.basedb.meludi.Site; |
3505 |
23 Sep 15 |
olle |
35 |
import net.sf.basedb.meludi.converter.DateToStringConverter; |
3505 |
23 Sep 15 |
olle |
36 |
import net.sf.basedb.meludi.dao.Annotationtype; |
3505 |
23 Sep 15 |
olle |
37 |
import net.sf.basedb.meludi.dao.Subtype; |
3505 |
23 Sep 15 |
olle |
38 |
import net.sf.basedb.util.Values; |
3505 |
23 Sep 15 |
olle |
39 |
import net.sf.basedb.util.error.ThrowableUtil; |
3505 |
23 Sep 15 |
olle |
40 |
|
3505 |
23 Sep 15 |
olle |
41 |
import org.json.simple.JSONArray; |
3505 |
23 Sep 15 |
olle |
42 |
import org.json.simple.JSONObject; |
3505 |
23 Sep 15 |
olle |
43 |
|
3505 |
23 Sep 15 |
olle |
44 |
public class MeludiQuarterMonthReportServlet |
3505 |
23 Sep 15 |
olle |
45 |
extends HttpServlet |
3505 |
23 Sep 15 |
olle |
46 |
{ |
3505 |
23 Sep 15 |
olle |
47 |
private static final long serialVersionUID = -7481987405276528027L; |
3505 |
23 Sep 15 |
olle |
48 |
|
3505 |
23 Sep 15 |
olle |
49 |
private ReportTableUtil tableUtil; |
3505 |
23 Sep 15 |
olle |
50 |
|
3514 |
29 Sep 15 |
olle |
51 |
private static int NUM_DECIMALS = 1; |
3505 |
23 Sep 15 |
olle |
52 |
|
3505 |
23 Sep 15 |
olle |
// Use stored annotation snapshots for performance reasons |
3505 |
23 Sep 15 |
olle |
54 |
private SnapshotManager snapshotManager; |
3505 |
23 Sep 15 |
olle |
55 |
|
3505 |
23 Sep 15 |
olle |
56 |
private SnapshotManager getSnapshotManager() |
3505 |
23 Sep 15 |
olle |
57 |
{ |
3505 |
23 Sep 15 |
olle |
58 |
if (this.snapshotManager == null) |
3505 |
23 Sep 15 |
olle |
59 |
{ |
3505 |
23 Sep 15 |
olle |
60 |
this.snapshotManager = new SnapshotManager(); |
3505 |
23 Sep 15 |
olle |
61 |
} |
3505 |
23 Sep 15 |
olle |
62 |
return this.snapshotManager; |
3505 |
23 Sep 15 |
olle |
63 |
} |
3505 |
23 Sep 15 |
olle |
64 |
|
3505 |
23 Sep 15 |
olle |
// Constants for view types not defined in ReportTableUtilServlet |
3505 |
23 Sep 15 |
olle |
66 |
public static final String quarterMonthView = "QUARTERMONTH"; |
3515 |
29 Sep 15 |
olle |
// Constants for extract source filter choices |
3515 |
29 Sep 15 |
olle |
68 |
public static final String EXTRACTSOURCE_NONE = "none"; |
3515 |
29 Sep 15 |
olle |
69 |
public static final String EXTRACTSOURCE_MELUDI_SPECIMEN_EXTRACT = "meludi_specimen_extract"; |
3515 |
29 Sep 15 |
olle |
70 |
public static final String EXTRACTSOURCE_INPUT_EXTRACT = "input_extract"; |
3505 |
23 Sep 15 |
olle |
// Constants for chart variant choices |
3514 |
29 Sep 15 |
olle |
72 |
public static final String ALL_CHARTS = "allcharts"; |
3514 |
29 Sep 15 |
olle |
73 |
public static final String ORIGINAL_QUANTITY_DNA_CHART = "originalquantitydna"; |
3514 |
29 Sep 15 |
olle |
74 |
public static final String ORIGINAL_QUANTITY_RNA_CHART = "originalquantityrna"; |
3514 |
29 Sep 15 |
olle |
75 |
public static final String DELTA_CT_DNA_CHART = "deltactdna"; |
3505 |
23 Sep 15 |
olle |
76 |
|
3505 |
23 Sep 15 |
olle |
77 |
private List<String> chartVariantList = null; |
3505 |
23 Sep 15 |
olle |
78 |
/** |
3505 |
23 Sep 15 |
olle |
* Returns a list of all chart variant strings. |
3505 |
23 Sep 15 |
olle |
80 |
* |
3505 |
23 Sep 15 |
olle |
* @return List<String> A list of all chart variant strings. |
3505 |
23 Sep 15 |
olle |
82 |
*/ |
3505 |
23 Sep 15 |
olle |
83 |
public List<String> getChartVariantList() |
3505 |
23 Sep 15 |
olle |
84 |
{ |
3505 |
23 Sep 15 |
olle |
85 |
if (this.chartVariantList == null) |
3505 |
23 Sep 15 |
olle |
86 |
{ |
3505 |
23 Sep 15 |
olle |
// Initialize list with chart variants |
3505 |
23 Sep 15 |
olle |
88 |
this.chartVariantList = new ArrayList<String>(); |
3514 |
29 Sep 15 |
olle |
89 |
this.chartVariantList.add(ORIGINAL_QUANTITY_DNA_CHART); |
3514 |
29 Sep 15 |
olle |
90 |
this.chartVariantList.add(ORIGINAL_QUANTITY_RNA_CHART); |
3514 |
29 Sep 15 |
olle |
91 |
this.chartVariantList.add(DELTA_CT_DNA_CHART); |
3505 |
23 Sep 15 |
olle |
92 |
} |
3505 |
23 Sep 15 |
olle |
93 |
return this.chartVariantList; |
3505 |
23 Sep 15 |
olle |
94 |
} |
3505 |
23 Sep 15 |
olle |
95 |
|
3505 |
23 Sep 15 |
olle |
96 |
private int minItemsForStatisticsCalculation = 5; |
3505 |
23 Sep 15 |
olle |
97 |
private List<Sample> allSamples; |
3505 |
23 Sep 15 |
olle |
98 |
private List<Sample> sampleRnaList = new ArrayList<Sample>(); |
3505 |
23 Sep 15 |
olle |
99 |
private List<Sample> sampleDnaList = new ArrayList<Sample>(); |
3505 |
23 Sep 15 |
olle |
100 |
private List<Extract> allExtracts; |
3505 |
23 Sep 15 |
olle |
101 |
private List<Extract> extractDnaList = new ArrayList<Extract>(); |
3505 |
23 Sep 15 |
olle |
102 |
private List<Extract> extractRnaList = new ArrayList<Extract>(); |
3505 |
23 Sep 15 |
olle |
103 |
|
3505 |
23 Sep 15 |
olle |
104 |
private HashMap<Integer, Date> sampleIdQiaCubeDateHashMap = new HashMap<Integer, Date>(); |
3505 |
23 Sep 15 |
olle |
105 |
private HashMap<Integer, Date> sampleIdSamplingDateHashMap = new HashMap<Integer, Date>(); |
3505 |
23 Sep 15 |
olle |
106 |
private HashMap<Integer, Date> extractIdQiaCubeDateHashMap = new HashMap<Integer, Date>(); |
3505 |
23 Sep 15 |
olle |
107 |
private HashMap<Integer, Integer> extractIdSampleIdHashMap = new HashMap<Integer, Integer>(); |
3505 |
23 Sep 15 |
olle |
108 |
private HashMap<Integer, Float> extractIdDeltaCtHashMap = new HashMap<Integer, Float>(); |
3505 |
23 Sep 15 |
olle |
109 |
|
3505 |
23 Sep 15 |
olle |
110 |
private ItemSubtype subtypeCase; |
3505 |
23 Sep 15 |
olle |
111 |
private ItemSubtype subtypeSpecimen; |
3505 |
23 Sep 15 |
olle |
112 |
|
3505 |
23 Sep 15 |
olle |
113 |
private ItemSubtype getSubtypeCase() |
3505 |
23 Sep 15 |
olle |
114 |
{ |
3505 |
23 Sep 15 |
olle |
115 |
return this.subtypeCase; |
3505 |
23 Sep 15 |
olle |
116 |
} |
3505 |
23 Sep 15 |
olle |
117 |
|
3505 |
23 Sep 15 |
olle |
118 |
private void setSubtypeCase(ItemSubtype subtypeCase) |
3505 |
23 Sep 15 |
olle |
119 |
{ |
3505 |
23 Sep 15 |
olle |
120 |
this.subtypeCase = subtypeCase; |
3505 |
23 Sep 15 |
olle |
121 |
} |
3505 |
23 Sep 15 |
olle |
122 |
|
3505 |
23 Sep 15 |
olle |
123 |
private ItemSubtype getSubtypeSpecimen() |
3505 |
23 Sep 15 |
olle |
124 |
{ |
3505 |
23 Sep 15 |
olle |
125 |
return this.subtypeSpecimen; |
3505 |
23 Sep 15 |
olle |
126 |
} |
3505 |
23 Sep 15 |
olle |
127 |
|
3505 |
23 Sep 15 |
olle |
128 |
private void setSubtypeSpecimen(ItemSubtype subtypeSpecimen) |
3505 |
23 Sep 15 |
olle |
129 |
{ |
3505 |
23 Sep 15 |
olle |
130 |
this.subtypeSpecimen = subtypeSpecimen; |
3505 |
23 Sep 15 |
olle |
131 |
} |
3505 |
23 Sep 15 |
olle |
132 |
|
3505 |
23 Sep 15 |
olle |
133 |
public MeludiQuarterMonthReportServlet() |
3505 |
23 Sep 15 |
olle |
134 |
{ |
3505 |
23 Sep 15 |
olle |
// Create new instance of ReportTableUtilServlet for common report table utilities |
3505 |
23 Sep 15 |
olle |
136 |
tableUtil = new ReportTableUtil(); |
3505 |
23 Sep 15 |
olle |
137 |
} |
3505 |
23 Sep 15 |
olle |
138 |
|
3505 |
23 Sep 15 |
olle |
139 |
|
3505 |
23 Sep 15 |
olle |
140 |
@SuppressWarnings("unchecked") |
3505 |
23 Sep 15 |
olle |
141 |
@Override |
3505 |
23 Sep 15 |
olle |
142 |
protected void doGet(HttpServletRequest req, HttpServletResponse resp) |
3505 |
23 Sep 15 |
olle |
143 |
throws ServletException, IOException |
3505 |
23 Sep 15 |
olle |
144 |
{ |
3505 |
23 Sep 15 |
olle |
145 |
String ID = req.getParameter("ID"); |
3505 |
23 Sep 15 |
olle |
146 |
String cmd = req.getParameter("cmd"); |
3505 |
23 Sep 15 |
olle |
//System.out.println(new Date() + " MeludiQuarterMonthReportServlet::doGet(): cmd = \"" + cmd + "\""); |
3505 |
23 Sep 15 |
olle |
148 |
JsonUtil.setJsonResponseHeaders(resp); |
3505 |
23 Sep 15 |
olle |
149 |
|
3505 |
23 Sep 15 |
olle |
150 |
JSONObject json = new JSONObject(); |
3505 |
23 Sep 15 |
olle |
151 |
json.put("status", "ok"); |
3505 |
23 Sep 15 |
olle |
152 |
|
5468 |
04 Jun 19 |
olle |
//final SessionControl sc = Application.getSessionControl(ID, req.getRemoteAddr()); |
5744 |
20 Nov 19 |
olle |
//final SessionControl sc = Application.getSessionControl(ID, "", req.getRemoteAddr(), true); |
5744 |
20 Nov 19 |
olle |
155 |
final SessionControl sc = Application.getSessionControl(ID, null, req.getRemoteAddr(), true); |
3505 |
23 Sep 15 |
olle |
156 |
DbControl dc = null; |
3505 |
23 Sep 15 |
olle |
157 |
dc = sc.newDbControl(); |
3505 |
23 Sep 15 |
olle |
// Set item subtype constants for later use |
3505 |
23 Sep 15 |
olle |
159 |
setSubtypeCase(Subtype.CASE.load(dc)); |
3505 |
23 Sep 15 |
olle |
160 |
setSubtypeSpecimen(Subtype.SPECIMEN.load(dc)); |
3505 |
23 Sep 15 |
olle |
161 |
|
3505 |
23 Sep 15 |
olle |
162 |
try |
3505 |
23 Sep 15 |
olle |
163 |
{ |
3505 |
23 Sep 15 |
olle |
164 |
if ("GetSites".equals(cmd)) |
3505 |
23 Sep 15 |
olle |
165 |
{ |
3505 |
23 Sep 15 |
olle |
166 |
json.put("sites", ReportTableUtil.getJSONSites(Site.SORT_BY_NAME)); |
3505 |
23 Sep 15 |
olle |
167 |
} |
3505 |
23 Sep 15 |
olle |
168 |
else if ("meludiquartermonthreport".equals(cmd)) |
3505 |
23 Sep 15 |
olle |
169 |
{ |
3505 |
23 Sep 15 |
olle |
170 |
String startDateParameter = Values.getString(req.getParameter("fdate"), null); |
3505 |
23 Sep 15 |
olle |
171 |
String endDateParameter = Values.getString(req.getParameter("tdate"), null); |
3505 |
23 Sep 15 |
olle |
172 |
|
3505 |
23 Sep 15 |
olle |
173 |
Date startDate = Meludi.CONVERTER_STRING_TO_DATE.convert(startDateParameter); |
3505 |
23 Sep 15 |
olle |
174 |
Date endDate = Meludi.CONVERTER_STRING_TO_DATE.convert(endDateParameter); |
3505 |
23 Sep 15 |
olle |
175 |
|
3505 |
23 Sep 15 |
olle |
176 |
if (startDate == null) |
3505 |
23 Sep 15 |
olle |
177 |
{ |
3505 |
23 Sep 15 |
olle |
// Get the when the first site started |
3505 |
23 Sep 15 |
olle |
179 |
for (Site s : Site.getAllSites()) |
3505 |
23 Sep 15 |
olle |
180 |
{ |
3505 |
23 Sep 15 |
olle |
181 |
Date siteDate = Meludi.CONVERTER_STRING_TO_DATE.convert(s.getStartDate().replaceAll("-", "")); |
3505 |
23 Sep 15 |
olle |
182 |
if (siteDate != null && (startDate == null || startDate.after(siteDate))) |
3505 |
23 Sep 15 |
olle |
183 |
{ |
3505 |
23 Sep 15 |
olle |
184 |
startDate = siteDate; |
3505 |
23 Sep 15 |
olle |
185 |
} |
3505 |
23 Sep 15 |
olle |
186 |
} |
3505 |
23 Sep 15 |
olle |
187 |
} |
3505 |
23 Sep 15 |
olle |
188 |
if (endDate == null) |
3505 |
23 Sep 15 |
olle |
189 |
{ |
3505 |
23 Sep 15 |
olle |
// Get the date for today |
3505 |
23 Sep 15 |
olle |
191 |
endDate = new Date(); |
3505 |
23 Sep 15 |
olle |
192 |
} |
3505 |
23 Sep 15 |
olle |
//System.out.println(new Date() + " MeludiQuarterMonthReportServlet::doGet(): cmd = \"" + cmd + "\" startDate = " + startDate + " endDate = " + endDate); |
3505 |
23 Sep 15 |
olle |
194 |
|
3505 |
23 Sep 15 |
olle |
195 |
String viewType = null; |
3505 |
23 Sep 15 |
olle |
196 |
String viewTypeParameter = Values.getString(req.getParameter("vtype"), null); |
3505 |
23 Sep 15 |
olle |
197 |
if (viewTypeParameter != null && !viewTypeParameter.equals(ReportTableUtil.autoView)) |
3505 |
23 Sep 15 |
olle |
198 |
{ |
3505 |
23 Sep 15 |
olle |
199 |
viewType = viewTypeParameter; |
3505 |
23 Sep 15 |
olle |
200 |
} |
3505 |
23 Sep 15 |
olle |
201 |
else |
3505 |
23 Sep 15 |
olle |
202 |
{ |
3505 |
23 Sep 15 |
olle |
// Auto view type |
3505 |
23 Sep 15 |
olle |
204 |
viewType = tableUtil.getViewType(startDate, endDate); |
3505 |
23 Sep 15 |
olle |
// Use month view instead of week view |
3505 |
23 Sep 15 |
olle |
206 |
if (viewType.equals(ReportTableUtil.weekView)) |
3505 |
23 Sep 15 |
olle |
207 |
{ |
3505 |
23 Sep 15 |
olle |
208 |
viewType = ReportTableUtil.monthView; |
3505 |
23 Sep 15 |
olle |
209 |
} |
3505 |
23 Sep 15 |
olle |
210 |
} |
3505 |
23 Sep 15 |
olle |
//System.out.println(new Date() + " MeludiQuarterMonthReportServlet::doGet(): cmd = \"" + cmd + "\" startDate = " + startDate + " endDate = " + endDate + " viewType = " + viewType); |
3515 |
29 Sep 15 |
olle |
212 |
String extractSourceFilter = EXTRACTSOURCE_NONE; |
3515 |
29 Sep 15 |
olle |
213 |
String extractSourceFilterParameter = Values.getString(req.getParameter("extractsourcefilter"), null); |
3515 |
29 Sep 15 |
olle |
214 |
if (extractSourceFilterParameter != null) |
3515 |
29 Sep 15 |
olle |
215 |
{ |
3515 |
29 Sep 15 |
olle |
216 |
extractSourceFilter = extractSourceFilterParameter; |
3515 |
29 Sep 15 |
olle |
217 |
} |
3515 |
29 Sep 15 |
olle |
//System.out.println(new Date() + " MeludiQuarterMonthReportServlet::doGet(): cmd = \"" + cmd + "\" startDate = " + startDate + " endDate = " + endDate + " viewType = " + viewType + " extractSourceFilter = " + extractSourceFilter); |
3505 |
23 Sep 15 |
olle |
219 |
String projectFocusFilter = InstallServlet.PROJECTFOCUS_NONE; |
3505 |
23 Sep 15 |
olle |
220 |
String projectFocusFilterParameter = Values.getString(req.getParameter("projectfocusfilter"), null); |
3505 |
23 Sep 15 |
olle |
221 |
if (projectFocusFilterParameter != null) |
3505 |
23 Sep 15 |
olle |
222 |
{ |
3505 |
23 Sep 15 |
olle |
223 |
projectFocusFilter = projectFocusFilterParameter; |
3505 |
23 Sep 15 |
olle |
224 |
} |
3505 |
23 Sep 15 |
olle |
//System.out.println(new Date() + " MeludiQuarterMonthReportServlet::doGet(): cmd = \"" + cmd + "\" startDate = " + startDate + " endDate = " + endDate + " viewType = " + viewType + " projectFocusFilter = " + projectFocusFilter); |
3505 |
23 Sep 15 |
olle |
226 |
String sitePrefix = Values.getStringOrNull(req.getParameter("site")); |
3505 |
23 Sep 15 |
olle |
//System.out.println(new Date() + " MeludiQuarterMonthReportServlet::doGet(): cmd = \"" + cmd + "\" startDate = " + startDate + " endDate = " + endDate + " viewType = " + viewType + " projectFocusFilter = " + projectFocusFilter + " sitePrefix = " + sitePrefix); |
3505 |
23 Sep 15 |
olle |
228 |
Site site = sitePrefix != null ? Site.findByPrefix(sitePrefix) : null; |
3505 |
23 Sep 15 |
olle |
//System.out.println(new Date() + " MeludiQuarterMonthReportServlet::doGet(): cmd = \"" + cmd + "\" startDate = " + startDate + " endDate = " + endDate + " viewType = " + viewType + " projectFocusFilter = " + projectFocusFilter + " sitePrefix = " + sitePrefix + " site = " + site); |
3514 |
29 Sep 15 |
olle |
230 |
String chartVariant = Values.getString(req.getParameter("cvariant"), ORIGINAL_QUANTITY_DNA_CHART); |
3505 |
23 Sep 15 |
olle |
//System.out.println(new Date() + " MeludiQuarterMonthReportServlet::doGet(): cmd = \"" + cmd + "\" startDate = " + startDate + " endDate = " + endDate + " viewType = " + viewType + " projectFocusFilter = " + projectFocusFilter + " sitePrefix = " + sitePrefix + " site = " + site + " chartVariant = " + chartVariant); |
3505 |
23 Sep 15 |
olle |
232 |
|
3515 |
29 Sep 15 |
olle |
233 |
json = createMeludiQuarterMonthReport(dc, json, startDate, endDate, viewType, chartVariant, extractSourceFilter, projectFocusFilter, site); |
3505 |
23 Sep 15 |
olle |
234 |
} |
3505 |
23 Sep 15 |
olle |
235 |
} |
3505 |
23 Sep 15 |
olle |
236 |
catch (Throwable t) |
3505 |
23 Sep 15 |
olle |
237 |
{ |
3505 |
23 Sep 15 |
olle |
238 |
t.printStackTrace(); |
3505 |
23 Sep 15 |
olle |
239 |
json.clear(); |
3505 |
23 Sep 15 |
olle |
240 |
json.put("status", "error"); |
3505 |
23 Sep 15 |
olle |
241 |
json.put("message", t.getMessage()); |
3505 |
23 Sep 15 |
olle |
242 |
json.put("stacktrace", ThrowableUtil.stackTraceToString(t)); |
3505 |
23 Sep 15 |
olle |
243 |
} |
3505 |
23 Sep 15 |
olle |
244 |
finally |
3505 |
23 Sep 15 |
olle |
245 |
{ |
3505 |
23 Sep 15 |
olle |
246 |
if (dc != null) dc.close(); |
3505 |
23 Sep 15 |
olle |
247 |
json.writeJSONString(resp.getWriter()); |
3505 |
23 Sep 15 |
olle |
248 |
} |
3505 |
23 Sep 15 |
olle |
249 |
} |
3505 |
23 Sep 15 |
olle |
250 |
|
3505 |
23 Sep 15 |
olle |
251 |
@SuppressWarnings("unchecked") |
3515 |
29 Sep 15 |
olle |
252 |
private JSONObject createMeludiQuarterMonthReport(DbControl dc, JSONObject json, Date startDate, Date endDate, String viewType, String chartVariant, String extractSourceFilter, String projectFocusFilter, Site site) |
3505 |
23 Sep 15 |
olle |
253 |
throws ServletException, IOException |
3505 |
23 Sep 15 |
olle |
254 |
{ |
3505 |
23 Sep 15 |
olle |
255 |
/* |
3515 |
29 Sep 15 |
olle |
System.out.println(new Date() + " MeludiQuarterMonthReportServlet::createMeludiQuarterMonthReport(): startDate = " + startDate + " endDate = " + endDate + " viewType = " + viewType + " extractSourceFilter = " + extractSourceFilter + " projectFocusFilter = " + projectFocusFilter + " site = " + site + " chartVariant = " + chartVariant); |
3505 |
23 Sep 15 |
olle |
if (site != null) |
3505 |
23 Sep 15 |
olle |
258 |
{ |
3505 |
23 Sep 15 |
olle |
System.out.println(new Date() + " MeludiQuarterMonthReportServlet::createMeludiQuarterMonthReport(): site.getName() = " + site.getName()); |
3505 |
23 Sep 15 |
olle |
260 |
} |
3505 |
23 Sep 15 |
olle |
261 |
*/ |
3505 |
23 Sep 15 |
olle |
262 |
JSONObject jsonReport = new JSONObject(); |
4175 |
24 Oct 16 |
olle |
// Get project name |
4175 |
24 Oct 16 |
olle |
264 |
Project project = Project.getById(dc, dc.getSessionControl().getActiveProjectId()); |
4175 |
24 Oct 16 |
olle |
265 |
jsonReport.put("projectName", project.getName()); |
3505 |
23 Sep 15 |
olle |
266 |
// |
3505 |
23 Sep 15 |
olle |
// Sample raw list |
3505 |
23 Sep 15 |
olle |
268 |
ItemQuery<Sample> sampleQuery = Sample.getQuery(); |
3505 |
23 Sep 15 |
olle |
269 |
sampleQuery.joinPermanent(Hql.innerJoin(null, "creationEvent", "ce", true)); |
3505 |
23 Sep 15 |
olle |
// ...only include 'Specimen' |
3505 |
23 Sep 15 |
olle |
271 |
sampleQuery.restrict( |
3505 |
23 Sep 15 |
olle |
272 |
Subtype.SPECIMEN.restriction(dc, null) |
3505 |
23 Sep 15 |
olle |
273 |
); |
3505 |
23 Sep 15 |
olle |
274 |
sampleQuery.setIncludes(Meludi.INCLUDE_IN_CURRENT_PROJECT); |
4163 |
19 Oct 16 |
olle |
// Only include samples for active project |
4163 |
19 Oct 16 |
olle |
276 |
String sampleItemPrefix = Meludi.fetchSampleItemPrefix(dc.getSessionControl().getActiveProjectId()); |
4163 |
19 Oct 16 |
olle |
277 |
String sampleQueryNameRestriction = sampleItemPrefix + "%"; |
4163 |
19 Oct 16 |
olle |
278 |
sampleQuery.restrict(Restrictions.like(Hql.property("name"), Expressions.string(sampleQueryNameRestriction))); |
3505 |
23 Sep 15 |
olle |
279 |
sampleQuery.order(Orders.asc(Hql.property("name"))); |
3505 |
23 Sep 15 |
olle |
280 |
sampleQuery.order(Orders.asc(Hql.property("ce", "eventDate"))); |
3505 |
23 Sep 15 |
olle |
281 |
sampleQuery.setCacheResult(true); |
3505 |
23 Sep 15 |
olle |
// Perform database query and store result in list |
3505 |
23 Sep 15 |
olle |
283 |
allSamples = sampleQuery.list(dc); |
3505 |
23 Sep 15 |
olle |
//System.out.println(new Date() + " MeludiQuarterMonthReportServlet::createMeludiQuarterMonthReport(): allSamples.size() = " + allSamples.size()); |
3505 |
23 Sep 15 |
olle |
285 |
|
3505 |
23 Sep 15 |
olle |
// Extract raw list |
3505 |
23 Sep 15 |
olle |
287 |
ItemQuery<Extract> extractQuery = Extract.getQuery(); |
3505 |
23 Sep 15 |
olle |
288 |
extractQuery.joinPermanent(Hql.innerJoin(null, "creationEvent", "ce", true)); |
3505 |
23 Sep 15 |
olle |
// ...only include 'Lysate', 'DNA', 'RNA', or 'RNAQC' items |
3505 |
23 Sep 15 |
olle |
290 |
extractQuery.restrict( |
3505 |
23 Sep 15 |
olle |
291 |
Restrictions.or( |
3505 |
23 Sep 15 |
olle |
292 |
Subtype.DNA.restriction(dc, null), |
3505 |
23 Sep 15 |
olle |
293 |
Subtype.RNA.restriction(dc, null) |
3505 |
23 Sep 15 |
olle |
294 |
)); |
3505 |
23 Sep 15 |
olle |
295 |
extractQuery.setIncludes(Meludi.INCLUDE_IN_CURRENT_PROJECT); |
4163 |
19 Oct 16 |
olle |
// Only include samples for active project |
4163 |
19 Oct 16 |
olle |
297 |
extractQuery.restrict(Restrictions.like(Hql.property("name"), Expressions.string(sampleQueryNameRestriction))); |
3505 |
23 Sep 15 |
olle |
298 |
extractQuery.order(Orders.asc(Hql.property("name"))); |
3505 |
23 Sep 15 |
olle |
299 |
extractQuery.order(Orders.asc(Hql.property("ce", "eventDate"))); |
3505 |
23 Sep 15 |
olle |
300 |
extractQuery.setCacheResult(true); |
3505 |
23 Sep 15 |
olle |
// Perform database query and store result in list |
3505 |
23 Sep 15 |
olle |
302 |
allExtracts = extractQuery.list(dc); |
3505 |
23 Sep 15 |
olle |
//System.out.println(new Date() + " MeludiQuarterMonthReportServlet::createMeludiQuarterMonthReport(): allExtracts.size() = " + allExtracts.size()); |
3505 |
23 Sep 15 |
olle |
304 |
|
3505 |
23 Sep 15 |
olle |
// Store samples that should be processed for report table in list |
3505 |
23 Sep 15 |
olle |
306 |
ItemSubtype subtypeCase = Subtype.CASE.load(dc); |
3505 |
23 Sep 15 |
olle |
307 |
ItemSubtype subtypeSpecimen = Subtype.SPECIMEN.load(dc); |
3505 |
23 Sep 15 |
olle |
308 |
ItemSubtype subtypeDna = Subtype.DNA.load(dc); |
3505 |
23 Sep 15 |
olle |
309 |
ItemSubtype subtypeRna = Subtype.RNA.load(dc); |
3505 |
23 Sep 15 |
olle |
310 |
Date date = null; |
3505 |
23 Sep 15 |
olle |
// Converter to check timestamps against midnight: 00:00:00 |
3505 |
23 Sep 15 |
olle |
312 |
DateToStringConverter timeConverter = new DateToStringConverter(new SimpleDateFormat("HH:mm:ss")); |
3505 |
23 Sep 15 |
olle |
313 |
|
3505 |
23 Sep 15 |
olle |
// Use stored annotation snapshots for performance reasons |
3505 |
23 Sep 15 |
olle |
315 |
SnapshotManager manager = getSnapshotManager(); |
3505 |
23 Sep 15 |
olle |
316 |
|
3505 |
23 Sep 15 |
olle |
317 |
for (Extract extract: allExtracts) |
3505 |
23 Sep 15 |
olle |
318 |
{ |
3505 |
23 Sep 15 |
olle |
319 |
boolean useExtract = false; |
3505 |
23 Sep 15 |
olle |
320 |
BioMaterial extractParent = extract.getParent(); |
3505 |
23 Sep 15 |
olle |
//System.out.println(new Date() + " MeludiQuarterMonthReportServlet::createMeludiQuarterMonthReport(): extract.getName() = " + extract.getName() + " dnaParent = " + dnaParent); |
3505 |
23 Sep 15 |
olle |
322 |
ItemSubtype parentSubtype = null; |
3505 |
23 Sep 15 |
olle |
323 |
if (extractParent != null) |
3505 |
23 Sep 15 |
olle |
324 |
{ |
3505 |
23 Sep 15 |
olle |
325 |
parentSubtype = extractParent.getItemSubtype(); |
3505 |
23 Sep 15 |
olle |
326 |
/* |
3505 |
23 Sep 15 |
olle |
System.out.println(new Date() + " MeludiQuarterMonthReportServlet::createMeludiQuarterMonthReport(): allExtracts.size() = " + allExtracts.size() + " extract.getName() = " + extract.getName() + " extractParent.getName() = " + extractParent.getName() + " parentSubtype = " + parentSubtype); |
3505 |
23 Sep 15 |
olle |
328 |
} |
3505 |
23 Sep 15 |
olle |
else |
3505 |
23 Sep 15 |
olle |
330 |
{ |
3505 |
23 Sep 15 |
olle |
System.out.println(new Date() + " MeludiQuarterMonthReportServlet::createMeludiQuarterMonthReport(): allExtracts.size() = " + allExtracts.size() + " extract.getName() = " + extract.getName() + " extractParent = " + extractParent); |
3505 |
23 Sep 15 |
olle |
332 |
*/ |
3505 |
23 Sep 15 |
olle |
333 |
} |
3505 |
23 Sep 15 |
olle |
// Only use extract source items or extracts from specimen |
3505 |
23 Sep 15 |
olle |
335 |
if (parentSubtype != null) |
3505 |
23 Sep 15 |
olle |
336 |
{ |
3505 |
23 Sep 15 |
olle |
337 |
Sample relatedCase = null; |
3515 |
29 Sep 15 |
olle |
338 |
if ((extractSourceFilter.equals(EXTRACTSOURCE_NONE) || extractSourceFilter.equals(EXTRACTSOURCE_MELUDI_SPECIMEN_EXTRACT)) && subtypeSpecimen.equals(parentSubtype)) |
3505 |
23 Sep 15 |
olle |
339 |
{ |
3505 |
23 Sep 15 |
olle |
// Extract from specimen |
3505 |
23 Sep 15 |
olle |
341 |
Sample parentSpecimen = (Sample)extractParent; |
3505 |
23 Sep 15 |
olle |
342 |
relatedCase = (Sample)parentSpecimen.getParent(); |
3505 |
23 Sep 15 |
olle |
343 |
} |
3515 |
29 Sep 15 |
olle |
344 |
else if ((extractSourceFilter.equals(EXTRACTSOURCE_NONE) || extractSourceFilter.equals(EXTRACTSOURCE_INPUT_EXTRACT)) && subtypeCase.equals(parentSubtype)) |
3505 |
23 Sep 15 |
olle |
345 |
{ |
3505 |
23 Sep 15 |
olle |
// Extract source item |
3505 |
23 Sep 15 |
olle |
347 |
relatedCase = (Sample)extractParent; |
3505 |
23 Sep 15 |
olle |
348 |
} |
3505 |
23 Sep 15 |
olle |
//System.out.println(new Date() + " MeludiQuarterMonthReportServlet::createMeludiQuarterMonthReport(): extract.getName() = " + extract.getName() + " relatedCase.getName() = " + relatedCase.getName()); |
3505 |
23 Sep 15 |
olle |
350 |
if (relatedCase != null) |
3505 |
23 Sep 15 |
olle |
351 |
{ |
3505 |
23 Sep 15 |
olle |
// Check for site filter |
3505 |
23 Sep 15 |
olle |
353 |
boolean passedSiteFilter = passSiteFilter(dc, manager, site, relatedCase); |
3505 |
23 Sep 15 |
olle |
// Check for project focus filter |
3505 |
23 Sep 15 |
olle |
355 |
boolean passedProjectFocusFilter = passProjectFocusFilter(dc, manager, projectFocusFilter, relatedCase); |
3505 |
23 Sep 15 |
olle |
356 |
if (passedSiteFilter && passedProjectFocusFilter) |
3505 |
23 Sep 15 |
olle |
357 |
{ |
3505 |
23 Sep 15 |
olle |
358 |
useExtract = true; |
3505 |
23 Sep 15 |
olle |
359 |
} |
3505 |
23 Sep 15 |
olle |
360 |
/* |
3505 |
23 Sep 15 |
olle |
System.out.println(new Date() + " MeludiQuarterMonthReportServlet::createMeludiQuarterMonthReport(): allExtracts.size() = " + allExtracts.size() + " extract.getName() = " + extract.getName() + " passedSiteFilter = " + passedSiteFilter + " passedProjectFocusFilter = " + passedProjectFocusFilter); |
3505 |
23 Sep 15 |
olle |
362 |
} |
3505 |
23 Sep 15 |
olle |
else |
3505 |
23 Sep 15 |
olle |
364 |
{ |
3505 |
23 Sep 15 |
olle |
System.out.println(new Date() + " MeludiQuarterMonthReportServlet::createMeludiQuarterMonthReport(): allExtracts.size() = " + allExtracts.size() + " extract.getName() = " + extract.getName() + " relatedCase = " + relatedCase); |
3505 |
23 Sep 15 |
olle |
366 |
*/ |
3505 |
23 Sep 15 |
olle |
367 |
} |
3505 |
23 Sep 15 |
olle |
368 |
} |
3505 |
23 Sep 15 |
olle |
369 |
ItemSubtype subtype = extract.getItemSubtype(); |
3505 |
23 Sep 15 |
olle |
370 |
if (subtypeDna.equals(subtype)) |
3505 |
23 Sep 15 |
olle |
371 |
{ |
3505 |
23 Sep 15 |
olle |
// Only use extract source items or extracts from specimen |
3505 |
23 Sep 15 |
olle |
373 |
if (useExtract) |
3505 |
23 Sep 15 |
olle |
374 |
{ |
3505 |
23 Sep 15 |
olle |
//System.out.println(new Date() + " MeludiQuarterMonthReportServlet::createMeludiQuarterMonthReport(): extract.getName() = " + extract.getName() + " dnaParent = " + dnaParent + " ADDED"); |
3505 |
23 Sep 15 |
olle |
376 |
extractDnaList.add(extract); |
3505 |
23 Sep 15 |
olle |
377 |
date = (Date) Annotationtype.QIACUBE_DATE.getAnnotationValue(dc, manager, extract); |
3505 |
23 Sep 15 |
olle |
378 |
extractIdQiaCubeDateHashMap.put(extract.getId(), date); |
3505 |
23 Sep 15 |
olle |
379 |
Float deltaCt = (Float) Annotationtype.DELTA_CT.getAnnotationValue(dc, manager, extract); |
3505 |
23 Sep 15 |
olle |
380 |
extractIdDeltaCtHashMap.put(extract.getId(), deltaCt); |
3505 |
23 Sep 15 |
olle |
381 |
if (extractParent != null) |
3505 |
23 Sep 15 |
olle |
382 |
{ |
3505 |
23 Sep 15 |
olle |
383 |
Sample sample = (Sample) extractParent; |
3505 |
23 Sep 15 |
olle |
384 |
sampleDnaList.add(sample); |
3505 |
23 Sep 15 |
olle |
385 |
sampleIdQiaCubeDateHashMap.put(sample.getId(), date); |
3505 |
23 Sep 15 |
olle |
// Store sample id for DNA yield calculation |
3505 |
23 Sep 15 |
olle |
387 |
extractIdSampleIdHashMap.put(extract.getId(), sample.getId()); |
3505 |
23 Sep 15 |
olle |
388 |
} |
3505 |
23 Sep 15 |
olle |
389 |
} |
3505 |
23 Sep 15 |
olle |
390 |
} |
3505 |
23 Sep 15 |
olle |
391 |
else if (subtypeRna.equals(subtype)) |
3505 |
23 Sep 15 |
olle |
392 |
{ |
3505 |
23 Sep 15 |
olle |
// Only use extract source items or extracts from specimen |
3505 |
23 Sep 15 |
olle |
394 |
if (useExtract) |
3505 |
23 Sep 15 |
olle |
395 |
{ |
3505 |
23 Sep 15 |
olle |
//System.out.println(new Date() + " MeludiQuarterMonthReportServlet::createMeludiQuarterMonthReport(): extract.getName() = " + extract.getName() + " rnaParent = " + rnaParent + " ADDED"); |
3505 |
23 Sep 15 |
olle |
397 |
extractRnaList.add(extract); |
3505 |
23 Sep 15 |
olle |
398 |
date = (Date) Annotationtype.QIACUBE_DATE.getAnnotationValue(dc, manager, extract); |
3505 |
23 Sep 15 |
olle |
399 |
extractIdQiaCubeDateHashMap.put(extract.getId(), date); |
3505 |
23 Sep 15 |
olle |
400 |
if (extractParent != null) |
3505 |
23 Sep 15 |
olle |
401 |
{ |
3505 |
23 Sep 15 |
olle |
402 |
Sample sample = (Sample) extractParent; |
3505 |
23 Sep 15 |
olle |
403 |
sampleRnaList.add(sample); |
3505 |
23 Sep 15 |
olle |
404 |
sampleIdQiaCubeDateHashMap.put(sample.getId(), date); |
3505 |
23 Sep 15 |
olle |
// Store sample id for RNA yield calculation |
3505 |
23 Sep 15 |
olle |
406 |
extractIdSampleIdHashMap.put(extract.getId(), sample.getId()); |
3505 |
23 Sep 15 |
olle |
407 |
} |
3505 |
23 Sep 15 |
olle |
408 |
} |
3505 |
23 Sep 15 |
olle |
409 |
} |
3505 |
23 Sep 15 |
olle |
//System.out.println(new Date() + " MeludiQuarterMonthReportServlet::createMeludiQuarterMonthReport(): allExtracts.size() = " + allExtracts.size() + " extract.getName() = " + extract.getName() + " extractDnaList.size() = " + extractDnaList.size() + " extractRnaList.size() = " + extractRnaList.size()); |
3505 |
23 Sep 15 |
olle |
411 |
} |
3505 |
23 Sep 15 |
olle |
// Create list of view types for plots |
3505 |
23 Sep 15 |
olle |
413 |
List<String> viewTypeList = new ArrayList<String>(); |
3505 |
23 Sep 15 |
olle |
414 |
if (viewType.equals(quarterMonthView)) |
3505 |
23 Sep 15 |
olle |
415 |
{ |
3505 |
23 Sep 15 |
olle |
// Create plots for quarter and month |
3505 |
23 Sep 15 |
olle |
417 |
viewTypeList.add(ReportTableUtil.quarterView); |
3505 |
23 Sep 15 |
olle |
418 |
viewTypeList.add(ReportTableUtil.monthView); |
3505 |
23 Sep 15 |
olle |
419 |
} |
3505 |
23 Sep 15 |
olle |
420 |
else |
3505 |
23 Sep 15 |
olle |
421 |
{ |
3505 |
23 Sep 15 |
olle |
// Create plot(s) for one view type |
3505 |
23 Sep 15 |
olle |
423 |
viewTypeList.add(viewType); |
3505 |
23 Sep 15 |
olle |
424 |
} |
3505 |
23 Sep 15 |
olle |
// Create list of chart variants for plots |
3505 |
23 Sep 15 |
olle |
426 |
List<String> chartVariantList; |
3514 |
29 Sep 15 |
olle |
427 |
if (chartVariant.equals(ALL_CHARTS)) |
3505 |
23 Sep 15 |
olle |
428 |
{ |
3505 |
23 Sep 15 |
olle |
// Create several plots |
3505 |
23 Sep 15 |
olle |
430 |
chartVariantList = getChartVariantList(); |
3505 |
23 Sep 15 |
olle |
431 |
} |
3505 |
23 Sep 15 |
olle |
432 |
else |
3505 |
23 Sep 15 |
olle |
433 |
{ |
3505 |
23 Sep 15 |
olle |
// Create one plot |
3505 |
23 Sep 15 |
olle |
435 |
chartVariantList = new ArrayList<String>(); |
3505 |
23 Sep 15 |
olle |
436 |
chartVariantList.add(chartVariant); |
3505 |
23 Sep 15 |
olle |
437 |
} |
3505 |
23 Sep 15 |
olle |
// Create JSON array for plot data |
3505 |
23 Sep 15 |
olle |
439 |
JSONArray jsonStatisticsPlotArray = new JSONArray(); |
3505 |
23 Sep 15 |
olle |
// Create plot statistics data and put in JSON statistics plot array |
3505 |
23 Sep 15 |
olle |
441 |
for (String vType: viewTypeList) |
3505 |
23 Sep 15 |
olle |
442 |
{ |
3505 |
23 Sep 15 |
olle |
443 |
for (String cVariant: chartVariantList) |
3505 |
23 Sep 15 |
olle |
444 |
{ |
3505 |
23 Sep 15 |
olle |
// Get JSON statistics data |
3515 |
29 Sep 15 |
olle |
446 |
JSONObject plotJsonData = createJsonPlot(cVariant, startDate, endDate, vType, extractSourceFilter, projectFocusFilter, site); |
3505 |
23 Sep 15 |
olle |
447 |
/* |
3505 |
23 Sep 15 |
olle |
plotJsonData = addExtraInfo(plotJsonData, cVariant); |
3505 |
23 Sep 15 |
olle |
449 |
*/ |
3505 |
23 Sep 15 |
olle |
450 |
JSONObject plotJsonDataContainer = new JSONObject(); |
3505 |
23 Sep 15 |
olle |
451 |
plotJsonDataContainer.put("site", site == null ? null : site.asJSONObject()); |
3505 |
23 Sep 15 |
olle |
452 |
plotJsonDataContainer.put("chartVariant", cVariant); |
3505 |
23 Sep 15 |
olle |
453 |
plotJsonDataContainer.put("viewType", vType); |
3505 |
23 Sep 15 |
olle |
454 |
plotJsonDataContainer.put("plotData", plotJsonData); |
3505 |
23 Sep 15 |
olle |
455 |
String optionalHeadline = ""; |
3505 |
23 Sep 15 |
olle |
456 |
plotJsonDataContainer.put("optionalHeadline", optionalHeadline); |
3505 |
23 Sep 15 |
olle |
457 |
jsonStatisticsPlotArray.add(plotJsonDataContainer); |
3505 |
23 Sep 15 |
olle |
458 |
} |
3505 |
23 Sep 15 |
olle |
459 |
} |
3505 |
23 Sep 15 |
olle |
// Add JSON statistics plot array to report |
3505 |
23 Sep 15 |
olle |
461 |
jsonReport.put("plotStatistics", jsonStatisticsPlotArray); |
3505 |
23 Sep 15 |
olle |
462 |
/* |
3505 |
23 Sep 15 |
olle |
// Appended info |
3505 |
23 Sep 15 |
olle |
String appendedInfoText = ""; |
3505 |
23 Sep 15 |
olle |
// Add info on special samples if chart for min to RNAlater is selected |
3505 |
23 Sep 15 |
olle |
if (chartVariantList.contains(minutesToRnaLaterChart)) |
3505 |
23 Sep 15 |
olle |
467 |
{ |
3505 |
23 Sep 15 |
olle |
appendedInfoText += "<h2 class=\"pagebreak\">Appended Info</h2>"; |
3505 |
23 Sep 15 |
olle |
appendedInfoText += "<br>"; |
3505 |
23 Sep 15 |
olle |
appendedInfoText += createMinToRnaLaterAppendTextTable(dc, "Samples with negative min to RNAlater", sampleNegativeMinToRnaLaterList); |
3505 |
23 Sep 15 |
olle |
appendedInfoText += "<br>"; |
3505 |
23 Sep 15 |
olle |
appendedInfoText += createMinToRnaLaterAppendTextTable(dc, "Samples with zero min to RNAlater", sampleZeroMinToRnaLaterList); |
3505 |
23 Sep 15 |
olle |
appendedInfoText += "<br>"; |
3505 |
23 Sep 15 |
olle |
474 |
} |
3505 |
23 Sep 15 |
olle |
// Add JSON appended info to report |
3505 |
23 Sep 15 |
olle |
jsonReport.put("appendedInfo", appendedInfoText); |
3505 |
23 Sep 15 |
olle |
477 |
*/ |
3505 |
23 Sep 15 |
olle |
// Add other data to report |
3505 |
23 Sep 15 |
olle |
479 |
DateToStringConverter date2StringConverter = Meludi.CONVERTER_DATE_TO_STRING; |
3505 |
23 Sep 15 |
olle |
480 |
jsonReport.put("beginDate", date2StringConverter.convert(startDate)); |
3505 |
23 Sep 15 |
olle |
481 |
jsonReport.put("endDate", date2StringConverter.convert(endDate)); |
3505 |
23 Sep 15 |
olle |
482 |
// |
3505 |
23 Sep 15 |
olle |
483 |
json.put("report", jsonReport); |
3505 |
23 Sep 15 |
olle |
484 |
return json; |
3505 |
23 Sep 15 |
olle |
485 |
} |
3505 |
23 Sep 15 |
olle |
486 |
|
3505 |
23 Sep 15 |
olle |
487 |
/* |
3505 |
23 Sep 15 |
olle |
private List<Sample> createFilteredSampleList(DbControl dc, SnapshotManager manager, List<Sample> rawSampleList, String projectFocusFilter) |
3505 |
23 Sep 15 |
olle |
throws ServletException, IOException |
3505 |
23 Sep 15 |
olle |
490 |
{ |
3505 |
23 Sep 15 |
olle |
// Store samples that should be processed for report table in list |
3505 |
23 Sep 15 |
olle |
List<Sample> sampleList = new ArrayList<Sample>(); |
3505 |
23 Sep 15 |
olle |
for (Sample s: rawSampleList) |
3505 |
23 Sep 15 |
olle |
494 |
{ |
3505 |
23 Sep 15 |
olle |
// Optional project focus filter (true if no filter, or sample passes filter) |
3505 |
23 Sep 15 |
olle |
boolean passedProjectFocusFilter = passProjectFocusFilter(dc, manager, projectFocusFilter, s); |
3505 |
23 Sep 15 |
olle |
if (passedProjectFocusFilter) |
3505 |
23 Sep 15 |
olle |
498 |
{ |
3505 |
23 Sep 15 |
olle |
// Add sample to list |
3505 |
23 Sep 15 |
olle |
sampleList.add(s); |
3505 |
23 Sep 15 |
olle |
501 |
} |
3505 |
23 Sep 15 |
olle |
502 |
} |
3505 |
23 Sep 15 |
olle |
return sampleList; |
3505 |
23 Sep 15 |
olle |
504 |
} |
3505 |
23 Sep 15 |
olle |
505 |
*/ |
3505 |
23 Sep 15 |
olle |
506 |
|
3505 |
23 Sep 15 |
olle |
507 |
/** |
3505 |
23 Sep 15 |
olle |
* Optional site filter. Returns 'true' if no filter, |
3505 |
23 Sep 15 |
olle |
* or sample passes filter. |
3505 |
23 Sep 15 |
olle |
510 |
* |
3505 |
23 Sep 15 |
olle |
* @param dc DbControl The DbControl to use. |
3505 |
23 Sep 15 |
olle |
* @param manager SnapshotManager The annotation snapshot manager to use. |
3505 |
23 Sep 15 |
olle |
* @param siteFilter Site Optional site filter. |
3505 |
23 Sep 15 |
olle |
* @param s Sample The sample to test. |
3505 |
23 Sep 15 |
olle |
* @return boolean Returns 'true' if no filter, or sample passes filter. |
3505 |
23 Sep 15 |
olle |
516 |
*/ |
3505 |
23 Sep 15 |
olle |
517 |
private boolean passSiteFilter(DbControl dc, SnapshotManager manager, Site siteFilter, Sample s) |
3505 |
23 Sep 15 |
olle |
518 |
{ |
3505 |
23 Sep 15 |
olle |
519 |
boolean passedFilter = true; |
3505 |
23 Sep 15 |
olle |
// Optional site filter |
3505 |
23 Sep 15 |
olle |
521 |
if (siteFilter != null && siteFilter.getPrefix() != null) |
3505 |
23 Sep 15 |
olle |
522 |
{ |
3505 |
23 Sep 15 |
olle |
// Get site annotation |
3505 |
23 Sep 15 |
olle |
524 |
Site sampleSite = fetchSite(dc, manager, s); |
3505 |
23 Sep 15 |
olle |
525 |
if (siteFilter.equals(Site.UNKNOWN_RPT)) |
3505 |
23 Sep 15 |
olle |
526 |
{ |
3505 |
23 Sep 15 |
olle |
// Sample site unknown (site == null should be included) |
3505 |
23 Sep 15 |
olle |
528 |
if (sampleSite != null && sampleSite.getPrefix() != null && !sampleSite.getPrefix().equals(siteFilter.getPrefix())) |
3505 |
23 Sep 15 |
olle |
529 |
{ |
3505 |
23 Sep 15 |
olle |
530 |
passedFilter = false; |
3505 |
23 Sep 15 |
olle |
531 |
} |
3505 |
23 Sep 15 |
olle |
532 |
} |
3505 |
23 Sep 15 |
olle |
533 |
else |
3505 |
23 Sep 15 |
olle |
534 |
{ |
3505 |
23 Sep 15 |
olle |
// Specific site (site == null should not be included) |
3505 |
23 Sep 15 |
olle |
536 |
if (sampleSite == null || sampleSite.getPrefix() == null || !sampleSite.getPrefix().equals(siteFilter.getPrefix())) |
3505 |
23 Sep 15 |
olle |
537 |
{ |
3505 |
23 Sep 15 |
olle |
538 |
passedFilter = false; |
3505 |
23 Sep 15 |
olle |
539 |
} |
3505 |
23 Sep 15 |
olle |
540 |
} |
3505 |
23 Sep 15 |
olle |
//System.out.println(new Date() + " MeludiQuarterMonthReportServlet::passProjectFocusFilter(): projectFocusFilter = " + projectFocusFilter + " s.getName() = " + s.getName() + " projectFocus = " + projectFocus + " passedFilter = " + passedFilter); |
3505 |
23 Sep 15 |
olle |
542 |
} |
3505 |
23 Sep 15 |
olle |
543 |
return passedFilter; |
3505 |
23 Sep 15 |
olle |
544 |
} |
3505 |
23 Sep 15 |
olle |
545 |
|
3505 |
23 Sep 15 |
olle |
546 |
/** |
3505 |
23 Sep 15 |
olle |
* Returns the site for the sample, based on the site annotation for the case. |
3505 |
23 Sep 15 |
olle |
548 |
* |
3505 |
23 Sep 15 |
olle |
* @param dc DbControl The DbControl to use. |
3505 |
23 Sep 15 |
olle |
* @param manager SnapshotManager The SnapshotManager to use for speeding up annotation retrieval. |
3505 |
23 Sep 15 |
olle |
* @param s Sample The sample to find the site for. |
3505 |
23 Sep 15 |
olle |
* @return Site The site object found for the sample or UNKNOWN. |
3505 |
23 Sep 15 |
olle |
553 |
*/ |
3505 |
23 Sep 15 |
olle |
554 |
private Site fetchSite(DbControl dc, SnapshotManager manager, Sample s) |
3505 |
23 Sep 15 |
olle |
555 |
{ |
3505 |
23 Sep 15 |
olle |
556 |
Site site = Site.UNKNOWN; |
3505 |
23 Sep 15 |
olle |
// Find parent case item for sample |
3505 |
23 Sep 15 |
olle |
558 |
String prefix = null; |
3505 |
23 Sep 15 |
olle |
559 |
if (s != null) |
3505 |
23 Sep 15 |
olle |
560 |
{ |
3505 |
23 Sep 15 |
olle |
561 |
if (s.getItemSubtype().equals(getSubtypeCase())) |
3505 |
23 Sep 15 |
olle |
562 |
{ |
3505 |
23 Sep 15 |
olle |
563 |
prefix = (String) Annotationtype.SITE.getAnnotationValue(dc, manager, s); |
3505 |
23 Sep 15 |
olle |
564 |
} |
3505 |
23 Sep 15 |
olle |
565 |
else if (s.getItemSubtype().equals(getSubtypeSpecimen())) |
3505 |
23 Sep 15 |
olle |
566 |
{ |
3505 |
23 Sep 15 |
olle |
567 |
Sample theCase = (Sample) s.getParent(); |
3505 |
23 Sep 15 |
olle |
568 |
if (theCase != null) |
3505 |
23 Sep 15 |
olle |
569 |
{ |
3505 |
23 Sep 15 |
olle |
570 |
prefix = (String) Annotationtype.SITE.getAnnotationValue(dc, manager, theCase); |
3505 |
23 Sep 15 |
olle |
571 |
} |
3505 |
23 Sep 15 |
olle |
572 |
} |
3505 |
23 Sep 15 |
olle |
573 |
} |
3505 |
23 Sep 15 |
olle |
574 |
if (prefix != null) |
3505 |
23 Sep 15 |
olle |
575 |
{ |
3505 |
23 Sep 15 |
olle |
576 |
site = Site.findByPrefix(prefix); |
3505 |
23 Sep 15 |
olle |
577 |
} |
3505 |
23 Sep 15 |
olle |
578 |
return site; |
3505 |
23 Sep 15 |
olle |
579 |
} |
3505 |
23 Sep 15 |
olle |
580 |
|
3505 |
23 Sep 15 |
olle |
581 |
/** |
3505 |
23 Sep 15 |
olle |
* Optional project focus filter. Returns 'true' if no filter, |
3505 |
23 Sep 15 |
olle |
* or sample passes filter. |
3505 |
23 Sep 15 |
olle |
584 |
* |
3505 |
23 Sep 15 |
olle |
* @param dc DbControl The DbControl to use. |
3505 |
23 Sep 15 |
olle |
* @param manager SnapshotManager The annotation snapshot manager to use. |
3505 |
23 Sep 15 |
olle |
* @param projectFocusFilter String Optional project focus filter. |
3505 |
23 Sep 15 |
olle |
* @param s Sample The sample to test. |
3505 |
23 Sep 15 |
olle |
* @return boolean Returns 'true' if no filter, or sample passes filter. |
3505 |
23 Sep 15 |
olle |
590 |
*/ |
3505 |
23 Sep 15 |
olle |
591 |
private boolean passProjectFocusFilter(DbControl dc, SnapshotManager manager, String projectFocusFilter, Sample s) |
3505 |
23 Sep 15 |
olle |
592 |
{ |
3505 |
23 Sep 15 |
olle |
593 |
boolean passedFilter = true; |
3505 |
23 Sep 15 |
olle |
// Optional project focus filter |
3505 |
23 Sep 15 |
olle |
595 |
if (projectFocusFilter != null && !projectFocusFilter.equals(InstallServlet.PROJECTFOCUS_NONE)) |
3505 |
23 Sep 15 |
olle |
596 |
{ |
3505 |
23 Sep 15 |
olle |
// Get project focus annotation |
3505 |
23 Sep 15 |
olle |
598 |
String projectFocus = fetchProjectFocus(dc, manager, s); |
3505 |
23 Sep 15 |
olle |
599 |
if (projectFocusFilter.equals(InstallServlet.PROJECTFOCUS_UNKNOWN)) |
3505 |
23 Sep 15 |
olle |
600 |
{ |
3505 |
23 Sep 15 |
olle |
// Sample project focus unknown (project focus == null should be included) |
3505 |
23 Sep 15 |
olle |
602 |
if (projectFocus != null && !projectFocus.equals(projectFocusFilter)) |
3505 |
23 Sep 15 |
olle |
603 |
{ |
3505 |
23 Sep 15 |
olle |
604 |
passedFilter = false; |
3505 |
23 Sep 15 |
olle |
605 |
} |
3505 |
23 Sep 15 |
olle |
606 |
} |
3505 |
23 Sep 15 |
olle |
607 |
else |
3505 |
23 Sep 15 |
olle |
608 |
{ |
3505 |
23 Sep 15 |
olle |
// Specific project focus (project focus == null should not be included) |
3505 |
23 Sep 15 |
olle |
610 |
if (projectFocus == null || !projectFocus.equals(projectFocusFilter)) |
3505 |
23 Sep 15 |
olle |
611 |
{ |
3505 |
23 Sep 15 |
olle |
612 |
passedFilter = false; |
3505 |
23 Sep 15 |
olle |
613 |
} |
3505 |
23 Sep 15 |
olle |
614 |
} |
3505 |
23 Sep 15 |
olle |
//System.out.println(new Date() + " MeludiQuarterMonthReportServlet::passProjectFocusFilter(): projectFocusFilter = " + projectFocusFilter + " s.getName() = " + s.getName() + " projectFocus = " + projectFocus + " passedFilter = " + passedFilter); |
3505 |
23 Sep 15 |
olle |
616 |
} |
3505 |
23 Sep 15 |
olle |
617 |
return passedFilter; |
3505 |
23 Sep 15 |
olle |
618 |
} |
3505 |
23 Sep 15 |
olle |
619 |
|
3505 |
23 Sep 15 |
olle |
620 |
/** |
3505 |
23 Sep 15 |
olle |
* Returns project focus for the sample, based on the ProjectFocus annotation for the case. |
3505 |
23 Sep 15 |
olle |
622 |
* |
3505 |
23 Sep 15 |
olle |
* @param dc DbControl The DbControl to use. |
3505 |
23 Sep 15 |
olle |
* @param manager SnapshotManager The SnapshotManager to use for speeding up annotation retrieval. |
3505 |
23 Sep 15 |
olle |
* @param s Sample The sample to find the project focus for. |
3505 |
23 Sep 15 |
olle |
* @return String The project focus for the sample, or `null`. |
3505 |
23 Sep 15 |
olle |
627 |
*/ |
3505 |
23 Sep 15 |
olle |
628 |
private String fetchProjectFocus(DbControl dc, SnapshotManager manager, Sample s) |
3505 |
23 Sep 15 |
olle |
629 |
{ |
3505 |
23 Sep 15 |
olle |
630 |
String projectFocus = null; |
3505 |
23 Sep 15 |
olle |
// Find parent case item for sample |
3505 |
23 Sep 15 |
olle |
632 |
if (s != null) |
3505 |
23 Sep 15 |
olle |
633 |
{ |
3505 |
23 Sep 15 |
olle |
634 |
if (s.getItemSubtype().equals(getSubtypeCase())) |
3505 |
23 Sep 15 |
olle |
635 |
{ |
3505 |
23 Sep 15 |
olle |
636 |
projectFocus = (String) Annotationtype.PROJECT_FOCUS.getAnnotationValue(dc, manager, s); |
3505 |
23 Sep 15 |
olle |
637 |
} |
3505 |
23 Sep 15 |
olle |
638 |
else if (s.getItemSubtype().equals(getSubtypeSpecimen())) |
3505 |
23 Sep 15 |
olle |
639 |
{ |
3505 |
23 Sep 15 |
olle |
640 |
Sample theCase = (Sample) s.getParent(); |
3505 |
23 Sep 15 |
olle |
641 |
if (theCase != null) |
3505 |
23 Sep 15 |
olle |
642 |
{ |
3505 |
23 Sep 15 |
olle |
643 |
projectFocus = (String) Annotationtype.PROJECT_FOCUS.getAnnotationValue(dc, manager, theCase); |
3505 |
23 Sep 15 |
olle |
644 |
} |
3505 |
23 Sep 15 |
olle |
645 |
} |
3505 |
23 Sep 15 |
olle |
646 |
} |
3505 |
23 Sep 15 |
olle |
647 |
return projectFocus; |
3505 |
23 Sep 15 |
olle |
648 |
} |
3505 |
23 Sep 15 |
olle |
649 |
|
3505 |
23 Sep 15 |
olle |
650 |
/* |
3505 |
23 Sep 15 |
olle |
private String createMinToRnaLaterAppendTextTable(DbControl dc, String title, List<Sample> sampleList) |
3505 |
23 Sep 15 |
olle |
652 |
{ |
3505 |
23 Sep 15 |
olle |
// Note: Generated HTML code refers to classes defined in resources/meludi.css |
3505 |
23 Sep 15 |
olle |
String text = "<table class='reporttable'>"; |
3505 |
23 Sep 15 |
olle |
// Report header |
3505 |
23 Sep 15 |
olle |
text += "<tr>"; |
3505 |
23 Sep 15 |
olle |
text += "<td class='reportheader' colspan='4'>" + title + "</td>"; |
3505 |
23 Sep 15 |
olle |
text += "</tr>"; |
3505 |
23 Sep 15 |
olle |
// Report header |
3505 |
23 Sep 15 |
olle |
text += "<tr>"; |
3505 |
23 Sep 15 |
olle |
text += "<td class='reportsubheader'>Sample</td>"; |
3505 |
23 Sep 15 |
olle |
text += "<td class='reportsubheader'>Sampling date</td>"; |
3505 |
23 Sep 15 |
olle |
text += "<td class='reportsubheader'>RNAlater date</td>"; |
3505 |
23 Sep 15 |
olle |
text += "<td class='reportsubheader noprint'>Case summary</td>"; |
3505 |
23 Sep 15 |
olle |
text += "</tr>"; |
3505 |
23 Sep 15 |
olle |
DateToStringConverter dateFormat = new DateToStringConverter(new SimpleDateFormat("yyyy-MM-dd HH:mm")); |
3505 |
23 Sep 15 |
olle |
for (Sample s: sampleList) |
3505 |
23 Sep 15 |
olle |
668 |
{ |
3505 |
23 Sep 15 |
olle |
Date samplingDate = sampleIdSamplingDateHashMap.get(s.getId()); |
3505 |
23 Sep 15 |
olle |
Date rnaLaterDate = sampleIdRnaLaterDateHashMap.get(s.getId()); |
3505 |
23 Sep 15 |
olle |
String samplingDateStr = dateFormat.convert(samplingDate); |
3505 |
23 Sep 15 |
olle |
String rnaLaterDateStr = dateFormat.convert(rnaLaterDate); |
3505 |
23 Sep 15 |
olle |
// Case name equals the sample name before first "." |
3505 |
23 Sep 15 |
olle |
String caseName = s.getName(); |
3505 |
23 Sep 15 |
olle |
int dotIndex = s.getName().indexOf("."); |
3505 |
23 Sep 15 |
olle |
if (dotIndex >= 0) |
3505 |
23 Sep 15 |
olle |
677 |
{ |
3505 |
23 Sep 15 |
olle |
caseName = s.getName().substring(0, dotIndex); |
3505 |
23 Sep 15 |
olle |
679 |
} |
3505 |
23 Sep 15 |
olle |
String caseSummaryButtonCode = createCaseSummaryButton(dc, caseName); |
3505 |
23 Sep 15 |
olle |
text += "<tr>"; |
3505 |
23 Sep 15 |
olle |
text += "<td class='reportdata'>" + s.getName() + "</td>"; |
3505 |
23 Sep 15 |
olle |
text += "<td class='reportdata'>" + samplingDateStr + "</td>"; |
3505 |
23 Sep 15 |
olle |
text += "<td class='reportdata'>" + rnaLaterDateStr + "</td>"; |
3505 |
23 Sep 15 |
olle |
text += "<td class='reportdata noprint'>" + caseSummaryButtonCode + "</td>"; |
3505 |
23 Sep 15 |
olle |
text += "</tr>"; |
3505 |
23 Sep 15 |
olle |
687 |
} |
3505 |
23 Sep 15 |
olle |
text += "</table>"; |
3505 |
23 Sep 15 |
olle |
return text; |
3505 |
23 Sep 15 |
olle |
690 |
} |
3505 |
23 Sep 15 |
olle |
691 |
*/ |
3505 |
23 Sep 15 |
olle |
692 |
|
3505 |
23 Sep 15 |
olle |
693 |
private String createCaseSummaryButton(DbControl dc, String caseName) |
3505 |
23 Sep 15 |
olle |
694 |
{ |
3505 |
23 Sep 15 |
olle |
695 |
String sessionId = dc.getSessionControl().getId(); |
3505 |
23 Sep 15 |
olle |
696 |
caseName = HTML.encodeTags(caseName); |
3505 |
23 Sep 15 |
olle |
697 |
String htmlStr ="<div class=\"link case-summary\" data-case-name=\""+caseName + "\" title=\"MeLuDI: Show summary of case #" + caseName + "\"><img src=\"../images/case_summary.png\"> " + caseName + "</div>"; |
3505 |
23 Sep 15 |
olle |
698 |
return htmlStr; |
3505 |
23 Sep 15 |
olle |
699 |
} |
3505 |
23 Sep 15 |
olle |
700 |
|
3515 |
29 Sep 15 |
olle |
701 |
private JSONObject createJsonPlot(String chartVariant, Date startDate, Date endDate, String viewType, String extractSourceFilter, String projectFocusFilter, Site site) |
3505 |
23 Sep 15 |
olle |
702 |
throws ServletException, IOException |
3505 |
23 Sep 15 |
olle |
703 |
{ |
3505 |
23 Sep 15 |
olle |
// Get JSON statistics data |
3515 |
29 Sep 15 |
olle |
705 |
String chartHeaderTitle = fetchChartHeaderTitle(chartVariant, viewType, extractSourceFilter, projectFocusFilter, site); |
3505 |
23 Sep 15 |
olle |
706 |
String chartTitle = fetchChartTitle(chartVariant); |
3505 |
23 Sep 15 |
olle |
707 |
String chartYAxisTitle = fetchChartYAxisTitle(chartVariant); |
3505 |
23 Sep 15 |
olle |
// Get HashMap with lists of samples for chosen time periods |
3505 |
23 Sep 15 |
olle |
709 |
HashMap<String,List<Float>> periodStringFloatListHashMap = createPeriodStringFloatListHashMap(chartVariant, startDate, endDate, viewType); |
3505 |
23 Sep 15 |
olle |
710 |
JSONObject jsonPlotStatistics = createJSONPlotStatistics(chartVariant, chartHeaderTitle, chartTitle, chartYAxisTitle, periodStringFloatListHashMap, viewType); |
3505 |
23 Sep 15 |
olle |
711 |
return jsonPlotStatistics; |
3505 |
23 Sep 15 |
olle |
712 |
} |
3505 |
23 Sep 15 |
olle |
713 |
|
3505 |
23 Sep 15 |
olle |
714 |
@SuppressWarnings("unchecked") |
3505 |
23 Sep 15 |
olle |
715 |
private JSONObject createJSONPlotStatistics(String chartVariant, String headerTitle, String title, String variableTitle, HashMap<String,List<Float>> periodStringFloatListHashMap, String viewType) |
3505 |
23 Sep 15 |
olle |
716 |
throws ServletException, IOException |
3505 |
23 Sep 15 |
olle |
717 |
{ |
3505 |
23 Sep 15 |
olle |
// Calculate statistics for all samples |
3505 |
23 Sep 15 |
olle |
719 |
List<Float> floatList = singleFloatList(periodStringFloatListHashMap); |
3505 |
23 Sep 15 |
olle |
720 |
int numItems = floatList.size(); |
3505 |
23 Sep 15 |
olle |
721 |
Float floatMin = calculateMinValue(floatList); |
3505 |
23 Sep 15 |
olle |
722 |
Float floatMax = calculateMaxValue(floatList); |
3505 |
23 Sep 15 |
olle |
723 |
Float floatMean = calculateMeanValue(floatList); |
3505 |
23 Sep 15 |
olle |
724 |
Float floatSDev = calculateSDev(floatList); |
3505 |
23 Sep 15 |
olle |
725 |
Collections.sort(floatList); |
3505 |
23 Sep 15 |
olle |
726 |
Float floatPct25 = calculatePercentile(floatList, 0.25f); |
3505 |
23 Sep 15 |
olle |
727 |
Float floatPct50 = calculatePercentile(floatList, 0.50f); |
3505 |
23 Sep 15 |
olle |
728 |
Float floatPct75 = calculatePercentile(floatList, 0.75f); |
3514 |
29 Sep 15 |
olle |
729 |
int localNumberOfDecimals = NUM_DECIMALS; |
3505 |
23 Sep 15 |
olle |
730 |
if (floatPct25 != null && floatPct25 < 1) |
3505 |
23 Sep 15 |
olle |
731 |
{ |
3514 |
29 Sep 15 |
olle |
732 |
localNumberOfDecimals = NUM_DECIMALS + 1; |
3505 |
23 Sep 15 |
olle |
733 |
} |
3505 |
23 Sep 15 |
olle |
// Create JSON object with sample statistics |
3505 |
23 Sep 15 |
olle |
735 |
JSONObject jsonStat = new JSONObject(); |
3505 |
23 Sep 15 |
olle |
736 |
jsonStat.put("headerTitleTop", headerTitle); |
3505 |
23 Sep 15 |
olle |
737 |
jsonStat.put("titleTop", title); |
3505 |
23 Sep 15 |
olle |
738 |
jsonStat.put("titleBottom", ""); |
3505 |
23 Sep 15 |
olle |
739 |
jsonStat.put("subTitleRight", "n = " + numItems); |
3505 |
23 Sep 15 |
olle |
740 |
jsonStat.put("subTitleLeft01", "mean, " + Values.formatNumber(floatMean, localNumberOfDecimals)); |
3505 |
23 Sep 15 |
olle |
741 |
jsonStat.put("subTitleLeft02", "sd, " + Values.formatNumber(floatSDev, localNumberOfDecimals)); |
3505 |
23 Sep 15 |
olle |
742 |
jsonStat.put("subTitleLeft03", "range, " + Values.formatNumber(floatMin, localNumberOfDecimals) + ", " + Values.formatNumber(floatMax, localNumberOfDecimals)); |
3505 |
23 Sep 15 |
olle |
743 |
jsonStat.put("yAxisTitleLeft", variableTitle); |
3505 |
23 Sep 15 |
olle |
744 |
jsonStat.put("yAxisTitleRight", ""); |
3505 |
23 Sep 15 |
olle |
// Create JSON array of sample statistics for time periods |
3505 |
23 Sep 15 |
olle |
746 |
JSONArray jsonPeriodPercentilesArray = new JSONArray(); |
3505 |
23 Sep 15 |
olle |
747 |
List<String> periodList = new ArrayList<String>(); |
3505 |
23 Sep 15 |
olle |
748 |
for (String period: periodStringFloatListHashMap.keySet()) |
3505 |
23 Sep 15 |
olle |
749 |
{ |
3505 |
23 Sep 15 |
olle |
750 |
periodList.add(period); |
3505 |
23 Sep 15 |
olle |
751 |
} |
3505 |
23 Sep 15 |
olle |
752 |
Collections.sort(periodList); |
3505 |
23 Sep 15 |
olle |
753 |
for (String period: periodList) |
3505 |
23 Sep 15 |
olle |
754 |
{ |
3505 |
23 Sep 15 |
olle |
//System.out.println(new Date() + " MeludiQuarterMonthReportServlet::createJSONPlotStatistics(): period = " + period + " periodStringFloatListHashMap.get(period).size() = " + periodStringFloatListHashMap.get(period).size()); |
3505 |
23 Sep 15 |
olle |
756 |
if (periodStringFloatListHashMap.get(period).size() >= minItemsForStatisticsCalculation) |
3505 |
23 Sep 15 |
olle |
757 |
{ |
3505 |
23 Sep 15 |
olle |
758 |
List<Float> periodFloatList = periodStringFloatListHashMap.get(period); |
3505 |
23 Sep 15 |
olle |
// Get name of time period in standard format for plot |
3505 |
23 Sep 15 |
olle |
760 |
String periodName = fetchPeriodNameForPlot(period, viewType); |
3505 |
23 Sep 15 |
olle |
761 |
JSONObject jsonPeriodData = createSamplePeriodJSONStatistics(periodFloatList, periodName); |
3505 |
23 Sep 15 |
olle |
762 |
jsonPeriodPercentilesArray.add(jsonPeriodData); |
3505 |
23 Sep 15 |
olle |
763 |
} |
3505 |
23 Sep 15 |
olle |
764 |
} |
3505 |
23 Sep 15 |
olle |
765 |
jsonStat.put("percentileData", jsonPeriodPercentilesArray); |
3505 |
23 Sep 15 |
olle |
// Create JSON array of percentile data for all samples |
3505 |
23 Sep 15 |
olle |
767 |
JSONArray jsonPercentilesArray = new JSONArray(); |
3505 |
23 Sep 15 |
olle |
768 |
JSONObject jsonPct25 = createValueWithText(floatPct25, localNumberOfDecimals); |
3505 |
23 Sep 15 |
olle |
769 |
jsonPercentilesArray.add(jsonPct25); |
3505 |
23 Sep 15 |
olle |
770 |
JSONObject jsonPct50 = createValueWithText(floatPct50, localNumberOfDecimals); |
3505 |
23 Sep 15 |
olle |
771 |
jsonPercentilesArray.add(jsonPct50); |
3505 |
23 Sep 15 |
olle |
772 |
JSONObject jsonPct75 = createValueWithText(floatPct75, localNumberOfDecimals); |
3505 |
23 Sep 15 |
olle |
773 |
jsonPercentilesArray.add(jsonPct75); |
3505 |
23 Sep 15 |
olle |
774 |
jsonStat.put("valueGuideLinesY", jsonPercentilesArray); |
3505 |
23 Sep 15 |
olle |
775 |
return jsonStat; |
3505 |
23 Sep 15 |
olle |
776 |
} |
3505 |
23 Sep 15 |
olle |
777 |
|
3505 |
23 Sep 15 |
olle |
778 |
private JSONObject createValueWithText(Float value, int numberOfDecimalsShown) |
3505 |
23 Sep 15 |
olle |
779 |
{ |
3505 |
23 Sep 15 |
olle |
780 |
if (value == null) |
3505 |
23 Sep 15 |
olle |
781 |
{ |
3505 |
23 Sep 15 |
olle |
782 |
return null; |
3505 |
23 Sep 15 |
olle |
783 |
} |
3505 |
23 Sep 15 |
olle |
784 |
JSONObject jsonValueWithText = createValueWithText(value, Values.formatNumber(value, numberOfDecimalsShown)); |
3505 |
23 Sep 15 |
olle |
785 |
return jsonValueWithText; |
3505 |
23 Sep 15 |
olle |
786 |
} |
3505 |
23 Sep 15 |
olle |
787 |
|
3505 |
23 Sep 15 |
olle |
788 |
@SuppressWarnings("unchecked") |
3505 |
23 Sep 15 |
olle |
789 |
private JSONObject createValueWithText(Float value, String text) |
3505 |
23 Sep 15 |
olle |
790 |
{ |
3505 |
23 Sep 15 |
olle |
791 |
if (value == null) |
3505 |
23 Sep 15 |
olle |
792 |
{ |
3505 |
23 Sep 15 |
olle |
793 |
return null; |
3505 |
23 Sep 15 |
olle |
794 |
} |
3505 |
23 Sep 15 |
olle |
795 |
JSONObject jsonValueWithText = new JSONObject(); |
3505 |
23 Sep 15 |
olle |
796 |
jsonValueWithText.put("value", value); |
3505 |
23 Sep 15 |
olle |
797 |
jsonValueWithText.put("text", text); |
3505 |
23 Sep 15 |
olle |
798 |
return jsonValueWithText; |
3505 |
23 Sep 15 |
olle |
799 |
} |
3505 |
23 Sep 15 |
olle |
800 |
|
3505 |
23 Sep 15 |
olle |
801 |
@SuppressWarnings("unchecked") |
3505 |
23 Sep 15 |
olle |
802 |
private JSONObject createSamplePeriodJSONStatistics(List<Float> floatList, String periodName) |
3505 |
23 Sep 15 |
olle |
803 |
throws ServletException, IOException |
3505 |
23 Sep 15 |
olle |
804 |
{ |
3505 |
23 Sep 15 |
olle |
// Calculate statistics for samples |
3505 |
23 Sep 15 |
olle |
806 |
int numItems = floatList.size(); |
3505 |
23 Sep 15 |
olle |
807 |
Collections.sort(floatList); |
3505 |
23 Sep 15 |
olle |
//Float floatPct05 = calculatePercentile(floatList, 0.05f); |
3505 |
23 Sep 15 |
olle |
809 |
Float floatPct25 = calculatePercentile(floatList, 0.25f); |
3505 |
23 Sep 15 |
olle |
810 |
Float floatPct50 = calculatePercentile(floatList, 0.50f); |
3505 |
23 Sep 15 |
olle |
811 |
Float floatPct75 = calculatePercentile(floatList, 0.75f); |
3505 |
23 Sep 15 |
olle |
//Float floatPct95 = calculatePercentile(floatList, 0.95f); |
3505 |
23 Sep 15 |
olle |
// Inter-percentile range ipr = pct75 - pct25 |
3505 |
23 Sep 15 |
olle |
// Calculate whisker values as lowest and highest data values within coef*ipr from box ends |
3505 |
23 Sep 15 |
olle |
815 |
float coef = 1.5f; |
3505 |
23 Sep 15 |
olle |
816 |
Float w1 = calculateBoxPlotWhiskerValue(floatList, floatPct25, floatPct75, coef, "lower"); |
3505 |
23 Sep 15 |
olle |
817 |
Float w2 = calculateBoxPlotWhiskerValue(floatList, floatPct25, floatPct75, coef, "upper"); |
3505 |
23 Sep 15 |
olle |
// Create JSON object with sample statistics for period |
3505 |
23 Sep 15 |
olle |
819 |
JSONObject jsonStat = new JSONObject(); |
3505 |
23 Sep 15 |
olle |
820 |
jsonStat.put("name", periodName); |
3505 |
23 Sep 15 |
olle |
821 |
jsonStat.put("numItems", numItems); |
3505 |
23 Sep 15 |
olle |
822 |
jsonStat.put("v1", w1); |
3505 |
23 Sep 15 |
olle |
823 |
jsonStat.put("v2", floatPct25); |
3505 |
23 Sep 15 |
olle |
824 |
jsonStat.put("v3", floatPct50); |
3505 |
23 Sep 15 |
olle |
825 |
jsonStat.put("v4", floatPct75); |
3505 |
23 Sep 15 |
olle |
826 |
jsonStat.put("v5", w2); |
3505 |
23 Sep 15 |
olle |
827 |
return jsonStat; |
3505 |
23 Sep 15 |
olle |
828 |
} |
3505 |
23 Sep 15 |
olle |
829 |
|
3505 |
23 Sep 15 |
olle |
830 |
/** |
3505 |
23 Sep 15 |
olle |
* Returns a period string intended for use as label in box plot. |
3505 |
23 Sep 15 |
olle |
* The period string will be modified as follows for different view types:<br> |
3505 |
23 Sep 15 |
olle |
* Year view: yyyy -> yyyy (no change)<br> |
3505 |
23 Sep 15 |
olle |
* Quarter view: yyyyq -> yyyy-Qq (e.g. 20123 -> 2012-Q3)<br> |
3505 |
23 Sep 15 |
olle |
* Month view: yyyymm -> yyyy-mm (e.g. 201203 -> 2012-03)<br> |
3505 |
23 Sep 15 |
olle |
* Week view: yyyyww -> yyyy-ww (e.g. 201203 -> 2012-03)<br> |
3505 |
23 Sep 15 |
olle |
837 |
* |
3505 |
23 Sep 15 |
olle |
* @param period String The period string in pure number format. |
3505 |
23 Sep 15 |
olle |
* @param viewType String The view type. |
3505 |
23 Sep 15 |
olle |
* @return String A period string intended for use as label in box plot. |
3505 |
23 Sep 15 |
olle |
841 |
*/ |
3505 |
23 Sep 15 |
olle |
842 |
private String fetchPeriodNameForPlot(String period, String viewType) |
3505 |
23 Sep 15 |
olle |
843 |
{ |
3505 |
23 Sep 15 |
olle |
844 |
if (period == null || period.length() < 4) |
3505 |
23 Sep 15 |
olle |
845 |
{ |
3505 |
23 Sep 15 |
olle |
846 |
return period; |
3505 |
23 Sep 15 |
olle |
847 |
} |
3505 |
23 Sep 15 |
olle |
848 |
String yearStr = period.substring(0,4); |
3505 |
23 Sep 15 |
olle |
849 |
String residueStr = period.substring(4); |
3505 |
23 Sep 15 |
olle |
// Add year string |
3505 |
23 Sep 15 |
olle |
851 |
String periodName = yearStr; |
3505 |
23 Sep 15 |
olle |
852 |
if (residueStr.length() > 0) |
3505 |
23 Sep 15 |
olle |
853 |
{ |
3505 |
23 Sep 15 |
olle |
// Add hyphen after year string |
3505 |
23 Sep 15 |
olle |
855 |
periodName += "-"; |
3505 |
23 Sep 15 |
olle |
856 |
if (viewType.equals(ReportTableUtil.quarterView)) |
3505 |
23 Sep 15 |
olle |
857 |
{ |
3505 |
23 Sep 15 |
olle |
// Add 'Q' after year string |
3505 |
23 Sep 15 |
olle |
859 |
periodName += "Q"; |
3505 |
23 Sep 15 |
olle |
860 |
} |
3505 |
23 Sep 15 |
olle |
// Add residue string (quarter, month, or week string) |
3505 |
23 Sep 15 |
olle |
862 |
periodName += residueStr; |
3505 |
23 Sep 15 |
olle |
863 |
} |
3505 |
23 Sep 15 |
olle |
864 |
return periodName; |
3505 |
23 Sep 15 |
olle |
865 |
} |
3505 |
23 Sep 15 |
olle |
866 |
|
3505 |
23 Sep 15 |
olle |
867 |
private HashMap<String, List<Float>> createPeriodStringFloatListHashMap(String chartVariant, Date startDate, Date endDate, String viewType) |
3505 |
23 Sep 15 |
olle |
868 |
throws ServletException, IOException |
3505 |
23 Sep 15 |
olle |
869 |
{ |
3505 |
23 Sep 15 |
olle |
//System.out.println(new Date() + " MeludiQuarterMonthReportServlet::createPeriodStringFloatListHashMap(): chartVariant = " + chartVariant + " startDate = " + startDate + " endDate = " + endDate + " viewType = " + viewType); |
3505 |
23 Sep 15 |
olle |
// Create HashMap to keep track of values for each time period |
3505 |
23 Sep 15 |
olle |
872 |
HashMap<String, List<Float>> periodStringFloatListHashMap = new HashMap<String, List<Float>>(); |
3505 |
23 Sep 15 |
olle |
873 |
|
3514 |
29 Sep 15 |
olle |
874 |
if (chartVariant.equals(ORIGINAL_QUANTITY_DNA_CHART)) |
3505 |
23 Sep 15 |
olle |
875 |
{ |
3505 |
23 Sep 15 |
olle |
//System.out.println(new Date() + " MeludiQuarterMonthReportServlet::createPeriodStringFloatListHashMap(): extractDnaList.size() = " + extractDnaList.size()); |
3505 |
23 Sep 15 |
olle |
877 |
for (Extract e: extractDnaList) |
3505 |
23 Sep 15 |
olle |
878 |
{ |
3505 |
23 Sep 15 |
olle |
// Use QiaCube date of extract |
3505 |
23 Sep 15 |
olle |
880 |
Date date = extractIdQiaCubeDateHashMap.get(e.getId()); |
3505 |
23 Sep 15 |
olle |
//System.out.println(new Date() + " MeludiQuarterMonthReportServlet::createPeriodStringFloatListHashMap(): e.getName() = " + e.getName() + " QIACube date = " + date); |
3505 |
23 Sep 15 |
olle |
882 |
if (date != null) |
3505 |
23 Sep 15 |
olle |
883 |
{ |
3505 |
23 Sep 15 |
olle |
884 |
if ((date.after(startDate) || date.equals(startDate)) && |
3505 |
23 Sep 15 |
olle |
885 |
(date.before(endDate) || date.equals(endDate))) |
3505 |
23 Sep 15 |
olle |
886 |
{ |
3505 |
23 Sep 15 |
olle |
// Get current period |
3505 |
23 Sep 15 |
olle |
888 |
String currentPeriod = tableUtil.getCurrentPeriod(date, viewType); |
3505 |
23 Sep 15 |
olle |
// Update period value hash map |
3505 |
23 Sep 15 |
olle |
890 |
Float value = null; |
3505 |
23 Sep 15 |
olle |
// Get DNA original quantity in microgram |
3505 |
23 Sep 15 |
olle |
892 |
value = e.getOriginalQuantity(); |
3505 |
23 Sep 15 |
olle |
893 |
updateStringFloatListHashMap(periodStringFloatListHashMap, currentPeriod, value); |
3505 |
23 Sep 15 |
olle |
894 |
} |
3505 |
23 Sep 15 |
olle |
895 |
} |
3505 |
23 Sep 15 |
olle |
896 |
} |
3505 |
23 Sep 15 |
olle |
897 |
} |
3514 |
29 Sep 15 |
olle |
898 |
else if (chartVariant.equals(DELTA_CT_DNA_CHART)) |
3505 |
23 Sep 15 |
olle |
899 |
{ |
3505 |
23 Sep 15 |
olle |
//System.out.println(new Date() + " MeludiQuarterMonthReportServlet::createPeriodStringFloatListHashMap(): extractDnaList.size() = " + extractDnaList.size()); |
3505 |
23 Sep 15 |
olle |
901 |
for (Extract e: extractDnaList) |
3505 |
23 Sep 15 |
olle |
902 |
{ |
3505 |
23 Sep 15 |
olle |
// Use QiaCube date of extract |
3505 |
23 Sep 15 |
olle |
904 |
Date date = extractIdQiaCubeDateHashMap.get(e.getId()); |
3505 |
23 Sep 15 |
olle |
//System.out.println(new Date() + " MeludiQuarterMonthReportServlet::createPeriodStringFloatListHashMap(): e.getName() = " + e.getName() + " QIACube date = " + date); |
3505 |
23 Sep 15 |
olle |
906 |
if (date != null) |
3505 |
23 Sep 15 |
olle |
907 |
{ |
3505 |
23 Sep 15 |
olle |
908 |
if ((date.after(startDate) || date.equals(startDate)) && |
3505 |
23 Sep 15 |
olle |
909 |
(date.before(endDate) || date.equals(endDate))) |
3505 |
23 Sep 15 |
olle |
910 |
{ |
3505 |
23 Sep 15 |
olle |
// Get current period |
3505 |
23 Sep 15 |
olle |
912 |
String currentPeriod = tableUtil.getCurrentPeriod(date, viewType); |
3505 |
23 Sep 15 |
olle |
// Update period value hash map |
3505 |
23 Sep 15 |
olle |
914 |
Float value = null; |
3505 |
23 Sep 15 |
olle |
// Get DNA delta-Ct value |
3505 |
23 Sep 15 |
olle |
916 |
value = extractIdDeltaCtHashMap.get(e.getId()); |
3505 |
23 Sep 15 |
olle |
917 |
updateStringFloatListHashMap(periodStringFloatListHashMap, currentPeriod, value); |
3505 |
23 Sep 15 |
olle |
918 |
} |
3505 |
23 Sep 15 |
olle |
919 |
} |
3505 |
23 Sep 15 |
olle |
920 |
} |
3505 |
23 Sep 15 |
olle |
921 |
} |
3514 |
29 Sep 15 |
olle |
922 |
else if (chartVariant.equals(ORIGINAL_QUANTITY_RNA_CHART)) |
3505 |
23 Sep 15 |
olle |
923 |
{ |
3505 |
23 Sep 15 |
olle |
//System.out.println(new Date() + " MeludiQuarterMonthReportServlet::createPeriodStringFloatListHashMap(): extractRnaList.size() = " + extractRnaList.size()); |
3505 |
23 Sep 15 |
olle |
925 |
for (Extract e: extractRnaList) |
3505 |
23 Sep 15 |
olle |
926 |
{ |
3505 |
23 Sep 15 |
olle |
// Use QiaCube date of extract |
3505 |
23 Sep 15 |
olle |
928 |
Date date = extractIdQiaCubeDateHashMap.get(e.getId()); |
3505 |
23 Sep 15 |
olle |
929 |
if (date != null) |
3505 |
23 Sep 15 |
olle |
930 |
{ |
3505 |
23 Sep 15 |
olle |
931 |
if ((date.after(startDate) || date.equals(startDate)) && |
3505 |
23 Sep 15 |
olle |
932 |
(date.before(endDate) || date.equals(endDate))) |
3505 |
23 Sep 15 |
olle |
933 |
{ |
3505 |
23 Sep 15 |
olle |
// Get current period |
3505 |
23 Sep 15 |
olle |
935 |
String currentPeriod = tableUtil.getCurrentPeriod(date, viewType); |
3505 |
23 Sep 15 |
olle |
// Update period value hash map |
3505 |
23 Sep 15 |
olle |
937 |
Float value = null; |
3505 |
23 Sep 15 |
olle |
// Get RNA original quantity in microgram |
3505 |
23 Sep 15 |
olle |
939 |
value = e.getOriginalQuantity(); |
3505 |
23 Sep 15 |
olle |
940 |
updateStringFloatListHashMap(periodStringFloatListHashMap, currentPeriod, value); |
3505 |
23 Sep 15 |
olle |
941 |
} |
3505 |
23 Sep 15 |
olle |
942 |
} |
3505 |
23 Sep 15 |
olle |
943 |
} |
3505 |
23 Sep 15 |
olle |
944 |
} |
3505 |
23 Sep 15 |
olle |
945 |
return periodStringFloatListHashMap; |
3505 |
23 Sep 15 |
olle |
946 |
} |
3505 |
23 Sep 15 |
olle |
947 |
|
3505 |
23 Sep 15 |
olle |
948 |
/* |
3505 |
23 Sep 15 |
olle |
@SuppressWarnings("unchecked") |
3505 |
23 Sep 15 |
olle |
private JSONObject addExtraInfo(JSONObject plotJsonData, String chartVariant) |
3505 |
23 Sep 15 |
olle |
951 |
{ |
3505 |
23 Sep 15 |
olle |
if (plotJsonData != null && chartVariant != null) |
3505 |
23 Sep 15 |
olle |
953 |
{ |
3505 |
23 Sep 15 |
olle |
if (chartVariant.equals(remainingQuantityForMeludiSpecimenChart)) |
3505 |
23 Sep 15 |
olle |
955 |
{ |
3505 |
23 Sep 15 |
olle |
String subTitleRight = (String) plotJsonData.get("subTitleRight"); |
3505 |
23 Sep 15 |
olle |
subTitleRight += "; > 1 mg, n = " + getNumRemainingTissueItemsGT1Mg(); |
3505 |
23 Sep 15 |
olle |
plotJsonData.put("subTitleRight", subTitleRight); |
3505 |
23 Sep 15 |
olle |
959 |
} |
3505 |
23 Sep 15 |
olle |
960 |
} |
3505 |
23 Sep 15 |
olle |
return plotJsonData; |
3505 |
23 Sep 15 |
olle |
962 |
} |
3505 |
23 Sep 15 |
olle |
963 |
*/ |
3505 |
23 Sep 15 |
olle |
964 |
|
3505 |
23 Sep 15 |
olle |
965 |
private HashMap<String, List<Float>> updateStringFloatListHashMap(HashMap<String, List<Float>> stringFloatListHashMap, String string, Float value) |
3505 |
23 Sep 15 |
olle |
966 |
{ |
3505 |
23 Sep 15 |
olle |
967 |
if (stringFloatListHashMap == null) |
3505 |
23 Sep 15 |
olle |
968 |
{ |
3505 |
23 Sep 15 |
olle |
969 |
stringFloatListHashMap = new HashMap<String, List<Float>>(); |
3505 |
23 Sep 15 |
olle |
970 |
} |
3505 |
23 Sep 15 |
olle |
971 |
if (string != null && !string.equals("") && value != null) |
3505 |
23 Sep 15 |
olle |
972 |
{ |
3505 |
23 Sep 15 |
olle |
973 |
List<Float> floatList = stringFloatListHashMap.get(string); |
3505 |
23 Sep 15 |
olle |
974 |
if (floatList == null) |
3505 |
23 Sep 15 |
olle |
975 |
{ |
3505 |
23 Sep 15 |
olle |
976 |
floatList = new ArrayList<Float>(); |
3505 |
23 Sep 15 |
olle |
977 |
} |
3505 |
23 Sep 15 |
olle |
978 |
floatList.add(value); |
3505 |
23 Sep 15 |
olle |
979 |
stringFloatListHashMap.put(string, floatList); |
3505 |
23 Sep 15 |
olle |
980 |
} |
3505 |
23 Sep 15 |
olle |
981 |
return stringFloatListHashMap; |
3505 |
23 Sep 15 |
olle |
982 |
} |
3505 |
23 Sep 15 |
olle |
983 |
|
3505 |
23 Sep 15 |
olle |
984 |
/** |
3505 |
23 Sep 15 |
olle |
* Returns a single List<Float> with all values in all the |
3505 |
23 Sep 15 |
olle |
* lists in the HashMap<String, List<Float>>. |
3505 |
23 Sep 15 |
olle |
987 |
* |
3505 |
23 Sep 15 |
olle |
* @param stringFloatListHashMap HashMap<String, List<Float>> The HashMap to use. |
3505 |
23 Sep 15 |
olle |
* @return List<Float> The list of float values in all the lists in the HashMap<String, List<Float>>. |
3505 |
23 Sep 15 |
olle |
990 |
*/ |
3505 |
23 Sep 15 |
olle |
991 |
private List<Float> singleFloatList(HashMap<String, List<Float>> stringFloatListHashMap) |
3505 |
23 Sep 15 |
olle |
992 |
{ |
3505 |
23 Sep 15 |
olle |
993 |
List<Float> singleFloatList = new ArrayList<Float>(); |
3505 |
23 Sep 15 |
olle |
994 |
for (List<Float> floatList: stringFloatListHashMap.values()) |
3505 |
23 Sep 15 |
olle |
995 |
{ |
3505 |
23 Sep 15 |
olle |
996 |
for (Float value: floatList) |
3505 |
23 Sep 15 |
olle |
997 |
{ |
3505 |
23 Sep 15 |
olle |
998 |
singleFloatList.add(value); |
3505 |
23 Sep 15 |
olle |
999 |
} |
3505 |
23 Sep 15 |
olle |
1000 |
} |
3505 |
23 Sep 15 |
olle |
1001 |
return singleFloatList; |
3505 |
23 Sep 15 |
olle |
1002 |
} |
3505 |
23 Sep 15 |
olle |
1003 |
|
3505 |
23 Sep 15 |
olle |
1004 |
private Float calculateMinValue(List<Float> floatList) |
3505 |
23 Sep 15 |
olle |
1005 |
{ |
3505 |
23 Sep 15 |
olle |
1006 |
Float floatMin = Float.valueOf("1000000000.0"); |
3505 |
23 Sep 15 |
olle |
1007 |
for (Float value: floatList) |
3505 |
23 Sep 15 |
olle |
1008 |
{ |
3505 |
23 Sep 15 |
olle |
1009 |
if (value != null && value < floatMin) |
3505 |
23 Sep 15 |
olle |
1010 |
{ |
3505 |
23 Sep 15 |
olle |
1011 |
floatMin = value; |
3505 |
23 Sep 15 |
olle |
1012 |
} |
3505 |
23 Sep 15 |
olle |
1013 |
} |
3505 |
23 Sep 15 |
olle |
1014 |
return floatMin; |
3505 |
23 Sep 15 |
olle |
1015 |
} |
3505 |
23 Sep 15 |
olle |
1016 |
|
3505 |
23 Sep 15 |
olle |
1017 |
private Float calculateMaxValue(List<Float> floatList) |
3505 |
23 Sep 15 |
olle |
1018 |
{ |
3505 |
23 Sep 15 |
olle |
1019 |
Float floatMax = Float.valueOf("-1000000000.0"); |
3505 |
23 Sep 15 |
olle |
1020 |
for (Float value: floatList) |
3505 |
23 Sep 15 |
olle |
1021 |
{ |
3505 |
23 Sep 15 |
olle |
1022 |
if (value != null && value > floatMax) |
3505 |
23 Sep 15 |
olle |
1023 |
{ |
3505 |
23 Sep 15 |
olle |
1024 |
floatMax = value; |
3505 |
23 Sep 15 |
olle |
1025 |
} |
3505 |
23 Sep 15 |
olle |
1026 |
} |
3505 |
23 Sep 15 |
olle |
1027 |
return floatMax; |
3505 |
23 Sep 15 |
olle |
1028 |
} |
3505 |
23 Sep 15 |
olle |
1029 |
|
3505 |
23 Sep 15 |
olle |
1030 |
private Float calculateMeanValue(List<Float> floatList) |
3505 |
23 Sep 15 |
olle |
1031 |
{ |
3505 |
23 Sep 15 |
olle |
1032 |
Float mean = Float.valueOf("0.0"); |
3505 |
23 Sep 15 |
olle |
1033 |
int n = 0; |
3505 |
23 Sep 15 |
olle |
1034 |
for (Float value: floatList) |
3505 |
23 Sep 15 |
olle |
1035 |
{ |
3505 |
23 Sep 15 |
olle |
1036 |
if (value != null) |
3505 |
23 Sep 15 |
olle |
1037 |
{ |
3505 |
23 Sep 15 |
olle |
1038 |
mean += value; |
3505 |
23 Sep 15 |
olle |
1039 |
n++; |
3505 |
23 Sep 15 |
olle |
1040 |
} |
3505 |
23 Sep 15 |
olle |
1041 |
} |
3505 |
23 Sep 15 |
olle |
1042 |
if (n > 0) |
3505 |
23 Sep 15 |
olle |
1043 |
{ |
3505 |
23 Sep 15 |
olle |
1044 |
mean /= n; |
3505 |
23 Sep 15 |
olle |
1045 |
} |
3505 |
23 Sep 15 |
olle |
1046 |
return mean; |
3505 |
23 Sep 15 |
olle |
1047 |
} |
3505 |
23 Sep 15 |
olle |
1048 |
|
3505 |
23 Sep 15 |
olle |
1049 |
private Float calculateSDev(List<Float> floatList) |
3505 |
23 Sep 15 |
olle |
1050 |
{ |
3505 |
23 Sep 15 |
olle |
1051 |
Float var = Float.valueOf("0.0"); |
3505 |
23 Sep 15 |
olle |
1052 |
Float mean = calculateMeanValue(floatList); |
3505 |
23 Sep 15 |
olle |
1053 |
int n = 0; |
3505 |
23 Sep 15 |
olle |
1054 |
Float dist = Float.valueOf("0.0"); |
3505 |
23 Sep 15 |
olle |
1055 |
for (Float value: floatList) |
3505 |
23 Sep 15 |
olle |
1056 |
{ |
3505 |
23 Sep 15 |
olle |
1057 |
if (value != null) |
3505 |
23 Sep 15 |
olle |
1058 |
{ |
3505 |
23 Sep 15 |
olle |
1059 |
dist = (value - mean); |
3505 |
23 Sep 15 |
olle |
1060 |
var += dist*dist; |
3505 |
23 Sep 15 |
olle |
1061 |
n++; |
3505 |
23 Sep 15 |
olle |
1062 |
} |
3505 |
23 Sep 15 |
olle |
1063 |
} |
3505 |
23 Sep 15 |
olle |
1064 |
if (n > 1) |
3505 |
23 Sep 15 |
olle |
1065 |
{ |
3505 |
23 Sep 15 |
olle |
1066 |
var /= (n - 1); |
3505 |
23 Sep 15 |
olle |
1067 |
} |
3505 |
23 Sep 15 |
olle |
1068 |
Float sDev = Double.valueOf(Math.sqrt(var)).floatValue(); |
3505 |
23 Sep 15 |
olle |
1069 |
return sDev; |
3505 |
23 Sep 15 |
olle |
1070 |
} |
3505 |
23 Sep 15 |
olle |
1071 |
|
3505 |
23 Sep 15 |
olle |
1072 |
private Float calculatePercentile(List<Float> sortedAscFloatList, float fraction) |
3505 |
23 Sep 15 |
olle |
1073 |
{ |
3505 |
23 Sep 15 |
olle |
1074 |
Float percentileValue = null; |
3505 |
23 Sep 15 |
olle |
1075 |
if (sortedAscFloatList == null || sortedAscFloatList.size() < 1 || fraction <= 0.0 || fraction >= 1.0) |
3505 |
23 Sep 15 |
olle |
1076 |
{ |
3505 |
23 Sep 15 |
olle |
1077 |
return null; |
3505 |
23 Sep 15 |
olle |
1078 |
} |
3505 |
23 Sep 15 |
olle |
1079 |
int len = sortedAscFloatList.size(); |
3505 |
23 Sep 15 |
olle |
// List index values goes from 0 to (len - 1) |
3505 |
23 Sep 15 |
olle |
1081 |
float indexVal = fraction*(len - 1); |
3505 |
23 Sep 15 |
olle |
1082 |
float floorVal = Double.valueOf(Math.floor(indexVal)).floatValue(); |
3505 |
23 Sep 15 |
olle |
1083 |
float ceilVal = Double.valueOf(Math.ceil(indexVal)).floatValue(); |
3505 |
23 Sep 15 |
olle |
1084 |
if (floorVal == ceilVal) |
3505 |
23 Sep 15 |
olle |
1085 |
{ |
3505 |
23 Sep 15 |
olle |
1086 |
percentileValue = sortedAscFloatList.get((int) indexVal); |
3505 |
23 Sep 15 |
olle |
1087 |
} |
3505 |
23 Sep 15 |
olle |
1088 |
else |
3505 |
23 Sep 15 |
olle |
1089 |
{ |
3505 |
23 Sep 15 |
olle |
// Calculate percentile value as weighted value of two list values |
3505 |
23 Sep 15 |
olle |
1091 |
float d0 = sortedAscFloatList.get((int) floorVal) * (ceilVal - indexVal); |
3505 |
23 Sep 15 |
olle |
1092 |
float d1 = sortedAscFloatList.get((int) ceilVal) * (indexVal - floorVal); |
3505 |
23 Sep 15 |
olle |
1093 |
percentileValue = d0 + d1; |
3505 |
23 Sep 15 |
olle |
1094 |
} |
3505 |
23 Sep 15 |
olle |
1095 |
return percentileValue; |
3505 |
23 Sep 15 |
olle |
1096 |
} |
3505 |
23 Sep 15 |
olle |
1097 |
|
3505 |
23 Sep 15 |
olle |
1098 |
private Float calculateBoxPlotWhiskerValue(List<Float> sortedAscFloatList, Float pct25, Float pct75, float coef, String plotEnd) |
3505 |
23 Sep 15 |
olle |
1099 |
{ |
3505 |
23 Sep 15 |
olle |
1100 |
Float whiskerValue = null; |
3505 |
23 Sep 15 |
olle |
1101 |
if (sortedAscFloatList == null || sortedAscFloatList.size() < 1 || pct25 == null || pct75 == null || coef <= 0.0 || plotEnd == null || !(plotEnd.equals("lower") || plotEnd.equals("upper"))) |
3505 |
23 Sep 15 |
olle |
1102 |
{ |
3505 |
23 Sep 15 |
olle |
1103 |
return null; |
3505 |
23 Sep 15 |
olle |
1104 |
} |
3505 |
23 Sep 15 |
olle |
1105 |
int len = sortedAscFloatList.size(); |
3505 |
23 Sep 15 |
olle |
// List index values goes from 0 to (len - 1) |
3505 |
23 Sep 15 |
olle |
1107 |
float ipr = pct75 - pct25; |
3505 |
23 Sep 15 |
olle |
1108 |
float limit = 0.0f; |
3505 |
23 Sep 15 |
olle |
1109 |
if (plotEnd.equals("lower")) |
3505 |
23 Sep 15 |
olle |
1110 |
{ |
3505 |
23 Sep 15 |
olle |
1111 |
limit = pct25 - ipr*coef; |
3505 |
23 Sep 15 |
olle |
1112 |
float value = 1000000000.0f; |
3505 |
23 Sep 15 |
olle |
1113 |
for (int i=(len-1); i >= 0; i--) |
3505 |
23 Sep 15 |
olle |
1114 |
{ |
3505 |
23 Sep 15 |
olle |
1115 |
value = sortedAscFloatList.get(i); |
3505 |
23 Sep 15 |
olle |
1116 |
if (value < limit) |
3505 |
23 Sep 15 |
olle |
1117 |
{ |
3505 |
23 Sep 15 |
olle |
1118 |
break; |
3505 |
23 Sep 15 |
olle |
1119 |
} |
3505 |
23 Sep 15 |
olle |
1120 |
whiskerValue = value; |
3505 |
23 Sep 15 |
olle |
1121 |
} |
3505 |
23 Sep 15 |
olle |
1122 |
} |
3505 |
23 Sep 15 |
olle |
1123 |
else if (plotEnd.equals("upper")) |
3505 |
23 Sep 15 |
olle |
1124 |
{ |
3505 |
23 Sep 15 |
olle |
1125 |
limit = pct75 + ipr*coef; |
3505 |
23 Sep 15 |
olle |
1126 |
float value = -1000000000.0f; |
3505 |
23 Sep 15 |
olle |
1127 |
for (int i=0; i < len; i++) |
3505 |
23 Sep 15 |
olle |
1128 |
{ |
3505 |
23 Sep 15 |
olle |
1129 |
value = sortedAscFloatList.get(i); |
3505 |
23 Sep 15 |
olle |
1130 |
if (value > limit) |
3505 |
23 Sep 15 |
olle |
1131 |
{ |
3505 |
23 Sep 15 |
olle |
1132 |
break; |
3505 |
23 Sep 15 |
olle |
1133 |
} |
3505 |
23 Sep 15 |
olle |
1134 |
whiskerValue = value; |
3505 |
23 Sep 15 |
olle |
1135 |
} |
3505 |
23 Sep 15 |
olle |
1136 |
} |
3505 |
23 Sep 15 |
olle |
1137 |
return whiskerValue; |
3505 |
23 Sep 15 |
olle |
1138 |
} |
3505 |
23 Sep 15 |
olle |
1139 |
|
3505 |
23 Sep 15 |
olle |
1140 |
/** |
3505 |
23 Sep 15 |
olle |
* Returns a chart header title given a chart variant string. |
3505 |
23 Sep 15 |
olle |
* If a plot is shown, this is normally the header title |
3505 |
23 Sep 15 |
olle |
* printed over the plot itself. |
3505 |
23 Sep 15 |
olle |
1144 |
* |
3505 |
23 Sep 15 |
olle |
* @param chartVariant String The chart variant to get a plot title for. |
3505 |
23 Sep 15 |
olle |
* @param viewType String The view type used for the period selection for the plot. |
3515 |
29 Sep 15 |
olle |
* @param extractSourceFilter String The extract source filter for the plot. |
3514 |
29 Sep 15 |
olle |
* @param projectFocusFilter String The project focus filter for the plot. |
3514 |
29 Sep 15 |
olle |
* @param site String The site used for the data selection for the plot. |
3505 |
23 Sep 15 |
olle |
* @return String A plot title for the given chart variant string. |
3505 |
23 Sep 15 |
olle |
1151 |
*/ |
3515 |
29 Sep 15 |
olle |
1152 |
private String fetchChartHeaderTitle(String chartVariant, String viewType, String extractSourceFilter, String projectFocusFilter, Site site) |
3505 |
23 Sep 15 |
olle |
1153 |
{ |
3515 |
29 Sep 15 |
olle |
// Get extract source filter for title |
3515 |
29 Sep 15 |
olle |
1155 |
String extractSourceFocus = fetchExtractSourceFilterName(extractSourceFilter); |
3505 |
23 Sep 15 |
olle |
// Get project focus filter for title |
3505 |
23 Sep 15 |
olle |
1157 |
String projectFocus = fetchProjectFocusFilterName(projectFocusFilter); |
3505 |
23 Sep 15 |
olle |
// Get time period name for title |
3505 |
23 Sep 15 |
olle |
1159 |
String periodName = fetchTimePeriodName(viewType); |
3505 |
23 Sep 15 |
olle |
// Get plot title |
3505 |
23 Sep 15 |
olle |
1161 |
String title = "New chart"; |
3505 |
23 Sep 15 |
olle |
1162 |
if (chartVariant != null) |
3505 |
23 Sep 15 |
olle |
1163 |
{ |
3505 |
23 Sep 15 |
olle |
// String "\u00B5" is the micro character in unicode |
3505 |
23 Sep 15 |
olle |
// String "\u223C" is the tilde character in unicode |
3514 |
29 Sep 15 |
olle |
1166 |
if (chartVariant.equals(ORIGINAL_QUANTITY_DNA_CHART)) |
3505 |
23 Sep 15 |
olle |
1167 |
{ |
3515 |
29 Sep 15 |
olle |
1168 |
title = "Total quantity DNA for " + projectFocus + extractSourceFocus + "extracts by " + periodName; |
3505 |
23 Sep 15 |
olle |
1169 |
} |
3514 |
29 Sep 15 |
olle |
1170 |
else if (chartVariant.equals(ORIGINAL_QUANTITY_RNA_CHART)) |
3505 |
23 Sep 15 |
olle |
1171 |
{ |
3515 |
29 Sep 15 |
olle |
1172 |
title = "Total quantity RNA for " + projectFocus + extractSourceFocus + "extracts by " + periodName; |
3505 |
23 Sep 15 |
olle |
1173 |
} |
3514 |
29 Sep 15 |
olle |
1174 |
else if (chartVariant.equals(DELTA_CT_DNA_CHART)) |
3505 |
23 Sep 15 |
olle |
1175 |
{ |
3515 |
29 Sep 15 |
olle |
1176 |
title = "DNA ΔCt value for " + projectFocus + extractSourceFocus + "extracts by " + periodName; |
3505 |
23 Sep 15 |
olle |
1177 |
} |
3505 |
23 Sep 15 |
olle |
1178 |
if (site != null) |
3505 |
23 Sep 15 |
olle |
1179 |
{ |
3505 |
23 Sep 15 |
olle |
// Add site name in parenthesis |
3505 |
23 Sep 15 |
olle |
1181 |
title += " (" + site.getName() + ")"; |
3505 |
23 Sep 15 |
olle |
1182 |
} |
3505 |
23 Sep 15 |
olle |
1183 |
} |
3505 |
23 Sep 15 |
olle |
1184 |
return title; |
3505 |
23 Sep 15 |
olle |
1185 |
} |
3505 |
23 Sep 15 |
olle |
1186 |
|
3505 |
23 Sep 15 |
olle |
1187 |
/** |
3515 |
29 Sep 15 |
olle |
* Returns the extract source title name for an extract source filter string. |
3515 |
29 Sep 15 |
olle |
1189 |
* |
3515 |
29 Sep 15 |
olle |
* @param extractSourceFilter String The extract source filter used. |
3515 |
29 Sep 15 |
olle |
* @return String The extract source title name. |
3515 |
29 Sep 15 |
olle |
1192 |
*/ |
3515 |
29 Sep 15 |
olle |
1193 |
private String fetchExtractSourceFilterName(String extractSourceFilter) |
3515 |
29 Sep 15 |
olle |
1194 |
{ |
3515 |
29 Sep 15 |
olle |
// Get extract source title name |
3515 |
29 Sep 15 |
olle |
1196 |
String extractSourceTitleName = ""; |
3515 |
29 Sep 15 |
olle |
1197 |
if (extractSourceFilter != null) |
3515 |
29 Sep 15 |
olle |
1198 |
{ |
3515 |
29 Sep 15 |
olle |
1199 |
if (extractSourceFilter.equals(EXTRACTSOURCE_MELUDI_SPECIMEN_EXTRACT)) |
3515 |
29 Sep 15 |
olle |
1200 |
{ |
3515 |
29 Sep 15 |
olle |
1201 |
extractSourceTitleName = "MeLuDI specimen "; |
3515 |
29 Sep 15 |
olle |
1202 |
} |
3515 |
29 Sep 15 |
olle |
1203 |
else if (extractSourceFilter.equals(EXTRACTSOURCE_INPUT_EXTRACT)) |
3515 |
29 Sep 15 |
olle |
1204 |
{ |
3515 |
29 Sep 15 |
olle |
1205 |
extractSourceTitleName = "input "; |
3515 |
29 Sep 15 |
olle |
1206 |
} |
3515 |
29 Sep 15 |
olle |
1207 |
} |
3515 |
29 Sep 15 |
olle |
1208 |
return extractSourceTitleName; |
3515 |
29 Sep 15 |
olle |
1209 |
} |
3515 |
29 Sep 15 |
olle |
1210 |
|
3515 |
29 Sep 15 |
olle |
1211 |
/** |
3505 |
23 Sep 15 |
olle |
* Returns the project focus title name for a project focus filter string. |
3505 |
23 Sep 15 |
olle |
1213 |
* |
3505 |
23 Sep 15 |
olle |
* @param projectFocusFilter String The project focus filter used. |
3505 |
23 Sep 15 |
olle |
* @return String The project focus title name. |
3505 |
23 Sep 15 |
olle |
1216 |
*/ |
3505 |
23 Sep 15 |
olle |
1217 |
private String fetchProjectFocusFilterName(String projectFocusFilter) |
3505 |
23 Sep 15 |
olle |
1218 |
{ |
3505 |
23 Sep 15 |
olle |
// Get project focus title name |
3505 |
23 Sep 15 |
olle |
1220 |
String projectFocusTitleName = ""; |
3505 |
23 Sep 15 |
olle |
1221 |
if (projectFocusFilter != null) |
3505 |
23 Sep 15 |
olle |
1222 |
{ |
3514 |
29 Sep 15 |
olle |
1223 |
if (projectFocusFilter.equals(InstallServlet.PROJECTFOCUS_MELANOMA)) |
3505 |
23 Sep 15 |
olle |
1224 |
{ |
3505 |
23 Sep 15 |
olle |
1225 |
projectFocusTitleName = "Melanoma "; |
3505 |
23 Sep 15 |
olle |
1226 |
} |
3514 |
29 Sep 15 |
olle |
1227 |
else if (projectFocusFilter.equals(InstallServlet.PROJECTFOCUS_LUNG_CANCER)) |
3505 |
23 Sep 15 |
olle |
1228 |
{ |
3505 |
23 Sep 15 |
olle |
1229 |
projectFocusTitleName = "Lung cancer "; |
3505 |
23 Sep 15 |
olle |
1230 |
} |
3514 |
29 Sep 15 |
olle |
1231 |
else if (projectFocusFilter.equals(InstallServlet.PROJECTFOCUS_COLON_CANCER)) |
3505 |
23 Sep 15 |
olle |
1232 |
{ |
3505 |
23 Sep 15 |
olle |
1233 |
projectFocusTitleName = "Colon cancer "; |
3505 |
23 Sep 15 |
olle |
1234 |
} |
3514 |
29 Sep 15 |
olle |
1235 |
else if (projectFocusFilter.equals(InstallServlet.PROJECTFOCUS_GIST)) |
3505 |
23 Sep 15 |
olle |
1236 |
{ |
3505 |
23 Sep 15 |
olle |
1237 |
projectFocusTitleName = "GIST "; |
3505 |
23 Sep 15 |
olle |
1238 |
} |
4196 |
31 Oct 16 |
olle |
1239 |
else if (projectFocusFilter.equals(InstallServlet.PROJECTFOCUS_BREAST_CANCER)) |
4196 |
31 Oct 16 |
olle |
1240 |
{ |
4196 |
31 Oct 16 |
olle |
1241 |
projectFocusTitleName = "Breast cancer "; |
4196 |
31 Oct 16 |
olle |
1242 |
} |
3505 |
23 Sep 15 |
olle |
1243 |
} |
3505 |
23 Sep 15 |
olle |
1244 |
return projectFocusTitleName; |
3505 |
23 Sep 15 |
olle |
1245 |
} |
3505 |
23 Sep 15 |
olle |
1246 |
|
3505 |
23 Sep 15 |
olle |
1247 |
/** |
3505 |
23 Sep 15 |
olle |
* Returns the time period name for a view type string. |
3505 |
23 Sep 15 |
olle |
1249 |
* |
3505 |
23 Sep 15 |
olle |
* @param viewType String The view type used for time period selection. |
3505 |
23 Sep 15 |
olle |
* @return String The time period name. |
3505 |
23 Sep 15 |
olle |
1252 |
*/ |
3505 |
23 Sep 15 |
olle |
1253 |
private String fetchTimePeriodName(String viewType) |
3505 |
23 Sep 15 |
olle |
1254 |
{ |
3505 |
23 Sep 15 |
olle |
// Get time period name |
3505 |
23 Sep 15 |
olle |
1256 |
String periodName = "year"; |
3505 |
23 Sep 15 |
olle |
1257 |
if (viewType.equals(ReportTableUtil.quarterView)) |
3505 |
23 Sep 15 |
olle |
1258 |
{ |
3505 |
23 Sep 15 |
olle |
1259 |
periodName = "quarter"; |
3505 |
23 Sep 15 |
olle |
1260 |
} |
3505 |
23 Sep 15 |
olle |
1261 |
else if (viewType.equals(ReportTableUtil.monthView)) |
3505 |
23 Sep 15 |
olle |
1262 |
{ |
3505 |
23 Sep 15 |
olle |
1263 |
periodName = "month"; |
3505 |
23 Sep 15 |
olle |
1264 |
} |
3505 |
23 Sep 15 |
olle |
1265 |
else if (viewType.equals(ReportTableUtil.weekView)) |
3505 |
23 Sep 15 |
olle |
1266 |
{ |
3505 |
23 Sep 15 |
olle |
1267 |
periodName = "week"; |
3505 |
23 Sep 15 |
olle |
1268 |
} |
3505 |
23 Sep 15 |
olle |
1269 |
return periodName; |
3505 |
23 Sep 15 |
olle |
1270 |
} |
3505 |
23 Sep 15 |
olle |
1271 |
|
3505 |
23 Sep 15 |
olle |
1272 |
/** |
3505 |
23 Sep 15 |
olle |
* Returns a chart title given a chart variant string. |
3505 |
23 Sep 15 |
olle |
1274 |
* |
3505 |
23 Sep 15 |
olle |
* @param chartVariant String The chart variant to get a title for. |
3505 |
23 Sep 15 |
olle |
* @return String A chart title for the given chart variant string. |
3505 |
23 Sep 15 |
olle |
1277 |
*/ |
3505 |
23 Sep 15 |
olle |
1278 |
private String fetchChartTitle(String chartVariant) |
3505 |
23 Sep 15 |
olle |
1279 |
{ |
3505 |
23 Sep 15 |
olle |
1280 |
String title = "New chart"; |
3505 |
23 Sep 15 |
olle |
1281 |
if (chartVariant != null) |
3505 |
23 Sep 15 |
olle |
1282 |
{ |
3505 |
23 Sep 15 |
olle |
// String "\u00B5" is the micro character in unicode |
3505 |
23 Sep 15 |
olle |
// String "\u223C" is the tilde character in unicode |
3514 |
29 Sep 15 |
olle |
1285 |
if (chartVariant.equals(ORIGINAL_QUANTITY_DNA_CHART)) |
3505 |
23 Sep 15 |
olle |
1286 |
{ |
3505 |
23 Sep 15 |
olle |
1287 |
title = "Original quantity DNA (\u00B5g)"; |
3505 |
23 Sep 15 |
olle |
1288 |
} |
3514 |
29 Sep 15 |
olle |
1289 |
else if (chartVariant.equals(ORIGINAL_QUANTITY_RNA_CHART)) |
3505 |
23 Sep 15 |
olle |
1290 |
{ |
3505 |
23 Sep 15 |
olle |
1291 |
title = "Original quantity RNA (\u00B5g)"; |
3505 |
23 Sep 15 |
olle |
1292 |
} |
3514 |
29 Sep 15 |
olle |
1293 |
else if (chartVariant.equals(DELTA_CT_DNA_CHART)) |
3505 |
23 Sep 15 |
olle |
1294 |
{ |
3505 |
23 Sep 15 |
olle |
1295 |
title = "DNA ΔCt value"; |
3505 |
23 Sep 15 |
olle |
1296 |
} |
3505 |
23 Sep 15 |
olle |
1297 |
} |
3505 |
23 Sep 15 |
olle |
1298 |
return title; |
3505 |
23 Sep 15 |
olle |
1299 |
} |
3505 |
23 Sep 15 |
olle |
1300 |
|
3505 |
23 Sep 15 |
olle |
1301 |
/** |
3505 |
23 Sep 15 |
olle |
* Returns a chart y-axis title given a chart variant string. |
3505 |
23 Sep 15 |
olle |
1303 |
* |
3505 |
23 Sep 15 |
olle |
* @param chartVariant String The chart variant to get a y-axis title for. |
3505 |
23 Sep 15 |
olle |
* @return String A chart y-axis title for the given chart variant string. |
3505 |
23 Sep 15 |
olle |
1306 |
*/ |
3505 |
23 Sep 15 |
olle |
1307 |
private String fetchChartYAxisTitle(String chartVariant) |
3505 |
23 Sep 15 |
olle |
1308 |
{ |
3505 |
23 Sep 15 |
olle |
1309 |
String title = "New chart"; |
3505 |
23 Sep 15 |
olle |
1310 |
if (chartVariant != null) |
3505 |
23 Sep 15 |
olle |
1311 |
{ |
3505 |
23 Sep 15 |
olle |
// String "\u00B5" is the micro character in unicode |
3505 |
23 Sep 15 |
olle |
// String "\u223C" is the tilde character in unicode |
3514 |
29 Sep 15 |
olle |
1314 |
if (chartVariant.equals(ORIGINAL_QUANTITY_DNA_CHART)) |
3505 |
23 Sep 15 |
olle |
1315 |
{ |
3505 |
23 Sep 15 |
olle |
1316 |
title = "\u00B5g"; |
3505 |
23 Sep 15 |
olle |
1317 |
} |
3514 |
29 Sep 15 |
olle |
1318 |
else if (chartVariant.equals(ORIGINAL_QUANTITY_RNA_CHART)) |
3505 |
23 Sep 15 |
olle |
1319 |
{ |
3505 |
23 Sep 15 |
olle |
1320 |
title = "\u00B5g"; |
3505 |
23 Sep 15 |
olle |
1321 |
} |
3514 |
29 Sep 15 |
olle |
1322 |
else if (chartVariant.equals(DELTA_CT_DNA_CHART)) |
3505 |
23 Sep 15 |
olle |
1323 |
{ |
3505 |
23 Sep 15 |
olle |
1324 |
title = "ΔCt value"; |
3505 |
23 Sep 15 |
olle |
1325 |
} |
3505 |
23 Sep 15 |
olle |
1326 |
} |
3505 |
23 Sep 15 |
olle |
1327 |
return title; |
3505 |
23 Sep 15 |
olle |
1328 |
} |
3505 |
23 Sep 15 |
olle |
1329 |
} |