/* * Copyright (c) 2003-2012 Fred Hutchinson Cancer Research Center * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.fhcrc.cpl.toolbox.proteomics.filehandler; import net.systemsbiology.regisWeb.pepXML.PeptideprophetSummaryDocument; import org.apache.xmlbeans.XmlException; import org.fhcrc.cpl.toolbox.statistics.MatrixUtil; import org.fhcrc.cpl.toolbox.filehandler.SimpleXMLStreamReader; import javax.xml.stream.XMLStreamException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import java.nio.IntBuffer; /** * User: arauch * Date: Mar 6, 2006 * Time: 1:04:29 PM */ public class PeptideProphetSummary extends SensitivitySummary { private float[] _fval; private float[][] _modelPos; private float[][] _modelNeg; private float[][] _obs; public static PeptideProphetSummary load(SimpleXMLStreamReader parser) throws XMLStreamException { parser.skipToStart("peptideprophet_summary"); PeptideprophetSummaryDocument summaryDoc; try { summaryDoc = PeptideprophetSummaryDocument.Factory.parse(parser); } catch(XmlException e) { e.printStackTrace(System.err); throw new XMLStreamException("Parsing peptide prophet summary: " + e.getMessage(), e); } PeptideprophetSummaryDocument.PeptideprophetSummary summary = summaryDoc.getPeptideprophetSummary(); return new PeptideProphetSummary(summary); } private PeptideProphetSummary(PeptideprophetSummaryDocument.PeptideprophetSummary summary) { PeptideprophetSummaryDocument.PeptideprophetSummary.DistributionPoint[] distribution = summary.getDistributionPointArray(); _fval = new float[distribution.length]; _obs = new float[3][distribution.length]; _modelPos = new float[3][distribution.length]; _modelNeg = new float[3][distribution.length]; for (int i=0; i<distribution.length; i++) { PeptideprophetSummaryDocument.PeptideprophetSummary.DistributionPoint point = distribution[i]; _fval[i] = point.getFvalue(); _modelPos[0][i] = point.getModel1PosDistr(); _modelNeg[0][i] = point.getModel1NegDistr(); _obs[0][i] = point.getObs1Distr().floatValue(); _modelPos[1][i] = point.getModel2PosDistr(); _modelNeg[1][i] = point.getModel2NegDistr(); _obs[1][i] = point.getObs2Distr().floatValue(); _modelPos[2][i] = point.getModel3PosDistr(); _modelNeg[2][i] = point.getModel3NegDistr(); _obs[2][i] = point.getObs3Distr().floatValue(); } PeptideprophetSummaryDocument.PeptideprophetSummary.RocDataPoint[] roc = summary.getRocDataPointArray(); _minProb = new float[roc.length]; _sensitivity = new float[roc.length]; _error = new float[roc.length]; for (int i = 0; i < roc.length; i++) { PeptideprophetSummaryDocument.PeptideprophetSummary.RocDataPoint rocDataPoint = roc[i]; _minProb[i] = rocDataPoint.getMinProb(); _sensitivity[i] = rocDataPoint.getSensitivity(); _error[i] = rocDataPoint.getError(); } } public PeptideProphetSummary() { _obs = new float[3][]; _modelPos = new float[3][]; _modelNeg = new float[3][]; } public byte[] getFValSeries() { return toByteArray(_fval); } public void setFValSeries(byte[] pepProphetFValSeries) { _fval = toFloatArray(pepProphetFValSeries); } public byte[] getObsSeries1() { return toByteArray(_obs[0]); } public void setObsSeries1(byte[] pepProphetObsSeries1) { _obs[0] = toFloatArray(pepProphetObsSeries1); } public byte[] getObsSeries2() { return toByteArray(_obs[1]); } public void setObsSeries2(byte[] pepProphetObsSeries2) { _obs[1] = toFloatArray(pepProphetObsSeries2); } public byte[] getObsSeries3() { return toByteArray(_obs[2]); } public void setObsSeries3(byte[] pepProphetObsSeries3) { _obs[2] = toFloatArray(pepProphetObsSeries3); } public byte[] getModelPosSeries1() { return toByteArray(_modelPos[0]); } public void setModelPosSeries1(byte[] pepProphetModelPosSeries1) { _modelPos[0] = toFloatArray(pepProphetModelPosSeries1); } public byte[] getModelPosSeries2() { return toByteArray(_modelPos[1]); } public void setModelPosSeries2(byte[] pepProphetModelPosSeries2) { _modelPos[1] = toFloatArray(pepProphetModelPosSeries2); } public byte[] getModelPosSeries3() { return toByteArray(_modelPos[2]); } public void setModelPosSeries3(byte[] pepProphetModelPosSeries3) { _modelPos[2] = toFloatArray(pepProphetModelPosSeries3); } public byte[] getModelNegSeries1() { return toByteArray(_modelNeg[0]); } public void setModelNegSeries1(byte[] pepProphetModelNegSeries1) { _modelNeg[0] = toFloatArray(pepProphetModelNegSeries1); } public byte[] getModelNegSeries2() { return toByteArray(_modelNeg[1]); } public void setModelNegSeries2(byte[] pepProphetModelNegSeries2) { _modelNeg[1] = toFloatArray(pepProphetModelNegSeries2); } public byte[] getModelNegSeries3() { return toByteArray(_modelNeg[2]); } public void setModelNegSeries3(byte[] pepProphetModelNegSeries3) { _modelNeg[2] = toFloatArray(pepProphetModelNegSeries3); } public float[] getFval() { return _fval; } public float[] getObs(int charge) { return _obs[charge - 1]; } public float[] getModelPos(int charge) { return _modelPos[charge - 1]; } public float[] getModelNeg(int charge) { return _modelNeg[charge - 1]; } public float[] getModelTotal(int charge) { float[] pos = getModelPos(charge); float[] neg = getModelNeg(charge); float[] total = new float[pos.length]; for (int i=0; i<total.length; i++) total[i] = pos[i] + neg[i]; return total; } public double distributionR2(int charge) { double r2 = -1.0; try { r2 = MatrixUtil.r2(getModelTotal(charge), getObs(charge)); } catch(RuntimeException e) { // Ignore matrix errors... probably means blank PeptideProphet distribution } return r2; } public static float[] toFloatArray(byte[] source) { if (null == source) source = new byte[0]; ByteBuffer bb = ByteBuffer.wrap(source); // Intel native is LITTLE_ENDIAN -- UNDONE: Make this an app-wide constant? bb.order(ByteOrder.LITTLE_ENDIAN); FloatBuffer fb = bb.asFloatBuffer(); float[] result = new float[fb.capacity()]; fb.get(result); return result; } public static byte[] toByteArray(float[] x) { int floatCount = x.length; ByteBuffer bb = ByteBuffer.allocate(floatCount * 4); bb.order(ByteOrder.LITTLE_ENDIAN); for (int i = 0; i < floatCount; i++) bb.putFloat(x[i]); return bb.array(); } public static byte[] toByteArray(int[] x) { int floatCount = x.length; ByteBuffer bb = ByteBuffer.allocate(floatCount * 4); bb.order(ByteOrder.LITTLE_ENDIAN); for (int i = 0; i < floatCount; i++) bb.putInt(x[i]); return bb.array(); } public static int[] toIntArray(byte[] source) { if (null == source) source = new byte[0]; ByteBuffer bb = ByteBuffer.wrap(source); // Intel native is LITTLE_ENDIAN -- UNDONE: Make this an app-wide constant? bb.order(ByteOrder.LITTLE_ENDIAN); IntBuffer ib = bb.asIntBuffer(); int[] result = new int[ib.capacity()]; ib.get(result); return result; } }