Source code for MSQuant: MicromassRawDataFileHandling.vb, MSQuant/msquant/src/main/massbase/MicromassRawDataFileHandling.vb.

Table of contents page.

Home page for MSQuant.

'****************************************************************************
'* 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.