extensions/net.sf.basedb.meludi/trunk/resources/libprep/libprep_protocol.js

Code
Comments
Other
Rev Date Author Line
3449 28 Jul 15 olle 1 var Protocol = function()
3449 28 Jul 15 olle 2 {
3449 28 Jul 15 olle 3   var protocol = {};
3449 28 Jul 15 olle 4   var debug = 0;
3449 28 Jul 15 olle 5   
3449 28 Jul 15 olle 6   var QUANTITY_REGULAR = 1.1;
3449 28 Jul 15 olle 7   var LOW_QUANTITY_WARNING_FACTOR = 2;
3449 28 Jul 15 olle 8
3449 28 Jul 15 olle 9   // Page initialization
3449 28 Jul 15 olle 10   protocol.initPage = function()
3449 28 Jul 15 olle 11   {
3449 28 Jul 15 olle 12     var pageId = Doc.getPageId();
3449 28 Jul 15 olle 13     if (pageId == 'protocol')
3449 28 Jul 15 olle 14     {
3449 28 Jul 15 olle 15       Buttons.addClickHandler('print-button', Wizard.goPrint);  
3449 28 Jul 15 olle 16
3449 28 Jul 15 olle 17       var libPlateId = Data.int('page-data', 'libplate');
3449 28 Jul 15 olle 18
3449 28 Jul 15 olle 19       var url = '../LibPrep.servlet?ID='+App.getSessionId();
3449 28 Jul 15 olle 20       url += '&cmd=GetLibraryInfoForPlate&bioplate='+libPlateId;    
3449 28 Jul 15 olle 21       Wizard.showLoadingAnimation('Loading Library bioplate information...');
3449 28 Jul 15 olle 22       Wizard.asyncJsonRequest(url, protocol.initializeProtocol);
3449 28 Jul 15 olle 23     }
3449 28 Jul 15 olle 24     else
3449 28 Jul 15 olle 25     {
3449 28 Jul 15 olle 26       Events.addEventHandler('bioplate', 'change', protocol.bioplateOnChange);
3449 28 Jul 15 olle 27       Events.addEventHandler('listview', 'click', protocol.viewProtocol);
3449 28 Jul 15 olle 28       Events.addEventHandler('plateview', 'click', protocol.viewProtocol);
3449 28 Jul 15 olle 29
3449 28 Jul 15 olle 30 /*
3449 28 Jul 15 olle 31       var request = Ajax.getXmlHttpRequest();
3449 28 Jul 15 olle 32       var url = '../LibPrep.servlet?ID='+App.getSessionId();
3449 28 Jul 15 olle 33       url += '&cmd=GetConfigurationsForCaliperRunParametersExporter';
3449 28 Jul 15 olle 34       Wizard.asyncJsonRequest(url, protocol.initExportLinks);
3449 28 Jul 15 olle 35 */
3449 28 Jul 15 olle 36   
3449 28 Jul 15 olle 37       var url = '../LibPrep.servlet?ID='+App.getSessionId();
3449 28 Jul 15 olle 38       url += '&cmd=GetLibraryPlatesForLibPrep';
3449 28 Jul 15 olle 39       Wizard.showLoadingAnimation('Loading Library plates...');
3449 28 Jul 15 olle 40       Wizard.asyncJsonRequest(url, protocol.initializeStep1);
3449 28 Jul 15 olle 41     }
3449 28 Jul 15 olle 42   }
3449 28 Jul 15 olle 43
3449 28 Jul 15 olle 44
3449 28 Jul 15 olle 45   protocol.initializeStep1 = function(response)
3449 28 Jul 15 olle 46   {
3449 28 Jul 15 olle 47     var frm = document.forms['meludi'];  
3449 28 Jul 15 olle 48
3449 28 Jul 15 olle 49     var bioplates = response.bioplates;
3449 28 Jul 15 olle 50     var plates = frm.bioplate;
3449 28 Jul 15 olle 51     if (bioplates.length > 0)
3449 28 Jul 15 olle 52     {
3449 28 Jul 15 olle 53       for (var i=0; i < bioplates.length; i++)
3449 28 Jul 15 olle 54       {
3449 28 Jul 15 olle 55         var bioplate = bioplates[i];
3449 28 Jul 15 olle 56         var option = new Option(bioplate.name, bioplate.id);
3449 28 Jul 15 olle 57         option.bioplate = bioplate;
3449 28 Jul 15 olle 58         plates.options[plates.length] = option;
3449 28 Jul 15 olle 59       }
3449 28 Jul 15 olle 60       bioplateIsValid = true;
3449 28 Jul 15 olle 61       protocol.bioplateOnChange();
3449 28 Jul 15 olle 62     }
3449 28 Jul 15 olle 63     else
3449 28 Jul 15 olle 64     {
3449 28 Jul 15 olle 65       Wizard.setFatalError('No Library bioplates available for processing.');
3449 28 Jul 15 olle 66       return;
3449 28 Jul 15 olle 67     }
3449 28 Jul 15 olle 68     
3449 28 Jul 15 olle 69     Doc.show('step-1');
3449 28 Jul 15 olle 70   }
3449 28 Jul 15 olle 71   
3449 28 Jul 15 olle 72   protocol.initExportLinks = function(response)
3449 28 Jul 15 olle 73   {
3449 28 Jul 15 olle 74     var configurations = response.configurations;
3449 28 Jul 15 olle 75     var caliper96 = protocol.makeExportLink('Sample names for Caliper (96)', 'CALIPER', 'SAMPLE_NAMES');
3449 28 Jul 15 olle 76     var caliper384 = protocol.makeExportLink('Sample names for Caliper (384)', 'CALIPER', 'SAMPLE_NAMES_384');
3449 28 Jul 15 olle 77     for (var i = 0; i < configurations.length; i++)
3449 28 Jul 15 olle 78     {
3449 28 Jul 15 olle 79       var config = configurations[i];
3449 28 Jul 15 olle 80       var btnHtml = protocol.makeExportLink('Run parameters: '+Strings.encodeTags(config.name), 'CALIPER', config.id);
3449 28 Jul 15 olle 81       if (config.name.indexOf('384') > 0)
3449 28 Jul 15 olle 82       {
3449 28 Jul 15 olle 83         caliper384 += btnHtml;
3449 28 Jul 15 olle 84       }
3449 28 Jul 15 olle 85       else
3449 28 Jul 15 olle 86       {
3449 28 Jul 15 olle 87         caliper96 += btnHtml;
3449 28 Jul 15 olle 88       }
3449 28 Jul 15 olle 89     }
3449 28 Jul 15 olle 90     Doc.element('exportCaliper96').innerHTML = caliper96;
3449 28 Jul 15 olle 91     Doc.element('exportCaliper384').innerHTML = caliper384;
3449 28 Jul 15 olle 92
3449 28 Jul 15 olle 93     var qubit = protocol.makeExportLink('Sample names for Qubit', 'QUBIT', 'SAMPLE_NAMES');
3449 28 Jul 15 olle 94     Doc.element('exportQubit').innerHTML = qubit;
3449 28 Jul 15 olle 95     
3449 28 Jul 15 olle 96     var links = Doc.element('export').getElementsByClassName('link');
3449 28 Jul 15 olle 97     for (var linkNo = 0; linkNo < links.length; linkNo++)
3449 28 Jul 15 olle 98     {
3449 28 Jul 15 olle 99       Events.addEventHandler(links[linkNo], 'click', protocol.exportFile);
3449 28 Jul 15 olle 100     }
3449 28 Jul 15 olle 101   }
3449 28 Jul 15 olle 102   
3449 28 Jul 15 olle 103   protocol.makeExportLink = function(title, hardware, exporter)
3449 28 Jul 15 olle 104   {
3449 28 Jul 15 olle 105     var btn = '';
3449 28 Jul 15 olle 106     btn += '<span class="link" data-hardware="'+hardware+'" data-exporter="'+exporter+'">';
3449 28 Jul 15 olle 107     btn += '<img src="../images/export.png">&nbsp;';
3449 28 Jul 15 olle 108     btn += title+'</span><br>\n';
3449 28 Jul 15 olle 109     return btn;
3449 28 Jul 15 olle 110   }
3449 28 Jul 15 olle 111   
3449 28 Jul 15 olle 112   // Add pools to the pools list based on the bioplate selection
3449 28 Jul 15 olle 113   protocol.bioplateOnChange = function()
3449 28 Jul 15 olle 114   {
3449 28 Jul 15 olle 115     var frm = document.forms['meludi'];
3449 28 Jul 15 olle 116     var bioplate = frm.bioplate[frm.bioplate.selectedIndex].bioplate;
3449 28 Jul 15 olle 117     Doc.element('comments').innerHTML = Strings.encodeTags(bioplate.comments);
3449 28 Jul 15 olle 118     frm.poolSchema.value = bioplate.poolSchema;
3449 28 Jul 15 olle 119     frm.barcodeVariant.value = bioplate.barcodeVariant;
3449 28 Jul 15 olle 120   }
3449 28 Jul 15 olle 121   
3449 28 Jul 15 olle 122
3449 28 Jul 15 olle 123   protocol.viewProtocol = function(event)
3449 28 Jul 15 olle 124   {
3449 28 Jul 15 olle 125     var frm = document.forms['meludi'];
3449 28 Jul 15 olle 126     if (frm.bioplate && !frm.bioplate.disabled)
3449 28 Jul 15 olle 127     {
3449 28 Jul 15 olle 128       frm.view.value = Data.get(event.currentTarget, 'protocol-type');
3449 28 Jul 15 olle 129       frm.submit();
3449 28 Jul 15 olle 130     }
3449 28 Jul 15 olle 131   }
3449 28 Jul 15 olle 132
3449 28 Jul 15 olle 133   protocol.exportFile = function(event)
3449 28 Jul 15 olle 134   {
3449 28 Jul 15 olle 135     var frm = document.forms['meludi'];
3449 28 Jul 15 olle 136     if (frm.bioplate && !frm.bioplate.disabled)
3449 28 Jul 15 olle 137     {
3449 28 Jul 15 olle 138       var bioPlateId = frm.bioplate[frm.bioplate.selectedIndex].value;
3449 28 Jul 15 olle 139     
3449 28 Jul 15 olle 140       var hardware = Data.get(event.currentTarget, 'hardware');
3449 28 Jul 15 olle 141       var exporter = Data.get(event.currentTarget, 'exporter');
3449 28 Jul 15 olle 142       
3449 28 Jul 15 olle 143       var url = '../LibPrep.servlet?ID='+App.getSessionId();
3449 28 Jul 15 olle 144       if (hardware == 'CALIPER')
3449 28 Jul 15 olle 145       {
3449 28 Jul 15 olle 146         if (exporter == 'SAMPLE_NAMES')
3449 28 Jul 15 olle 147         {
3449 28 Jul 15 olle 148           url += '&cmd=ExportSampleNamesForCaliper&bioPlateId='+bioPlateId;
3449 28 Jul 15 olle 149         }
3449 28 Jul 15 olle 150         else if (exporter == 'SAMPLE_NAMES_384')
3449 28 Jul 15 olle 151         {
3449 28 Jul 15 olle 152           url += '&cmd=ExportSampleNamesForCaliper&remapTo384=1&bioPlateId='+bioPlateId;
3449 28 Jul 15 olle 153         }
3449 28 Jul 15 olle 154         else
3449 28 Jul 15 olle 155         {
3449 28 Jul 15 olle 156           url += '&cmd=ExportCaliperRunParameters&bioPlateId='+bioPlateId+'&configurationId='+exporter;
3449 28 Jul 15 olle 157         }
3449 28 Jul 15 olle 158       }
3449 28 Jul 15 olle 159       else if (hardware == 'QUBIT')
3449 28 Jul 15 olle 160       {
3449 28 Jul 15 olle 161         if (exporter == 'SAMPLE_NAMES')
3449 28 Jul 15 olle 162         {
3449 28 Jul 15 olle 163           url += '&cmd=ExportSampleNamesForQubit&bioPlateId='+bioPlateId;
3449 28 Jul 15 olle 164         }
3449 28 Jul 15 olle 165         else
3449 28 Jul 15 olle 166         {
3449 28 Jul 15 olle 167           alert('not implemented');
3449 28 Jul 15 olle 168           return;
3449 28 Jul 15 olle 169         }
3449 28 Jul 15 olle 170       }
3449 28 Jul 15 olle 171       window.location = url;
3449 28 Jul 15 olle 172     }
3449 28 Jul 15 olle 173   }
3449 28 Jul 15 olle 174
3449 28 Jul 15 olle 175   protocol.initializeProtocol = function(response)
3449 28 Jul 15 olle 176   {
3449 28 Jul 15 olle 177     var list = response.libraries;
3449 28 Jul 15 olle 178
3449 28 Jul 15 olle 179
3449 28 Jul 15 olle 180     var schema = PoolSchema.getById(Data.get('page-data', 'schema'));
3449 28 Jul 15 olle 181     var barcodeVariant = PoolSchema.getBarcodeVariantByName(schema, Data.get('page-data', 'barcode-variant'));
3449 28 Jul 15 olle 182
3449 28 Jul 15 olle 183     // Pre-process the Library items
3449 28 Jul 15 olle 184     for (var i = 0; i < list.length; i++)
3449 28 Jul 15 olle 185     {
3449 28 Jul 15 olle 186       protocol.checkAndPreProcessLibrary(list[i], schema, barcodeVariant);
3449 28 Jul 15 olle 187     }
3449 28 Jul 15 olle 188     
3449 28 Jul 15 olle 189     var view = Data.get('page-data', 'view');
3449 28 Jul 15 olle 190     if (view == 'list')
3449 28 Jul 15 olle 191     {
3449 28 Jul 15 olle 192       protocol.viewAsList(list, schema, barcodeVariant);
3449 28 Jul 15 olle 193     }
3449 28 Jul 15 olle 194     else
3449 28 Jul 15 olle 195     {
3449 28 Jul 15 olle 196       protocol.viewAsPlate(list, schema, barcodeVariant)
3449 28 Jul 15 olle 197     }
3449 28 Jul 15 olle 198
3449 28 Jul 15 olle 199   }
3449 28 Jul 15 olle 200   
3449 28 Jul 15 olle 201   /**
3449 28 Jul 15 olle 202     Find the lowest used quantity. This is the QUANTITY_REGULAR
3449 28 Jul 15 olle 203     value. RNA with larger used quantities are assumed to be selected
3449 28 Jul 15 olle 204     for QC.
3449 28 Jul 15 olle 205   */
3449 28 Jul 15 olle 206   protocol.findLowestUsedQuantity = function(mrnaList)
3449 28 Jul 15 olle 207   {
3449 28 Jul 15 olle 208     var lowestQuantity = mrnaList[0].rna.usedQuantity;
3449 28 Jul 15 olle 209     for (var i = 1; i < mrnaList.length; i++)
3449 28 Jul 15 olle 210     {
3449 28 Jul 15 olle 211       var rna = mrnaList[i].rna;
3449 28 Jul 15 olle 212       if (rna.usedQuantity < lowestQuantity)
3449 28 Jul 15 olle 213       {
3449 28 Jul 15 olle 214         lowestQuantity = rna.usedQuantity;
3449 28 Jul 15 olle 215       }
3449 28 Jul 15 olle 216     }
3449 28 Jul 15 olle 217     return lowestQuantity;
3449 28 Jul 15 olle 218   }
3449 28 Jul 15 olle 219
3449 28 Jul 15 olle 220   
3449 28 Jul 15 olle 221   protocol.checkAndPreProcessLibrary = function(lib, schema, barcodeVariant)
3449 28 Jul 15 olle 222   {
3449 28 Jul 15 olle 223     var well = lib.bioWell;
3449 28 Jul 15 olle 224     var remarks = [];
3449 28 Jul 15 olle 225
3449 28 Jul 15 olle 226     // Check if default barcode has been modified
3449 28 Jul 15 olle 227     var indexSet = barcodeVariant.indexSets[well.column];
3449 28 Jul 15 olle 228     if (indexSet)
3449 28 Jul 15 olle 229     {
3449 28 Jul 15 olle 230       var defaultBarcode = indexSet.barcodes[well.row];
3449 28 Jul 15 olle 231       if (defaultBarcode && lib.barcode.name != defaultBarcode)
3449 28 Jul 15 olle 232       {
3449 28 Jul 15 olle 233         remarks[remarks.length] = 'Modified barcode';
3449 28 Jul 15 olle 234         lib.barcode.modified = true;
3449 28 Jul 15 olle 235       }
3449 28 Jul 15 olle 236     }
3449 28 Jul 15 olle 237     lib.remarks = remarks;
3449 28 Jul 15 olle 238   }
3449 28 Jul 15 olle 239
3449 28 Jul 15 olle 240   protocol.viewAsPlate = function(list, schema, barcodeVariant)
3449 28 Jul 15 olle 241   {
3449 28 Jul 15 olle 242     var rows = Data.get('page-data', 'rows');
3449 28 Jul 15 olle 243     var columns = Data.get('page-data', 'columns');
3449 28 Jul 15 olle 244     Plate.init(rows, columns, schema, WellPainter);
3449 28 Jul 15 olle 245     
3449 28 Jul 15 olle 246     for (var i = 0; i < list.length; i++)
3449 28 Jul 15 olle 247     {
3449 28 Jul 15 olle 248       var lib = list[i];
3449 28 Jul 15 olle 249       var well = lib.bioWell;
3449 28 Jul 15 olle 250       Plate.getWell(well.row, well.column).setExtract(lib);
3449 28 Jul 15 olle 251     }
3449 28 Jul 15 olle 252
3449 28 Jul 15 olle 253     WellPainter.barcodeVariant = barcodeVariant;
3449 28 Jul 15 olle 254     Plate.paint(Plate.getWells());
3449 28 Jul 15 olle 255     PoolSchema.buildPoolTableRow(schema, columns);
3449 28 Jul 15 olle 256
3449 28 Jul 15 olle 257     Doc.show('all-protocol');
3449 28 Jul 15 olle 258   }
3449 28 Jul 15 olle 259
3449 28 Jul 15 olle 260   protocol.viewAsList = function(list, schema, barcodeVariant)
3449 28 Jul 15 olle 261   {
3449 28 Jul 15 olle 262     var lastPoolNum = -1;
3449 28 Jul 15 olle 263     for (var i = 0; i < list.length; i++)
3449 28 Jul 15 olle 264     {
3449 28 Jul 15 olle 265       var lib = list[i];
3449 28 Jul 15 olle 266       var well = lib.bioWell;
3449 28 Jul 15 olle 267   
3449 28 Jul 15 olle 268       var idSuffix = well.column + '.' + well.row;
3449 28 Jul 15 olle 269       Doc.removeClass('row.'+idSuffix, 'empty');
3449 28 Jul 15 olle 270       Doc.element('lib.'+idSuffix).innerHTML = Strings.encodeTags(lib.name);
3449 28 Jul 15 olle 271       Doc.element('barcode.'+idSuffix).innerHTML = Strings.encodeTags(lib.barcode.name);
3449 28 Jul 15 olle 272       
3449 28 Jul 15 olle 273       var indexSet = barcodeVariant.indexSets[well.column];
3449 28 Jul 15 olle 274       if (indexSet)
3449 28 Jul 15 olle 275       {
3449 28 Jul 15 olle 276         var color = lib.barcode.modified ? 'bg-modified' : indexSet.color;
3449 28 Jul 15 olle 277         Doc.addClass('barcode.'+idSuffix, color);
3449 28 Jul 15 olle 278       }
3449 28 Jul 15 olle 279       
3449 28 Jul 15 olle 280       Doc.element('remarks.'+idSuffix).innerHTML = lib.remarks.join('; ');
3449 28 Jul 15 olle 281     }
3449 28 Jul 15 olle 282
3449 28 Jul 15 olle 283     Doc.show('all-protocol');
3449 28 Jul 15 olle 284   }
3449 28 Jul 15 olle 285   
3449 28 Jul 15 olle 286   
3449 28 Jul 15 olle 287   return protocol;
3449 28 Jul 15 olle 288 }();
3449 28 Jul 15 olle 289
3449 28 Jul 15 olle 290 Doc.onLoad(Protocol.initPage);
3449 28 Jul 15 olle 291
3449 28 Jul 15 olle 292
3449 28 Jul 15 olle 293 var WellPainter = function()
3449 28 Jul 15 olle 294 {
3449 28 Jul 15 olle 295   var painter = {};
3449 28 Jul 15 olle 296   
3449 28 Jul 15 olle 297   painter.getClassNameForWell = function(well, schema)
3449 28 Jul 15 olle 298   {
3449 28 Jul 15 olle 299     var cls = '';
3449 28 Jul 15 olle 300     var indexSet = painter.barcodeVariant.indexSets[well.column];
3449 28 Jul 15 olle 301     if (indexSet)
3449 28 Jul 15 olle 302     {
3449 28 Jul 15 olle 303       var lib = well.extract;
3449 28 Jul 15 olle 304       cls += lib && lib.barcode.modified ? 'bg-modified' : indexSet.color;
3449 28 Jul 15 olle 305     }
3449 28 Jul 15 olle 306     return cls;
3449 28 Jul 15 olle 307   }
3449 28 Jul 15 olle 308   
3449 28 Jul 15 olle 309   painter.getWellText = function(well, schema)
3449 28 Jul 15 olle 310   {
3449 28 Jul 15 olle 311     var text = '';
3449 28 Jul 15 olle 312     var lib = well.extract;
3449 28 Jul 15 olle 313     if (lib)
3449 28 Jul 15 olle 314     {
3449 28 Jul 15 olle 315       var name = lib.name;
3449 28 Jul 15 olle 316       var i = name.indexOf('.m');
3449 28 Jul 15 olle 317       text += '<div class="lib">'+Strings.encodeTags(name.substring(0, i))+'.<br>&nbsp;'+Strings.encodeTags(name.substring(i))+'</div>';
3449 28 Jul 15 olle 318       text += '<div class="barcode">'+Strings.encodeTags(lib.barcode.name)+'</div>';
3449 28 Jul 15 olle 319       text += '<div class="remarks">'+ lib.remarks.join('; ') + '</div>';
3449 28 Jul 15 olle 320     }
3449 28 Jul 15 olle 321     return text;
3449 28 Jul 15 olle 322   }
3449 28 Jul 15 olle 323
3449 28 Jul 15 olle 324   return painter;
3449 28 Jul 15 olle 325 }();