public void TestProteinMassComparerWithBinning()
        {
            var comparer2 = new FilteredProteinMassBinning(new AminoAcidSet(),  50001);

            for (var i = 9999d; i < 10010; i++)
            {
                Console.WriteLine("{0}, {1}",i, comparer2.GetBinNumber(i));
            }

            //var comparer = new ProteinMassBinning(50, 50001, true);
            /*
            Console.WriteLine(Constants.GetBinNumHighPrecision(50000));
            Console.WriteLine(comparer.NumberOfBins);
            Console.WriteLine(comparer2.NumberOfBins);

            var rnd = new Random();
            
            var mass = 0d;
            for (var i = 0; i < 450; i ++)
            {
                if (i > 0)
                {
                    var j = rnd.Next(aaSet.Length);
                    mass += aaSet[j].Mass;
                }
                if (mass > comparer.MaxMass) break;

                var binNum = Constants.GetBinNumHighPrecision(mass);
                var binNum1 = comparer.GetBinNumber(mass);
                var binNum2 = comparer2.GetBinNumber(mass);

                Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}", i, mass, binNum, binNum1, binNum2);
            }*/
        }
        public double PearsonCorrelation(Peak[] spectrum1, Peak[] spectrum2,FilteredProteinMassBinning comparer)
        {
            
            var spec1Bar = 0d;
            var spec2Bar = 0d;

            spectrum1 = GuassianFilter(spectrum1, .5);
            spectrum2 = GuassianFilter(spectrum2, .5);
            var vectorLength = comparer.GetBinNumber(10000.0); 

            spec1Bar = spectrum1.Sum(x => x.Intensity)/vectorLength;
            spec2Bar = spectrum1.Sum(y => y.Intensity)/vectorLength;


            var intensityVector1 = ConvertToFullIntensityVector(spectrum1, vectorLength, comparer);
            var intensityVector2 = ConvertToFullIntensityVector(spectrum2, vectorLength, comparer);

            var cov = 0.0;
            var s1 = 0.0;
            var s2 = 0.0;

            for (var i = 0; i < vectorLength; i++)
            {
                var d1 = intensityVector1[i] - spec1Bar;
                var d2 = intensityVector2[i] - spec2Bar;
                cov += d1*d2;
                s1 += d1*d1;
                s2 += d2*d2;
            }

            if (s1 <= 0 || s2 <= 0) return 0;
            return cov < 0 ? 0f : cov/Math.Sqrt(s1*s2);
        }
        public double RootMeanSquareDeviation(Peak[] spectrum1, Peak[] spectrum2, FilteredProteinMassBinning comparer)
        {

            spectrum1 = GuassianFilter(spectrum1, .5);
            spectrum2 = GuassianFilter(spectrum2, .5);
            var vectorLength = comparer.GetBinNumber(10000.0);
            var intensityVector1 = ConvertToFullIntensityVector(spectrum1, vectorLength, comparer);
            var intensityVector2 = ConvertToFullIntensityVector(spectrum2, vectorLength, comparer);
            var mean1 = spectrum1.Sum(p => p.Intensity)/spectrum1.Length;
            var mean2 = spectrum1.Sum(p => p.Intensity)/spectrum2.Length;

            var sum = 0d;
            for (int i = 0; i < vectorLength; i++)
            {
                var diff = intensityVector1[i] - intensityVector2[i];
                sum += diff*diff;
            }

            return Math.Sqrt(sum/vectorLength);
        }
        public double DotProduct(Peak[] spectrum1, Peak[] spectrum2, FilteredProteinMassBinning comparer)
        {

            spectrum1 = GuassianFilter(spectrum1,.5);
            spectrum2 = GuassianFilter(spectrum2,.5);
            var vectorLength = comparer.GetBinNumber(10000.0);
            var featureVector1 = ConvertToFullIntensityVector(spectrum1,vectorLength,comparer);
            var featureVector2 = ConvertToFullIntensityVector(spectrum2, vectorLength,comparer);

  
            var sum = 0d;
            for (int i = 0; i < vectorLength; i++)
            {
                sum += featureVector1[i]*featureVector2[i];
            }

            var norm1 = featureVector1.Sum(x => x*x);
            var norm2 = featureVector2.Sum(x => x * x);
            return sum/Math.Sqrt(norm1*norm2);
        }
        public double[] ConvertToFullIntensityVector(Peak[] spectrum, int length, FilteredProteinMassBinning comparer)
        {
            var intensityVector = new double[length];
            Array.Clear(intensityVector,0,length);
            spectrum = RemovePeaks(10000.0, spectrum);

            for (var i = 0; i < spectrum.Length; i++)
            {
                var binNumber = comparer.GetBinNumber(spectrum[i].Mz);
                if (binNumber >= 0)
                {
                    intensityVector[binNumber - 1] = spectrum[i].Intensity;
                }
            }
            return intensityVector;
        }