extensions/net.sf.basedb.meludi/trunk/src/net/sf/basedb/meludi/servlet/MeludiQuarterMonthReportServlet.java

Code
Comments
Other
Rev Date Author Line
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 53   // 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 65   // 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 67   // 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 71   // 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 79    *  Returns a list of all chart variant strings.
3505 23 Sep 15 olle 80    *
3505 23 Sep 15 olle 81    *  @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 87       // 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 135     // 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 147 //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 153     //final SessionControl sc = Application.getSessionControl(ID, req.getRemoteAddr());
5744 20 Nov 19 olle 154     //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 158     // 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 178           // 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 190           // 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 193 //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 203           // Auto view type
3505 23 Sep 15 olle 204           viewType = tableUtil.getViewType(startDate, endDate);
3505 23 Sep 15 olle 205           // 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 211 //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 218 //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 225 //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 227 //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 229 //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 231 //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 256 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 257     if (site != null)
3505 23 Sep 15 olle 258     {
3505 23 Sep 15 olle 259 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 263     // 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 267     // 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 270     // ...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 275     // 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 282     // Perform database query and store result in list
3505 23 Sep 15 olle 283     allSamples = sampleQuery.list(dc);
3505 23 Sep 15 olle 284 //System.out.println(new Date() + " MeludiQuarterMonthReportServlet::createMeludiQuarterMonthReport(): allSamples.size() = " + allSamples.size());
3505 23 Sep 15 olle 285
3505 23 Sep 15 olle 286     // 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 289     // ...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 296     // 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 301     // Perform database query and store result in list
3505 23 Sep 15 olle 302     allExtracts = extractQuery.list(dc);
3505 23 Sep 15 olle 303 //System.out.println(new Date() + " MeludiQuarterMonthReportServlet::createMeludiQuarterMonthReport(): allExtracts.size() = " + allExtracts.size());
3505 23 Sep 15 olle 304
3505 23 Sep 15 olle 305     // 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 311     // 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 314     // 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 321 //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 327 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 329       else
3505 23 Sep 15 olle 330       {
3505 23 Sep 15 olle 331 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 334       // 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 340           // 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 346           // Extract source item
3505 23 Sep 15 olle 347           relatedCase = (Sample)extractParent;
3505 23 Sep 15 olle 348         }
3505 23 Sep 15 olle 349 //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 352           // Check for site filter
3505 23 Sep 15 olle 353           boolean passedSiteFilter = passSiteFilter(dc, manager, site, relatedCase);
3505 23 Sep 15 olle 354           // 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 361 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 363         else
3505 23 Sep 15 olle 364         {          
3505 23 Sep 15 olle 365 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 372         // 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 375 //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 386             // 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 393         // 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 396 //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 405             // 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 410 //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 412     // 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 416       // 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 422       // 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 425     // 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 429       // 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 434       // 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 438     // Create JSON array for plot data
3505 23 Sep 15 olle 439     JSONArray jsonStatisticsPlotArray = new JSONArray();
3505 23 Sep 15 olle 440     // 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 445         // 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 448         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 460     // 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 463     // Appended info
3505 23 Sep 15 olle 464     String appendedInfoText = "";
3505 23 Sep 15 olle 465     // Add info on special samples if chart for min to RNAlater is selected
3505 23 Sep 15 olle 466     if (chartVariantList.contains(minutesToRnaLaterChart))
3505 23 Sep 15 olle 467     {
3505 23 Sep 15 olle 468       appendedInfoText += "<h2 class=\"pagebreak\">Appended Info</h2>";
3505 23 Sep 15 olle 469       appendedInfoText += "<br>";
3505 23 Sep 15 olle 470       appendedInfoText += createMinToRnaLaterAppendTextTable(dc, "Samples with negative min to RNAlater", sampleNegativeMinToRnaLaterList);
3505 23 Sep 15 olle 471       appendedInfoText += "<br>";
3505 23 Sep 15 olle 472       appendedInfoText += createMinToRnaLaterAppendTextTable(dc, "Samples with zero min to RNAlater", sampleZeroMinToRnaLaterList);
3505 23 Sep 15 olle 473       appendedInfoText += "<br>";
3505 23 Sep 15 olle 474     }
3505 23 Sep 15 olle 475     // Add JSON appended info to report
3505 23 Sep 15 olle 476     jsonReport.put("appendedInfo", appendedInfoText);
3505 23 Sep 15 olle 477 */
3505 23 Sep 15 olle 478     // 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 488   private List<Sample> createFilteredSampleList(DbControl dc, SnapshotManager manager, List<Sample> rawSampleList, String projectFocusFilter)
3505 23 Sep 15 olle 489       throws ServletException, IOException 
3505 23 Sep 15 olle 490   {  
3505 23 Sep 15 olle 491     // Store samples that should be processed for report table in list 
3505 23 Sep 15 olle 492     List<Sample> sampleList = new ArrayList<Sample>();
3505 23 Sep 15 olle 493     for (Sample s: rawSampleList)
3505 23 Sep 15 olle 494     {
3505 23 Sep 15 olle 495       // Optional project focus filter (true if no filter, or sample passes filter)
3505 23 Sep 15 olle 496       boolean passedProjectFocusFilter = passProjectFocusFilter(dc, manager, projectFocusFilter, s);
3505 23 Sep 15 olle 497       if (passedProjectFocusFilter)
3505 23 Sep 15 olle 498       {
3505 23 Sep 15 olle 499         // Add sample to list
3505 23 Sep 15 olle 500         sampleList.add(s);
3505 23 Sep 15 olle 501       }
3505 23 Sep 15 olle 502     }
3505 23 Sep 15 olle 503     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 508    * Optional site filter. Returns 'true' if no filter,
3505 23 Sep 15 olle 509    * or sample passes filter.
3505 23 Sep 15 olle 510    * 
3505 23 Sep 15 olle 511    * @param dc DbControl The DbControl to use.
3505 23 Sep 15 olle 512    * @param manager SnapshotManager The annotation snapshot manager to use.
3505 23 Sep 15 olle 513    * @param siteFilter Site Optional site filter.
3505 23 Sep 15 olle 514    * @param s Sample The sample to test.
3505 23 Sep 15 olle 515    * @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 520     // 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 523       // 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 527         // 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 535         // 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 541 //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 547    * 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 549    * @param dc DbControl The DbControl to use.
3505 23 Sep 15 olle 550    * @param manager SnapshotManager The SnapshotManager to use for speeding up annotation retrieval.
3505 23 Sep 15 olle 551    * @param s Sample The sample to find the site for.
3505 23 Sep 15 olle 552    * @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 557     // 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 582    * Optional project focus filter. Returns 'true' if no filter,
3505 23 Sep 15 olle 583    * or sample passes filter.
3505 23 Sep 15 olle 584    * 
3505 23 Sep 15 olle 585    * @param dc DbControl The DbControl to use.
3505 23 Sep 15 olle 586    * @param manager SnapshotManager The annotation snapshot manager to use.
3505 23 Sep 15 olle 587    * @param projectFocusFilter String Optional project focus filter.
3505 23 Sep 15 olle 588    * @param s Sample The sample to test.
3505 23 Sep 15 olle 589    * @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 594     // 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 597       // 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 601         // 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 609         // 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 615 //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 621    * 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 623    * @param dc DbControl The DbControl to use.
3505 23 Sep 15 olle 624    * @param manager SnapshotManager The SnapshotManager to use for speeding up annotation retrieval.
3505 23 Sep 15 olle 625    * @param s Sample The sample to find the project focus for.
3505 23 Sep 15 olle 626    * @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 631     // 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 651   private String createMinToRnaLaterAppendTextTable(DbControl dc, String title, List<Sample> sampleList)
3505 23 Sep 15 olle 652   {
3505 23 Sep 15 olle 653     // Note: Generated HTML code refers to classes defined in resources/meludi.css
3505 23 Sep 15 olle 654     String text = "<table class='reporttable'>";
3505 23 Sep 15 olle 655     // Report header
3505 23 Sep 15 olle 656     text += "<tr>";
3505 23 Sep 15 olle 657     text += "<td class='reportheader' colspan='4'>" + title + "</td>";
3505 23 Sep 15 olle 658     text += "</tr>";
3505 23 Sep 15 olle 659     // Report header
3505 23 Sep 15 olle 660     text += "<tr>";
3505 23 Sep 15 olle 661     text += "<td class='reportsubheader'>Sample</td>";
3505 23 Sep 15 olle 662     text += "<td class='reportsubheader'>Sampling date</td>";
3505 23 Sep 15 olle 663     text += "<td class='reportsubheader'>RNAlater date</td>";
3505 23 Sep 15 olle 664     text += "<td class='reportsubheader noprint'>Case summary</td>";
3505 23 Sep 15 olle 665     text += "</tr>";
3505 23 Sep 15 olle 666     DateToStringConverter dateFormat = new DateToStringConverter(new SimpleDateFormat("yyyy-MM-dd HH:mm"));
3505 23 Sep 15 olle 667     for (Sample s: sampleList)
3505 23 Sep 15 olle 668     {
3505 23 Sep 15 olle 669       Date samplingDate = sampleIdSamplingDateHashMap.get(s.getId());
3505 23 Sep 15 olle 670       Date rnaLaterDate = sampleIdRnaLaterDateHashMap.get(s.getId());
3505 23 Sep 15 olle 671       String samplingDateStr = dateFormat.convert(samplingDate);
3505 23 Sep 15 olle 672       String rnaLaterDateStr = dateFormat.convert(rnaLaterDate);
3505 23 Sep 15 olle 673       // Case name equals the sample name before first "."
3505 23 Sep 15 olle 674       String caseName = s.getName();
3505 23 Sep 15 olle 675       int dotIndex = s.getName().indexOf(".");
3505 23 Sep 15 olle 676       if (dotIndex >= 0)
3505 23 Sep 15 olle 677       {
3505 23 Sep 15 olle 678         caseName = s.getName().substring(0, dotIndex);
3505 23 Sep 15 olle 679       }
3505 23 Sep 15 olle 680       String caseSummaryButtonCode = createCaseSummaryButton(dc, caseName);
3505 23 Sep 15 olle 681       text += "<tr>";
3505 23 Sep 15 olle 682       text += "<td class='reportdata'>" + s.getName() + "</td>";
3505 23 Sep 15 olle 683       text += "<td class='reportdata'>" + samplingDateStr + "</td>";
3505 23 Sep 15 olle 684       text += "<td class='reportdata'>" + rnaLaterDateStr + "</td>";
3505 23 Sep 15 olle 685       text += "<td class='reportdata noprint'>" + caseSummaryButtonCode + "</td>";
3505 23 Sep 15 olle 686       text += "</tr>";
3505 23 Sep 15 olle 687     }
3505 23 Sep 15 olle 688     text += "</table>";
3505 23 Sep 15 olle 689     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\">&nbsp;" + 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 704     // 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 708     // 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 718     // 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 734     // 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 745     // 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 755 //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 759         // 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 766     // 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 805       // 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 808       //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 812       //Float floatPct95 = calculatePercentile(floatList, 0.95f);
3505 23 Sep 15 olle 813       // Inter-percentile range ipr = pct75 - pct25
3505 23 Sep 15 olle 814       // 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 818       // 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 831    *  Returns a period string intended for use as label in box plot.
3505 23 Sep 15 olle 832    *  The period string will be modified as follows for different view types:<br>
3505 23 Sep 15 olle 833    *  Year view:    yyyy  ->  yyyy    (no change)<br>
3505 23 Sep 15 olle 834    *  Quarter view: yyyyq  -> yyyy-Qq (e.g. 20123  -> 2012-Q3)<br>
3505 23 Sep 15 olle 835    *  Month view:   yyyymm -> yyyy-mm (e.g. 201203 -> 2012-03)<br>
3505 23 Sep 15 olle 836    *  Week view:    yyyyww -> yyyy-ww (e.g. 201203 -> 2012-03)<br>
3505 23 Sep 15 olle 837    * 
3505 23 Sep 15 olle 838    *  @param period String The period string in pure number format.
3505 23 Sep 15 olle 839    *  @param viewType String The view type.
3505 23 Sep 15 olle 840    *  @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 850     // 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 854       // 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 858         // Add 'Q' after year string
3505 23 Sep 15 olle 859         periodName += "Q";
3505 23 Sep 15 olle 860       }
3505 23 Sep 15 olle 861       // 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 870 //System.out.println(new Date() + " MeludiQuarterMonthReportServlet::createPeriodStringFloatListHashMap(): chartVariant = " + chartVariant + " startDate = " + startDate + " endDate = " + endDate + " viewType = " + viewType);
3505 23 Sep 15 olle 871     // 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 876 //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 879         // Use QiaCube date of extract
3505 23 Sep 15 olle 880         Date date = extractIdQiaCubeDateHashMap.get(e.getId());                
3505 23 Sep 15 olle 881 //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 887             // Get current period
3505 23 Sep 15 olle 888             String currentPeriod = tableUtil.getCurrentPeriod(date, viewType);                        
3505 23 Sep 15 olle 889             // Update period value hash map
3505 23 Sep 15 olle 890             Float value = null;
3505 23 Sep 15 olle 891             // 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 900 //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 903         // Use QiaCube date of extract
3505 23 Sep 15 olle 904         Date date = extractIdQiaCubeDateHashMap.get(e.getId());                
3505 23 Sep 15 olle 905 //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 911             // Get current period
3505 23 Sep 15 olle 912             String currentPeriod = tableUtil.getCurrentPeriod(date, viewType);                        
3505 23 Sep 15 olle 913             // Update period value hash map
3505 23 Sep 15 olle 914             Float value = null;
3505 23 Sep 15 olle 915             // 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 924 //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 927         // 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 934             // Get current period
3505 23 Sep 15 olle 935             String currentPeriod = tableUtil.getCurrentPeriod(date, viewType);                        
3505 23 Sep 15 olle 936             // Update period value hash map
3505 23 Sep 15 olle 937             Float value = null;
3505 23 Sep 15 olle 938             // 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 949   @SuppressWarnings("unchecked")
3505 23 Sep 15 olle 950   private JSONObject addExtraInfo(JSONObject plotJsonData, String chartVariant)
3505 23 Sep 15 olle 951   {
3505 23 Sep 15 olle 952     if (plotJsonData != null && chartVariant != null)
3505 23 Sep 15 olle 953     {
3505 23 Sep 15 olle 954       if (chartVariant.equals(remainingQuantityForMeludiSpecimenChart))
3505 23 Sep 15 olle 955       {
3505 23 Sep 15 olle 956         String subTitleRight = (String) plotJsonData.get("subTitleRight");
3505 23 Sep 15 olle 957         subTitleRight += "; > 1 mg, n = " + getNumRemainingTissueItemsGT1Mg();
3505 23 Sep 15 olle 958         plotJsonData.put("subTitleRight", subTitleRight);
3505 23 Sep 15 olle 959       }        
3505 23 Sep 15 olle 960     }
3505 23 Sep 15 olle 961     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 985    *  Returns a single List<Float> with all values in all the
3505 23 Sep 15 olle 986    *  lists in the HashMap<String, List<Float>>.
3505 23 Sep 15 olle 987    *
3505 23 Sep 15 olle 988    *  @param stringFloatListHashMap HashMap<String, List<Float>> The HashMap to use.
3505 23 Sep 15 olle 989    *  @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 1080     // 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 1090       // 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 1106     // 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 1141    *  Returns a chart header title given a chart variant string.
3505 23 Sep 15 olle 1142    *  If a plot is shown, this is normally the header title
3505 23 Sep 15 olle 1143    *  printed over the plot itself.
3505 23 Sep 15 olle 1144    *
3505 23 Sep 15 olle 1145    *  @param chartVariant String The chart variant to get a plot title for.
3505 23 Sep 15 olle 1146    *  @param viewType String The view type used for the period selection for the plot.
3515 29 Sep 15 olle 1147    *  @param extractSourceFilter String The extract source filter for the plot.
3514 29 Sep 15 olle 1148    *  @param projectFocusFilter String The project focus filter for the plot.
3514 29 Sep 15 olle 1149    *  @param site String The site used for the data selection for the plot.
3505 23 Sep 15 olle 1150    *  @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 1154     // Get extract source filter for title
3515 29 Sep 15 olle 1155     String extractSourceFocus = fetchExtractSourceFilterName(extractSourceFilter);
3505 23 Sep 15 olle 1156     // Get project focus filter for title
3505 23 Sep 15 olle 1157     String projectFocus = fetchProjectFocusFilterName(projectFocusFilter);
3505 23 Sep 15 olle 1158     // Get time period name for title
3505 23 Sep 15 olle 1159     String periodName = fetchTimePeriodName(viewType);
3505 23 Sep 15 olle 1160     // 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 1164       // String "\u00B5" is the micro character in unicode
3505 23 Sep 15 olle 1165       // 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 1180         // 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 1188    *  Returns the extract source title name for an extract source filter string.
3515 29 Sep 15 olle 1189    *
3515 29 Sep 15 olle 1190    *  @param extractSourceFilter String The extract source filter used.
3515 29 Sep 15 olle 1191    *  @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 1195     // 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 1212    *  Returns the project focus title name for a project focus filter string.
3505 23 Sep 15 olle 1213    *
3505 23 Sep 15 olle 1214    *  @param projectFocusFilter String The project focus filter used.
3505 23 Sep 15 olle 1215    *  @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 1219     // 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 1248    *  Returns the time period name for a view type string.
3505 23 Sep 15 olle 1249    *
3505 23 Sep 15 olle 1250    *  @param viewType String The view type used for time period selection.
3505 23 Sep 15 olle 1251    *  @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 1255     // 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 1273    *  Returns a chart title given a chart variant string.
3505 23 Sep 15 olle 1274    *
3505 23 Sep 15 olle 1275    *  @param chartVariant String The chart variant to get a title for.
3505 23 Sep 15 olle 1276    *  @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 1283       // String "\u00B5" is the micro character in unicode
3505 23 Sep 15 olle 1284       // 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 1302    *  Returns a chart y-axis title given a chart variant string.
3505 23 Sep 15 olle 1303    *
3505 23 Sep 15 olle 1304    *  @param chartVariant String The chart variant to get a y-axis title for.
3505 23 Sep 15 olle 1305    *  @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 1312       // String "\u00B5" is the micro character in unicode
3505 23 Sep 15 olle 1313       // 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 }