@@ -1477,6 +1477,8 @@ private SpectrumType ConstructMSSpectrum(int scanNumber)
14771477 double ? highestObservedMz = null ;
14781478 double [ ] masses ;
14791479 double [ ] intensities ;
1480+ double [ ] charges = null ;
1481+ double [ ] raw_masses ; //this array is a copy of masses used for sorting
14801482
14811483 if ( ! ParseInput . NoPeakPicking . Contains ( ( int ) scanFilter . MSOrder ) )
14821484 {
@@ -1496,10 +1498,18 @@ private SpectrumType ConstructMSSpectrum(int scanNumber)
14961498 basePeakIntensity = scan . CentroidScan . BasePeakIntensity ;
14971499
14981500 masses = scan . CentroidScan . Masses ;
1501+ raw_masses = ( double [ ] ) masses . Clone ( ) ; //Copy of original (unsorted) masses
14991502 intensities = scan . CentroidScan . Intensities ;
15001503
1504+ if ( ParseInput . ChargeData )
1505+ {
1506+ charges = scan . CentroidScan . Charges ;
1507+ }
1508+
15011509 if ( scan . CentroidScan . Length > 0 )
15021510 {
1511+ //Sort masses
1512+ Array . Sort ( masses ) ;
15031513 lowestObservedMz = scan . CentroidScan . Masses [ 0 ] ;
15041514 highestObservedMz = scan . CentroidScan . Masses [ scan . CentroidScan . Masses . Length - 1 ] ;
15051515 }
@@ -1515,10 +1525,13 @@ private SpectrumType ConstructMSSpectrum(int scanNumber)
15151525 : scan . SegmentedScan ;
15161526
15171527 masses = segmentedScan . Positions ;
1528+ raw_masses = ( double [ ] ) masses . Clone ( ) ;
15181529 intensities = segmentedScan . Intensities ;
15191530
15201531 if ( segmentedScan . PositionCount > 0 )
15211532 {
1533+ //Sort masses
1534+ Array . Sort ( masses ) ;
15221535 lowestObservedMz = segmentedScan . Positions [ 0 ] ;
15231536 highestObservedMz = segmentedScan . Positions [ segmentedScan . PositionCount - 1 ] ;
15241537 }
@@ -1551,10 +1564,13 @@ private SpectrumType ConstructMSSpectrum(int scanNumber)
15511564 basePeakMass = scan . ScanStatistics . BasePeakMass ;
15521565 basePeakIntensity = scan . ScanStatistics . BasePeakIntensity ;
15531566 masses = scan . SegmentedScan . Positions ;
1567+ raw_masses = ( double [ ] ) masses . Clone ( ) ;
15541568 intensities = scan . SegmentedScan . Intensities ;
15551569
15561570 if ( scan . SegmentedScan . Positions . Length > 0 )
15571571 {
1572+ //Sort masses
1573+ Array . Sort ( masses ) ;
15581574 lowestObservedMz = scan . SegmentedScan . Positions [ 0 ] ;
15591575 highestObservedMz = scan . SegmentedScan . Positions [ scan . SegmentedScan . Positions . Length - 1 ] ;
15601576 }
@@ -1629,9 +1645,6 @@ private SpectrumType ConstructMSSpectrum(int scanNumber)
16291645 // M/Z Data
16301646 if ( masses != null )
16311647 {
1632- //sorting
1633- Array . Sort ( masses , intensities ) ;
1634-
16351648 // Set the spectrum default array length
16361649 spectrum . defaultArrayLength = masses . Length ;
16371650
@@ -1687,8 +1700,11 @@ private SpectrumType ConstructMSSpectrum(int scanNumber)
16871700 }
16881701
16891702 // Intensity Data
1690- if ( intensities != null )
1703+ if ( masses != null && intensities != null )
16911704 {
1705+ //sorting intensities based on masses
1706+ Array . Sort ( ( double [ ] ) raw_masses . Clone ( ) , intensities ) ;
1707+
16921708 // Set the spectrum default array length if necessary
16931709 if ( spectrum . defaultArrayLength == 0 )
16941710 {
@@ -1747,6 +1763,63 @@ private SpectrumType ConstructMSSpectrum(int scanNumber)
17471763 binaryData . Add ( intensitiesBinaryData ) ;
17481764 }
17491765
1766+ // Optional Charge Data
1767+ if ( masses != null && charges != null )
1768+ {
1769+ //sorting charges based on masses
1770+ Array . Sort ( ( double [ ] ) raw_masses . Clone ( ) , charges ) ;
1771+
1772+ var chargesBinaryData =
1773+ new BinaryDataArrayType
1774+ {
1775+ binary = ParseInput . NoZlibCompression
1776+ ? Get64BitArray ( charges )
1777+ : GetZLib64BitArray ( charges )
1778+ } ;
1779+ chargesBinaryData . encodedLength =
1780+ ( 4 * Math . Ceiling ( ( double ) chargesBinaryData
1781+ . binary . Length / 3 ) ) . ToString ( CultureInfo . InvariantCulture ) ;
1782+
1783+ var chargesBinaryDataCvParams = new List < CVParamType >
1784+ {
1785+ new CVParamType
1786+ {
1787+ accession = "MS:1000516" ,
1788+ name = "charge array" ,
1789+ cvRef = "MS" ,
1790+ value = ""
1791+ } ,
1792+ new CVParamType { accession = "MS:1000523" , name = "64-bit float" , cvRef = "MS" , value = "" }
1793+ } ;
1794+
1795+ if ( ! ParseInput . NoZlibCompression )
1796+ {
1797+ chargesBinaryDataCvParams . Add (
1798+ new CVParamType
1799+ {
1800+ accession = "MS:1000574" ,
1801+ name = "zlib compression" ,
1802+ cvRef = "MS" ,
1803+ value = ""
1804+ } ) ;
1805+ }
1806+ else
1807+ {
1808+ chargesBinaryDataCvParams . Add (
1809+ new CVParamType
1810+ {
1811+ accession = "MS:1000576" ,
1812+ name = "no compression" ,
1813+ cvRef = "MS" ,
1814+ value = ""
1815+ } ) ;
1816+ }
1817+
1818+ chargesBinaryData . cvParam = chargesBinaryDataCvParams . ToArray ( ) ;
1819+
1820+ binaryData . Add ( chargesBinaryData ) ;
1821+ }
1822+
17501823 // Include optional noise data
17511824 if ( ParseInput . NoiseData )
17521825 {
0 commit comments