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

Table of contents page.

Home page for MSQuant.

'****************************************************************************
'* Copyright (C) 2007 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 AnalystCOM, see below                               *
'*          for documentation.                                              * 
'*                                                                          *
'****************************************************************************

'****************************************************************************
'*                               CEBI                                       *
'*                    Software Development Group                            *
'*                         Peter Mortensen                                  *
'*                E-mail: NUKESPAMMERSdrmortensen@get2netZZZZZZ.dk          *
'*                 WWW: http://www.cebi.sdu.dk/                             *
'*                                                                          *
'*  Program for post-processing of result from search in mass               *
'*    spectrometric data.                                                   *
'*                                                                          *
'*    FILENAME:   AnalystCOM.vb                                             *
'*    MAIN_CLASS:   AnalystCOM                                              *
'*    STRUCTS_AND_CLASSES:   <none>                                         *
'*    TYPE:       VISUAL_BASIC                                              *
'*                                                                          *
'* CREATED: PM 2007-07-17   Vrs 1.0.                                        *
'* UPDATED: PM 2007-xx-xx                                                   *
'*                                                                          *
'****************************************************************************

'Future: 
' 1. 

'Markers:
'  AAAAAA  End of public section


'Content:
'  This class and derived classes are a thin layer to primarily hide
'  the version of Analyst COM components.
'
'  Abstract class that is the interface to the rest of the
'  program for Analyst COM components. It hides the
'  particular ***version*** of the COM components that happen to
'  be installed on the user computer. In this way all versions
'  of Analyst QS can used and it is not dependent on which
'  version was installed on the ***development computer*** when the
'  application was build.
'
'  Primary purpose is to hide the COM version for (otherwise
'  equivalent) functions used in MSQuant.
'
'  It hides the versions for DLL files ExploreDataObjects.dll and
'  GraphControl.ocx.
'
'  Additional functions can be to hide differences (between
'  COM versions) in output for the same function with the
'  same input parameters. This is in fact the case for
'  GetActualPeriodAndCycleFromTime() of
'  ExploreDataObjects.FMANWiffFile in QS 1.1 (or earlier) vs.
'  QS 2.0.
'
'  Note: as one data source/wiff file object can be connected to more than one 
'        visual Analyst control/spectrum display (a fragment spectrum in the
'        Protein Validation Window and a MS spectrum in the Quantitation window) 
'        the same instance of this class will either contain COM instances
'        from ExploreDataObjects.dll (data source) or from GraphControl.ocx.
'        This should be enforced with ASSERTs.
'
'
'Used in COM components:
'
'  ExploreDataObjects.dll:
'
'    class FMANSpecData
'
'    class FMANWiffFile
'
'    class ExploreDataObjects.FMANWiffFileControl
'
'    enum ExploreDataObjects.WhichClosestPointType
'
'    function xyz1
'    function xyz2
'
'
'  GraphControl.ocx:
'
'    class AxGraphControl
'
'    ????? _DGraphControlEvents_GraphZoomEvent
'
'    function xyz1
'    function xyz2


Imports SDUPutility 'For SDUPlogger


'Put the class into Namespace massSpectrometryBase ?


'Corresponding to the Analyst data COM enum, but COM version
'independent. A particular COM
'version: QS20.ExploreDataObjects.WhichClosestPointType
Public Enum whichClosestPointTypeEnum

    enumCLOSEST_POINT = 347
    enumCLOSEST_POINT_HIGHER
    enumCLOSEST_POINT_LOWER
End Enum 'sortingDirectionEnum


'Helper class for GraphZoom event from AxQSxx_GraphControlLib.AxGraphControl
'****************************************************************************
'*    <placeholder for header>                                              *
'****************************************************************************
Public Class graphZoom2EventArgs
    Inherits System.EventArgs

    Private mSomeValue As Integer


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Sub New(ByVal aSomeValue As Integer)
        mSomeValue = aSomeValue
    End Sub

End Class 'graphZoom2EventArgs




