extensions/net.sf.basedb.varsearch/trunk/src/net/sf/basedb/varsearch/servlet/HitServlet.java

Code
Comments
Other
Rev Date Author Line
6170 17 Mar 21 nicklas 1 package net.sf.basedb.varsearch.servlet;
6170 17 Mar 21 nicklas 2
6170 17 Mar 21 nicklas 3 import java.io.IOException;
6170 17 Mar 21 nicklas 4 import java.util.Arrays;
6553 27 Jan 22 nicklas 5 import java.util.List;
6170 17 Mar 21 nicklas 6 import java.util.Set;
6170 17 Mar 21 nicklas 7
6170 17 Mar 21 nicklas 8 import javax.servlet.ServletException;
6170 17 Mar 21 nicklas 9 import javax.servlet.http.HttpServlet;
6170 17 Mar 21 nicklas 10 import javax.servlet.http.HttpServletRequest;
6170 17 Mar 21 nicklas 11 import javax.servlet.http.HttpServletResponse;
6170 17 Mar 21 nicklas 12
6170 17 Mar 21 nicklas 13 import org.json.simple.JSONObject;
6170 17 Mar 21 nicklas 14
6170 17 Mar 21 nicklas 15 import net.sf.basedb.core.DbControl;
6170 17 Mar 21 nicklas 16 import net.sf.basedb.core.File;
6170 17 Mar 21 nicklas 17 import net.sf.basedb.core.InvalidDataException;
6551 26 Jan 22 nicklas 18 import net.sf.basedb.core.Nameable;
6170 17 Mar 21 nicklas 19 import net.sf.basedb.core.RawBioAssay;
6170 17 Mar 21 nicklas 20 import net.sf.basedb.core.SessionControl;
6170 17 Mar 21 nicklas 21 import net.sf.basedb.util.Values;
6170 17 Mar 21 nicklas 22 import net.sf.basedb.util.error.ThrowableUtil;
6170 17 Mar 21 nicklas 23 import net.sf.basedb.varsearch.JsonUtil;
6522 20 Dec 21 nicklas 24 import net.sf.basedb.varsearch.LuceneColumnFactory;
6170 17 Mar 21 nicklas 25 import net.sf.basedb.varsearch.VarSearch;
6522 20 Dec 21 nicklas 26 import net.sf.basedb.varsearch.LuceneColumnFactory.LuceneColumnAction;
6522 20 Dec 21 nicklas 27 import net.sf.basedb.varsearch.LuceneColumnFactory.SubColumn;
6170 17 Mar 21 nicklas 28 import net.sf.basedb.varsearch.analyze.AminoAcidTranslator;
6173 18 Mar 21 nicklas 29 import net.sf.basedb.varsearch.index.LuceneIndex;
6553 27 Jan 22 nicklas 30 import net.sf.basedb.varsearch.index.VcfFile;
6522 20 Dec 21 nicklas 31 import net.sf.basedb.varsearch.query.AutoPrefixer;
6522 20 Dec 21 nicklas 32 import net.sf.basedb.varsearch.query.LuceneQueryFactory.LuceneFilterAction;
6173 18 Mar 21 nicklas 33 import net.sf.basedb.varsearch.service.VarSearchService;
6170 17 Mar 21 nicklas 34 import net.sf.basedb.varsearch.util.NullSafeJSONObject;
6170 17 Mar 21 nicklas 35 import net.sf.basedb.varsearch.util.NullSafeLinkedSet;
6170 17 Mar 21 nicklas 36 import net.sf.basedb.varsearch.util.NullSafeTreeSet;
6170 17 Mar 21 nicklas 37 import net.sf.basedb.varsearch.vcf.VcfParser;
6551 26 Jan 22 nicklas 38 import net.sf.basedb.varsearch.vcf.VcfParser.IdFilter;
6551 26 Jan 22 nicklas 39 import net.sf.basedb.varsearch.vcf.VcfParser.LineNoFilter;
6170 17 Mar 21 nicklas 40 import net.sf.basedb.varsearch.vcf.VcfParser.VcfHeader;
6170 17 Mar 21 nicklas 41 import net.sf.basedb.varsearch.vcf.VcfParser.VcfLine;
6170 17 Mar 21 nicklas 42
6170 17 Mar 21 nicklas 43 /**
6170 17 Mar 21 nicklas 44   Get information about the current session.
6170 17 Mar 21 nicklas 45   
6170 17 Mar 21 nicklas 46 */
6170 17 Mar 21 nicklas 47 public class HitServlet 
6170 17 Mar 21 nicklas 48   extends HttpServlet 
6170 17 Mar 21 nicklas 49 {
6170 17 Mar 21 nicklas 50
6170 17 Mar 21 nicklas 51   private static final long serialVersionUID = -3842354795495914729L;
6170 17 Mar 21 nicklas 52
6170 17 Mar 21 nicklas 53   public HitServlet()
6170 17 Mar 21 nicklas 54   {}
6170 17 Mar 21 nicklas 55
6170 17 Mar 21 nicklas 56   @Override
6170 17 Mar 21 nicklas 57   protected void doGet(HttpServletRequest req, HttpServletResponse resp)
6170 17 Mar 21 nicklas 58     throws ServletException, IOException 
6170 17 Mar 21 nicklas 59   {
6170 17 Mar 21 nicklas 60     String cmd = req.getParameter("cmd");
6170 17 Mar 21 nicklas 61     JsonUtil.setJsonResponseHeaders(resp);
6170 17 Mar 21 nicklas 62     
6170 17 Mar 21 nicklas 63     JSONObject json = new JSONObject();
6170 17 Mar 21 nicklas 64     json.put("status", "ok");
6170 17 Mar 21 nicklas 65   
6170 17 Mar 21 nicklas 66     SessionControl sc = null;
6170 17 Mar 21 nicklas 67     DbControl dc = null;
6170 17 Mar 21 nicklas 68     try
6170 17 Mar 21 nicklas 69     {
6170 17 Mar 21 nicklas 70       if ("GetDetails".equals(cmd))
6170 17 Mar 21 nicklas 71       {
6551 26 Jan 22 nicklas 72         /*
6551 26 Jan 22 nicklas 73           We can load details from 1 or 2 files. The 2-file case is only
6551 26 Jan 22 nicklas 74           used for the OncoArray where 'fileId' is the reference VCf file
6551 26 Jan 22 nicklas 75           attached to the array design, and 'file2Id' is the VCF data file
6551 26 Jan 22 nicklas 76           for the raw bioassay. 
6551 26 Jan 22 nicklas 77          */
6170 17 Mar 21 nicklas 78         int rbaId = Values.getInt(req.getParameter("rbaId"));
6170 17 Mar 21 nicklas 79         int fileId = Values.getInt(req.getParameter("fileId"));
6170 17 Mar 21 nicklas 80         int lineNo = Values.getInt(req.getParameter("lineNo"));
6551 26 Jan 22 nicklas 81         String snpId = Values.getStringOrNull(req.getParameter("snpId"));
6173 18 Mar 21 nicklas 82         LuceneIndex idx = VarSearchService.getInstance().getIndexById(Values.getStringOrNull(req.getParameter("idx")));
6170 17 Mar 21 nicklas 83         
6170 17 Mar 21 nicklas 84         sc = VarSearch.getSessionControl(req);
6604 23 Feb 22 nicklas 85         dc = sc.newDbControl("Variant search: View hit details");
6170 17 Mar 21 nicklas 86         
6170 17 Mar 21 nicklas 87         RawBioAssay rba = RawBioAssay.getById(dc, rbaId);
6170 17 Mar 21 nicklas 88         File vcfFile = File.getById(dc, fileId);
6551 26 Jan 22 nicklas 89         json.put("rba", toJSON(rba));
6551 26 Jan 22 nicklas 90         json.put("file", toJSON(vcfFile));
6551 26 Jan 22 nicklas 91         
6551 26 Jan 22 nicklas 92         JSONObject jsonHit = new NullSafeJSONObject();
6551 26 Jan 22 nicklas 93         try (VcfParser parser = new VcfParser(vcfFile))
6170 17 Mar 21 nicklas 94         {
6551 26 Jan 22 nicklas 95           VcfHeader header = parser.parseHeaders();
6551 26 Jan 22 nicklas 96           if (header == null) 
6551 26 Jan 22 nicklas 97           {
6551 26 Jan 22 nicklas 98             throw new InvalidDataException("Could not find header line in VCF file: " + vcfFile.getName());
6551 26 Jan 22 nicklas 99           }
6551 26 Jan 22 nicklas 100           VcfLine line = parser.parseToLine(new LineNoFilter(lineNo));
6551 26 Jan 22 nicklas 101           if (line == null) 
6551 26 Jan 22 nicklas 102           {
6551 26 Jan 22 nicklas 103             throw new InvalidDataException("Could not find line #" + lineNo + ": " + vcfFile.getName());
6551 26 Jan 22 nicklas 104           }
6551 26 Jan 22 nicklas 105           json.put("raw", line.line());
6551 26 Jan 22 nicklas 106           VcfHit hit = new VcfHit(header, line);
6551 26 Jan 22 nicklas 107           
6551 26 Jan 22 nicklas 108           hit.exportColumns(jsonHit, "#CHROM", "POS", "REF", "ALT");
6551 26 Jan 22 nicklas 109           hit.exportInfo(jsonHit, "TYPE", "cosmic_ID", "cosmic_WES_BRCA_MF", "dbsnp_ID", "scanb_MF_NR", "scanb_CNT_NR");
6551 26 Jan 22 nicklas 110           hit.exportFormat(jsonHit, "GT", "AD", "DP", "AF", "VD");
6551 26 Jan 22 nicklas 111           
6551 26 Jan 22 nicklas 112           int annCol = header.annIndexOf("Annotation");
6551 26 Jan 22 nicklas 113           String effect = line.ann(annCol);
6551 26 Jan 22 nicklas 114           if (effect != null) jsonHit.put("effect", effect.replace("&", ", "));
6551 26 Jan 22 nicklas 115           
6551 26 Jan 22 nicklas 116           int geneCol = header.annIndexOf("Gene_Name");
6551 26 Jan 22 nicklas 117           Set<String> genes = new NullSafeTreeSet<>(); 
6551 26 Jan 22 nicklas 118           genes.add(line.ann(geneCol));
6551 26 Jan 22 nicklas 119           String ncbiRefSeq = line.info("ncbiRefSeq");
6551 26 Jan 22 nicklas 120           if (ncbiRefSeq != null) genes.addAll(Arrays.asList(ncbiRefSeq.split(",")));
6551 26 Jan 22 nicklas 121           jsonHit.put("genes", Values.getString(genes, ", ", true));
6551 26 Jan 22 nicklas 122           
6551 26 Jan 22 nicklas 123           int hgvsCCol = header.annIndexOf("HGVS.c");
6551 26 Jan 22 nicklas 124           Set<String> hgvsc = new NullSafeLinkedSet<>();
6551 26 Jan 22 nicklas 125           hgvsc.add(line.ann(hgvsCCol));
6551 26 Jan 22 nicklas 126           String cosmicCDS = line.info("cosmic_CDS");
6551 26 Jan 22 nicklas 127           if (cosmicCDS != null) hgvsc.addAll(Arrays.asList(cosmicCDS.split(",")));
6551 26 Jan 22 nicklas 128           jsonHit.put("hgvsc", Values.getString(hgvsc, ", ", true));
6551 26 Jan 22 nicklas 129
6551 26 Jan 22 nicklas 130           int hgvsPCol = header.annIndexOf("HGVS.p");
6551 26 Jan 22 nicklas 131           Set<String> hgvsp = new NullSafeLinkedSet<>();
6551 26 Jan 22 nicklas 132           hgvsp.add(AminoAcidTranslator.INSTANCE.translate(line.ann(hgvsPCol)));
6551 26 Jan 22 nicklas 133           String cosmicAA = line.info("cosmic_AA");
6551 26 Jan 22 nicklas 134           if (cosmicAA != null) hgvsp.addAll(Arrays.asList(cosmicAA.split(",")));
6551 26 Jan 22 nicklas 135           hgvsp.remove("p.?");
6551 26 Jan 22 nicklas 136           jsonHit.put("hgvsp", Values.getString(hgvsp, ", ", true));
6551 26 Jan 22 nicklas 137           
6551 26 Jan 22 nicklas 138           if (idx != null)
6551 26 Jan 22 nicklas 139           {
6551 26 Jan 22 nicklas 140             Set<Integer> allRba = hit.getAllRawBioAssays(idx);
6551 26 Jan 22 nicklas 141             allRba.remove(rbaId);
6551 26 Jan 22 nicklas 142             jsonHit.put("numOther", allRba.size());
6551 26 Jan 22 nicklas 143           }
6170 17 Mar 21 nicklas 144         }
6551 26 Jan 22 nicklas 145
6553 27 Jan 22 nicklas 146         if ("oncoarray-500K".equals(idx.getId()))
6170 17 Mar 21 nicklas 147         {
6553 27 Jan 22 nicklas 148           List<VcfFile> moreFiles = idx.getVcfFileLocator().getVcfFiles(dc, rba);
6553 27 Jan 22 nicklas 149           if (moreFiles.size() > 0)
6551 26 Jan 22 nicklas 150           {
6553 27 Jan 22 nicklas 151             File vcfFile2 = moreFiles.get(0).getFile();
6553 27 Jan 22 nicklas 152             json.put("file2", toJSON(vcfFile2));
6553 27 Jan 22 nicklas 153             try (VcfParser parser = new VcfParser(vcfFile2))
6551 26 Jan 22 nicklas 154             {
6553 27 Jan 22 nicklas 155               VcfHeader header = parser.parseHeaders();
6553 27 Jan 22 nicklas 156               VcfLine line = parser.parseToLine(new IdFilter(snpId, header.indexOf("ID")));
6553 27 Jan 22 nicklas 157               if (line == null) 
6553 27 Jan 22 nicklas 158               {
6553 27 Jan 22 nicklas 159                 throw new InvalidDataException("Could not find line with ID=" + snpId + ": " + vcfFile2.getName());
6553 27 Jan 22 nicklas 160               }
6553 27 Jan 22 nicklas 161               json.put("raw2", line.line());
6553 27 Jan 22 nicklas 162               VcfHit hit2 = new VcfHit(header, line);
6553 27 Jan 22 nicklas 163               hit2.exportFormat(jsonHit, "GT", "BAF", "GQ", "LRR");
6551 26 Jan 22 nicklas 164             }
6551 26 Jan 22 nicklas 165           }
6173 18 Mar 21 nicklas 166         }
6173 18 Mar 21 nicklas 167         
6170 17 Mar 21 nicklas 168         json.put("hit", jsonHit);
6170 17 Mar 21 nicklas 169       }
6522 20 Dec 21 nicklas 170       else if ("GetAllRbaHits".equals(cmd))
6522 20 Dec 21 nicklas 171       {
6522 20 Dec 21 nicklas 172         sc = VarSearch.getSessionControl(req);
6604 23 Feb 22 nicklas 173         dc = sc.newDbControl("Variant search: View hit details");
6522 20 Dec 21 nicklas 174         
6522 20 Dec 21 nicklas 175         int rbaId = Values.getInt(req.getParameter("rbaId"));
6526 20 Dec 21 nicklas 176         int fileId = Values.getInt(req.getParameter("fileId"));
6522 20 Dec 21 nicklas 177         RawBioAssay rba = RawBioAssay.getById(dc, rbaId);
6522 20 Dec 21 nicklas 178
6522 20 Dec 21 nicklas 179         LuceneIndex idx = VarSearchService.getInstance().getIndexById(Values.getStringOrNull(req.getParameter("idx")));
6522 20 Dec 21 nicklas 180         
6522 20 Dec 21 nicklas 181         json.put("indexName", idx.getName());
6522 20 Dec 21 nicklas 182         json.put("rbaName", rba.getName());
6526 20 Dec 21 nicklas 183         if (fileId > 0)
6526 20 Dec 21 nicklas 184         {
6526 20 Dec 21 nicklas 185           File f = File.getById(dc, fileId);
6526 20 Dec 21 nicklas 186           json.put("fileName", f.getName());
6526 20 Dec 21 nicklas 187         }
6522 20 Dec 21 nicklas 188         
6522 20 Dec 21 nicklas 189         String visibleColumns = Values.getString(sc.getUserClientSetting("net.sf.basedb.varsearch.visible-columns."+idx.getId()), 
6522 20 Dec 21 nicklas 190             "GENE,POS,REF_ALT,TYPE,HGVSC,HGVSP,LINKS");
6522 20 Dec 21 nicklas 191         SubColumn[] columns = SubColumn.getByName(visibleColumns.split(","));
6522 20 Dec 21 nicklas 192         StringBuilder gridTemplate = new StringBuilder();
6522 20 Dec 21 nicklas 193         gridTemplate.append("1.6rem ");
6522 20 Dec 21 nicklas 194         for (int colNo = 0; colNo < columns.length; colNo++)
6522 20 Dec 21 nicklas 195         {
6522 20 Dec 21 nicklas 196           gridTemplate.append(columns[colNo].getWidth()).append(" ");
6522 20 Dec 21 nicklas 197         }
6522 20 Dec 21 nicklas 198         gridTemplate.append("18px 18px");
6522 20 Dec 21 nicklas 199
6522 20 Dec 21 nicklas 200         StringBuilder sb = new StringBuilder();
6522 20 Dec 21 nicklas 201         sb.append("<div id=\"varsearch-header."+idx.getId()+"\" class=\"varsearch-grid\" style=\"grid-template-columns: "+gridTemplate+";\">");
6522 20 Dec 21 nicklas 202         int colNo = 0;
6522 20 Dec 21 nicklas 203         boolean enableHideColumn = columns.length > 1;
6522 20 Dec 21 nicklas 204         sb.append("<div class=\"varsearch-hitno\">#</div>");
6522 20 Dec 21 nicklas 205         for (SubColumn col : columns)
6522 20 Dec 21 nicklas 206         {
6522 20 Dec 21 nicklas 207           sb.append("<div title=\"").append(col.getTooltip()).append("\"");
6522 20 Dec 21 nicklas 208           sb.append(" class=\"gridcol-"+colNo+"\"");
6522 20 Dec 21 nicklas 209           sb.append(" data-index-id=\""+idx.getId()+"\" data-col=\""+col.name()+"\" data-col-no=\""+colNo+"\"");
6522 20 Dec 21 nicklas 210           if (enableHideColumn) sb.append(" draggable=\"true\"");
6522 20 Dec 21 nicklas 211           sb.append(">");
6522 20 Dec 21 nicklas 212           if (enableHideColumn)
6522 20 Dec 21 nicklas 213           {
6522 20 Dec 21 nicklas 214             sb.append("<span class=\"hide-col auto-init\" data-auto-init=\"varsearch-hide-col\" title=\"Hide this column\"></span>");
6522 20 Dec 21 nicklas 215           }
6522 20 Dec 21 nicklas 216           sb.append(col.getTitle()).append("</div>");
6522 20 Dec 21 nicklas 217           colNo++;
6522 20 Dec 21 nicklas 218         }
6522 20 Dec 21 nicklas 219         sb.append("<div style=\"border-left-width: 0; padding: 1px; grid-column: span 2;\">");
6522 20 Dec 21 nicklas 220         sb.append("<span class=\"varsearch-help link no-print auto-init\" data-auto-init=\"varsearch-options\" data-index-id=\""+idx.getId()+"\" title=\"Configuration options\"><img src=\"./images/gear.svg\"></span>");
6522 20 Dec 21 nicklas 221         sb.append("</div>");
6522 20 Dec 21 nicklas 222         sb.append("</div>");
6522 20 Dec 21 nicklas 223         json.put("header", sb.toString());
6522 20 Dec 21 nicklas 224         
6551 26 Jan 22 nicklas 225         LuceneFilterAction<?> filter = idx.createFilterAction(null);
6526 20 Dec 21 nicklas 226         if (fileId > 0)
6526 20 Dec 21 nicklas 227         {
6526 20 Dec 21 nicklas 228           filter.addQuery("file:"+fileId);
6526 20 Dec 21 nicklas 229         }
6526 20 Dec 21 nicklas 230         else
6526 20 Dec 21 nicklas 231         {
6526 20 Dec 21 nicklas 232           filter.addQuery(AutoPrefixer.INSTANCE.autoPrefix("0/1 OR 1/0 OR 1/1"));
6526 20 Dec 21 nicklas 233         }
6522 20 Dec 21 nicklas 234         
6552 26 Jan 22 nicklas 235         LuceneColumnAction<?, ?> action = idx.createColumnAction(filter); //new LuceneColumnAction(idx, filter, columns);
6552 26 Jan 22 nicklas 236         action.setColumns(columns);
6522 20 Dec 21 nicklas 237         action.setMaxHitsPerRba(LuceneColumnFactory.MAX_HITS_PER_TABLE);
6522 20 Dec 21 nicklas 238         json.put("results", action.getValue(dc, rba));
6522 20 Dec 21 nicklas 239       }
6170 17 Mar 21 nicklas 240     }
6170 17 Mar 21 nicklas 241     catch (Throwable t)
6170 17 Mar 21 nicklas 242     {
6170 17 Mar 21 nicklas 243       t.printStackTrace();
6170 17 Mar 21 nicklas 244       json.clear();
6170 17 Mar 21 nicklas 245       json.put("status", "error");
6170 17 Mar 21 nicklas 246       json.put("message", t.getMessage());
6170 17 Mar 21 nicklas 247       json.put("stacktrace", ThrowableUtil.stackTraceToString(t));
6170 17 Mar 21 nicklas 248     }
6170 17 Mar 21 nicklas 249     finally
6170 17 Mar 21 nicklas 250     {
6170 17 Mar 21 nicklas 251       if (dc != null) dc.close();
6170 17 Mar 21 nicklas 252       json.writeJSONString(resp.getWriter());
6170 17 Mar 21 nicklas 253     }
6170 17 Mar 21 nicklas 254     
6170 17 Mar 21 nicklas 255   }
6170 17 Mar 21 nicklas 256
6551 26 Jan 22 nicklas 257   JSONObject toJSON(Nameable item)
6551 26 Jan 22 nicklas 258   {
6551 26 Jan 22 nicklas 259     JSONObject json = new JSONObject();
6551 26 Jan 22 nicklas 260     json.put("id", item.getId());
6551 26 Jan 22 nicklas 261     json.put("name", item.getName());
6554 27 Jan 22 nicklas 262     if (item instanceof RawBioAssay)
6554 27 Jan 22 nicklas 263     {
6554 27 Jan 22 nicklas 264       json.put("type", ((RawBioAssay)item).getRawDataType().getName());
6554 27 Jan 22 nicklas 265     }
6551 26 Jan 22 nicklas 266     return json;
6551 26 Jan 22 nicklas 267   }
6551 26 Jan 22 nicklas 268   
6173 18 Mar 21 nicklas 269   /**
6173 18 Mar 21 nicklas 270     A single line from the VCF with header information.
6173 18 Mar 21 nicklas 271   */
6170 17 Mar 21 nicklas 272   static class VcfHit
6170 17 Mar 21 nicklas 273   {
6551 26 Jan 22 nicklas 274     public final VcfHeader header;
6551 26 Jan 22 nicklas 275     public final VcfLine line;
6170 17 Mar 21 nicklas 276     
6170 17 Mar 21 nicklas 277     VcfHit(VcfHeader header, VcfLine line)
6170 17 Mar 21 nicklas 278     {
6170 17 Mar 21 nicklas 279       this.header = header;
6170 17 Mar 21 nicklas 280       this.line = line;
6170 17 Mar 21 nicklas 281     }
6170 17 Mar 21 nicklas 282     
6173 18 Mar 21 nicklas 283     Set<Integer> getAllRawBioAssays(LuceneIndex idx)
6173 18 Mar 21 nicklas 284       throws IOException
6173 18 Mar 21 nicklas 285     {
6173 18 Mar 21 nicklas 286       String chr = line.col(header.indexOf("#CHROM"));
6173 18 Mar 21 nicklas 287       long pos = line.longValue(header.indexOf("POS"));
6173 18 Mar 21 nicklas 288       String ref = line.col(header.indexOf("REF"));
6173 18 Mar 21 nicklas 289       String alt = line.col(header.indexOf("ALT"));
6551 26 Jan 22 nicklas 290       String snpId = line.col(header.indexOf("ID"));
6551 26 Jan 22 nicklas 291       return idx.getRawBioAssaysWithVariant(chr, pos, ref, alt, snpId);
6173 18 Mar 21 nicklas 292     }
6173 18 Mar 21 nicklas 293     
6170 17 Mar 21 nicklas 294     void exportColumns(JSONObject json, String... cols)
6170 17 Mar 21 nicklas 295     {
6170 17 Mar 21 nicklas 296       for (String c : cols)
6170 17 Mar 21 nicklas 297       {
6170 17 Mar 21 nicklas 298         json.put(c, line.col(header.indexOf(c)));
6170 17 Mar 21 nicklas 299       }
6170 17 Mar 21 nicklas 300     }
6170 17 Mar 21 nicklas 301     
6170 17 Mar 21 nicklas 302     void exportAnn(JSONObject json, String... cols)
6170 17 Mar 21 nicklas 303     {
6170 17 Mar 21 nicklas 304       for (String c : cols)
6170 17 Mar 21 nicklas 305       {
6170 17 Mar 21 nicklas 306         json.put(c, line.ann(header.annIndexOf(c)));
6170 17 Mar 21 nicklas 307       }
6170 17 Mar 21 nicklas 308     }
6170 17 Mar 21 nicklas 309     
6170 17 Mar 21 nicklas 310     void exportInfo(JSONObject json, String... cols)
6170 17 Mar 21 nicklas 311     {
6170 17 Mar 21 nicklas 312       for (String c : cols)
6170 17 Mar 21 nicklas 313       {
6170 17 Mar 21 nicklas 314         json.put(c, line.info(c));
6170 17 Mar 21 nicklas 315       }
6170 17 Mar 21 nicklas 316     }
6170 17 Mar 21 nicklas 317
6170 17 Mar 21 nicklas 318     void exportFormat(JSONObject json, String... cols)
6170 17 Mar 21 nicklas 319     {
6170 17 Mar 21 nicklas 320       for (String c : cols)
6170 17 Mar 21 nicklas 321       {
6170 17 Mar 21 nicklas 322         json.put(c, line.format(c));
6170 17 Mar 21 nicklas 323       }
6170 17 Mar 21 nicklas 324     }
6170 17 Mar 21 nicklas 325
6170 17 Mar 21 nicklas 326   }
6170 17 Mar 21 nicklas 327 }