5292 |
26 Mar 10 |
nicklas |
1 |
/** |
5292 |
26 Mar 10 |
nicklas |
$Id: FieldConverter.java 5277 2010-03-22 12:45:37Z nicklas $ |
5292 |
26 Mar 10 |
nicklas |
3 |
|
5292 |
26 Mar 10 |
nicklas |
Copyright (C) 2009 Nicklas Nordborg |
5292 |
26 Mar 10 |
nicklas |
5 |
|
5292 |
26 Mar 10 |
nicklas |
This file is part of BASE - BioArray Software Environment. |
5292 |
26 Mar 10 |
nicklas |
Available at http://base.thep.lu.se/ |
5292 |
26 Mar 10 |
nicklas |
8 |
|
5292 |
26 Mar 10 |
nicklas |
BASE is free software; you can redistribute it and/or |
5292 |
26 Mar 10 |
nicklas |
modify it under the terms of the GNU General Public License |
5292 |
26 Mar 10 |
nicklas |
as published by the Free Software Foundation; either version 3 |
5292 |
26 Mar 10 |
nicklas |
of the License, or (at your option) any later version. |
5292 |
26 Mar 10 |
nicklas |
13 |
|
5292 |
26 Mar 10 |
nicklas |
BASE is distributed in the hope that it will be useful, |
5292 |
26 Mar 10 |
nicklas |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
5292 |
26 Mar 10 |
nicklas |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
5292 |
26 Mar 10 |
nicklas |
GNU General Public License for more details. |
5292 |
26 Mar 10 |
nicklas |
18 |
|
5292 |
26 Mar 10 |
nicklas |
You should have received a copy of the GNU General Public License |
5292 |
26 Mar 10 |
nicklas |
along with BASE. If not, see <http://www.gnu.org/licenses/>. |
5292 |
26 Mar 10 |
nicklas |
21 |
*/ |
5292 |
26 Mar 10 |
nicklas |
22 |
package net.sf.basedb.util.export.spotdata; |
5292 |
26 Mar 10 |
nicklas |
23 |
|
5292 |
26 Mar 10 |
nicklas |
24 |
|
5292 |
26 Mar 10 |
nicklas |
25 |
import net.sf.basedb.core.BioAssaySet; |
5292 |
26 Mar 10 |
nicklas |
26 |
import net.sf.basedb.core.DbControl; |
5292 |
26 Mar 10 |
nicklas |
27 |
import net.sf.basedb.core.ItemNotFoundException; |
5292 |
26 Mar 10 |
nicklas |
28 |
import net.sf.basedb.core.ExtraValue.CoordinateType; |
5292 |
26 Mar 10 |
nicklas |
29 |
|
5292 |
26 Mar 10 |
nicklas |
30 |
/** |
5292 |
26 Mar 10 |
nicklas |
Exportable field converter that support BASE 1 naming conventions. |
5292 |
26 Mar 10 |
nicklas |
This implementation rely in most cases on formulas with the same |
5292 |
26 Mar 10 |
nicklas |
name as the BASE 1 field. BASE 1 fields that happens to have the |
5292 |
26 Mar 10 |
nicklas |
same name in BASE 2 doesn't need formulas. |
5292 |
26 Mar 10 |
nicklas |
<p> |
5292 |
26 Mar 10 |
nicklas |
This class extends the standard field converter and only overrides |
5292 |
26 Mar 10 |
nicklas |
methods that is used by the {@link net.sf.basedb.plugins.Base1PluginExecuter} |
5292 |
26 Mar 10 |
nicklas |
so thatit can work as expected. The major differences are the name of |
5292 |
26 Mar 10 |
nicklas |
intensity fields and the _xc_ prefix on extra value fields. |
5292 |
26 Mar 10 |
nicklas |
40 |
|
5292 |
26 Mar 10 |
nicklas |
@author Nicklas |
5292 |
26 Mar 10 |
nicklas |
@version 2.15 |
5292 |
26 Mar 10 |
nicklas |
@base.modified $Date: 2010-03-22 13:45:37 +0100 (må, 22 mar 2010) $ |
5292 |
26 Mar 10 |
nicklas |
44 |
*/ |
5292 |
26 Mar 10 |
nicklas |
45 |
public class Base1FieldConverter |
5292 |
26 Mar 10 |
nicklas |
46 |
extends StandardFieldConverter |
5292 |
26 Mar 10 |
nicklas |
47 |
{ |
5292 |
26 Mar 10 |
nicklas |
48 |
|
5292 |
26 Mar 10 |
nicklas |
49 |
/** |
5292 |
26 Mar 10 |
nicklas |
Create a new converter for the given bioassay set. |
5292 |
26 Mar 10 |
nicklas |
@param dc A DbControl to use for database access |
5292 |
26 Mar 10 |
nicklas |
@param source The source bioassay set |
5292 |
26 Mar 10 |
nicklas |
53 |
*/ |
5292 |
26 Mar 10 |
nicklas |
54 |
public Base1FieldConverter(DbControl dc, BioAssaySet source) |
5292 |
26 Mar 10 |
nicklas |
55 |
{ |
5292 |
26 Mar 10 |
nicklas |
56 |
super(dc, source); |
5292 |
26 Mar 10 |
nicklas |
57 |
} |
5292 |
26 Mar 10 |
nicklas |
58 |
|
5292 |
26 Mar 10 |
nicklas |
59 |
/* |
5292 |
26 Mar 10 |
nicklas |
From the ExportableFieldConverter interface |
5292 |
26 Mar 10 |
nicklas |
61 |
------------------------------------------- |
5292 |
26 Mar 10 |
nicklas |
62 |
*/ |
5292 |
26 Mar 10 |
nicklas |
63 |
|
5292 |
26 Mar 10 |
nicklas |
64 |
/** |
5292 |
26 Mar 10 |
nicklas |
Convert a reporter field. The conversion is done in steps |
5292 |
26 Mar 10 |
nicklas |
until a match is found: |
5292 |
26 Mar 10 |
nicklas |
<ul> |
5292 |
26 Mar 10 |
nicklas |
<li>If the field starts with '_xc_' it could be an extra value. We |
5292 |
26 Mar 10 |
nicklas |
check if there is a position extra value with an external id that is the |
5292 |
26 Mar 10 |
nicklas |
same as the rest of the field (eg. without the _xc_ prefix). |
5292 |
26 Mar 10 |
nicklas |
<li>Check if a formula that has the exactly the same name as the |
5292 |
26 Mar 10 |
nicklas |
given field name exists. The formula must be a column expression |
5292 |
26 Mar 10 |
nicklas |
and it must usable on the raw data type and the intensity transform |
5292 |
26 Mar 10 |
nicklas |
that the source bioassay set uses. |
5292 |
26 Mar 10 |
nicklas |
<li>Check if an extended reporter property with exactly the same name |
5292 |
26 Mar 10 |
nicklas |
as the given field name exists. |
5292 |
26 Mar 10 |
nicklas |
</ul> |
5292 |
26 Mar 10 |
nicklas |
@param name The BASE 1 field name |
5292 |
26 Mar 10 |
nicklas |
@param required Controls if null is returned or an exception is thrown when |
5292 |
26 Mar 10 |
nicklas |
a field is not found |
5292 |
26 Mar 10 |
nicklas |
@return A DynamicField expression or null if the field name can't be |
5292 |
26 Mar 10 |
nicklas |
converted |
5292 |
26 Mar 10 |
nicklas |
83 |
*/ |
5292 |
26 Mar 10 |
nicklas |
84 |
@Override |
5292 |
26 Mar 10 |
nicklas |
85 |
public DynamicField getReporterField(String name, boolean required) |
5292 |
26 Mar 10 |
nicklas |
86 |
{ |
5292 |
26 Mar 10 |
nicklas |
87 |
DynamicField fld = null; |
5292 |
26 Mar 10 |
nicklas |
88 |
if (name.startsWith("_xc_")) |
5292 |
26 Mar 10 |
nicklas |
89 |
{ |
5292 |
26 Mar 10 |
nicklas |
90 |
fld = getExtraValueField(name.substring(4), CoordinateType.POSITION, name); |
5292 |
26 Mar 10 |
nicklas |
91 |
} |
5292 |
26 Mar 10 |
nicklas |
92 |
if (fld == null) |
5292 |
26 Mar 10 |
nicklas |
93 |
{ |
5292 |
26 Mar 10 |
nicklas |
94 |
fld = getFormulaField(name, name); |
5292 |
26 Mar 10 |
nicklas |
95 |
} |
5292 |
26 Mar 10 |
nicklas |
96 |
if (fld == null) |
5292 |
26 Mar 10 |
nicklas |
97 |
{ |
5292 |
26 Mar 10 |
nicklas |
98 |
fld = getReporterProperty(name, name); |
5292 |
26 Mar 10 |
nicklas |
99 |
} |
5292 |
26 Mar 10 |
nicklas |
100 |
if (fld == null && required) |
5292 |
26 Mar 10 |
nicklas |
101 |
{ |
5292 |
26 Mar 10 |
nicklas |
102 |
throw new ItemNotFoundException("Unknown reporter field: " + name + |
5292 |
26 Mar 10 |
nicklas |
103 |
" (you can add this field as an formula)"); |
5292 |
26 Mar 10 |
nicklas |
104 |
} |
5292 |
26 Mar 10 |
nicklas |
105 |
return fld; |
5292 |
26 Mar 10 |
nicklas |
106 |
} |
5292 |
26 Mar 10 |
nicklas |
107 |
|
5292 |
26 Mar 10 |
nicklas |
108 |
/** |
5292 |
26 Mar 10 |
nicklas |
Convert a spot field. The conversion is done in steps |
5292 |
26 Mar 10 |
nicklas |
until a match is found: |
5292 |
26 Mar 10 |
nicklas |
<ul> |
5292 |
26 Mar 10 |
nicklas |
<li>If the field starts with '_xc_' it could be an extra value. We |
5292 |
26 Mar 10 |
nicklas |
check if there is an spot extra value with an external id that is the |
5292 |
26 Mar 10 |
nicklas |
same as the rest of the field (eg. without the _xc_ prefix). |
5292 |
26 Mar 10 |
nicklas |
<li>Check if a formula that has the exactly the same name as the |
5292 |
26 Mar 10 |
nicklas |
given field name exists. The formula must be a column expression |
5292 |
26 Mar 10 |
nicklas |
and it must usable on the raw data type and the intensity transform |
5292 |
26 Mar 10 |
nicklas |
that the source bioassay set uses. |
5292 |
26 Mar 10 |
nicklas |
<li>Check if a raw data property with exactly the same name |
5292 |
26 Mar 10 |
nicklas |
as the given field name exists. |
5292 |
26 Mar 10 |
nicklas |
<li>Check if the field name is 'intensityX' where 'X' is a channel |
5292 |
26 Mar 10 |
nicklas |
number. |
5292 |
26 Mar 10 |
nicklas |
</ul> |
5292 |
26 Mar 10 |
nicklas |
@param name The BASE 1 field name |
5292 |
26 Mar 10 |
nicklas |
@param required Controls if null is returned or an exception is thrown when |
5292 |
26 Mar 10 |
nicklas |
a field is not found |
5292 |
26 Mar 10 |
nicklas |
@return A DynamicField expression or null if the field name can't be |
5292 |
26 Mar 10 |
nicklas |
converted |
5292 |
26 Mar 10 |
nicklas |
129 |
*/ |
5292 |
26 Mar 10 |
nicklas |
130 |
@Override |
5292 |
26 Mar 10 |
nicklas |
131 |
public DynamicField getSpotField(String name, boolean required) |
5292 |
26 Mar 10 |
nicklas |
132 |
{ |
5292 |
26 Mar 10 |
nicklas |
133 |
DynamicField fld = null; |
5292 |
26 Mar 10 |
nicklas |
134 |
if (name.startsWith("_xc_")) |
5292 |
26 Mar 10 |
nicklas |
135 |
{ |
5292 |
26 Mar 10 |
nicklas |
136 |
fld = getExtraValueField(name.substring(4), CoordinateType.SPOT, name); |
5292 |
26 Mar 10 |
nicklas |
137 |
} |
5292 |
26 Mar 10 |
nicklas |
138 |
if (fld == null) |
5292 |
26 Mar 10 |
nicklas |
139 |
{ |
5292 |
26 Mar 10 |
nicklas |
140 |
fld = getFormulaField(name, name); |
5292 |
26 Mar 10 |
nicklas |
141 |
} |
5292 |
26 Mar 10 |
nicklas |
142 |
if (fld == null) |
5292 |
26 Mar 10 |
nicklas |
143 |
{ |
5300 |
31 Mar 10 |
nicklas |
144 |
fld = getRawDataProperty(name, name); |
5292 |
26 Mar 10 |
nicklas |
145 |
} |
5292 |
26 Mar 10 |
nicklas |
146 |
if (fld == null) |
5292 |
26 Mar 10 |
nicklas |
147 |
{ |
5292 |
26 Mar 10 |
nicklas |
148 |
fld = getIntensityField(name, name); |
5292 |
26 Mar 10 |
nicklas |
149 |
} |
5292 |
26 Mar 10 |
nicklas |
150 |
if (fld == null && required) |
5292 |
26 Mar 10 |
nicklas |
151 |
{ |
5292 |
26 Mar 10 |
nicklas |
152 |
throw new ItemNotFoundException("Unknown spot field: " + name + |
5292 |
26 Mar 10 |
nicklas |
153 |
" (you can add this field as a formula)"); |
5292 |
26 Mar 10 |
nicklas |
154 |
} |
5292 |
26 Mar 10 |
nicklas |
155 |
return fld; |
5292 |
26 Mar 10 |
nicklas |
156 |
} |
5292 |
26 Mar 10 |
nicklas |
157 |
|
5292 |
26 Mar 10 |
nicklas |
158 |
// -------------------------------- |
5292 |
26 Mar 10 |
nicklas |
159 |
|
5292 |
26 Mar 10 |
nicklas |
160 |
/** |
5292 |
26 Mar 10 |
nicklas |
Create a dynamic field for spot intensity if the field name has |
5292 |
26 Mar 10 |
nicklas |
the pattern 'intensityX' where 'X' is a channel number between 1 |
5292 |
26 Mar 10 |
nicklas |
and the number of channels in the raw data type used by the |
5292 |
26 Mar 10 |
nicklas |
source bioassay set. |
5292 |
26 Mar 10 |
nicklas |
@param fieldName The field name |
5292 |
26 Mar 10 |
nicklas |
@return A dynamic field, or null if the name doesn't match the pattern |
5292 |
26 Mar 10 |
nicklas |
167 |
*/ |
5292 |
26 Mar 10 |
nicklas |
168 |
@Override |
5292 |
26 Mar 10 |
nicklas |
169 |
protected DynamicField getIntensityField(String fieldName, String exportTitle) |
5292 |
26 Mar 10 |
nicklas |
170 |
{ |
5292 |
26 Mar 10 |
nicklas |
171 |
DynamicField df = null; |
5292 |
26 Mar 10 |
nicklas |
172 |
for (int i = 1; i <= getSource().getRawDataType().getChannels(); ++i) |
5292 |
26 Mar 10 |
nicklas |
173 |
{ |
5292 |
26 Mar 10 |
nicklas |
174 |
if (fieldName.equals("intensity"+i)) |
5292 |
26 Mar 10 |
nicklas |
175 |
{ |
5292 |
26 Mar 10 |
nicklas |
176 |
df = ExportableFieldFactory.channel(i, exportTitle, null); |
5292 |
26 Mar 10 |
nicklas |
177 |
break; |
5292 |
26 Mar 10 |
nicklas |
178 |
} |
5292 |
26 Mar 10 |
nicklas |
179 |
} |
5292 |
26 Mar 10 |
nicklas |
180 |
return df; |
5292 |
26 Mar 10 |
nicklas |
181 |
} |
5292 |
26 Mar 10 |
nicklas |
182 |
|
5292 |
26 Mar 10 |
nicklas |
183 |
} |