'****************************************************************************
'* Copyright (C) 2004 Peter Mortensen and Matthias Mann *
'* This file is part of MSQuant. *
'* *
'* MSQuant is distributed under the terms of *
'* the GNU General Public License. See src/COPYING.TXT or *
'* <http://www.gnu.org/licenses/gpl.txt> for details. *
'* *
'* MSQuant 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 2 of the *
'* License, or (at your option) any later version. *
'* *
'* MSQuant 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 MSQuant; if not, write to *
'* the Free Software Foundation, Inc., 59 Temple *
'* Place, Suite 330, Boston, MA 02111-1307 USA *
'* *
'* Purpose: Holds Class micromassRawDataFileHandling, see below *
'* for documentation. *
'* *
'****************************************************************************
'****************************************************************************
'* Utrecht University *
'* Biomolecular Mass Spectrometry *
'* Joost Gouw *
'* E-mail: NUKESPAMMERSdrmortensen@get2netZZZZZZ.dk *
'* WWW: http://www.chem.uu.nl/bioms *
'* *
'* Program for post-processing of result from search in mass *
'* spectrometric data. *
'* *
'* FILENAME: MicromassRawDataFileHandling.vb *
'* MAIN_CLASS: MicromassRawDataFileHandling *
'* STRUCTS_AND_CLASSES: <none> *
'* TYPE: VISUAL_BASIC *
'* *
'* CREATED: JWG 2004-02-16 Vrs 1.0. *
'* UPDATED: JWG 2004-xx-xx *
'* *
'****************************************************************************
'Future:
' 1.
' 2.
' 3.
' 4.
Option Strict On
Option Explicit On
Imports System.IO 'For Path class/functions
'Changed PM_MICROMASS_ENABLE 2004-07-19
Imports DACSERVERLib '\MassLynx\DACServer.dll
'Requires adding reference to project:
' menu Project/Add Reference/Browse,
' select D:\MassLynx\DACServer.dll.
'****************************************************************************
'd$ <summary>
'd$ Purpose: Namespace for lower layers of mass spectrometric
'd$ applications: raw data file handling, descriptive statistics,
'd$ fragment masses, digestion, file associations, etc.
'd$ <see cref="T:VBXMLDoc.CVBXMLDoc" />.
'd$ <isUnitTest></isUnitTest>
'd$ <applicationname>test_rawDataFileHandling</applicationname>
'd$ <author>Peter Mortensen</author>
'd$ <seealso>http://www.cebi.sdu.dk/</seealso>
'd$ <codetype>PLATFORM independent</codetype>
'd$ </summary>
Namespace massSpectrometryBase
'****************************************************************************
'd$ <summary>
'd$ Purpose:
'd$
'd$ Knows about handling of Micromass/Finnegan/Xcalibur/RAW raw
'd$ data files with mass spectra.
'd$
'd$ ?(or is it the base class): Hides the fact that the Xcalibur
'd$ compoment (XYZ) can only handle one open WIFF file at a time.
'd$
'd$ <see cref="T:VBXMLDoc.CVBXMLDoc" />.
'd$ <applicationname>test_rawDataFileHandling</applicationname>
'd$ <author>Peter Mortensen</author>
'd$ <seealso>http://www.cebi.sdu.dk/</seealso>
'd$ <codetype>PLATFORM independent</codetype>
'd$ </summary>
Public Class MicromassRawDataFileHandling
Inherits rawDataFileHandling
Dim mSpectrumRange As spectrumRangeStructure
Dim mFolderName As String 'foldername of the data
Dim mScanNumber As Integer 'the scannumber in the channel
Dim mProcess As Short = 0 'always 0 change if people store a process e.g. smooth
Dim mInfoTime As Double 'peptide retentiontime for MSMS data points
Dim mfunctionnumber As Short 'selects the channel (1 = MS, 2-9 = MSMS)
Dim mFunctionInfo As New DACFunctionInfo 'In DACSERVERLib
Dim mChrom As New DACChromatogram 'In DACSERVERLib
Dim mScanStats As New DACScanStats 'In DACSERVERLib
Dim mSpectrum As New DACSpectrum 'In DACSERVERLib
'****************************************************************************
'* SUBROUTINE NAME: New *
'd$ <summary> N/A </summary>
Public Sub New(ByRef anInSpectrumClassifier As spectrumClassifier, _
ByVal aCOMversion As COMversionEnum)
MyBase.New(anInSpectrumClassifier, aCOMversion) 'Is this necessary? Yes!
'Changed PM_MICROMASS_BROKEN 2008-07-04. For error detection.
mSpectrumRange.endSpectrum = -1
mSpectrumRange.startSpectrum = -1
mSpectrumRange.firstRetentionTimeSeconds = -100.0
mSpectrumRange.lastRetentionTimeSeconds = -100.0
End Sub 'New
'****************************************************************************
'* SUBROUTINE NAME: closeRawFile *
'd$ <summary>XYZ
'd$ </summary>
Protected Overrides Sub closeRawFile(ByVal aFileSpec As fileSpecStructure)
mOpenRawCalls -= 1
End Sub 'closeRawFile
'****************************************************************************
'* SUBROUTINE NAME: DataTitle *
'd$ <summary>
'd$ </summary>
Public Overrides Function DataTitle() As String
Select Case mexperimentinfo.spectrumType
Case spectrumTypeEnum.enumIsFragmentSpectrum
Call mFunctionInfo.GetFunctionInfo(mFolderName, CShort(mexperimentinfo.experimentNumber))
Case Else
Dim Functionnumber As Short = 1 'MS channel
Call mFunctionInfo.GetFunctionInfo(mFolderName, Functionnumber)
End Select
Return mFunctionInfo.FunctionType
End Function
'****************************************************************************
'* SUBROUTINE NAME: derived_NewSpectrum *
'd$ <summary> .
'd$ </summary>
Protected Overrides Function derived_NewSpectrum( _
ByVal aSpectrumNumber As Integer, _
ByVal aInfoRetentionTime_Seconds As Double, _
ByRef anOutSpectrumClassification As SpectrumClassificationStructure) _
As Double
mScanNumber = aSpectrumNumber 'Stored for ReturnDataPionts
'Store the peptide retentiontime for ReturnDataPionts MSMS
mInfoTime = aInfoRetentionTime_Seconds
Dim functionnumber As Short = 1 'MS channel
Call mScanStats.GetScanStats( _
mFolderName, functionnumber, mProcess, aSpectrumNumber)
Dim toReturn As Double = mScanStats.RetnTime * 60
'Changed PM_ASSERT_FOR_MICROMASS 2006-03-14
''Changed PM_PHOSPHO_SCORING 2005-08-12
''Later: fill in anOutSpectrumClassification ....
'
'mainClassification is fragment type : this is not always logically true!!!
'For now this function is used by clients:
'
' 1. in the Protein Validation window to show
' the type of spectrum as a string
' 2. In PTM scoring, to check for MS3 (that it assumes is a
' fragment spectrum of a neutral loss).
anOutSpectrumClassification.mainClassification = _
spectrumTypeEnum.enumIsFragmentSpectrum
anOutSpectrumClassification.spectrumSubType2 = _
spectrumSubTypeEnum.enumIsFragmentCID
Return toReturn
End Function 'derived_NewSpectrum
'****************************************************************************
'* SUBROUTINE NAME: derived_SpectrumNumber2RetentionTime *
'd$ <summary> Convert from spectrum number to retention time (sec).
'd$ </summary>
Protected Overrides Function derived_SpectrumNumber2RetentionTime( _
ByVal aSpectrumNumber As Integer, _
ByVal anInExperimentNumber As Integer) _
As Double
Dim functionnumber As Short = 1 'MS channel
'Changed PM_MICROMASS_BROKEN 2008-07-04
'Is spectrum number 0 allowed????
Trace.Assert(aSpectrumNumber >= 1, _
"PIL ASSERT. Spectrum number out of range: " & aSpectrumNumber & ".")
Call mScanStats.GetScanStats( _
mFolderName, functionnumber, mProcess, aSpectrumNumber)
Dim toReturn As Double = mScanStats.RetnTime * 60
Return toReturn
End Function 'derived_SpectrumNumber2RetentionTime
Public Overrides Sub doCleanUp()
Trace.Assert(False, "Stop!", "PIL ASSERT. Internal/development assert for stopping execution......")
End Sub
'****************************************************************************
'* SUBROUTINE NAME: getSpectrumRange *
'd$ <summary> Returns the MS spectrum range (number of scans)
'd$ </summary>
Public Overrides Function getSpectrumRange() _
As spectrumRangeStructure
'Note: the implementation of this function is asymmetric compared
' to the implementation in newFinneganRawDataFileHandling.vb
' and AnalystRawDataFileHandling.vb - the value is set in the
' call of openRawFile().
'
' Why?
'Changed JWG_BAD_STARTSPECTRUM 2004-06-01
'The start spectrum is never 0, always 1
'mSpectrumRange.startSpectrum = 0
If True Then
mfunctionnumber = 1
Call mFunctionInfo.GetFunctionInfo(mFolderName, mfunctionnumber)
Dim Numscans As Integer = mFunctionInfo.NumScans
mSpectrumRange.startSpectrum = 1
mSpectrumRange.endSpectrum = Numscans
End If
'Changed PM_MICROMASS_BROKEN 2008-07-04. The fix...
mSpectrumRange.firstRetentionTimeSeconds = _
derived_SpectrumNumber2RetentionTime(mSpectrumRange.startSpectrum, 0) '0: MS spectrum
mSpectrumRange.lastRetentionTimeSeconds = _
derived_SpectrumNumber2RetentionTime(mSpectrumRange.endSpectrum, 0) '0: MS spectrum. So
Dim toReturn As spectrumRangeStructure = mSpectrumRange
'Changed PM_MICROMASS_BROKEN 2008-07-04
Trace.Assert(toReturn.firstRetentionTimeSeconds >= 0.0, _
"PIL ASSERT. Micromass, getSpectrumRange(). " & _
"toReturn.firstRetentionTimeSeconds" & _
" is undefined: " & _
toReturn.firstRetentionTimeSeconds.ToString("0.0000"))
Return toReturn
End Function 'getSpectrumRange
'Changed PM_SUPERCHARGE 2003-11-03
'****************************************************************************
'* SUBROUTINE NAME: nextFragmentspectrum *
'd$ <summary> .
'd$ </summary>
Public Overrides Function nextFragmentspectrum2( _
ByVal aSpectrumNumber As Integer, _
ByRef anOutSupposedPrecursorMass As Double, _
ByRef anOutCurClassification As SpectrumClassificationStructure, _
ByRef anOutExperimentNumber As Integer) _
As Integer
'Changed PM_MICROMASS_ASSERT 2007-08-08. Implemented... More or less
'Trace.Assert(False, "Stop!",
' "PIL ASSERT. Internal/development assert for stopping execution......")
'This function: does not really change state or go to the
' next fragment sprectrum. How do we do this
' anyway for Micromass?
' It is now used from the client to build the
' spectrum tree. And from some combined files
' and display an approximate MS-MS for an
' inserted peptide.
anOutSupposedPrecursorMass = 0.0 'For now.
anOutExperimentNumber = 1 'In the Analyst world this would
' be the first fragment spectrum.
anOutCurClassification.mainClassification = _
spectrumTypeEnum.enumIsFragmentSpectrum
anOutCurClassification.spectrumSubType2 = _
spectrumSubTypeEnum.enumIsFragmentCID
Return aSpectrumNumber 'Same as input. Is this right???.
End Function 'nextFragmentspectrum
'****************************************************************************
'* SUBROUTINE NAME: nextMSspectrum *
'd$ <summary> Note: We are NOT allowed to change our internal states that is
'd$ in this case the mScanNumber.
'd$ </summary>
Public Overrides Function nextMSspectrum(ByVal aSpectrumNumber As Integer, _
ByRef anOutSpectrumClassification As SpectrumClassificationStructure) _
As Integer
'Trivial for Micromass because the spectrum number is already the MS spectrum.
Dim toReturn As Integer = aSpectrumNumber + 1
anOutSpectrumClassification.mainClassification = _
spectrumTypeEnum.enumIsMSspectrum
'Changed JWG_BAD_SPECTRUMSUBTYPEENUM 2004-06-01
'Changed MSspectrumSubTypeEnum into spectrumSubTypeEnum
anOutSpectrumClassification.spectrumSubType2 = _
spectrumSubTypeEnum.enumIsNormalMS
Return toReturn
End Function 'nextMSspectrum
'****************************************************************************
'* SUBROUTINE NAME: openRawFile *
'd$ <summary>Micromass specific open action - use the component XYZ to prepare
'd$ for reading
'd$ </summary>
Protected Overrides Sub openRawFile(ByVal aFileSpec As fileSpecStructure)
'Dim MasslynxFileName As String
mOpenRawCalls += 1
'Micromass needs a foldername instead of a filename
mFolderName = Path.GetDirectoryName(aFileSpec.path)
End Sub 'openRawFile
'****************************************************************************
'* SUBROUTINE NAME: retentionTime2SpectrumNumber *
'd$ <summary>
'd$ </summary>
Protected Overrides Function retentionTime2SpectrumNumber( _
ByVal aRetentionTime_Secs As Double) _
As Integer
Dim RetTime As Double = aRetentionTime_Secs / 60
Dim toreturn As Integer
Call mFunctionInfo.GetFunctionInfo(mFolderName, 1)
Call mChrom.GetChromatogram( _
mFolderName, 1, 0, 0, mFunctionInfo.NumScans, CInt(False), "200")
Dim array1 As Single() = DirectCast(mChrom.Times, Single())
'Changed PM_MICROMASS_UPDATE 2006-11-29
'Dim scannumber As Integer = array1.BinarySearch(array1, CSng(RetTime))
Dim scannumber As Integer = Array.BinarySearch(array1, CSng(RetTime))
Select Case scannumber
Case Is < -1
toreturn = (Not scannumber) - 1
Case Is = -1 'The first scannumber otherwise toreturn is -1
toreturn = 0
Case Else
toreturn = scannumber
End Select
Return toreturn
End Function 'retentionTime2SpectrumNumber
''Changed JWG_MICROMASS_DISPLAY 2004-02-23
'****************************************************************************
'* SUBROUTINE NAME: returnDataPoints *
'd$ <summary>Retrieve datapoints from the current spectrum.
'd$ </summary>
'd$ <param name="anOutDatapoints">
'd$ Items are of type signalStructure, <see cref="T:xyz.abc" />
'd$ </param>
Protected Overrides Sub returnDataPoints( _
ByVal aStartMass As Double, ByVal anEndMass As Double, _
ByRef anOutDatapoints2 As _
Generic.List(Of massSpectrometryBase.signalStructure), _
ByRef aDataPointsInfo As dataPointsInfoStructure2)
'Changed PM_MICROMASS_ENABLE 2004-07-19. To dataPointsInfoStructure2.
'Changed PM_MICROMASS_UPDATE 2006-11-29
'Old:
' ByRef anOutDatapoints As System.Collections.ArrayList
anOutDatapoints2.Clear()
Select Case mExperimentInfo.spectrumType
Case spectrumTypeEnum.enumIsMSspectrum
Call mSpectrum.GetSpectrum( _
mFolderName, mfunctionnumber, mProcess, mScanNumber)
Case spectrumTypeEnum.enumIsFragmentSpectrum
Dim MSMSexpNumber As Integer = mExperimentInfo.experimentNumber
Call mFunctionInfo.GetFunctionInfo(mFolderName, CShort(MSMSexpNumber))
Call mChrom.GetChromatogram( _
mFolderName, CShort(MSMSexpNumber), mProcess, 0, _
mFunctionInfo.NumScans, CInt(False), "200")
Dim testarray As Single() = DirectCast(mChrom.Times, Single())
Dim scanmsms As Integer = _
Array.BinarySearch(testarray, CSng((mInfoTime / 60)))
Dim scanmsms2 As Integer
Select Case scanmsms
Case Is < 1
scanmsms2 = (Not scanmsms) - 2
Case Is = 0
scanmsms2 = 0
Case Else
scanmsms2 = scanmsms + 1
End Select
Call mSpectrum.GetSpectrum( _
mFolderName, CShort(MSMSexpNumber), mProcess, scanmsms2)
End Select
Dim massesarray As Single() = DirectCast(mSpectrum.Masses, Single())
Dim intensitiesarray As Single() = DirectCast(mSpectrum.Intensities, Single())
'Negative index is returned when the value doesn't exactly match
'which is usely the case for us.
Dim startindex As Integer = Array.BinarySearch(massesarray, CSng(aStartMass))
Dim stopindex As Integer = Array.BinarySearch(massesarray, CSng(anEndMass))
Dim lastindex As Integer = massesarray.Length - 1
Dim BitStartindex As Integer = Not startindex 'Bitwise negation of the startindex.
Dim BitStopindex As Integer = Not stopindex 'Bitwise negation of the stopindex.
Dim startPT As Integer
Select Case startindex
Case Is < -1
'BinarySearch returns the index of the higher value.
startPT = BitStartindex - 1
Case Is = -1
startPT = 0
Case Is = lastindex
startPT = BitStartindex
Case Else
startPT = startindex
End Select
Dim stopPT As Integer
Select Case stopindex
Case Is < -1
stopPT = BitStopindex - 1
Case Is = -1
stopPT = 0
Case Is = lastindex
stopPT = BitStopindex
Case Else
stopPT = stopindex
End Select
'Changed PM_MICROMASS_SPECTRUM_MASSRANGE_BUG 2006-03-14
'Dim minY As Double = 1000000.0
'Dim maxY As Double = -1000000.0
Dim minYsignal As signalStructure
minYsignal.Ysig = 1000000.0
Dim maxYsignal As signalStructure
maxYsignal.Ysig = -1000000.0
Dim datapoints As Integer = stopPT - startPT + 1
Dim pt As signalStructure
Dim j As Integer
For j = startPT To stopPT
Dim xVal As Double = CDbl(massesarray.GetValue(j))
Dim yVal As Double = CDbl(intensitiesarray.GetValue(j))
If xVal >= aStartMass AndAlso xVal <= anEndMass Then
If yVal > 0.000001 Then 'Ignore datapoints with zero count,
' like Analyst.
pt.Xsig = xVal
pt.Ysig = yVal
anOutDatapoints2.Add(pt)
If yVal < minYsignal.Ysig Then
minYsignal = pt
End If
If yVal > maxYsignal.Ysig Then
maxYsignal = pt
End If
Else
Dim peter6 As Integer = 6
End If
End If
Next
Dim len As Integer = anOutDatapoints2.Count
If len > 0 Then
'Changed PM_MICROMASS_UPDATE 2006-11-29
Dim minX As Double = CDbl(anOutDatapoints2.Item(0).Xsig)
Dim maxX As Double = CDbl(anOutDatapoints2.Item(len - 1).Xsig)
'Changed PM_MICROMASS_SPECTRUM_MASSRANGE_BUG 2006-03-14
aDataPointsInfo.minX2 = minX
aDataPointsInfo.maxX2 = maxX
'Changed PM_MICROMASS_ENABLE 2004-07-19
'aDataPointsInfo.minimumSignal.Xsig = minX
'aDataPointsInfo.maximumSignal.Xsig = maxX
'aDataPointsInfo.minimumSignal.Ysig = minY
'aDataPointsInfo.maximumSignal.Ysig = maxY
aDataPointsInfo.minimumSignal = minYsignal
aDataPointsInfo.maximumSignal = maxYsignal
Else
'Changed PM_MICROMASS_ENABLE 2004-07-19
aDataPointsInfo.minimumSignal.Xsig = 0.0
aDataPointsInfo.maximumSignal.Xsig = 0.0
aDataPointsInfo.minimumSignal.Ysig = 0.0
aDataPointsInfo.maximumSignal.Ysig = 0.0
End If
End Sub 'returnDataPoints
'****************************************************************************
'* SUBROUTINE NAME: spectrumNumberForMSspectrum *
'd$ <summary>
'd$ </summary>
Public Overrides Function spectrumNumberForMSspectrum( _
ByVal aSpectrumNumber As Integer, _
ByRef anOutSpectrumClassification As SpectrumClassificationStructure, _
ByVal aForceOneLevelUp As Boolean) _
As Integer
'Trivial for Micromass because the spectrum number is already the MS spectrum.
anOutSpectrumClassification.mainClassification = spectrumTypeEnum.enumIsMSspectrum
'Changed JWG_BAD_SPECTRUMSUBTYPEENUM 2004-06-01
'Changed MSspectrumSubTypeEnum into spectrumSubTypeEnum
anOutSpectrumClassification.spectrumSubType2 = spectrumSubTypeEnum.enumIsNormalMS
Return aSpectrumNumber
End Function 'spectrumNumberForMSspectrum
'****************************************************************************
'* SUBROUTINE NAME: MaybeToBeChanged_MSMSretentionTime *
'd$ <summary>xyz
'd$ </summary>
Public Overrides Function MaybeToBeChanged_MSMSretentionTime( _
ByVal aMSMSspecification As Integer, _
ByVal aExtraNumber As Integer) As Double
Call mScanStats.GetScanStats( _
mFolderName, CShort(aExtraNumber), mProcess, aMSMSspecification)
Dim toReturn As Double = mScanStats.RetnTime * 60
Return toReturn
End Function
End Class 'MayBeToChanged_MSMSretentionTime
End Namespace
Generated by script codePublish.pl at 2009-01-05T15:20:59.