/************************************************************************* * * * This file is part of the 20n/act project. * * 20n/act enables DNA prediction for synthetic biology/bioengineering. * * Copyright (C) 2017 20n Labs, Inc. * * * * Please direct all queries to act@20n.com. * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see <http://www.gnu.org/licenses/>. * * * *************************************************************************/ package com.act.biointerpretation.networkanalysis; import com.act.jobs.FileChecker; import com.act.lcms.v2.DetectedPeak; import com.act.lcms.v2.FixedWindowDetectedPeak; import com.act.lcms.v2.LcmsPeakSpectrum; import com.act.lcms.v2.PeakSpectrum; import com.act.utils.TSVParser; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; public class LcmsTSVParser { private static final String MZ_KEY = "mz"; private static final String INT_KEY = "exp_maxo"; private static final String RT_KEY = "rt"; // 0.01 daltons is a good baseline tolerance for matching mz values between ions and peaks private static final Double MZ_TOLERANCE = .01; // This is currently irrelevant, but the peak requires some notion of an RT window, so we make one based on this. private static final Double RT_TOLERANCE = 1.0; private LcmsTSVParser() { // There's no reason to instantiate this class. } public static PeakSpectrum parseTSV(File lcmsTSVFile) throws IOException { FileChecker.verifyInputFile(lcmsTSVFile); TSVParser parser = new TSVParser(); parser.parse(lcmsTSVFile); List<DetectedPeak> peaks = new ArrayList<>(); for (Map<String, String> row : parser.getResults()) { Double mz = Double.parseDouble(row.get(MZ_KEY)); Double intensity = row.get(INT_KEY).equals("") ? 0.0 : Double.parseDouble(row.get(INT_KEY)); Double retentionTime = Double.parseDouble(row.get(RT_KEY)); // We're abusing DetectedPeak's scan file field by pointing it to a TSV file instead of a scan file. // TODO: work out the proper way to do this. String scanFile = lcmsTSVFile.getAbsolutePath(); if (intensity > 0) { FixedWindowDetectedPeak peak = new FixedWindowDetectedPeak(scanFile, mz, 2*MZ_TOLERANCE, retentionTime, RT_TOLERANCE, intensity, 1.0); peaks.add(peak); } } return new LcmsPeakSpectrum(peaks); } }