extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/plugins/release/IncaWriter.java

Code
Comments
Other
Rev Date Author Line
3942 16 May 16 nicklas 1 package net.sf.basedb.reggie.plugins.release;
3942 16 May 16 nicklas 2
3942 16 May 16 nicklas 3 import java.util.Date;
3942 16 May 16 nicklas 4 import java.util.List;
3942 16 May 16 nicklas 5
4475 27 Apr 17 nicklas 6 import org.json.simple.JSONArray;
4475 27 Apr 17 nicklas 7 import org.json.simple.JSONObject;
4475 27 Apr 17 nicklas 8
3942 16 May 16 nicklas 9 import net.sf.basedb.core.AnnotationType;
5096 14 Nov 18 nicklas 10 import net.sf.basedb.core.BioSource;
3942 16 May 16 nicklas 11 import net.sf.basedb.core.DbControl;
3942 16 May 16 nicklas 12 import net.sf.basedb.core.Item;
3942 16 May 16 nicklas 13 import net.sf.basedb.core.ItemQuery;
4484 09 May 17 nicklas 14 import net.sf.basedb.core.Quantity;
3942 16 May 16 nicklas 15 import net.sf.basedb.core.Sample;
3942 16 May 16 nicklas 16 import net.sf.basedb.core.Type;
4484 09 May 17 nicklas 17 import net.sf.basedb.core.Unit;
3942 16 May 16 nicklas 18 import net.sf.basedb.core.query.Expressions;
3942 16 May 16 nicklas 19 import net.sf.basedb.core.query.Hql;
3942 16 May 16 nicklas 20 import net.sf.basedb.core.query.Orders;
3942 16 May 16 nicklas 21 import net.sf.basedb.core.query.Restrictions;
3942 16 May 16 nicklas 22 import net.sf.basedb.reggie.Reggie;
4479 05 May 17 nicklas 23 import net.sf.basedb.reggie.converter.DateToQuarterConverter;
4479 05 May 17 nicklas 24 import net.sf.basedb.reggie.converter.DateToYearConverter;
4479 05 May 17 nicklas 25 import net.sf.basedb.reggie.converter.DaysSinceRefDateConverter;
4479 05 May 17 nicklas 26 import net.sf.basedb.reggie.converter.UpperBinConverter;
4479 05 May 17 nicklas 27 import net.sf.basedb.reggie.converter.ValueConverter;
3942 16 May 16 nicklas 28 import net.sf.basedb.reggie.dao.Annotationtype;
5096 14 Nov 18 nicklas 29 import net.sf.basedb.reggie.dao.Case;
4475 27 Apr 17 nicklas 30 import net.sf.basedb.reggie.json.FilteredJSONArray;
4475 27 Apr 17 nicklas 31 import net.sf.basedb.util.filter.NotNullFilter;
4484 09 May 17 nicklas 32 import net.sf.basedb.util.units.UnitUtil;
3942 16 May 16 nicklas 33
3942 16 May 16 nicklas 34 /**
5096 14 Nov 18 nicklas 35   Cohort writer implementation for INCA annotations related to a case.
3942 16 May 16 nicklas 36   @since 4.5
3942 16 May 16 nicklas 37 */
3942 16 May 16 nicklas 38 public class IncaWriter 
3942 16 May 16 nicklas 39   extends CohortWriter 
3942 16 May 16 nicklas 40 {
3942 16 May 16 nicklas 41
3942 16 May 16 nicklas 42   private final Annotationtype[] incaTypes;
7022 06 Feb 23 nicklas 43   private final DaysSinceRefDateConverter daysSinceRefDate;
7022 06 Feb 23 nicklas 44   private final ValueConverter<?, ?>[] incaConverters;
4479 05 May 17 nicklas 45   
7022 06 Feb 23 nicklas 46   @SuppressWarnings("rawtypes")
5090 14 Nov 18 nicklas 47   public IncaWriter(DbControl dc, ReleaseWriterOptions options)
3942 16 May 16 nicklas 48   {
5090 14 Nov 18 nicklas 49     super(dc, options);
3942 16 May 16 nicklas 50     
3942 16 May 16 nicklas 51     // Load all "INCA" annotation types
3942 16 May 16 nicklas 52     ItemQuery<AnnotationType> query = AnnotationType.getQuery(Item.SAMPLE);
3942 16 May 16 nicklas 53     query.setIncludes(Reggie.INCLUDE_IN_CURRENT_PROJECT);
3942 16 May 16 nicklas 54     query.join(Hql.innerJoin("categories", "cat"));
4475 27 Apr 17 nicklas 55     query.restrict(Restrictions.eq(Hql.property("cat", "name"), Expressions.string("INCA_Release")));
3942 16 May 16 nicklas 56     query.order(Orders.asc(Hql.property("name")));
3942 16 May 16 nicklas 57     
3942 16 May 16 nicklas 58     List<AnnotationType> tmp = query.list(dc);
3942 16 May 16 nicklas 59
5096 14 Nov 18 nicklas 60     incaTypes = new Annotationtype[1+tmp.size()];
5096 14 Nov 18 nicklas 61     incaTypes[0] = Annotationtype.INCA_EXPORT_DATE;
5096 14 Nov 18 nicklas 62     int index = 1;
3942 16 May 16 nicklas 63     for (AnnotationType at : tmp)
3942 16 May 16 nicklas 64     {
3942 16 May 16 nicklas 65       incaTypes[index] = Annotationtype.get(at);
4700 16 Mar 18 nicklas 66       String header = at.getName().replace("INCA2_", "");
3942 16 May 16 nicklas 67       index++;
3942 16 May 16 nicklas 68     }
7022 06 Feb 23 nicklas 69     
7022 06 Feb 23 nicklas 70     incaConverters = new ValueConverter[incaTypes.length];
7022 06 Feb 23 nicklas 71     daysSinceRefDate = new DaysSinceRefDateConverter();
3942 16 May 16 nicklas 72   }
3942 16 May 16 nicklas 73   
4475 27 Apr 17 nicklas 74   
4475 27 Apr 17 nicklas 75   @Override
5091 14 Nov 18 nicklas 76   public JSONArray toJSONObjects(CohortItem item)
4475 27 Apr 17 nicklas 77   {
5096 14 Nov 18 nicklas 78     List<Case> cases = item.getCases();
5096 14 Nov 18 nicklas 79     if (cases.size() == 0) return null;
4475 27 Apr 17 nicklas 80     
5096 14 Nov 18 nicklas 81     BioSource patient = item.getPatient().getItem();    
5096 14 Nov 18 nicklas 82     JSONArray json = new JSONArray();
5096 14 Nov 18 nicklas 83     for (Case c : cases)
4475 27 Apr 17 nicklas 84     {
5096 14 Nov 18 nicklas 85       Sample theCase = c.getItem();
5096 14 Nov 18 nicklas 86       
5096 14 Nov 18 nicklas 87       // Get the reference date (diagnosis date)
5096 14 Nov 18 nicklas 88       Date diaDate = (Date)item.getAnnotationValue(Annotationtype.INCA2_a_diag_dat, theCase);
5096 14 Nov 18 nicklas 89       daysSinceRefDate.setRefDate(diaDate);
5096 14 Nov 18 nicklas 90       
5096 14 Nov 18 nicklas 91       // Get all annotations
5096 14 Nov 18 nicklas 92       JSONArray jsonAnnotations = new FilteredJSONArray(new NotNullFilter<>(false));
5096 14 Nov 18 nicklas 93       for (int index = 0; index < incaTypes.length; ++index)
5096 14 Nov 18 nicklas 94       {
5096 14 Nov 18 nicklas 95         Annotationtype at = incaTypes[index];
5096 14 Nov 18 nicklas 96         jsonAnnotations.add(item.getAnnotationJSON(at, theCase, incaConverters[index]));
5096 14 Nov 18 nicklas 97       }
5096 14 Nov 18 nicklas 98       
5096 14 Nov 18 nicklas 99       // Only export something if there is at least some INCA data
5096 14 Nov 18 nicklas 100       if (jsonAnnotations.size() > 0)
5096 14 Nov 18 nicklas 101       {
5096 14 Nov 18 nicklas 102         JSONObject jsonCase = new JSONObject();
5096 14 Nov 18 nicklas 103         jsonCase.put("name", theCase.getExternalId());
5096 14 Nov 18 nicklas 104         jsonCase.put("type", theCase.getType().name());
5096 14 Nov 18 nicklas 105         jsonCase.put("subtype", getName(theCase.getItemSubtype()));
5096 14 Nov 18 nicklas 106         jsonCase.put("annotations", jsonAnnotations);
5096 14 Nov 18 nicklas 107         json.add(jsonCase);
5096 14 Nov 18 nicklas 108       }
4475 27 Apr 17 nicklas 109     }
5096 14 Nov 18 nicklas 110     
5096 14 Nov 18 nicklas 111     return json;
4475 27 Apr 17 nicklas 112   }
4475 27 Apr 17 nicklas 113
4475 27 Apr 17 nicklas 114   @Override
4475 27 Apr 17 nicklas 115   public List<CohortTypeDef> getTypeDefsInJSON()
4475 27 Apr 17 nicklas 116   {
4475 27 Apr 17 nicklas 117     DbControl dc = getDbControl();
4475 27 Apr 17 nicklas 118     CohortTypeDefFactory incaFactory = new CohortTypeDefFactory(dc, Item.SAMPLE, "Case");
4484 09 May 17 nicklas 119     Unit days = UnitUtil.getUnit(dc, Quantity.TIME, "d");
4484 09 May 17 nicklas 120     
5096 14 Nov 18 nicklas 121     for (int index = 0; index < incaTypes.length; ++index)
4475 27 Apr 17 nicklas 122     {
4479 05 May 17 nicklas 123       Annotationtype at = incaTypes[index];
4479 05 May 17 nicklas 124       Type valueType = at.getValueType();
4479 05 May 17 nicklas 125       CohortAnnotationType cat = null;
4484 09 May 17 nicklas 126       Unit unit = null;
4479 05 May 17 nicklas 127       String name = at.getName();
4479 05 May 17 nicklas 128       if (valueType == Type.DATE || valueType == Type.TIMESTAMP)
4479 05 May 17 nicklas 129       {
4479 05 May 17 nicklas 130         /*
4479 05 May 17 nicklas 131          INCA dates need some processing:
4479 05 May 17 nicklas 132          * IncaExportDate: Converted to a string, year+quarter (2017Q1)
4700 16 Mar 18 nicklas 133          * INCA2_a_diag_dat: Converted to year
4479 05 May 17 nicklas 134          * Other dates are converted to number of days since the diagnosis date
4479 05 May 17 nicklas 135         */
4479 05 May 17 nicklas 136         valueType = Type.INT;
4479 05 May 17 nicklas 137         if (name.equals(Annotationtype.INCA_EXPORT_DATE.getName()))
4479 05 May 17 nicklas 138         {
4479 05 May 17 nicklas 139           incaConverters[index] = DateToQuarterConverter.INSTANCE;
4479 05 May 17 nicklas 140           valueType = Type.STRING;
4479 05 May 17 nicklas 141         }
4700 16 Mar 18 nicklas 142         else if (name.equals(Annotationtype.INCA2_a_diag_dat.getName()))
4479 05 May 17 nicklas 143         {
4479 05 May 17 nicklas 144           incaConverters[index] = DateToYearConverter.INSTANCE;
4479 05 May 17 nicklas 145         }
4479 05 May 17 nicklas 146         else
4479 05 May 17 nicklas 147         {
4479 05 May 17 nicklas 148           incaConverters[index] = daysSinceRefDate;
4484 09 May 17 nicklas 149           unit = days;
4479 05 May 17 nicklas 150         }
4479 05 May 17 nicklas 151         cat = incaFactory.createAnnotationType(name, valueType);
4484 09 May 17 nicklas 152         if (unit != null) cat.setUnit(unit);
4479 05 May 17 nicklas 153       }
4479 05 May 17 nicklas 154       else
4479 05 May 17 nicklas 155       {
4479 05 May 17 nicklas 156         cat = incaFactory.createAnnotationType(incaTypes[index]);
4700 16 Mar 18 nicklas 157         if (name.equals("INCA2_a_pat_alder"))
4479 05 May 17 nicklas 158         {
4700 16 Mar 18 nicklas 159           // The age-at-diagnosis is binned to 5-year intervals
4479 05 May 17 nicklas 160           incaConverters[index] = new UpperBinConverter(5);
4479 05 May 17 nicklas 161         }
4479 05 May 17 nicklas 162       }
4479 05 May 17 nicklas 163       cat.setProjectSpecificValues(true);
4475 27 Apr 17 nicklas 164     }
4475 27 Apr 17 nicklas 165     return incaFactory.allCreated();
4475 27 Apr 17 nicklas 166   }
4475 27 Apr 17 nicklas 167
4475 27 Apr 17 nicklas 168
3942 16 May 16 nicklas 169 }