'****************************************************************************
'*    <placeholder for header>                                              *
'****************************************************************************
Public MustInherit Class AnalystCOM

    Public Event GraphZoom2( _
      ByVal aSender As Object, ByVal anEvent As graphZoom2EventArgs)


    Private mData_Instance As Boolean 'Flag to keep track of 
    '  lazy instantiation status of the ExploreDataObjects.FMANSpecData
    '  object. The object is in a derived class, but we use
    '  implementation inheritance to keep the logic for lazy
    '  instantiation in this base class.
    '
    '  End result is that we don't create COM objects until needed.

    Private mFileControl_Instance As Boolean

    'What about flag for XYData ??? In XYdata_create().

    Private mAxControl_Instance As Boolean

    Private mSpectrumRange As massSpectrometryBase.spectrumRangeStructure

    'Changed PM_QSTAR_BROKEN_QUANTITATION_FULLZOOMBUG 2007-10-10
    Private mLogger As SDUPlogger
    Private mUseLogging As Boolean 'Flag to avoid creating strings that
    '  may not be used anyway.




    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Sub New()
        MyBase.New() 'Is this necessary? Yes!

        mLogger = Nothing

        mUseLogging = False
        'mUseLogging = True


        mData_Instance = False
        mFileControl_Instance = False

        mAxControl_Instance = False

        'Invalid values, for error detection. (the last two are however not
        'set or used.)
        mSpectrumRange.startSpectrum = -1
        mSpectrumRange.endSpectrum = -1
        mSpectrumRange.firstRetentionTimeSeconds = -3333.3333
        mSpectrumRange.lastRetentionTimeSeconds = -4444.4444

        If mUseLogging Then
            mLogger = New SDUPlogger
            'mLogger.disableLogging()
            mLogger.enableLogging()
        End If
    End Sub 'New


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Function getLogger() _
      As SDUPlogger

        Return mLogger
    End Function 'getLogger


    'Changed PM_ANALYST_GRAPHZOOM_HANDLING 2007-07-25
    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected Sub doRaiseGraphZoomEvent( _
      ByVal aSender As Object, ByVal aSomeValue As Integer)

        'Note: signature of this function does not have to have the 
        '      event signature. We can pass some information 
        '      as e.g. normal scalar parameters.

        RaiseEvent GraphZoom2(aSender, New graphZoom2EventArgs(aSomeValue))
    End Sub 'doRaiseGraphZoomEvent


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Sub XYdata_create(ByVal aXValuesAreSorted As Boolean)

        _derived_XYdata_create(aXValuesAreSorted)
    End Sub 'XYdata_create


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Sub data_setWiffFileName( _
      ByRef aFileNameFullPath As String, _
      ByVal aSampleNumberInRawFile As Integer)

        'Changed PM_QSTARCOMBINED_ASSERT 2007-11-01. Not true; neither
        'the comments nor the ASSERT...
        '
        ' 'Assume this function is only called once (for the same instance). 
        ' 'Otherwise  we need a third flag for 
        ' '_derived_NewInstance_WiffFile() below.
        ' Trace.Assert(mData_Instance = False, _
        '   "PIL ASSERT. data_setWiffFileName() called more than once.")


        'Changed PM_QSTARCOMBINED_ASSERT 2007-11-01
        'Note: the instances of ExploreDataObjects.FMANSpecData and
        '      ExploreDataObjects.FMANWiffFileControl are created
        '      only once. But the instance of ExploreDataObjects.FMANWiffFile
        '      is derived from FMANWiffFileControl (_derived_NewInstance_WiffFile())
        '      with the raw file name as parameter (New is not used for this class).
        '
        '      Thus we need to create a new instance every time we change raw
        '      file - this will happen for combined files.

        If Not mData_Instance Then
            _derived_NewInstance_data()
            mData_Instance = True
        End If

        'Fails here if COM version problems.
        _derived_data_setWiffFileName(aFileNameFullPath)

        'Later...
        Try
        Catch ex As Exception
        End Try

        If Not mFileControl_Instance Then
            _derived_NewInstance_fileControl()
            mFileControl_Instance = True
        End If

        If True Then

            'Changed PM_QSTARCOMBINED_ASSERT 2007-11-01.
            'Note: we can not have a flag for this one. Reason: see comments
            'in the beginning of this function.
            _derived_NewInstance_WiffFile(aFileNameFullPath, aSampleNumberInRawFile)

            If True Then 'For use in GetActualPeriodAndCycleFromTime_ex().
                Dim period As Integer = 0
                Dim cycles As Integer = _
                  Me.wiffFile_GetActualNumberOfCycles( _
                    aSampleNumberInRawFile, period)

                mSpectrumRange.startSpectrum = 1 '0 ?
                mSpectrumRange.endSpectrum = cycles
            End If
        End If


        'An instance of this class must either be used as
        'an Analyst GraphControl.ocx or ExploreDataObjects.dll...
        Trace.Assert( _
          mAxControl_Instance = False, _
          "PIL ASSERT. Client error: Analyst COM wrapper object is used multipurpose.")


        'Check for initialisation.
        Trace.Assert( _
          mSpectrumRange.startSpectrum > 0, _
          "PIL ASSERT. mSpectrumRange was not initialised.")

    End Sub 'data_setWiffFileName


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Sub data_SetSpectrum( _
      ByVal anInSample As Integer, _
      ByVal anInPeriod As Integer, _
      ByVal anExperiment As Integer, _
      ByVal anInStartTime As Single, _
      ByVal anInEndTime As Single)

        Trace.Assert(mData_Instance = True, _
          "PIL ASSERT. Data Analyst COM object has not been created.")

        _derived_data_SetSpectrum( _
          anInSample, _
          anInPeriod, _
          anExperiment, _
          anInStartTime, _
          anInEndTime)

        If mUseLogging Then
            mLogger.timeLog("data_SetSpectrum().")
        End If

    End Sub 'data_SetSpectrum


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Function data_GetStartMass() _
      As Double

        Trace.Assert(mData_Instance = True, _
          "PIL ASSERT. Data Analyst COM object has not been created.")

        Dim toReturn As Double = _derived_data_GetStartMass()

        If mUseLogging Then
            mLogger.timeLog("data_GetStartMass(). Return value: " & toReturn)
        End If

        Return toReturn
    End Function 'GetStartMass


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Function data_GetStopMass() _
      As Double

        Trace.Assert(mData_Instance = True, _
          "PIL ASSERT. Data Analyst COM object has not been created.")

        Dim toReturn As Double = _derived_data_GetStopMass()

        If mUseLogging Then
            mLogger.timeLog("data_GetStopMass(). Return value: " & toReturn)
        End If

        Return toReturn
    End Function 'GetStopMass


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Function data_GetStartTime() _
      As Single

        Trace.Assert(mData_Instance = True, _
          "PIL ASSERT. Data Analyst COM object has not been created.")

        Dim toReturn As Single = _derived_data_GetStartTime()

        If mUseLogging Then
            mLogger.timeLog("data_GetStartTime(). Return value: " & toReturn)
        End If

        Return toReturn
    End Function 'GetStartTime


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Function data_GetEndTime() _
      As Single

        Trace.Assert(mData_Instance = True, _
          "PIL ASSERT. Data Analyst COM object has not been created.")

        Dim toReturn As Single = _derived_data_GetEndTime()

        If mUseLogging Then
            mLogger.timeLog("data_GetEndTime(). Return value: " & toReturn)
        End If

        Return toReturn
    End Function 'GetEndTime


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Sub data_GetXValueRange( _
      ByRef anOutMinimumXvalue As Double, _
      ByRef anOutMaximumXvalue As Double)

        Trace.Assert(mData_Instance = True, _
          "PIL ASSERT. Data Analyst COM object has not been created.")

        _derived_data_GetXValueRange(anOutMinimumXvalue, anOutMaximumXvalue)

        If mUseLogging Then
            mLogger.timeLog( _
              "data_GetXValueRange(). Out values: " & _
              "anOutMinimumXvalue=" & anOutMinimumXvalue & ", " & _
              "anOutMaximumXvalue=" & anOutMaximumXvalue & ", " & _
              "")
        End If
    End Sub 'data_GetXValueRange


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Sub data_GetClosestPointNumberForXValue( _
      ByVal anInXvalue As Double, _
      ByVal anInWhichClosestPoint As whichClosestPointTypeEnum, _
      ByRef anOutPointNumber As Integer)

        Trace.Assert(mData_Instance = True, _
          "PIL ASSERT. Data Analyst COM object has not been created.")

        _derived_data_GetClosestPointNumberForXValue( _
          anInXvalue, anInWhichClosestPoint, anOutPointNumber)

        If mUseLogging Then
            mLogger.timeLog("data_GetClosestPointNumberForXValue().")
        End If

    End Sub 'data_GetClosestPointNumberForXValue


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Sub data_GetDataPoint( _
      ByVal anInPointerNumber As Integer, _
      ByRef anOutXvalue As Double, _
      ByRef anOutYvalue As Double)

        Trace.Assert(mData_Instance = True, _
          "PIL ASSERT. Data Analyst COM object has not been created.")

        _derived_data_GetDataPoint( _
          anInPointerNumber, anOutXvalue, anOutYvalue)

        If mUseLogging Then
            mLogger.timeLog("data_GetDataPoint().")
        End If

    End Sub 'data_GetDataPoint


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Function data_getDataTitle() _
      As String

        Trace.Assert(mData_Instance = True, _
          "PIL ASSERT. Data Analyst COM object has not been created.")

        Dim toReturn As String = _derived_data_DataTitle()

        If mUseLogging Then
            mLogger.timeLog("data_DataTitle().")
        End If

        Return toReturn
    End Function 'data_getDataTitle


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Function wiffFile_GetActualTimeFromPeriodAndCycle( _
      ByVal aInSample As Integer, _
      ByVal aPeriod As Integer, _
      ByVal anExperiment As Integer, _
      ByVal aCycle As Integer) _
      As Single

        Trace.Assert(mFileControl_Instance, _
          "PIL ASSERT. File control and wiff file Analyst COM objects have not been created.")

        '  It seems this can take a very long time (seconds).
        '  Example: 2.7 for seconds for
        '  "T:\refDataForMSQuant\TripleEncoding\Q1LCMS190203_01DoubleArg.wiff",
        '  cycle=1.
        Dim toReturn As Single = _
          _derived_wiffFile_GetActualTimeFromPeriodAndCycle( _
            aInSample, _
            aPeriod, _
            anExperiment, _
            aCycle)

        If mUseLogging Then
            mLogger.timeLog("wiffFile_GetActualTimeFromPeriodAndCycle().")
        End If

        Return toReturn
    End Function 'wiffFile_GetActualTimeFromPeriodAndCycle


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Function wiffFile_GetActualNumberOfCycles( _
      ByVal aInSample As Integer, _
      ByVal aPeriod As Integer) _
      As Integer

        Trace.Assert(mFileControl_Instance, _
          "PIL ASSERT. File control and wiff file Analyst COM objects have not been created.")

        Dim toReturn As Integer = _
          _derived_wiffFile_GetActualNumberOfCycles( _
            aInSample, _
            aPeriod)
        Return toReturn
    End Function 'wiffFile_GetActualNumberOfCycles


    'Private because it is hidden by GetActualPeriodAndCycleFromTime_ex()...
    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Private Sub wiffFile_GetActualPeriodAndCycleFromTime( _
      ByVal aInSample As Integer, _
      ByVal aInExperiment As Integer, _
      ByVal aInRetT As Single, _
      ByRef anOutPeriod As Integer, _
      ByRef anOutCycle As Integer)

        Trace.Assert(mFileControl_Instance, _
          "PIL ASSERT. File control and wiff file Analyst COM objects have not been created.")

        _derived_wiffFile_GetActualPeriodAndCycleFromTime( _
            aInSample, aInExperiment, aInRetT, anOutPeriod, anOutCycle)

        If mUseLogging Then
            mLogger.timeLog("wiffFile_GetActualPeriodAndCycleFromTime().")
        End If

    End Sub 'wiffFile_GetActualPeriodAndCycleFromTime


    'Changed PM_REFACTOR 2007-07-18. Moved to this class. It is in this
    '  base class; strictly it is not needed for all derived as the we
    '  adapt to match the output from the older version of the COM component.
    '  
    '
    'Changed PM_MORE_QSTAR_TROUBLE 2007-06-28. Changed implementation, based
    'on the right assumptions...
    ''Changed PM_QSTAR_ROUNDING 2007-06-14
    '****************************************************************************
    '*  SUBROUTINE NAME:   GetActualPeriodAndCycleFromTime_ex                   *
    'd$ <summary>
    'd$   Function to isolate the changed behavior of the Analyst COM
    'd$   component in Analyst QS 2.0. It always rounds down the retention
    'd$   time when finding the cycle number. In earlier versions, QS 1.0 and
    'd$   QS 1.1 the nearest cycle number was returned. With this function
    'd$   we keep the ***old*** behavior for rest of this class.
    'd$
    'd$   Update, 2007-06-28:
    'd$     It is more complicated. Besides the different rounding above
    'd$     please note:
    'd$
    'd$       1. The retention time does not always point to the MS 
    'd$          spectrum. In fact this assumption was caused by a bug 
    'd$          in Mascot.dll for QS 1.0 and that most spectrum 
    'd$          groups (MS spectrum plus a number of MS-MS spectra) have 
    'd$          only one MS-MS spectrum. Mascot.dll for QS 1.0 is 
    'd$          outputting the retention time for ***previous*** 
    'd$          spectrum. Thus in most cases this was pointing to 
    'd$          the MS spectrum... In QS 2.0 it seems Mascot.dll is 
    'd$          outputting the intended retention time.
    'd$          
    'd$       2. Because the retention time is pointing somewhere in the 
    'd$          spectrum group we can't assume the nearest value from 
    'd$          GetActualTimeFromPeriodAndCycle() is the correct 
    'd$          cycle number. Instead we use the nearest lower value, 
    'd$          taking into account the rounding in the MGF file 
    'd$          generated by Mascot.dll. Resolution is 0.01 minutes = 
    'd$          0.6 secs for QS 1.0 and 0.001 min = 0.06 secs for QS 2.0.
    'd$          
    'd$ </summary>
    Public Sub wiffFile_GetActualPeriodAndCycleFromTime_ex( _
      ByVal aSampleNumber As Integer, _
      ByVal anExperiment As Integer, _
      ByVal aRetentionTime As Single, _
      ByRef anOutPeriod As Integer, _
      ByRef anOutCycle As Integer _
      )

        Const RETT_MARGIN_SECS As Single = 0.61 'Corresponding to
        'worst case rounding for the worst MGF file resolution of 0.01 min 
        'plus a small margin.

        Dim targetRetentionTime As Single = aRetentionTime + RETT_MARGIN_SECS
        '  "+" to always lift it above any rounding problem.

        Dim cycleNominal As Integer
        Dim somePeriod As Integer 'Will this be the same for all 3??


        'Changed PM_REFACTOR 2007-07-18
        'mANALYSTCOM_WiffFile2.GetActualPeriodAndCycleFromTime( _
        '    aSampleNumber, anExperiment, _
        '    aRetentionTime, somePeriod, cycleNominal)
        Me.wiffFile_GetActualPeriodAndCycleFromTime( _
            aSampleNumber, anExperiment, _
            aRetentionTime, somePeriod, cycleNominal)

        'mANALYSTCOM_WiffFile2.

        'Check for initialisation.
        Trace.Assert( _
          mSpectrumRange.startSpectrum > 0, _
          "PIL ASSERT. mSpectrumRange was not initialised.")

        Dim cycleLow As Integer = cycleNominal - 1
        If cycleLow < mSpectrumRange.startSpectrum Then
            cycleLow = mSpectrumRange.startSpectrum
        End If

        Dim cycleHigh As Integer = cycleNominal + 1
        If cycleHigh > mSpectrumRange.endSpectrum Then
            cycleHigh = mSpectrumRange.endSpectrum
        End If

        'Memory/garbage collection penalty??
        Dim cycleVector(2) As Integer

        'Not really needed as we can just keep the minimum
        'time difference and corresponding index.
        Dim timeVector(2) As Single
        Dim diffTimeVector(2) As Single

        cycleVector(0) = cycleLow
        cycleVector(1) = cycleNominal
        cycleVector(2) = cycleHigh

        'Dim minDiff As Single = 10000000000.0
        Dim foundIndex As Integer = -1

        Dim lastIndex As Integer = 2
        Dim j As Integer
        For j = 0 To lastIndex Step 1
            Dim someSpectrumNumber As Integer = cycleVector(j)

            'Changed PM_REFACTOR 2007-07-18
            'Dim someTime As Single = _
            '  mANALYSTCOM_WiffFile2.GetActualTimeFromPeriodAndCycle( _
            '    aSampleNumber, somePeriod, anExperiment, _
            '    someSpectrumNumber)
            Dim someTime As Single = _
              Me.wiffFile_GetActualTimeFromPeriodAndCycle( _
                aSampleNumber, somePeriod, anExperiment, _
                someSpectrumNumber)

            Dim diffToInput As Single = someTime - aRetentionTime
            Dim absDiffToInput As Single = Math.Abs(diffToInput)

            'Changed PM_MORE_QSTAR_TROUBLE 2007-06-28
            'If absDiffToInput < minDiff Then
            '    minDiff = absDiffToInput
            '    minDiffIndex = j
            'End If
            Dim diffToInput2 As Single = someTime - targetRetentionTime
            If diffToInput2 > 0.0 Then 'Use nearest lower value.
                Dim peter2 As Integer = 2
                '  Exit For 'Use exit when we are debugging, to see
                '            all times and time diffs.
            Else
                foundIndex = j 'Update it as long as the current time
                'is less than the target. This way we always get the
                'nearest closer.
            End If

            'If minDiffIndex < 0 Then 'Guard for the case when we don't
            '    'exit the loop when we have found the nearest lower value.
            'Else
            '    Dim peter3 As Integer = 3 'Already found...
            'End If

            timeVector(j) = someTime
            diffTimeVector(j) = diffToInput 'absDiffToInput if we
            '  were going the iterate through the vector in a 
            '  separate loop.
        Next j

        anOutPeriod = somePeriod 'Is this right??

        anOutCycle = cycleVector(foundIndex) 'This is the 
        '  important output, closest cycle number to the input
        '  retention time.
        '
        '  For QS 1.1 and QS 1.0 minDiffIndex is expected to be 1.
        '
        '  For QS 2.0 minDiffIndex is expected to be 0 for 50% and
        '  1 for the other 50%.
        '
        '  This may indicate that we don't need cycleHigh. But then
        '  we would have make to the assumption that it never always
        '  rounds up (this could theoretically happen in a future
        '  version of Analyst QS).

        If True Then 'For debugging only
            Dim timeDiff As Double = diffTimeVector(foundIndex)

            If foundIndex = 0 Then
                If timeDiff > 0.0 Then
                    Dim peter10 As Integer = 10
                Else
                    Dim peter12 As Integer = 12
                End If
            End If
            If foundIndex = 1 Then
                If timeDiff > 0.0 Then
                    Dim peter10 As Integer = 10
                    'Hit with QSTAR std. dataset, Mascot.dll for QS 2.0, Mascot 2.2.
                Else
                    Dim peter12 As Integer = 12
                End If
            End If
            If foundIndex = 2 Then
                If timeDiff > 0.0 Then
                    Dim peter10 As Integer = 10
                Else
                    Dim peter12 As Integer = 12
                End If
            End If
        End If

        If mUseLogging Then
            mLogger.timeLog("wiffFile_GetActualPeriodAndCycleFromTime_ex().")
        End If

    End Sub 'wiffFile_GetActualPeriodAndCycleFromTime_ex


    'Now in axControl_setupControl().
    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Private Sub axControl_BeginInit()

        'Note: implicit creation of COM instance by calling this function.


        'Take parameter with another instance of AnalystCOM?? (for the data).
        'Possibly the data is connected to two visualisation controls, from
        'Protein Validation window and Quantitation Window.
        '
        'Probably not. ByRef anInAnalystData As AnalystCOM
        '              mData = anInAnalystData

        'Client error to call this function more than once (on the same instance
        'of this class).
        Trace.Assert( _
          mAxControl_Instance = False, _
          "PIL ASSERT. axControl_BeginInit() was called more than once.")

        If Not mAxControl_Instance Then
            _derived_NewInstance_axControl()
            mAxControl_Instance = True

            'An instance of this class must either be used as
            'an Analyst GraphControl.ocx or ExploreDataObjects.dll...
            Trace.Assert( _
              mData_Instance = False, _
              "PIL ASSERT. Client error: Analyst COM wrapper object is used multipurpose.")
        End If

        _derived_axControl_BeginInit()
    End Sub 'wiffFile_GetActualPeriodAndCycleFromTime_ex


    'Return value is nominally AxGraphControl, but that type is COM 
    'component version dependent. Thus we hide the real type
    'by returning system.Windows.Forms.Control instead.
    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Function axControl_setupControl( _
      ByRef anInFormWindowType As System.Type, _
      ByVal anEnabled As Boolean, _
      ByVal aLocation As System.Drawing.Point, _
      ByRef anInSpectrumControlName As String, _
      ByVal aSize As System.Drawing.Size, _
      ByVal aTabIndex As Integer _
      ) _
      As System.Windows.Forms.Control

        Dim resources2 As System.Resources.ResourceManager = _
          New System.Resources.ResourceManager(anInFormWindowType)

        Me.axControl_BeginInit()

        Dim toReturn As System.Windows.Forms.Control = _
          _derived_axControl_setupControl( _
            resources2, anEnabled, aLocation, anInSpectrumControlName, aSize, aTabIndex)

        Return toReturn
    End Function 'axControl_setupControl


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Function axControl_getTitle() _
      As String

        Trace.Assert( _
          mAxControl_Instance = True, _
          "PIL ASSERT. axControl not created.")

        Dim toReturn As String = _
          _derived_axControl_getTitle()
        Return toReturn
    End Function 'axControl_getTitle


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Sub axControl_setXaxisMin(ByVal aMinX As Double)

        Trace.Assert( _
          mAxControl_Instance = True, _
          "PIL ASSERT. axControl not created.")

        _derived_axControl_setXaxisMin(aMinX)

        If mUseLogging Then
            mLogger.timeLog("axControl_setXaxisMin(). Input: " & aMinX)
        End If

    End Sub 'axControl_setXaxisMin


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Sub axControl_setXaxisMax(ByVal aMaxX As Double)

        Trace.Assert( _
          mAxControl_Instance = True, _
          "PIL ASSERT. axControl not created.")

        _derived_axControl_setXaxisMax(aMaxX)

        If mUseLogging Then
            mLogger.timeLog("axControl_setXaxisMax(). Input: " & aMaxX)
        End If

    End Sub 'axControl_setXaxisMax


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Sub axControl_setYaxisMax(ByVal aMaxY As Double)

        Trace.Assert( _
          mAxControl_Instance = True, _
          "PIL ASSERT. axControl not created.")

        'Changed PM_QSTAR_BROKEN_ZOOMING 2007-10-03
        Trace.Assert( _
          aMaxY > 0.0, _
          "PIL ASSERT. aMaxY is undefined: " & aMaxY & ".")

        _derived_axControl_setYaxisMax(aMaxY)

        If mUseLogging Then
            mLogger.timeLog("axControl_setYaxisMax(). Input: " & aMaxY)
        End If

    End Sub 'axControl_setYaxisMax


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Sub axControl_getAxisRanges( _
      ByRef anOutDataXmin As Double, _
      ByRef anOutDataXmax As Double, _
      ByRef anOutDataYmax As Double, _
      ByRef anOutXmin As Double, _
      ByRef anOutXmax As Double _
      )

        Trace.Assert( _
          mAxControl_Instance = True, _
          "PIL ASSERT. axControl not created.")

        _derived_axControl_getAxisRanges( _
          anOutDataXmin, anOutDataXmax, anOutDataYmax, anOutXmin, anOutXmax)

        If mUseLogging Then
            mLogger.timeLog( _
              "axControl_getAxisRanges(). Out values: " & _
              "anOutDataXmin=" & anOutDataXmin & ", " & _
              "anOutDataXmax=" & anOutDataXmax & ", " & _
              "anOutDataYmax=" & anOutDataYmax & ", " & _
              "anOutXmin=" & anOutXmin & ", " & _
              "anOutXmax=" & anOutXmax & ", " & _
              "")
        End If

    End Sub 'axControl_getAxisRanges


    'Changed PM_REFACTOR 2007-07-22. Moved
    '  from frmAnalystSpectraWithLabelMarkers.vb.
    'Changed PM_ANALYST_INVALIDNUMBEROFPARAMETERS 2005-02-10
    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Sub avoidInvalidNumberOfParametersError()

        Trace.Assert( _
          mAxControl_Instance = True, _
          "PIL ASSERT. axControl not created.")

        If True Then
            'Not these 4 by themselves.
            'anInOutAnalystCOM.Invalidate()
            'anInOutAnalystCOM.InvalidateControl()
            'anInOutAnalystCOM.Refresh()
            'anInOutAnalystCOM.Select()

            'anInOutAnalystCOM.SendToBack() 'Not by itself.

            'These 5 works, but spectrum is zapped temporary
            'anInOutAnalystCOM.SetRedraw(True)
            'anInOutAnalystCOM.Show()
            'anInOutAnalystCOM.Update()
            'anInOutAnalystCOM.Visible = False
            'anInOutAnalystCOM.Visible = True

            'These 3 do not work
            'anInOutAnalystCOM.SetRedraw(True)
            'anInOutAnalystCOM.Show()
            'anInOutAnalystCOM.Update()

            'This moves the infamous dialog
            'box "Graph control. Invalid number of parameters" to be displayed
            'at zoom time instead of at every other user action after a zoom.

            'Changed PM_REFACTOR 2007-07-22
            'anInOutAnalystCOM.Visible = False
            'anInOutAnalystCOM.Visible = True
            _derived_axControl_setVisible(False)
            _derived_axControl_setVisible(True)
        End If
    End Sub 'avoidInvalidNumberOfParametersError


    'Reflect SeriesColl in name of sub??
    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Sub axControl_setTitle( _
      ByVal anIndex As Integer, ByRef anInTitle As String)

        Trace.Assert( _
          mAxControl_Instance = True, _
          "PIL ASSERT. axControl not created.")

        _derived_axControl_setTitle(anIndex, anInTitle)

        If mUseLogging Then
            mLogger.timeLog("axControl_setTitle().")
        End If

    End Sub 'axControl_setTitle


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Sub axControl_InvalidateControl()

        Trace.Assert( _
          mAxControl_Instance = True, _
          "PIL ASSERT. axControl not created.")

        _derived_axControl_InvalidateControl()
    End Sub 'axControl_InvalidateControl


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Function axControl_CreateAddUserLabel( _
      ByVal anIndex As Integer, _
      ByRef anInText As String, _
      ByVal anXpos As Double, _
      ByVal anYpos As Double) _
      As Integer

        Trace.Assert( _
          mAxControl_Instance = True, _
          "PIL ASSERT. axControl not created.")

        Dim toReturn As Integer = _
          _derived_axControl_CreateAddUserLabel( _
            anIndex, anInText, anXpos, anYpos)
        Return toReturn
    End Function 'axControl_CreateAddUserLabel


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Sub axControl_fontBoldItalic( _
      ByVal aCollIndex As Integer, ByVal aSomeOtherIndex As Integer)

        Trace.Assert( _
          mAxControl_Instance = True, _
          "PIL ASSERT. axControl not created.")

        _derived_axControl_fontBoldItalic(aCollIndex, aSomeOtherIndex)
    End Sub 'axControl_fontBoldItalic


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Function axControl_SeriesCollCount() _
      As Integer

        Trace.Assert( _
          mAxControl_Instance = True, _
          "PIL ASSERT. axControl not created.")

        Dim toReturn As Integer = _
          _derived_axControl_SeriesCollCount()
        Return toReturn
    End Function 'axControl_SeriesCollCount


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Sub axControl_CreateAddSeries()

        Trace.Assert( _
          mAxControl_Instance = True, _
          "PIL ASSERT. axControl not created.")

        _derived_axControl_CreateAddSeries()
    End Sub 'axControl_InvalidateControl


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Sub axControl_SeriesRemoveAll(ByVal aColIndex As Integer)

        Trace.Assert( _
          mAxControl_Instance = True, _
          "PIL ASSERT. axControl not created.")

        _derived_axControl_SeriesRemoveAll(aColIndex)
    End Sub 'axControl_SeriesRemoveAll


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Sub axControl_AutoCreateMetaData(ByVal aColIndex As Integer)

        Trace.Assert( _
          mAxControl_Instance = True, _
          "PIL ASSERT. axControl not created.")

        _derived_axControl_AutoCreateMetaData(aColIndex)
    End Sub 'axControl_AutoCreateMetaData


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Sub axControl_setDataObject( _
      ByVal aColIndex As Integer, ByRef anInSourceObject As Object)

        Trace.Assert( _
          mAxControl_Instance = True, _
          "PIL ASSERT. axControl not created.")

        'Current assumption (may be removed later):
        Trace.Assert( _
          aColIndex = 1, _
          "PIL ASSERT. aColIndex is not 1.")

        'Note: this resets zoom of spectrum display to full zoom!!!
        _derived_axControl_setDataObject(aColIndex, anInSourceObject)

        'Changed PM_MARKER 2007-10-10
        If mUseLogging Then
            mLogger.timeLog("axControl_setDataObject().")
        End If

    End Sub 'axControl_setDataObject


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Sub axControl_setXYObject( _
      ByVal aColIndex As Integer, ByRef anInSourceObject As Object)

        Trace.Assert( _
          mAxControl_Instance = True, _
          "PIL ASSERT. axControl not created.")

        'Current assumption (may be removed later):
        Trace.Assert( _
          aColIndex = 2, _
          "PIL ASSERT. aColIndex is not 2.")

        _derived_axControl_setXYObject(aColIndex, anInSourceObject)
    End Sub 'axControl_setXYObject


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Sub axControl_CreateAddMarker( _
      ByVal aColIndex As Integer, ByVal anInDpos As Double)

        Trace.Assert( _
          mAxControl_Instance = True, _
          "PIL ASSERT. axControl not created.")

        _derived_axControl_CreateAddMarker(aColIndex, anInDpos)
    End Sub 'axControl_AutoCreateMetaData


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Sub axControl_getLocation( _
      ByRef anOutX As Integer, ByRef anOutY As Integer)

        Trace.Assert( _
          mAxControl_Instance = True, _
          "PIL ASSERT. axControl not created.")

        _derived_axControl_getLocation(anOutX, anOutY)

        If mUseLogging Then
            mLogger.timeLog("axControl_getLocation().")
        End If

    End Sub 'axControl_getLocation


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Sub axControl_getSize( _
      ByRef anOutSizeX As Integer, ByRef anOutSizeY As Integer)

        Trace.Assert( _
          mAxControl_Instance = True, _
          "PIL ASSERT. axControl not created.")

        _derived_axControl_getSize(anOutSizeX, anOutSizeY)

        If mUseLogging Then
            mLogger.timeLog("axControl_getSize().")
        End If

    End Sub 'axControl_getSize


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Sub axControl_Refresh()

        Trace.Assert( _
          mAxControl_Instance = True, _
          "PIL ASSERT. axControl not created.")

        _derived_axControl_Refresh()

        If mUseLogging Then
            mLogger.timeLog("axControl_Refresh().")
        End If
    End Sub 'axControl_Refresh


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Sub axControl_Focus()

        Trace.Assert( _
          mAxControl_Instance = True, _
          "PIL ASSERT. axControl not created.")

        _derived_axControl_Focus()
    End Sub 'axControl_Focus


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Public Sub XYdata_AppendDataPoint( _
      ByVal aXvalue As Double, ByVal aYvalue As Double)

        _derived_XYdata_AppendDataPoint(aXvalue, aYvalue)
    End Sub 'XYdata_AppendDataPoint



    'AAAAAAAAAAA   A marker...

    '****************************************************************************
    '*  P R O T E C T E D   S E C T I O N  ,   B E G I N                        *
    '****************************************************************************


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_XYdata_create( _
      ByVal aXValuesAreSorted As Boolean)


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_NewInstance_data()


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_NewInstance_fileControl()


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_NewInstance_WiffFile( _
      ByRef aFileNameFullPath As String, _
      ByVal aSampleNumberInRawFile As Integer)


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_NewInstance_axControl()


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_data_setWiffFileName( _
      ByRef aFileNameFullPath As String)


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_data_SetSpectrum( _
      ByVal anInSample As Integer, _
      ByVal anInPeriod As Integer, _
      ByVal anExperiment As Integer, _
      ByVal anInStartTime As Single, _
      ByVal anInEndTime As Single)


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Function _derived_data_GetStartMass() As Double


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Function _derived_data_GetStopMass() As Double


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Function _derived_data_GetStartTime() As Single


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Function _derived_data_GetEndTime() As Single


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_data_GetXValueRange( _
      ByRef anOutMinimumXvalue As Double, _
      ByRef anOutMaximumXvalue As Double)


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_data_GetClosestPointNumberForXValue( _
      ByVal anInXvalue As Double, _
      ByVal anInWhichClosestPoint As whichClosestPointTypeEnum, _
      ByRef anOutPointNumber As Integer)


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_data_GetDataPoint( _
      ByVal anInPointerNumber As Integer, _
      ByRef anOutXvalue As Double, _
      ByRef anOutYvalue As Double)


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Function _derived_data_DataTitle() _
    As String


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride _
    Function _derived_wiffFile_GetActualTimeFromPeriodAndCycle( _
      ByVal aInSample As Integer, _
      ByVal aPeriod As Integer, _
      ByVal anExperiment As Integer, _
      ByVal aCycle As Integer) _
      As Single


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride _
    Function _derived_wiffFile_GetActualNumberOfCycles( _
      ByVal aInSample As Integer, _
      ByVal aPeriod As Integer) _
      As Integer


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride _
    Sub _derived_wiffFile_GetActualPeriodAndCycleFromTime( _
      ByVal aInSample As Integer, _
      ByVal aInExperiment As Integer, _
      ByVal aInRetT As Single, _
      ByRef anOutPeriod As Integer, _
      ByRef anOutCycle As Integer)


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_axControl_BeginInit()


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Function _derived_axControl_setupControl( _
      ByRef aResources As System.Resources.ResourceManager, _
      ByVal anEnabled As Boolean, _
      ByVal aLocation As System.Drawing.Point, _
      ByRef anInSpectrumControlName As String, _
      ByVal aSize As System.Drawing.Size, _
      ByVal aTabIndex As Integer _
      ) _
      As System.Windows.Forms.Control


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Function _derived_axControl_getTitle() _
      As String


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_axControl_setXaxisMin( _
      ByVal aMinX As Double)


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_axControl_setXaxisMax( _
      ByVal aMaxX As Double)


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_axControl_setYaxisMax( _
      ByVal aMaxY As Double)


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_axControl_getAxisRanges( _
      ByRef anOutDataXmin As Double, _
      ByRef anOutDataXmax As Double, _
      ByRef anOutDataYmax As Double, _
      ByRef anOutXmin As Double, _
      ByRef anOutXmax As Double _
      )


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_axControl_setVisible( _
      ByVal aState As Boolean)


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_axControl_setTitle( _
      ByVal anIndex As Integer, ByRef anInTitle As String)


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_axControl_InvalidateControl()


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Function _derived_axControl_CreateAddUserLabel( _
      ByVal anIndex As Integer, _
      ByRef anInText As String, _
      ByVal anXpos As Double, _
      ByVal anYpos As Double) _
      As Integer


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_axControl_fontBoldItalic( _
      ByVal aCollIndex As Integer, ByVal aSomeOtherIndex As Integer)


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Function _derived_axControl_SeriesCollCount() _
      As Integer


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_axControl_CreateAddSeries()


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_axControl_SeriesRemoveAll( _
      ByVal aColIndex As Integer)


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_axControl_AutoCreateMetaData( _
      ByVal aColIndex As Integer)


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_axControl_setDataObject( _
      ByVal aColIndex As Integer, ByRef anInSourceObject As Object)


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_axControl_setXYObject( _
      ByVal aColIndex As Integer, ByRef anInSourceObject As Object)


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_axControl_CreateAddMarker( _
      ByVal aColIndex As Integer, ByVal anInDpos As Double)


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_axControl_getLocation( _
      ByRef anOutX As Integer, ByRef anOutY As Integer)


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_axControl_getSize( _
      ByRef anOutSizeX As Integer, ByRef anOutSizeY As Integer)


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_axControl_Refresh()


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_axControl_Focus()


    '****************************************************************************
    '*    <placeholder for header>                                              *
    '****************************************************************************
    Protected MustOverride Sub _derived_XYdata_AppendDataPoint( _
      ByVal aXvalue As Double, ByVal aYvalue As Double)


    '****************************************************************************
    '*  P R O T E C T E D   S E C T I O N  ,   E N D                            *
    '****************************************************************************


End Class 'AnalystCOM


    

    

Generated by script codePublish.pl at 2008-09-23T11:59:18.