content: /*************************************************************************
  *                                                                        *
  *  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.lcms.v2;
  
  /**
   * Implementation of a fixed window peak.
   * Such a peak matches a m/z value if it falls within the m/z window around the peak.
   */
  public class FixedWindowDetectedPeak implements DetectedPeak {
  
    private String sourceScanFileId;
  
    // Estimated m/z value for the peak
    private Double mz;
  
    // Full size of the m/z window for the peak.
    // The true m/z value lies between `mz - mzWindow / 2` and `mz + mzWindow / 2`
    private Double mzWindow;
  
    // Estimated retention time for the peak
    private Double retentionTime;
  
    // Full size of the retention time window
    // The true m/z value lies between `rt - retentionTimeWindow / 2` and `rt + retentionTimeWindow / 2`
    private Double retentionTimeWindow;
  
    // Peak intensity
    private Double intensity;
  
    // Probability (hence in [0,1]) that the peak is a true peak
    private Double confidence;
  
    public FixedWindowDetectedPeak(String sourceScanFileId, Double mz, Double mzWindow, Double retentionTime,
                                   Double retentionTimeWindow, Double intensity, Double confidence) {
      this.sourceScanFileId = sourceScanFileId;
      this.mz = mz;
      this.mzWindow = mzWindow;
      this.retentionTime = retentionTime;
      this.retentionTimeWindow = retentionTimeWindow;
      this.intensity = intensity;
      this.confidence = confidence;
    }
  
    @Override
    public Double getMz() {
      return mz;
    }
  
    @Override
    public Double getRetentionTime() {
      return retentionTime;
    }
  
    @Override
    public Double getIntensity() {
      return intensity;
    }
  
    @Override
    public String getSourceScanFileId() {
      return sourceScanFileId;
    }
  
    @Override
    public Double getConfidence() {
      return confidence;
    }
  
    @Override
    public Boolean matchesMz(Double mz, Double confidenceLevel) {
      // Matches if the m/z value is in the m/z window, regardless of the confidenceLevel
      return (this.mz - this.mzWindow / 2 <= mz) && (this.mz + this.mzWindow / 2 >= mz);
    }
  
    @Override
    public Boolean matchesMzTime(Double mz, Double retentionTime, Double confidenceLevel) {
      // Matches if the m/z value is in the m/z window, regardless of the confidenceLevel
      Boolean matchesMz = (this.mz - this.mzWindow / 2 <= mz) && (this.mz + this.mzWindow / 2 >= mz);
      Boolean matchesTime = (this.retentionTime - this.retentionTimeWindow / 2 <= retentionTime) &&
          (this.retentionTime + this.retentionTimeWindow / 2 >= retentionTime);
      return matchesMz && matchesTime;
    }
  }
  