extensions/net.sf.basedb.reggie/trunk/resources/sampleproc/rna_normalization.js

Code
Comments
Other
Rev Date Author Line
2903 06 Nov 14 nicklas 1 var RnaNormalize = function()
2903 06 Nov 14 nicklas 2 {
2903 06 Nov 14 nicklas 3   var normalize = {};
3269 23 Apr 15 nicklas 4
3269 23 Apr 15 nicklas 5   // The minial volume of RNA we want to take when normalizing
3269 23 Apr 15 nicklas 6   // For RNA with high concentration we must make a larger mix to reach the target concentation
3269 23 Apr 15 nicklas 7   var MINIMAL_RNA_VOLUME = 1; // µl
3269 23 Apr 15 nicklas 8   var hasInitProtocols = false;
2903 06 Nov 14 nicklas 9   
2903 06 Nov 14 nicklas 10   var selectedRna;
2903 06 Nov 14 nicklas 11   var subtypeRna = null;
2903 06 Nov 14 nicklas 12   
2903 06 Nov 14 nicklas 13   var autoGoNext = 0;
2903 06 Nov 14 nicklas 14   var newRna = [];
2903 06 Nov 14 nicklas 15   
2903 06 Nov 14 nicklas 16   // Page initialization
2903 06 Nov 14 nicklas 17   normalize.initPage = function()
2903 06 Nov 14 nicklas 18   {
2903 06 Nov 14 nicklas 19     // Step 1
2903 06 Nov 14 nicklas 20     Events.addEventHandler('step-1', 'wizard-validate', normalize.validateStep1);
2903 06 Nov 14 nicklas 21     Buttons.addClickHandler('btnSelectRna', normalize.selectRna);
2903 06 Nov 14 nicklas 22     Events.addEventHandler('rna', 'base-selected', normalize.onRnaSelected);
2903 06 Nov 14 nicklas 23     
2903 06 Nov 14 nicklas 24     // Step 2
3269 23 Apr 15 nicklas 25     Events.addEventHandler('normalizationProtocol', 'change', normalize.protocolOnChange);
3269 23 Apr 15 nicklas 26     Events.addEventHandler('normalizationProtocol', 'keyup', normalize.protocolOnChange);
2903 06 Nov 14 nicklas 27     Events.addEventHandler('step-2', 'wizard-initialize', normalize.initializeStep2);
2903 06 Nov 14 nicklas 28     Events.addEventHandler('step-2', 'wizard-validate', normalize.validateStep2);
2903 06 Nov 14 nicklas 29
2903 06 Nov 14 nicklas 30     // Step 3
2903 06 Nov 14 nicklas 31     Events.addEventHandler('step-3', 'wizard-initialize', normalize.initializeStep3);
2903 06 Nov 14 nicklas 32     Events.addEventHandler('normalizationDate', 'blur', Wizard.validateDate);
2903 06 Nov 14 nicklas 33     
2903 06 Nov 14 nicklas 34     // Navigation
2903 06 Nov 14 nicklas 35     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
2903 06 Nov 14 nicklas 36     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
2903 06 Nov 14 nicklas 37     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
2903 06 Nov 14 nicklas 38     Buttons.addClickHandler('goprint', normalize.printVersion);
2903 06 Nov 14 nicklas 39     Buttons.addClickHandler('goregister', Wizard.goRegister);
2903 06 Nov 14 nicklas 40
2903 06 Nov 14 nicklas 41     // Final registration
2903 06 Nov 14 nicklas 42     Events.addEventHandler('wizard', 'wizard-submit', normalize.submit);
2903 06 Nov 14 nicklas 43
2903 06 Nov 14 nicklas 44     var rna = Data.json('page-data', 'rna-id');
2903 06 Nov 14 nicklas 45     if (rna.length > 0)
2903 06 Nov 14 nicklas 46     {
2903 06 Nov 14 nicklas 47       Doc.show('step-1');
2903 06 Nov 14 nicklas 48       autoGoNext = rna.length;
2903 06 Nov 14 nicklas 49       // Get more information about the selected rna
2903 06 Nov 14 nicklas 50       var url = '../Extraction.servlet?ID='+App.getSessionId();
2903 06 Nov 14 nicklas 51       url += '&cmd=GetRNAInfoForNormalize&rnaIds=' + rna.join(',');
2903 06 Nov 14 nicklas 52       Wizard.asyncJsonRequest(url, normalize.onRnaInfoLoaded);
2903 06 Nov 14 nicklas 53     }
2903 06 Nov 14 nicklas 54     else
2903 06 Nov 14 nicklas 55     {
2903 06 Nov 14 nicklas 56       var url = '../Extraction.servlet?ID='+App.getSessionId();
2903 06 Nov 14 nicklas 57       url += '&cmd=GetRNAToNormalize';
2903 06 Nov 14 nicklas 58       Wizard.showLoadingAnimation('Loading RNA extracts...');
2903 06 Nov 14 nicklas 59       Wizard.asyncJsonRequest(url, normalize.onRnaLoaded);
2903 06 Nov 14 nicklas 60     }
2903 06 Nov 14 nicklas 61   }
2903 06 Nov 14 nicklas 62   
2903 06 Nov 14 nicklas 63   normalize.onRnaLoaded = function(response)
2903 06 Nov 14 nicklas 64   {
2903 06 Nov 14 nicklas 65     var frm = document.forms['reggie'];
2903 06 Nov 14 nicklas 66     var rnaExtracts = response.rnaExtracts;
2903 06 Nov 14 nicklas 67     
2903 06 Nov 14 nicklas 68     rnaExtracts.sort(normalize.sortByQiacubePosition);
2903 06 Nov 14 nicklas 69     
2903 06 Nov 14 nicklas 70     if (rnaExtracts.length > 0)
2903 06 Nov 14 nicklas 71     {
2903 06 Nov 14 nicklas 72       var qiacubeRun = rnaExtracts[0].QiacubeDate + '#' + rnaExtracts[0].QiacubeRunNo;
2903 06 Nov 14 nicklas 73       for (var i=0; i < rnaExtracts.length; i++)
2903 06 Nov 14 nicklas 74       {
2903 06 Nov 14 nicklas 75         var rna = rnaExtracts[i];
2903 06 Nov 14 nicklas 76         var selected = (rna.QiacubeDate + '#' + rna.QiacubeRunNo) == qiacubeRun;
2903 06 Nov 14 nicklas 77         normalize.addRnaOption(frm.rna, rna, selected);
2903 06 Nov 14 nicklas 78       }
2903 06 Nov 14 nicklas 79     }
2903 06 Nov 14 nicklas 80     else
2903 06 Nov 14 nicklas 81     {  
2903 06 Nov 14 nicklas 82       Wizard.setInputStatus('rna', 'invalid', 'No RNA available for normalization.');
2903 06 Nov 14 nicklas 83     }
2903 06 Nov 14 nicklas 84     
2903 06 Nov 14 nicklas 85     Doc.show('step-1');
2903 06 Nov 14 nicklas 86     Doc.show('gonext');
2903 06 Nov 14 nicklas 87   }
2903 06 Nov 14 nicklas 88   
2903 06 Nov 14 nicklas 89   /**
2903 06 Nov 14 nicklas 90     Sort by qiacube date, run number and position
2903 06 Nov 14 nicklas 91   */
2903 06 Nov 14 nicklas 92   normalize.sortByQiacubePosition = function(a, b)
2903 06 Nov 14 nicklas 93   {
2903 06 Nov 14 nicklas 94     if (a.QiacubeDate == b.QiacubeDate)
2903 06 Nov 14 nicklas 95     {
2903 06 Nov 14 nicklas 96       if (a.QiacubeRunNo == b.QiacubeRunNo)
2903 06 Nov 14 nicklas 97       {
2903 06 Nov 14 nicklas 98         return a.QiacubePosition-b.QiacubePosition;
2903 06 Nov 14 nicklas 99       }
2903 06 Nov 14 nicklas 100       else
2903 06 Nov 14 nicklas 101       {
2903 06 Nov 14 nicklas 102         return a.QiacubeRunNo - b.QiacubeRunNo;
2903 06 Nov 14 nicklas 103       }
2903 06 Nov 14 nicklas 104     }
2903 06 Nov 14 nicklas 105     else
2903 06 Nov 14 nicklas 106     {
2903 06 Nov 14 nicklas 107       return a.QiacubeDate < b.QiacubeDate ? -1 : 1;
2903 06 Nov 14 nicklas 108     }
2903 06 Nov 14 nicklas 109
2903 06 Nov 14 nicklas 110     return a.id - b.id;
2903 06 Nov 14 nicklas 111   }
2903 06 Nov 14 nicklas 112
2903 06 Nov 14 nicklas 113
2903 06 Nov 14 nicklas 114   /**
2903 06 Nov 14 nicklas 115     Sort by qiacube date, run number and position
2903 06 Nov 14 nicklas 116   */
2903 06 Nov 14 nicklas 117   normalize.sortByStorageLocation = function(a, b)
2903 06 Nov 14 nicklas 118   {
6219 20 Apr 21 nicklas 119     if (a.bioWell && b.bioWell)
2903 06 Nov 14 nicklas 120     {
6219 20 Apr 21 nicklas 121       if (a.bioWell.bioPlate.name == b.bioWell.bioPlate.name)
6219 20 Apr 21 nicklas 122       {
6219 20 Apr 21 nicklas 123         return a.bioWell.location < b.bioWell.location ? -1 : 1;
6219 20 Apr 21 nicklas 124       }
6219 20 Apr 21 nicklas 125       else
6219 20 Apr 21 nicklas 126       {
6219 20 Apr 21 nicklas 127         return a.bioWell.bioPlate.name < b.bioWell.bioPlate.name ? -1 : 1;
6219 20 Apr 21 nicklas 128       }
2903 06 Nov 14 nicklas 129     }
2903 06 Nov 14 nicklas 130   
2903 06 Nov 14 nicklas 131     return a.id - b.id;
2903 06 Nov 14 nicklas 132   }
2903 06 Nov 14 nicklas 133
2903 06 Nov 14 nicklas 134   
2903 06 Nov 14 nicklas 135   normalize.selectRna = function()
2903 06 Nov 14 nicklas 136   {
2903 06 Nov 14 nicklas 137     var frm = document.forms['reggie'];
2903 06 Nov 14 nicklas 138     if (frm.rna.disabled) return;
2903 06 Nov 14 nicklas 139     
2903 06 Nov 14 nicklas 140     if (subtypeRna == null)
2903 06 Nov 14 nicklas 141     {
2903 06 Nov 14 nicklas 142       subtypeRna = Reggie.getSubtypeInfo('RNA');
2903 06 Nov 14 nicklas 143     }
2903 06 Nov 14 nicklas 144     
2903 06 Nov 14 nicklas 145     newRna = [];
2903 06 Nov 14 nicklas 146     var url = '&resetTemporary=1';
2903 06 Nov 14 nicklas 147     url += '&tmpfilter:INT:itemSubtype='+subtypeRna.id;
2903 06 Nov 14 nicklas 148     Dialogs.selectItem('EXTRACT', 'rna', 1, url);
2903 06 Nov 14 nicklas 149   }
2903 06 Nov 14 nicklas 150
2903 06 Nov 14 nicklas 151   normalize.onRnaSelected = function(event)
2903 06 Nov 14 nicklas 152   {
2903 06 Nov 14 nicklas 153     var rna = event.detail;
2903 06 Nov 14 nicklas 154     
2903 06 Nov 14 nicklas 155     var frm = document.forms['reggie'];
2903 06 Nov 14 nicklas 156     var rnaList = frm.rna;
2903 06 Nov 14 nicklas 157     var isNew = true;
2903 06 Nov 14 nicklas 158     for (var i = 0; i < rnaList.length; i++)
2903 06 Nov 14 nicklas 159     {
2903 06 Nov 14 nicklas 160       if (rnaList[i].value == rna.id)
2903 06 Nov 14 nicklas 161       {
2903 06 Nov 14 nicklas 162         rnaList[i].selected = true;
2903 06 Nov 14 nicklas 163         isNew = false;
2903 06 Nov 14 nicklas 164       }
2903 06 Nov 14 nicklas 165     }
2903 06 Nov 14 nicklas 166     
2903 06 Nov 14 nicklas 167     if (isNew) newRna[newRna.length] = rna.id;
2903 06 Nov 14 nicklas 168     
2903 06 Nov 14 nicklas 169     if (event.detail.remaining == 0 && newRna.length > 0)
2903 06 Nov 14 nicklas 170     {
2903 06 Nov 14 nicklas 171       // Get more information about the selected rna
2903 06 Nov 14 nicklas 172       var url = '../Extraction.servlet?ID='+App.getSessionId();
2903 06 Nov 14 nicklas 173       url += '&cmd=GetRNAInfoForNormalize&rnaIds=' + newRna.join(',');
2903 06 Nov 14 nicklas 174       Wizard.asyncJsonRequest(url, normalize.onRnaInfoLoaded);
2903 06 Nov 14 nicklas 175     }
2903 06 Nov 14 nicklas 176   }
2903 06 Nov 14 nicklas 177
2903 06 Nov 14 nicklas 178   normalize.onRnaInfoLoaded = function(response)
2903 06 Nov 14 nicklas 179   {
2903 06 Nov 14 nicklas 180     var frm = document.forms['reggie'];
2903 06 Nov 14 nicklas 181     var rnaExtracts = response.rnaExtracts;
2903 06 Nov 14 nicklas 182     rnaExtracts.sort(normalize.sortByQiacubePosition);
2903 06 Nov 14 nicklas 183     
2903 06 Nov 14 nicklas 184     for (var rnaNo = 0; rnaNo < rnaExtracts.length; rnaNo++)
2903 06 Nov 14 nicklas 185     {
2903 06 Nov 14 nicklas 186       var rna = rnaExtracts[rnaNo];
2903 06 Nov 14 nicklas 187       normalize.addRnaOption(frm.rna, rna, true);
2903 06 Nov 14 nicklas 188     }
2903 06 Nov 14 nicklas 189     
2903 06 Nov 14 nicklas 190     if (frm.rna.length == autoGoNext)
2903 06 Nov 14 nicklas 191     {
2903 06 Nov 14 nicklas 192       Wizard.goNext(true);
2903 06 Nov 14 nicklas 193     }
2903 06 Nov 14 nicklas 194   }
2903 06 Nov 14 nicklas 195   
2903 06 Nov 14 nicklas 196   normalize.addRnaOption = function(list, rna, selected)
2903 06 Nov 14 nicklas 197   {
2903 06 Nov 14 nicklas 198     var name = rna.name;
6726 04 May 22 nicklas 199     if (rna.QiacubeDate)
2903 06 Nov 14 nicklas 200     {
6726 04 May 22 nicklas 201       name += ' -- ' + Reggie.reformatDate(rna.QiacubeDate);
6726 04 May 22 nicklas 202       if (rna.QiacubeRunNo) name += '; Run ' + rna.QiacubeRunNo;
6726 04 May 22 nicklas 203       if (rna.QiacubePosition) name += '; Pos ' + rna.QiacubePosition;
2903 06 Nov 14 nicklas 204     }
2903 06 Nov 14 nicklas 205
2903 06 Nov 14 nicklas 206     var option = new Option(name, rna.id, selected, selected);
3741 12 Feb 16 nicklas 207     if (rna.specimen && rna.specimen.YellowLabel != null) option.className = 'yellow';
2903 06 Nov 14 nicklas 208     option.rna = rna;
2903 06 Nov 14 nicklas 209     list[list.length] = option;
2903 06 Nov 14 nicklas 210   }
2903 06 Nov 14 nicklas 211   
2903 06 Nov 14 nicklas 212   normalize.validateStep1 = function(event)
2903 06 Nov 14 nicklas 213   {
2903 06 Nov 14 nicklas 214     var frm = document.forms['reggie'];
2903 06 Nov 14 nicklas 215     var rnaList = frm.rna;
2903 06 Nov 14 nicklas 216     
2903 06 Nov 14 nicklas 217     selectedRna = [];
2903 06 Nov 14 nicklas 218     for (var i=0; i < rnaList.length; i++)
2903 06 Nov 14 nicklas 219     {
2903 06 Nov 14 nicklas 220       if (rnaList[i].selected)
2903 06 Nov 14 nicklas 221       {
2903 06 Nov 14 nicklas 222         selectedRna[selectedRna.length] = rnaList[i].rna;
2903 06 Nov 14 nicklas 223       }
2903 06 Nov 14 nicklas 224     }
2903 06 Nov 14 nicklas 225       
2903 06 Nov 14 nicklas 226     if (selectedRna.length == 0)
2903 06 Nov 14 nicklas 227     {
2903 06 Nov 14 nicklas 228       Wizard.setInputStatus('rna', 'invalid', 'Not selected', 'invalid');
2903 06 Nov 14 nicklas 229       event.preventDefault();
2903 06 Nov 14 nicklas 230     }
2903 06 Nov 14 nicklas 231     else
2903 06 Nov 14 nicklas 232     {
2903 06 Nov 14 nicklas 233       Wizard.setInputStatus('rna', 'valid');
2903 06 Nov 14 nicklas 234     }
2903 06 Nov 14 nicklas 235   }
2903 06 Nov 14 nicklas 236
2903 06 Nov 14 nicklas 237
2903 06 Nov 14 nicklas 238   normalize.initializeStep2 = function()
2903 06 Nov 14 nicklas 239   {
3269 23 Apr 15 nicklas 240     var frm = document.forms['reggie'];
2903 06 Nov 14 nicklas 241     // Check if all RNA from same Qiacube run
2903 06 Nov 14 nicklas 242     var qiacubeRun = selectedRna[0].QiacubeDate + '#' + selectedRna[0].QiacubeRunNo;
2903 06 Nov 14 nicklas 243     var sameQiacubeRun = true;
6726 04 May 22 nicklas 244     var showLabelColumn = false;
6726 04 May 22 nicklas 245     for (var i=0; i < selectedRna.length; i++)
2903 06 Nov 14 nicklas 246     {
2903 06 Nov 14 nicklas 247       var rna = selectedRna[i];
2903 06 Nov 14 nicklas 248       if (qiacubeRun != rna.QiacubeDate+'#'+rna.QiacubeRunNo)
2903 06 Nov 14 nicklas 249       {
2903 06 Nov 14 nicklas 250         sameQiacubeRun = false;
2903 06 Nov 14 nicklas 251       }
6726 04 May 22 nicklas 252       if (rna.label) showLabelColumn = true;
2903 06 Nov 14 nicklas 253     }
2903 06 Nov 14 nicklas 254     
2903 06 Nov 14 nicklas 255     if (sameQiacubeRun)
2903 06 Nov 14 nicklas 256     {
2903 06 Nov 14 nicklas 257       selectedRna.sort(normalize.sortByQiacubePosition);
2903 06 Nov 14 nicklas 258       Doc.show('qiacube-info');
2903 06 Nov 14 nicklas 259       Doc.element('qiacube-date').innerHTML = Reggie.reformatDate(selectedRna[0].QiacubeDate);
2903 06 Nov 14 nicklas 260       Doc.element('qiacube-run').innerHTML = selectedRna[0].QiacubeRunNo;
2903 06 Nov 14 nicklas 261     }
2903 06 Nov 14 nicklas 262     else
2903 06 Nov 14 nicklas 263     {
2903 06 Nov 14 nicklas 264       selectedRna.sort(normalize.sortByStorageLocation);
2903 06 Nov 14 nicklas 265     }
2903 06 Nov 14 nicklas 266     
5360 12 Apr 19 nicklas 267     var html = '<table id="extractTable">';
3026 11 Dec 14 nicklas 268     html += '<thead class="bg-filled-100">';
2903 06 Nov 14 nicklas 269     // First header row
2903 06 Nov 14 nicklas 270     html += '<tr>';
2903 06 Nov 14 nicklas 271     html += '<th>RNA</th>';
6726 04 May 22 nicklas 272     if (showLabelColumn)
6726 04 May 22 nicklas 273     {
6726 04 May 22 nicklas 274       html += '<th>Label¹</th>';
6726 04 May 22 nicklas 275     }
2903 06 Nov 14 nicklas 276     if (sameQiacubeRun)
2903 06 Nov 14 nicklas 277     {
2903 06 Nov 14 nicklas 278       html += '<th>Qiacube</th>';
2903 06 Nov 14 nicklas 279     }
3524 02 Oct 15 nicklas 280     html += '<th>Storage</th>';
6219 20 Apr 21 nicklas 281     html += '<th>Conc.</th>';
2903 06 Nov 14 nicklas 282     html += '<th>Remain</th>';  
2903 06 Nov 14 nicklas 283     html += '<th colspan="2">Volumes</th>';
2903 06 Nov 14 nicklas 284     html += '<th></th>';
2903 06 Nov 14 nicklas 285     html += '</tr>';
2903 06 Nov 14 nicklas 286     // Second header row
2903 06 Nov 14 nicklas 287     html += '<tr>';
2903 06 Nov 14 nicklas 288     html += '<th></th>';
6726 04 May 22 nicklas 289     if (showLabelColumn)
6726 04 May 22 nicklas 290     {
6726 04 May 22 nicklas 291       html += '<th></th>';
6726 04 May 22 nicklas 292     }
2903 06 Nov 14 nicklas 293     if (sameQiacubeRun)
2903 06 Nov 14 nicklas 294     {
2903 06 Nov 14 nicklas 295       html += '<th>position</th>';
2903 06 Nov 14 nicklas 296     }
3524 02 Oct 15 nicklas 297     html += '<th>box</th>';
2903 06 Nov 14 nicklas 298     html += '<th>(ng/µl)</th>';
2903 06 Nov 14 nicklas 299     html += '<th>(µg)</th>';
2903 06 Nov 14 nicklas 300     html += '<th>(µl)</th>';
2903 06 Nov 14 nicklas 301     html += '<th>H<sub>2</sub>O</th>';
2903 06 Nov 14 nicklas 302     html += '<th>Remarks</th>';
2903 06 Nov 14 nicklas 303     html += '</tr>';
2903 06 Nov 14 nicklas 304     html += '</thead>';
2903 06 Nov 14 nicklas 305     html += '<tbody>';
2903 06 Nov 14 nicklas 306     
2903 06 Nov 14 nicklas 307     var expectedQiacubePosition = 0;
3741 12 Feb 16 nicklas 308     var homeUrl = Data.get('page-data', 'home-url');
3741 12 Feb 16 nicklas 309     var yellowImg = '<img src="'+homeUrl+'/images/yellow-label.png">';
2903 06 Nov 14 nicklas 310     for (var i=0; i < selectedRna.length; i++)
2903 06 Nov 14 nicklas 311     {
2903 06 Nov 14 nicklas 312       var rna = selectedRna[i];
3741 12 Feb 16 nicklas 313       var isYellow = rna.specimen && rna.specimen.YellowLabel != null;
2903 06 Nov 14 nicklas 314       if (sameQiacubeRun)
2903 06 Nov 14 nicklas 315       {
2903 06 Nov 14 nicklas 316         expectedQiacubePosition++;
2903 06 Nov 14 nicklas 317         while (expectedQiacubePosition != rna.QiacubePosition && expectedQiacubePosition <= 12)
2903 06 Nov 14 nicklas 318         {
6726 04 May 22 nicklas 319           html += normalize.insertEmpty(expectedQiacubePosition, showLabelColumn);
2903 06 Nov 14 nicklas 320           expectedQiacubePosition++;
2903 06 Nov 14 nicklas 321         }
2903 06 Nov 14 nicklas 322       }
3741 12 Feb 16 nicklas 323
3741 12 Feb 16 nicklas 324       var img = isYellow ? yellowImg : '';
3741 12 Feb 16 nicklas 325       html += '<tr class="highlight'+(isYellow ? ' yellow-specimen' : '')+'">';
5360 12 Apr 19 nicklas 326       html += '<td class="extract if-yellow">'+img+Strings.encodeTags(rna.nextAliquotName)+'</td>';
6726 04 May 22 nicklas 327       if (showLabelColumn)
6726 04 May 22 nicklas 328       {
6726 04 May 22 nicklas 329         html += '<td class="label if-yellow">'+Strings.encodeTags(rna.label)+'</td>';
6726 04 May 22 nicklas 330       }
2903 06 Nov 14 nicklas 331       if (sameQiacubeRun)
2903 06 Nov 14 nicklas 332       {
2903 06 Nov 14 nicklas 333         html += '<td class="qiacubepos">'+rna.QiacubePosition+'</td>';
2903 06 Nov 14 nicklas 334       }
6219 20 Apr 21 nicklas 335       html += '<td class="box">'+(rna.bioWell ? Strings.encodeTags(rna.bioWell.bioPlate.name + ' ' + rna.bioWell.location):'unknown')+'</td>';
6219 20 Apr 21 nicklas 336       html += '<td class="conc">'+ Numbers.formatNumber(rna.conc, 1) + '</td>';
4569 05 Sep 17 nicklas 337       html += '<td class="remain">'+ Numbers.formatNumber(rna.remainingQuantity, 2) + '</td>';
3269 23 Apr 15 nicklas 338       html += '<td class="volume" id="rnaVolume.'+rna.id+'"></td>';
3269 23 Apr 15 nicklas 339       html += '<td class="water" id="rnaWater.'+rna.id+'"></td>';
3269 23 Apr 15 nicklas 340       html += '<td class="remarks" id="remarks.'+rna.id+'"></td>';
2903 06 Nov 14 nicklas 341       html += '</tr>'
2903 06 Nov 14 nicklas 342     }
2903 06 Nov 14 nicklas 343     if (sameQiacubeRun)
2903 06 Nov 14 nicklas 344     {
2903 06 Nov 14 nicklas 345       expectedQiacubePosition++;
2903 06 Nov 14 nicklas 346       while (expectedQiacubePosition <= 12)
2903 06 Nov 14 nicklas 347       {
6726 04 May 22 nicklas 348         html += normalize.insertEmpty(expectedQiacubePosition, showLabelColumn);
2903 06 Nov 14 nicklas 349         expectedQiacubePosition++;
2903 06 Nov 14 nicklas 350       }
2903 06 Nov 14 nicklas 351     }
2903 06 Nov 14 nicklas 352     html += '</tbody>';
2903 06 Nov 14 nicklas 353     html += '</table>';
6726 04 May 22 nicklas 354     if (showLabelColumn)
6726 04 May 22 nicklas 355     {
6726 04 May 22 nicklas 356       html += '<div id="protocol-footer">';
6726 04 May 22 nicklas 357       html += '¹ Some SCAN-B tubes have a non-standard label.';
6726 04 May 22 nicklas 358       html += '</div>';
6726 04 May 22 nicklas 359     }
6726 04 May 22 nicklas 360
2903 06 Nov 14 nicklas 361     Doc.element('rnaNormalize').innerHTML = html;
3269 23 Apr 15 nicklas 362     
2903 06 Nov 14 nicklas 363     Wizard.setCurrentStep(2);
2903 06 Nov 14 nicklas 364     Doc.show('gonext');
2903 06 Nov 14 nicklas 365     Doc.show('goprint');
2903 06 Nov 14 nicklas 366     Doc.show('gocancel');
2903 06 Nov 14 nicklas 367     Wizard.keepSessionAlive();
3831 06 Apr 16 nicklas 368     Reggie.loadProtocols('RNA_NORMALIZATION_PROTOCOL', 'normalizationProtocol', 'RNA_TARGET_AMOUNT,RNA_MINIMAL_AMOUNT,RNA_TARGET_VOLUME');
3269 23 Apr 15 nicklas 369     frm.normalizationProtocol.focus();
2903 06 Nov 14 nicklas 370   }
2903 06 Nov 14 nicklas 371   
3269 23 Apr 15 nicklas 372   normalize.protocolOnChange = function()
3269 23 Apr 15 nicklas 373   {
3269 23 Apr 15 nicklas 374     var frm = document.forms['reggie'];
3269 23 Apr 15 nicklas 375
3269 23 Apr 15 nicklas 376     if (!hasInitProtocols)
3269 23 Apr 15 nicklas 377     {
3269 23 Apr 15 nicklas 378       hasInitProtocols = true;
3269 23 Apr 15 nicklas 379       if (frm.normalizationProtocol.length == 0)
3269 23 Apr 15 nicklas 380       {
3269 23 Apr 15 nicklas 381         Wizard.setFatalError('No RNA normalization protocols found. Please ask the server administrator to create at least one protocol.');
3269 23 Apr 15 nicklas 382         return;
3269 23 Apr 15 nicklas 383       }
3269 23 Apr 15 nicklas 384       for (var i=0; i < frm.normalizationProtocol.length; i++)
3269 23 Apr 15 nicklas 385       {
3269 23 Apr 15 nicklas 386         var p = frm.normalizationProtocol[i].item;
3831 06 Apr 16 nicklas 387         
3831 06 Apr 16 nicklas 388         var unit = 'µg';
3831 06 Apr 16 nicklas 389         var factor = 1;
5360 12 Apr 19 nicklas 390         if (p.RNATargetAmount <= 0.5)
3831 06 Apr 16 nicklas 391         {
3831 06 Apr 16 nicklas 392           unit = 'ng';
3831 06 Apr 16 nicklas 393           factor = 1000;
3831 06 Apr 16 nicklas 394         }
3831 06 Apr 16 nicklas 395         
3831 06 Apr 16 nicklas 396         var text = p.name + ' (';
3831 06 Apr 16 nicklas 397         if (p.RNAMinimalAmount) text += Reggie.formatNumber(p.RNAMinimalAmount * factor, '', 1) + '-';
3831 06 Apr 16 nicklas 398         text += p.RNATargetAmount ? Reggie.formatNumber(p.RNATargetAmount * factor, '', 1) : '? ';
3831 06 Apr 16 nicklas 399         text += unit;
3831 06 Apr 16 nicklas 400         text += ' in '+(p.RNATargetVolume || '? ')+'µl)';
3831 06 Apr 16 nicklas 401         frm.normalizationProtocol[i].text = text;
3269 23 Apr 15 nicklas 402       }
3269 23 Apr 15 nicklas 403     }
3269 23 Apr 15 nicklas 404
5360 12 Apr 19 nicklas 405     Wizard.showGoNextConfirmation(true, 'Print the lab protocol before continuing with the registration!');
3269 23 Apr 15 nicklas 406     var protocol = frm.normalizationProtocol[frm.normalizationProtocol.selectedIndex].item;
3269 23 Apr 15 nicklas 407     if (!protocol || !protocol.RNATargetAmount || !protocol.RNATargetVolume)
3269 23 Apr 15 nicklas 408     {
3269 23 Apr 15 nicklas 409       protocol = {};
3269 23 Apr 15 nicklas 410       if (!protocol.RNATargetAmount) protocol.RNATargetAmount = 1.1;
3269 23 Apr 15 nicklas 411       if (!protocol.RNATargetVolume) protocol.RNATargetVolume = 50;
3269 23 Apr 15 nicklas 412       
3269 23 Apr 15 nicklas 413       var msg = 'Missing normalization data; assuming ';
3269 23 Apr 15 nicklas 414       msg += protocol.RNATargetAmount+ 'µg in '+protocol.RNATargetVolume+'µl.';
3269 23 Apr 15 nicklas 415       Wizard.setInputStatus('normalizationProtocol', 'warning',  msg);
3269 23 Apr 15 nicklas 416     }
3269 23 Apr 15 nicklas 417     else
3269 23 Apr 15 nicklas 418     {
3269 23 Apr 15 nicklas 419       Wizard.setInputStatus('normalizationProtocol', 'valid');
3269 23 Apr 15 nicklas 420     }
3831 06 Apr 16 nicklas 421     if (!protocol.RNAMinimalAmount) protocol.RNAMinimalAmount = protocol.RNATargetAmount;
3269 23 Apr 15 nicklas 422     Doc.element('normalization-protocol').innerHTML =  Strings.encodeTags(frm.normalizationProtocol[frm.normalizationProtocol.selectedIndex].text);
3269 23 Apr 15 nicklas 423
3269 23 Apr 15 nicklas 424     // The concentration of the normalized RNA
3269 23 Apr 15 nicklas 425     var normalizedConc = protocol.RNATargetAmount / protocol.RNATargetVolume; // µg/µl
3269 23 Apr 15 nicklas 426     
3269 23 Apr 15 nicklas 427     for (var i=0; i < selectedRna.length; i++)
3269 23 Apr 15 nicklas 428     {
3269 23 Apr 15 nicklas 429       var rna = selectedRna[i];
3269 23 Apr 15 nicklas 430       
4569 05 Sep 17 nicklas 431       // Aim for RNATargetAmount but not more than remiaingQuantity or less than RNAMinimalAmount
4569 05 Sep 17 nicklas 432       rna.usedQuantity = Math.max(Math.min(rna.remainingQuantity, protocol.RNATargetAmount), protocol.RNAMinimalAmount); // µg
6219 20 Apr 21 nicklas 433       rna.volume = Math.ceil(10000*rna.usedQuantity/rna.conc) / 10;
3269 23 Apr 15 nicklas 434       rna.water = protocol.RNATargetVolume-rna.volume; // µl
3269 23 Apr 15 nicklas 435       
3269 23 Apr 15 nicklas 436       var remarks = [];
3269 23 Apr 15 nicklas 437       if (rna.volume < MINIMAL_RNA_VOLUME)
3269 23 Apr 15 nicklas 438       {
3269 23 Apr 15 nicklas 439         // Large mix since we do not want to take less than 1µl
3269 23 Apr 15 nicklas 440         rna.volume = MINIMAL_RNA_VOLUME;
6219 20 Apr 21 nicklas 441         rna.usedQuantity = rna.volume * rna.conc / 1000; // µg
3269 23 Apr 15 nicklas 442         var totalVolume = rna.usedQuantity / normalizedConc; // µl
3269 23 Apr 15 nicklas 443         rna.water = totalVolume - rna.volume;
3269 23 Apr 15 nicklas 444         remarks[remarks.length] = 'Large mix';
3269 23 Apr 15 nicklas 445       }
3831 06 Apr 16 nicklas 446       else if (rna.volume > protocol.RNATargetVolume)
3831 06 Apr 16 nicklas 447       {
3831 06 Apr 16 nicklas 448         // The RNA has too low concentration so we can't reach the target amount
3831 06 Apr 16 nicklas 449         // with the target volume. The protocol may allow us to use a lesser amount
3831 06 Apr 16 nicklas 450         // so we try this
3831 06 Apr 16 nicklas 451         rna.volume = protocol.RNATargetVolume;
3831 06 Apr 16 nicklas 452         rna.water = 0;
6219 20 Apr 21 nicklas 453         rna.usedQuantity = rna.volume * rna.conc / 1000;
3831 06 Apr 16 nicklas 454       }
3269 23 Apr 15 nicklas 455       
3831 06 Apr 16 nicklas 456       rna.notEnoughQuantity = rna.remainingQuantity < rna.usedQuantity || rna.usedQuantity < protocol.RNAMinimalAmount;
3831 06 Apr 16 nicklas 457       if (rna.notEnoughQuantity) 
3831 06 Apr 16 nicklas 458       {
3831 06 Apr 16 nicklas 459         remarks[remarks.length] = '<span class="flag">Not enough quantity</span>';
3831 06 Apr 16 nicklas 460       }
3831 06 Apr 16 nicklas 461       else if (rna.usedQuantity < protocol.RNATargetAmount)
3831 06 Apr 16 nicklas 462       {
3831 06 Apr 16 nicklas 463         remarks[remarks.length] = Numbers.formatNumber(rna.usedQuantity * 1000, 0) + 'ng';
3831 06 Apr 16 nicklas 464       }
3269 23 Apr 15 nicklas 465       
3831 06 Apr 16 nicklas 466       Doc.element('rnaVolume.'+rna.id).innerHTML = rna.notEnoughQuantity ? '' : Numbers.formatNumber(rna.volume, 1);
3831 06 Apr 16 nicklas 467       Doc.element('rnaWater.'+rna.id).innerHTML = rna.notEnoughQuantity ? '' : (rna.water > 0 ? Numbers.formatNumber(rna.water, 1) : '—');
3269 23 Apr 15 nicklas 468       Doc.element('remarks.'+rna.id).innerHTML = remarks.join(', ');
3269 23 Apr 15 nicklas 469     }
3269 23 Apr 15 nicklas 470   }
3269 23 Apr 15 nicklas 471   
6726 04 May 22 nicklas 472   normalize.insertEmpty = function(qiacubePosition, showLabelColumn)
2903 06 Nov 14 nicklas 473   {
2903 06 Nov 14 nicklas 474     var html = '<tr class="highlight empty">';
5360 12 Apr 19 nicklas 475     html += '<td class="extract"></td>';
6726 04 May 22 nicklas 476     if (showLabelColumn) html += '<td class="label"></td>';
2903 06 Nov 14 nicklas 477     html += '<td class="qiacubepos">'+qiacubePosition+'</td>';
3559 22 Oct 15 nicklas 478     html += '<td class="box"></td>';
6219 20 Apr 21 nicklas 479     html += '<td class="conc"></td>';
2903 06 Nov 14 nicklas 480     html += '<td class="remain"></td>';
2903 06 Nov 14 nicklas 481     html += '<td class="volume"></td>';
2903 06 Nov 14 nicklas 482     html += '<td class="water"></td>';
3269 23 Apr 15 nicklas 483     html += '<td class="remarks">Not selected for pre-normalization</td>';
2903 06 Nov 14 nicklas 484     html += '</tr>'
2903 06 Nov 14 nicklas 485     return html;
2903 06 Nov 14 nicklas 486   }
2903 06 Nov 14 nicklas 487   
2903 06 Nov 14 nicklas 488   normalize.printVersion = function()
2903 06 Nov 14 nicklas 489   {
2903 06 Nov 14 nicklas 490     Wizard.hideGoNextConfirmation();
2903 06 Nov 14 nicklas 491     Doc.removeClass('gonext', 'disabled');
2903 06 Nov 14 nicklas 492     var reportName = 'RNA Normalization Protocol';
2903 06 Nov 14 nicklas 493     var printNote = '<b>Note!</b> For better printing set page orientation to <i>portrait</i>.';
5360 12 Apr 19 nicklas 494     Reggie.openPrintWindow('full-protocol', reportName, 'portrait', printNote, '../', 'normalize_extract.css');
2903 06 Nov 14 nicklas 495   }
2903 06 Nov 14 nicklas 496
2903 06 Nov 14 nicklas 497   normalize.validateStep2 = function(event)
2903 06 Nov 14 nicklas 498   {}
2903 06 Nov 14 nicklas 499
2903 06 Nov 14 nicklas 500   normalize.initializeStep3 = function()
2903 06 Nov 14 nicklas 501   {
2903 06 Nov 14 nicklas 502     var frm = document.forms['reggie'];
2903 06 Nov 14 nicklas 503     Wizard.setCurrentStep(3);
2903 06 Nov 14 nicklas 504     Doc.show('goregister');
2903 06 Nov 14 nicklas 505     Doc.show('gocancel');
2903 06 Nov 14 nicklas 506     Events.sendChangeEvent('normalizationDate');
2903 06 Nov 14 nicklas 507     frm.normalizationDate.focus();
2903 06 Nov 14 nicklas 508   }
2903 06 Nov 14 nicklas 509   
2903 06 Nov 14 nicklas 510   normalize.submit = function()
2903 06 Nov 14 nicklas 511   {
2903 06 Nov 14 nicklas 512     var frm = document.forms['reggie'];
2903 06 Nov 14 nicklas 513     
2903 06 Nov 14 nicklas 514     var submitInfo = {};
3269 23 Apr 15 nicklas 515     submitInfo.normalizationProtocol = parseInt(frm.normalizationProtocol.value, 10);
2903 06 Nov 14 nicklas 516     submitInfo.normalizationDate = frm.normalizationDate.value;
2903 06 Nov 14 nicklas 517     submitInfo.normalizationOperator = frm.normalizationOperator.value;
2903 06 Nov 14 nicklas 518     
2903 06 Nov 14 nicklas 519     var rnaAliquots = [];
2903 06 Nov 14 nicklas 520     for (var i=0; i < selectedRna.length; i++)
2903 06 Nov 14 nicklas 521     {
2903 06 Nov 14 nicklas 522       var rna = selectedRna[i];
3831 06 Apr 16 nicklas 523       if (!rna.notEnoughQuantity)
2903 06 Nov 14 nicklas 524       {
2903 06 Nov 14 nicklas 525         var normalizedRna = {};
2903 06 Nov 14 nicklas 526         normalizedRna.parentId = rna.id;
2903 06 Nov 14 nicklas 527         normalizedRna.name = rna.nextAliquotName;
2903 06 Nov 14 nicklas 528
2903 06 Nov 14 nicklas 529         normalizedRna.usedQuantity = rna.usedQuantity; // µg
6219 20 Apr 21 nicklas 530         normalizedRna.conc = 1000 * rna.usedQuantity / (rna.volume+rna.water); // ng/µl
6219 20 Apr 21 nicklas 531         normalizedRna.ConcType = rna.NDConc ? 'ND_CONC' : 'QUBIT_CONC';
2903 06 Nov 14 nicklas 532         
2903 06 Nov 14 nicklas 533         rnaAliquots[rnaAliquots.length] = normalizedRna;
2903 06 Nov 14 nicklas 534       }
3269 23 Apr 15 nicklas 535       else
3269 23 Apr 15 nicklas 536       {
3269 23 Apr 15 nicklas 537         var flaggedRna = {};
3269 23 Apr 15 nicklas 538         flaggedRna.id = rna.id;
3269 23 Apr 15 nicklas 539         flaggedRna.flag = 'NotEnoughRemainingQuantity';
3269 23 Apr 15 nicklas 540         rnaAliquots[rnaAliquots.length] = flaggedRna;
3269 23 Apr 15 nicklas 541       }
2903 06 Nov 14 nicklas 542     }
3269 23 Apr 15 nicklas 543     
2903 06 Nov 14 nicklas 544     submitInfo.rnaAliquots = rnaAliquots;
2903 06 Nov 14 nicklas 545
2903 06 Nov 14 nicklas 546     var url = '../Extraction.servlet?ID='+App.getSessionId();
2903 06 Nov 14 nicklas 547     url += '&cmd=RegisterNormalizedRNA';
2903 06 Nov 14 nicklas 548     Wizard.showLoadingAnimation('Performing registration...');
2903 06 Nov 14 nicklas 549     Wizard.asyncJsonRequest(url, normalize.submissionResults, 'POST', JSON.stringify(submitInfo));
2903 06 Nov 14 nicklas 550   }
2903 06 Nov 14 nicklas 551
2903 06 Nov 14 nicklas 552   normalize.submissionResults = function(response)
2903 06 Nov 14 nicklas 553   {
2903 06 Nov 14 nicklas 554     Wizard.showFinalMessage(response.messages);
2903 06 Nov 14 nicklas 555     Doc.show('gorestart');
2903 06 Nov 14 nicklas 556   }
2903 06 Nov 14 nicklas 557
2903 06 Nov 14 nicklas 558   return normalize;
2903 06 Nov 14 nicklas 559 }();
2903 06 Nov 14 nicklas 560
2903 06 Nov 14 nicklas 561 Doc.onLoad(RnaNormalize.initPage);
2903 06 Nov 14 nicklas 562