6366 |
05 Dec 13 |
nicklas |
1 |
/** |
6366 |
05 Dec 13 |
nicklas |
$Id$ |
6366 |
05 Dec 13 |
nicklas |
3 |
|
6366 |
05 Dec 13 |
nicklas |
Copyright (C) 2013 Nicklas Nordborg |
6366 |
05 Dec 13 |
nicklas |
5 |
|
6366 |
05 Dec 13 |
nicklas |
This file is part of BASE - BioArray Software Environment. |
6366 |
05 Dec 13 |
nicklas |
Available at http://base.thep.lu.se/ |
6366 |
05 Dec 13 |
nicklas |
8 |
|
6366 |
05 Dec 13 |
nicklas |
BASE is free software; you can redistribute it and/or |
6366 |
05 Dec 13 |
nicklas |
modify it under the terms of the GNU General Public License |
6366 |
05 Dec 13 |
nicklas |
as published by the Free Software Foundation; either version 3 |
6366 |
05 Dec 13 |
nicklas |
of the License, or (at your option) any later version. |
6366 |
05 Dec 13 |
nicklas |
13 |
|
6366 |
05 Dec 13 |
nicklas |
BASE is distributed in the hope that it will be useful, |
6366 |
05 Dec 13 |
nicklas |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
6366 |
05 Dec 13 |
nicklas |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
6366 |
05 Dec 13 |
nicklas |
GNU General Public License for more details. |
6366 |
05 Dec 13 |
nicklas |
18 |
|
6366 |
05 Dec 13 |
nicklas |
You should have received a copy of the GNU General Public License |
6366 |
05 Dec 13 |
nicklas |
along with BASE. If not, see <http://www.gnu.org/licenses/>. |
6366 |
05 Dec 13 |
nicklas |
21 |
*/ |
6366 |
05 Dec 13 |
nicklas |
22 |
package net.sf.basedb.util.ma; |
6366 |
05 Dec 13 |
nicklas |
23 |
|
6366 |
05 Dec 13 |
nicklas |
24 |
/** |
6366 |
05 Dec 13 |
nicklas |
Calculates M and A values for 2-channel data. For "normal" intensity |
6366 |
05 Dec 13 |
nicklas |
values M and A are defined as follows: |
6366 |
05 Dec 13 |
nicklas |
27 |
|
6366 |
05 Dec 13 |
nicklas |
M = log2(ch1/ch2) |
6366 |
05 Dec 13 |
nicklas |
A = log10(ch*ch2)/2 |
6366 |
05 Dec 13 |
nicklas |
30 |
|
6366 |
05 Dec 13 |
nicklas |
Channel intensity corrections are used to calculate new |
6366 |
05 Dec 13 |
nicklas |
values for channel 1 and 2. For corrections that use M+A |
6366 |
05 Dec 13 |
nicklas |
values the corrections are usually calculated in log2-space |
6366 |
05 Dec 13 |
nicklas |
and the resulting equations are: |
6366 |
05 Dec 13 |
nicklas |
35 |
|
6366 |
05 Dec 13 |
nicklas |
log2(newCh1) = log2(oldCh1) - factor |
6366 |
05 Dec 13 |
nicklas |
log2(newCh2) = log2(oldCh2) + factor |
6366 |
05 Dec 13 |
nicklas |
38 |
|
6366 |
05 Dec 13 |
nicklas |
Source data that has been transformed (eg. log2-transformed) must use |
6366 |
05 Dec 13 |
nicklas |
different equations to get the correct results. |
6366 |
05 Dec 13 |
nicklas |
41 |
|
6366 |
05 Dec 13 |
nicklas |
@author nicklas |
6366 |
05 Dec 13 |
nicklas |
@since 3.2.4 |
6366 |
05 Dec 13 |
nicklas |
44 |
*/ |
6366 |
05 Dec 13 |
nicklas |
45 |
public class MACalculator |
6366 |
05 Dec 13 |
nicklas |
46 |
{ |
6366 |
05 Dec 13 |
nicklas |
47 |
static final double INV_LN2 = 1 / Math.log(2); |
6366 |
05 Dec 13 |
nicklas |
48 |
static final double INV_LN10x2 = 1 / (Math.log(10) * 2); |
6366 |
05 Dec 13 |
nicklas |
49 |
|
6366 |
05 Dec 13 |
nicklas |
50 |
|
6366 |
05 Dec 13 |
nicklas |
51 |
public MACalculator() |
6366 |
05 Dec 13 |
nicklas |
52 |
{} |
6366 |
05 Dec 13 |
nicklas |
53 |
|
6366 |
05 Dec 13 |
nicklas |
54 |
/** |
6366 |
05 Dec 13 |
nicklas |
Calculate the M and A values from the ch1 and ch2 intensity values. |
6366 |
05 Dec 13 |
nicklas |
See class description for information about the definitions of M and A. |
6366 |
05 Dec 13 |
nicklas |
@return An array with [0] = M, [1] = A |
6366 |
05 Dec 13 |
nicklas |
58 |
*/ |
6366 |
05 Dec 13 |
nicklas |
59 |
public double[] MA(double ch1, double ch2) |
6366 |
05 Dec 13 |
nicklas |
60 |
{ |
6366 |
05 Dec 13 |
nicklas |
61 |
double lnCh1 = Math.log(ch1); |
6366 |
05 Dec 13 |
nicklas |
62 |
double lnCh2 = Math.log(ch2); |
6366 |
05 Dec 13 |
nicklas |
// M = log2(ch1)-log2(ch2) = (ln(ch1)-ln(ch2)) / ln(2) |
6366 |
05 Dec 13 |
nicklas |
// A = (log10(ch1)+log10(ch2))/2 = (ln(ch1)+ln(ch2))/(ln(10)*2) |
6366 |
05 Dec 13 |
nicklas |
65 |
double[] MA = { (lnCh1-lnCh2)*INV_LN2, (lnCh1+lnCh2)*INV_LN10x2 }; |
6366 |
05 Dec 13 |
nicklas |
66 |
return MA; |
6366 |
05 Dec 13 |
nicklas |
67 |
} |
6366 |
05 Dec 13 |
nicklas |
68 |
|
6366 |
05 Dec 13 |
nicklas |
69 |
/** |
6366 |
05 Dec 13 |
nicklas |
Apply a correction factor to the ch1 and ch2 intensity values. |
6366 |
05 Dec 13 |
nicklas |
@return An array with [0] = newCh1, [1] = newCh2 |
6366 |
05 Dec 13 |
nicklas |
72 |
*/ |
6366 |
05 Dec 13 |
nicklas |
73 |
public double[] correct(double ch1, double ch2, double factor) |
6366 |
05 Dec 13 |
nicklas |
74 |
{ |
6366 |
05 Dec 13 |
nicklas |
75 |
factor = Math.pow(2, factor); |
6366 |
05 Dec 13 |
nicklas |
76 |
double[] result = {ch1 / factor , ch2 * factor}; |
6366 |
05 Dec 13 |
nicklas |
77 |
return result; |
6366 |
05 Dec 13 |
nicklas |
78 |
} |
6366 |
05 Dec 13 |
nicklas |
79 |
|
6366 |
05 Dec 13 |
nicklas |
80 |
|
6366 |
05 Dec 13 |
nicklas |
81 |
} |