private void RunTransitionOverTimeTest(mbsMATRIX M)
        {
            C3mbsWrapperSpeciesModel wrapper = new C3mbsWrapperSpeciesModel();
            // Generate and display data.
            if(m_displayType == MBSDEFAULTS.BITMAPDISPLAYTYPE.BEHAVIOR_TRANSITION)
                m_displayData = wrapper.RunBehaviorTransitionControlTest(M, m_behaviorIndex, m_numTrials);
            else
                m_displayData = wrapper.InitialBehaviorControlTest(M, m_numTrials);

            m_bitmapMgr.SetDisplayData(m_numBehaviors, m_displayData);

        }
        //------------------------------------------------------------------------------//
        // Behavior Transition Over Time Bitmap UpdateDataDisplay()
        //------------------------------------------------------------------------------//
        public void SetDisplayData(int NumBehaviors, mbsSNGLBEHTRANSTRUCT Data)
        {
            int i;

            m_data = Data;
            m_numBehaviors = NumBehaviors;

            // Run debug assertions on the data passed in
            Debug.Assert(m_data.timePeriodArray.Length > 0);
            for(i=0; i<m_data.timePeriodArray.Length; i++)
                Debug.Assert(m_data.timePeriodArray[i].trialArray.Length > 0);
            RedrawBitmap();
        }
        private SINGLEBEHTRANSSTATS GetSingleBehaviorTransitionStats(mbsSNGLBEHTRANSTRUCT Data)
        {
            int i, j, beh; // indexing vars.

            SINGLEBEHTRANSSTATS stats = new SINGLEBEHTRANSSTATS();
            stats.periodArray = new TRANSPERIOD[Data.timePeriodArray.Length];

            // The number of translational periods defined in the behavior transition
            // model. Equivelent to the number of rows in the behavior transition matrix.
            stats.periodCnt = m_data.timePeriodArray.Length;

            // The number of trials conducted per translational period.  This value is
            // defined by the application calling the behavior translation test.
            stats.trialsPerPeriodCnt = m_data.timePeriodArray[0].trialArray.Length;

            
            if(stats.trialsPerPeriodCnt == 0)
                return stats; // handle this better!!!!

            stats.maxPeriodDuration = 0;
            stats.maxBehaviorCount = 0;

            // Allocate memory for stats for each transitional period in the model and
            // memory for recording the total counts of behavior transitions achieved
            // during those trials.
            stats.periodArray = new TRANSPERIOD[stats.periodCnt];
            for(i=0; i<stats.periodCnt; i++)
                stats.periodArray[i].toBehaviorCount = new int[m_numBehaviors];

            //--------------------------------------------------------------------------//
            // Generate the stats
            //-------------------//
            // i is the transitional period
            // j is the j number for that transitional period
            // beh is the behavior index
            stats.maxPeriodDuration = m_data.timePeriodArray[0].trialArray[0].sec;
            stats.minPeriodDuration = m_data.timePeriodArray[0].trialArray[0].sec;
            stats.maxBehaviorCount = 0;
            for(i=0; i<stats.periodCnt; i++)
            {
                stats.periodArray[i].aveDuration = 0;
                stats.periodArray[i].minDuration = m_data.timePeriodArray[i].trialArray[0].sec;
                stats.periodArray[i].maxDuration = m_data.timePeriodArray[i].trialArray[0].sec;

                // set max duraiton to initial value
                // set min duration to initial value
                // initial ave duration
                for(j=0; j<stats.trialsPerPeriodCnt; j++)
                {
                    // m_data.timePeriodArray[i].trialArray[j].sec holds time the behavior persisted until
                    // it transitioned into a new behavior.
                    stats.periodArray[i].aveDuration += m_data.timePeriodArray[i].trialArray[j].sec;

                    // Update the minimum for this transition period
                    if(stats.periodArray[i].minDuration > m_data.timePeriodArray[i].trialArray[j].sec)
                        stats.periodArray[i].minDuration = m_data.timePeriodArray[i].trialArray[j].sec;

                    // Update the maximum for this transition period.
                    if(stats.periodArray[i].maxDuration < m_data.timePeriodArray[i].trialArray[j].sec)
                        stats.periodArray[i].maxDuration = m_data.timePeriodArray[i].trialArray[j].sec;

                    // m_data.timePeriodArray[i].trialArray[j].trans holds the behavior transitioned into
                    // when the behavior transition being tested transitioned into
                    // a new behavior.
                    beh = m_data.timePeriodArray[i].trialArray[j].trans;
                    stats.periodArray[i].toBehaviorCount[beh]++;
                }

                // Average time before transitioning to a new behavior from being being
                // tested.
                stats.periodArray[i].aveDuration /= (double)stats.trialsPerPeriodCnt;

                // Update the maximum count of all behavior transitions for all time periods and all trials conducted
                for(beh=0; beh<m_numBehaviors; beh++)
                {
                    // Maximum of all transitional periods
                    if(stats.maxBehaviorCount < stats.periodArray[i].toBehaviorCount[beh])
                        stats.maxBehaviorCount = stats.periodArray[i].toBehaviorCount[beh];
                }

                // Update the maximum of all period durations for all transiton periods and trials
                if(stats.maxPeriodDuration < stats.periodArray[i].maxDuration)
                    stats.maxPeriodDuration = stats.periodArray[i].maxDuration;

                // Update the minimum of all period durations for all transiton periods and trials
                if(stats.minPeriodDuration > stats.periodArray[i].minDuration)
                    stats.minPeriodDuration = stats.periodArray[i].minDuration;
            }
            return stats;
        }
        //------------------------------------------------------------------------------//
        // Behavior Transition Over Time Manager UpdateDataDisplay()
        //------------------------------------------------------------------------------//
        // Called by the parent form when data has changed or a characteristic about how
        // the data is to be displayed has been modified.
        public void SetDisplayData(int NumBehaviors, mbsSNGLBEHTRANSTRUCT Data)
        {
            m_numBehaviors = NumBehaviors;


            // Have the bitmap class update its data display.
            m_transBitMap.SetDisplayData(NumBehaviors, Data);

            // Invalidate the rect of the parent form that the data is displayed in so
            // that the OS displays the updated display.
            m_parentForm.Invalidate();
        }