16 #include "AccessionManager.h"
23 #include <boost/filesystem/path.hpp>
24 #include <boost/filesystem/operations.hpp>
34 using namespace kome::io::mzml;
39 #define new new( _NORMAL_BLOCK, __FILE__, __LINE__ )
40 #define malloc( s ) _malloc_dbg( s, _NORMAL_BLOCK, __FILE__, __LINE__ )
45 #define SOFTWARE_ACC "MS:1000531"
46 #define MACHINE_ACC "MS:1000031"
48 #define DATA_STATUS "data_status"
70 bool MzmlManager::exportDataSet(
72 kome::objects::DataSet& dataSet,
73 kome::core::Progress& progress,
74 kome::objects::SettingParameterValues* saveSettings
80 if( dataSet.getNumberOfSpectra() == 0 && dataSet.getNumberOfChromatograms() == 0 ) {
81 LOG_ERROR_CODE( FMT(
"There is no data to be exported. Open a data file first." ), ERR_OTHER );
86 FILE* fp = fileopen( path,
"wb" );
88 LOG_ERROR_CODE( FMT(
"Failed to open the file for writing. Check file / folder permissions. [%s]", path ), ERR_FILE_OPEN_FAILED );
93 exportDataSet( fp, dataSet, progress, saveSettings );
103 void MzmlManager::exportDataSet(
105 kome::objects::DataSet& dataSet,
106 kome::core::Progress& progress,
107 kome::objects::SettingParameterValues* saveSettings
110 std::vector< kome::objects::Spectrum* > spectra;
111 std::vector< kome::objects::Chromatogram* > chroms;
112 std::vector< kome::objects::Sample* > samples;
113 std::set< kome::objects::Sample* > sampleSet;
115 for(
unsigned int i = 0; i < dataSet.getNumberOfSpectra(); i++ ) {
116 kome::objects::Spectrum* spec = dataSet.getSpectrum( i );
117 spectra.push_back( spec );
119 kome::objects::Sample* smpl = spec->getSample();
120 if( smpl != NULL && sampleSet.find( smpl ) == sampleSet.end() ) {
121 sampleSet.insert( smpl );
122 samples.push_back( smpl );
126 for(
unsigned int i = 0; i < dataSet.getNumberOfChromatograms(); i++ ) {
127 kome::objects::Chromatogram* chrom = dataSet.getChromatogram( i );
128 if( !chrom->isAutoCreated() ) {
129 chroms.push_back( chrom );
132 kome::objects::Sample* smpl = chrom->getSample();
133 if( smpl != NULL && sampleSet.find( smpl ) == sampleSet.end() ) {
134 sampleSet.insert( smpl );
135 samples.push_back( smpl );
140 std::sort( spectra.begin(), spectra.end(),
lessSpec );
143 const bool specFlg = ( dataSet.getNumberOfSpectra() > 0 );
144 const bool chromFlg = ( dataSet.getNumberOfChromatograms() > 0 );
146 unsigned int subPrgsNum = 1;
154 progress.createSubProgresses( subPrgsNum );
156 kome::core::Progress* mainPrgs = progress.getSubProgress( 0 );
157 kome::core::Progress* specPrgs = ( specFlg ? progress.getSubProgress( 1 ) : NULL );
158 kome::core::Progress* chromPrgs = ( chromFlg ? progress.getSubProgress( subPrgsNum - 1 ) : NULL );
160 mainPrgs->setRange( 0, 7 );
163 mainPrgs->setPosition( 0 );
164 progress.setStatus(
"Writing Header..." );
166 mainPrgs->setPosition( 1 );
170 mainPrgs->setPosition( 2 );
174 mainPrgs->setPosition( 3 );
178 mainPrgs->setPosition( 4 );
182 mainPrgs->setPosition( 5 );
186 mainPrgs->setPosition( 6 );
189 writeRun( fp, samples, spectra, chroms, specPrgs, chromPrgs, saveSettings );
190 if( progress.isStopped() ) {
194 if( specPrgs != NULL ) {
197 if( chromPrgs != NULL ) {
204 mainPrgs->setPosition( 7 );
211 fprintf( fp,
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" );
212 fprintf( fp,
"<indexedmzML xmlns=\"http://psi.hupo.org/ms/mzml\"\n" );
213 fprintf( fp,
" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" );
214 fprintf( fp,
" xsi:schemaLocation=\"http://psi.hupo.org/ms/mzml http://psidev.info/files/ms/mzML/xsd/mzML1.1.0_idx.xsd\">\n" );
215 fprintf( fp,
" <mzML xmlns=\"http://psi.hupo.org/ms/mzml\"\n" );
216 fprintf( fp,
" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" );
217 fprintf( fp,
" xsi:schemaLocation=\"http://psi.hupo.org/ms/mzml http://psidev.info/files/ms/mzML/xsd/mzML1.1.0.xsd\"\n" );
218 fprintf( fp,
" version=\"1.1.0\">\n" );
219 fprintf( fp,
" <cvList count=\"2\">\n" );
220 fprintf( fp,
" <cv id=\"MS\"\n" );
221 fprintf( fp,
" fullName=\"Proteomics Standards Initiative Mass Spectrometry Ontology\"\n" );
222 fprintf( fp,
" version=\"1.3.1\"\n" );
223 fprintf( fp,
" URI=\"http://psidev.info/ms/mzML/psi-ms.obo\" />\n" );
224 fprintf( fp,
" <cv id=\"UO\"\n" );
225 fprintf( fp,
" fullName=\"Unit Ontology\"\n" );
226 fprintf( fp,
" version=\"1.15\"\n" );
227 fprintf( fp,
" URI=\"http://obo.cvs.sourceforge.net/obo/obo/ontology/phenotype/unit.obo\" />\n" );
228 fprintf( fp,
" </cvList>\n" );
234 fprintf( fp,
" <fileDescription>\n" );
240 fprintf( fp,
" </fileDescription>\n" );
247 fprintf( fp,
" <fileContent>\n" );
250 fprintf( fp,
" <cvParam cvRef=\"MS\" accession=\"MS:1000580\" name=\"MSn spectrum\" value=\"\"/>\n" );
253 fprintf( fp,
" </fileContent>\n" );
262 fprintf( fp,
" <sourceFileList>\n" );
265 std::set< kome::objects::SampleSet* > sampleSets;
267 for(
unsigned int i = 0; i < samples.size(); i++ ) {
268 kome::objects::Sample* s = samples[ i ];
269 kome::objects::SampleSet* ss = s->getSampleSet();
271 if( sampleSets.find( ss ) == sampleSets.end() ) {
272 sampleSets.insert( ss );
275 std::string fileName = ss->getFileName();
276 std::string fileDir = getdir( ss->getFilePath() );
277 fileDir = replacestring( fileDir.c_str(),
"\\",
"/" );
281 " <sourceFile id=\"SF%d\" name=\"%s\" location=\"file://%s\" />\n",
290 fprintf( fp,
" </sourceFileList>\n" );
296 #ifdef MZML_USE_REFERENCEABLE_PARAM_GROUP
300 if( specFlg && chromFlg ) {
303 else if( specFlg || chromFlg ) {
311 fprintf( fp,
" <referenceableParamGroupList count=\"%d\">\n", cnt );
315 fprintf( fp,
" <referenceableParamGroup id=\"mz_params\">\n" );
316 fprintf( fp,
" <cvParam cvRef=\"MS\" accession=\"MS:1000514\" name=\"m/z array\" value=\"\"\n" );
317 fprintf( fp,
" unitCvRef=\"MS\" unitAccession=\"MS:1000040\" unitName=\"m/z\"/>\n" );
318 fprintf( fp,
" <cvParam cvRef=\"MS\" accession=\"MS:1000521\" name=\"32-bit float\" value=\"\"/>\n" );
319 fprintf( fp,
" <cvParam cvRef=\"MS\" accession=\"MS:1000576\" name=\"no compression\" value=\"\"/>\n" );
320 fprintf( fp,
" </referenceableParamGroup>\n" );
325 fprintf( fp,
" <referenceableParamGroup id=\"rt_params\">\n" );
326 fprintf( fp,
" <cvParam cvRef=\"MS\" accession=\"MS:1000595\" name=\"time array\" value=\"\"\n" );
327 fprintf( fp,
" unitCvRef=\"UO\" unitAccession=\"UO:0000031\" unitName=\"minute\"/>\n" );
328 fprintf( fp,
" <cvParam cvRef=\"MS\" accession=\"MS:1000521\" name=\"32-bit float\" value=\"\"/>\n" );
329 fprintf( fp,
" <cvParam cvRef=\"MS\" accession=\"MS:1000576\" name=\"no compression\" value=\"\"/>\n" );
330 fprintf( fp,
" </referenceableParamGroup>\n" );
334 fprintf( fp,
" <referenceableParamGroup id=\"int_params\">\n" );
335 fprintf( fp,
" <cvParam cvRef=\"MS\" accession=\"MS:1000515\" name=\"intensity array\" value=\"\"/>\n" );
336 fprintf( fp,
" <cvParam cvRef=\"MS\" accession=\"MS:1000521\" name=\"32-bit float\" value=\"\"/>\n" );
337 fprintf( fp,
" <cvParam cvRef=\"MS\" accession=\"MS:1000576\" name=\"no compression\ value=\"\"/>\n" );
338 fprintf( fp,
" </referenceableParamGroup>\n" );
341 fprintf( fp,
" </referenceableParamGroupList>\n" );
343 #endif // MZML_USE_REFERENCEABLE_PARAM_GROUP
349 kome::core::MsppManager& msppMgr = kome::core::MsppManager::getInstance();
353 std::vector< std::pair< std::string, std::string > > softwares;
354 std::set< std::string > softwareSet;
356 std::string software =
"Mass_plus_plus";
357 std::string version = msppMgr.getVersion();
359 softwareSet.insert( software );
360 softwares.push_back( std::make_pair( software, version ) );
362 for(
unsigned int i = 0; i < samples.size(); i++ ) {
363 kome::objects::Sample* smpl = samples[ i ];
365 software = smpl->getSoftwareName();
366 version = smpl->getSoftwareVersion();
368 if( !software.empty() && softwareSet.find( software ) == softwareSet.end() ) {
369 softwareSet.insert( software );
370 softwares.push_back( std::make_pair( software, version ) );
375 fprintf( fp,
" <softwareList count=\"%d\">\n", softwares.size() );
379 const double minScore = 3.0;
382 for(
unsigned int i = 0; i < softwares.size(); i++ ) {
384 software = softwares[ i ].first;
385 version = softwares[ i ].second;
389 double score = minScore - 0.01;
395 if( tmpScore > score ) {
403 fprintf( fp,
" <software id=\"%s\" version=\"%s\"", software.c_str(), version.c_str() );
404 if( softAcc == NULL ) {
405 fprintf( fp,
"/>\n" );
410 ">\n <cvParam cvRef=\"MS\" accession=\"%s\" name=\"%s\" value=\"\"/>\n",
414 fprintf( fp,
" </software>\n" );
419 fprintf( fp,
" </softwareList>\n" );
428 std::vector< std::string > instruments;
429 std::set< std::string > instrumentSet;
431 for(
unsigned int i = 0; i < samples.size(); i++ ) {
432 std::string instrument = samples[ i ]->getInstrument();
433 if( instrument.empty() ) {
434 instrument =
"undefined";
437 if( instrumentSet.find( instrument ) == instrumentSet.end() ) {
438 instrumentSet.insert( instrument );
439 instruments.push_back( instrument );
444 fprintf( fp,
" <instrumentConfigurationList count=\"%d\">\n", instruments.size() );
448 const double minScore = 3.0;
450 for(
unsigned int i = 0; i < instruments.size(); i++ ) {
452 std::string instrument = instruments[ i ];
454 double score = minScore - 0.01;
460 if( tmpScore > score ) {
468 fprintf( fp,
" <instrumentConfiguration id=\"%s\"", instrument.c_str() );
469 if( machineAcc == NULL ) {
470 fprintf( fp,
"/>\n" );
475 ">\n <cvParam cvRef=\"MS\" accession=\"%s\" name=\"%s\" value=\"\"/>\n",
479 fprintf( fp,
" </instrumentConfiguration>\n" );
484 fprintf( fp,
" </instrumentConfigurationList>\n" );
490 fprintf( fp,
" <dataProcessingList count=\"1\">\n" );
492 fprintf( fp,
" <dataProcessing id=\"Mspp_proc\">\n" );
493 fprintf( fp,
" <processingMethod softwareRef=\"Mass_plus_plus\" order=\"1\">\n" );
494 fprintf( fp,
" <cvParam cvRef=\"MS\" accession=\"MS:1000544\" name=\"Conversion to mzML\" value=\"\"/>\n" );
495 fprintf( fp,
" </processingMethod>\n" );
496 fprintf( fp,
" </dataProcessing>\n" );
499 fprintf( fp,
" </dataProcessingList>\n" );
505 std::vector< kome::objects::Sample* >& samples,
506 std::vector< kome::objects::Spectrum* >& spectra,
507 std::vector< kome::objects::Chromatogram* >& chroms,
508 kome::core::Progress* specPrgs,
509 kome::core::Progress* chromPrgs,
510 kome::objects::SettingParameterValues* saveSettings
513 std::string instrument;
514 if( samples.size() > 0 ) {
515 instrument = samples.front()->getInstrument();
517 if( instrument.empty() ) {
518 instrument =
"undefined";
522 fprintf( fp,
" <run id=\"R1\" defaultInstrumentConfigurationRef=\"%s\">\n", instrument.c_str() );
527 " <spectrumList defaultDataProcessingRef=\"Mspp_proc\" count=\"%d\"",
531 if( spectra.size() == 0 ) {
532 fprintf( fp,
"/>\n" );
535 fprintf( fp,
">\n" );
537 specPrgs->setRange( 0, spectra.size() );
538 specPrgs->setPosition( 0 );
541 for(
unsigned int i = 0; i < spectra.size() && !specPrgs->isStopped(); i++ ) {
543 kome::objects::Spectrum* spec = spectra[ i ];
545 std::string msg = FMT(
546 "Writing Spectrum [%d/%d] ..... %s",
551 specPrgs->setStatus( msg.c_str() );
555 specPrgs->setPosition( i + 1 );
558 if( specPrgs->isStopped() ) {
563 fprintf( fp,
" </spectrumList>\n" );
567 if( chroms.size() > 0 ) {
570 " <chromatogramList defaultDataProcessingRef=\"Mspp_proc\" count=\"%d\">\n",
574 chromPrgs->setRange( 0, chroms.size() );
575 chromPrgs->setPosition( 0 );
578 for(
unsigned int i = 0; i < chroms.size() && !chromPrgs->isStopped(); i++ ) {
580 kome::objects::Chromatogram* chrom = chroms[ i ];
582 std::string msg = FMT(
583 "Writing Chromatogram [%d/%d] ..... %s",
588 chromPrgs->setStatus( msg.c_str() );
592 chromPrgs->setPosition( i + 1 );
595 if( chromPrgs->isStopped() ) {
600 fprintf( fp,
" </chromatogramList>\n" );
604 fprintf( fp,
" </run>\n" );
610 kome::objects::Spectrum& spec,
611 kome::objects::SettingParameterValues* saveSettings
614 bool op = saveSettings->getBoolValue( DATA_STATUS,
false );
617 kome::core::DataPoints tmpDps;
618 kome::core::DataPoints dps( kome::core::DataPoints::FLOAT );
620 spec.getXYData( &tmpDps, op );
621 for(
unsigned int i = 0; i < tmpDps.getLength(); i++ ) {
622 const double x = tmpDps.getX( i );
623 const double y = tmpDps.getY( i );
626 dps.addPoint( x, y );
631 const unsigned int len = dps.getLength();
633 float* xArr = (
float*)dps.getXData();
634 float* yArr = (
float*)dps.getYData();
636 for(
unsigned int i = 0; i < len; i++ ) {
637 memreverse( xArr + i,
sizeof(
float ) );
638 memreverse( yArr + i,
sizeof(
float ) );
652 std::string strSpotId;
654 if ( (
char *)NULL != spec.getSpotId( ) )
656 strSpotId = FMT(
"%s", spec.getSpotId( ) );
659 if ( 0 == strSpotId.length( ) )
663 "<spectrum id=\"%s\" index=\"%d\" defaultArrayLength=\"%d\">\n",
673 "<spectrum id=\"%s\" index=\"%d\" defaultArrayLength=\"%d\" spotID=\"%s\">\n",
684 kome::core::Properties& props = spec.getProperties();
686 if( spec.getMsStage() >= 1 ) {
689 " <cvParam cvRef=\"MS\" accession=\"MS:1000511\" name=\"ms level\" value=\"%d\"/>\n",
694 if( spec.isCentroidMode() ) {
695 fprintf( fp,
" <cvParam cvRef=\"MS\" accession=\"MS:1000127\" name=\"centroid spectrum\" value=\"\"/>\n" );
698 fprintf( fp,
" <cvParam cvRef=\"MS\" accession=\"MS:1000128\" name=\"profile spectrum\" value=\"\"/>\n" );
701 if( spec.getPolarity() == kome::objects::Spectrum::POLARITY_NEGATIVE ) {
702 fprintf( fp,
" <cvParam cvRef=\"MS\" accession=\"MS:1000129\" name=\"negative scan\" value=\"\"/>\n" );
704 else if( spec.getPolarity() == kome::objects::Spectrum::POLARITY_POSITIVE ) {
705 fprintf( fp,
" <cvParam cvRef=\"MS\" accession=\"MS:1000130\" name=\"positive scan\" value=\"\"/>\n" );
708 if( spec.getTotalIntensity() >= 0.0 ) {
711 " <cvParam cvRef=\"MS\" accession=\"MS:1000285\" name=\"total ion current\" value=\"%f\"/>\n",
712 spec.getTotalIntensity()
716 if( spec.getBasePeakMass() >= 0.0 ) {
719 " <cvParam cvRef=\"MS\" accession=\"MS:1000504\" name=\"base peak m/z\" value=\"%f\"/>\n",
720 spec.getBasePeakMass()
724 if( spec.getMaxIntensity() >= 0.0 ) {
727 " <cvParam cvRef=\"MS\" accession=\"MS:1000505\" name=\"base peak intensity\" value=\"%f\"/>\n",
728 spec.getMaxIntensity()
735 " <scanList count=\"1\">\n"
738 std::string instrument = spec.getSample()->getInstrument();
739 if( instrument.empty() ) {
740 instrument =
"undefined";
748 std::string filter = props.getStringValue(
"Filter",
"" );
749 if( !filter.empty() ) {
752 " <cvParam cvRef=\"MS\" accession=\"MS:1000512\" name=\"filter string\" value=\"%s\"/>\n",
757 if( spec.getRt() >= 0.0 ) {
760 " <cvParam cvRef=\"MS\" accession=\"MS:1000016\" name=\"scan start time\" value=\"%f\"\n",
766 " unitCvRef=\"UO\" unitAccession=\"UO:0000031\" unitName=\"minute\"/>\n"
772 " <scanWindowList count=\"1\">\n"
780 if( spec.getMinX() >= 0.0 ) {
783 " <cvParam cvRef=\"MS\" accession=\"MS:1000501\" name=\"scan window lower limit\" value=\"%f\"/>\n",
787 if( spec.getMaxX() >= 0.0 ) {
790 " <cvParam cvRef=\"MS\" accession=\"MS:1000500\" name=\"scan window upper limit\" value=\"%f\"/>\n",
802 " </scanWindowList>\n"
816 const double precursor = spec.getPrecursor();
817 if( precursor >= 0.0 ) {
818 kome::objects::Spectrum* parent = spec.getParentSpectrum();
819 std::string parentId = ( parent == NULL ?
"" : parent->getName() );
823 " <precursorList count=\"1\">\n"
828 " <precursor spectrumRef=\"%s\">\n",
834 " <selectedIonList count=\"1\">\n"
844 " <cvParam cvRef=\"MS\" accession=\"MS:1000744\" name=\"selected ion m/z\"\n"
849 " value=\"%f\" unitCvRef=\"MS\" unitAccession=\"MS:1000040\" unitName=\"m/z\"/>\n",
860 " </selectedIonList>\n"
870 " </precursorList>\n"
877 unsigned long buffLength = len *
sizeof( float ) * 2;
878 char* base64Buff =
new char[ buffLength ];
880 fprintf( fp,
" <binaryDataArrayList count=\"2\">\n" );
883 unsigned long size = kome::core::Base64::encode( dps.getXData(),
sizeof( float ) * len, base64Buff, buffLength );
885 fprintf( fp,
" <binaryDataArray encodedLength=\"%d\">\n", size );
887 #ifdef MZML_USE_REFERENCEABLE_PARAM_GROUP
888 fprintf( fp,
" <referenceableParamGroupRef ref=\"mz_params\"/>\n" );
890 fprintf( fp,
" <cvParam cvRef=\"MS\" accession=\"MS:1000514\" name=\"m/z array\" value=\"\"\n" );
891 fprintf( fp,
" unitCvRef=\"MS\" unitAccession=\"MS:1000040\" unitName=\"m/z\"/>\n" );
892 fprintf( fp,
" <cvParam cvRef=\"MS\" accession=\"MS:1000521\" name=\"32-bit float\" value=\"\"/>\n" );
893 fprintf( fp,
" <cvParam cvRef=\"MS\" accession=\"MS:1000576\" name=\"no compression\" value=\"\"/>\n" );
894 #endif // MZML_USE_REFERENCEABLE_PARAM_GROUP
896 fprintf( fp,
" <binary>" );
899 char* pos = base64Buff;
901 int writeSize = MIN( size, 1024 );
902 writeSize = fwrite( pos, 1, writeSize, fp );
907 fprintf( fp,
"</binary>\n" );
908 fprintf( fp,
" </binaryDataArray>\n" );
911 size = kome::core::Base64::encode( dps.getYData(),
sizeof( float ) * len, base64Buff, buffLength );
913 fprintf( fp,
" <binaryDataArray encodedLength=\"%d\">\n", size );
915 #ifdef MZML_USE_REFERENCEABLE_PARAM_GROUP
916 fprintf( fp,
" <referenceableParamGroupRef ref=\"int_params\"/>\n" );
918 fprintf( fp,
" <cvParam cvRef=\"MS\" accession=\"MS:1000515\" name=\"intensity array\" value=\"\"/>\n" );
919 fprintf( fp,
" <cvParam cvRef=\"MS\" accession=\"MS:1000521\" name=\"32-bit float\" value=\"\"/>\n" );
920 fprintf( fp,
" <cvParam cvRef=\"MS\" accession=\"MS:1000576\" name=\"no compression\" value=\"\"/>\n" );
921 #endif // MZML_USE_REFERENCEABLE_PARAM_GROUP
923 fprintf( fp,
" <binary>" );
927 int writeSize = MIN( size, 1024 );
928 writeSize = fwrite( pos, 1, writeSize, fp );
933 fprintf( fp,
"</binary>\n" );
934 fprintf( fp,
" </binaryDataArray>\n" );
936 fprintf( fp,
" </binaryDataArrayList>\n" );
942 fprintf( fp,
" </spectrum>\n" );
948 kome::objects::Chromatogram& chrom,
949 kome::objects::SettingParameterValues* saveSettings
952 bool op = saveSettings->getBoolValue( DATA_STATUS,
false );
955 kome::core::DataPoints dps( kome::core::DataPoints::FLOAT );
957 chrom.getXYData( &dps, op );
960 const unsigned int len = dps.getLength();
962 float* xArr = (
float*)dps.getXData();
963 float* yArr = (
float*)dps.getYData();
965 for(
unsigned int i = 0; i < len; i++ ) {
966 memreverse( xArr + i,
sizeof(
float ) );
967 memreverse( yArr + i,
sizeof(
float ) );
981 "<chromatogram id=\"%s\" index=\"%d\" defaultArrayLength=\"%d\">\n",
990 unsigned long buffLength = len *
sizeof( float ) * 2;
991 char* base64Buff =
new char[ buffLength ];
993 fprintf( fp,
" <binaryDataArrayList count=\"2\">\n" );
996 unsigned long size = kome::core::Base64::encode( dps.getXData(),
sizeof( float ) * len, base64Buff, buffLength );
998 fprintf( fp,
" <binaryDataArray encodedLength=\"%d\">\n", size );
1000 #ifdef MZML_USE_REFERENCEABLE_PARAM_GROUP
1001 fprintf( fp,
" <referenceableParamGroupRef ref=\"rt_params\"/>\n" );
1003 fprintf( fp,
" <cvParam cvRef=\"MS\" accession=\"MS:1000595\" name=\"time array\" value=\"\"\n" );
1004 fprintf( fp,
" unitCvRef=\"UO\" unitAccession=\"UO:0000031\" unitName=\"minute\"/>\n" );
1005 fprintf( fp,
" <cvParam cvRef=\"MS\" accession=\"MS:1000521\" name=\"32-bit float\" value=\"\"/>\n" );
1006 fprintf( fp,
" <cvParam cvRef=\"MS\" accession=\"MS:1000576\" name=\"no compression\" value=\"\"/>\n" );
1007 #endif // MZML_USE_REFERENCEABLE_PARAM_GROUP
1009 fprintf( fp,
" <binary>" );
1011 char* pos = base64Buff;
1013 int writeSize = MIN( size, 1024 );
1014 writeSize = fwrite( pos, 1, writeSize, fp );
1019 fprintf( fp,
"</binary>\n" );
1020 fprintf( fp,
" </binaryDataArray>\n" );
1023 size = kome::core::Base64::encode( dps.getYData(),
sizeof( float ) * len, base64Buff, buffLength );
1025 fprintf( fp,
" <binaryDataArray encodedLength=\"%d\">\n", size );
1027 #ifdef MZML_USE_REFERENCEABLE_PARAM_GROUP
1028 fprintf( fp,
" <referenceableParamGroupRef ref=\"int_params\"/>\n" );
1030 fprintf( fp,
" <cvParam cvRef=\"MS\" accession=\"MS:1000515\" name=\"intensity array\" value=\"\"/>\n" );
1031 fprintf( fp,
" <cvParam cvRef=\"MS\" accession=\"MS:1000521\" name=\"32-bit float\" value=\"\"/>\n" );
1032 fprintf( fp,
" <cvParam cvRef=\"MS\" accession=\"MS:1000576\" name=\"no compression\" value=\"\"/>\n" );
1033 #endif // MZML_USE_REFERENCEABLE_PARAM_GROUP
1035 fprintf( fp,
" <binary>" );
1039 int writeSize = MIN( size, 1024 );
1040 writeSize = fwrite( pos, 1, writeSize, fp );
1045 fprintf( fp,
"</binary>\n" );
1046 fprintf( fp,
" </binaryDataArray>\n" );
1048 fprintf( fp,
" </binaryDataArrayList>\n" );
1050 delete[] base64Buff;
1054 fprintf( fp,
" </chromatogram>\n" );
1060 std::vector< kome::objects::Spectrum* >& spectra,
1061 std::vector< kome::objects::Chromatogram* >& chroms
1064 fprintf( fp,
" </mzML>\n" );
1068 if( spectra.size() > 0 ) {
1071 if( chroms.size() > 0 ) {
1076 const long long idxOffset = filetell( fp ) + 2;
1079 fprintf( fp,
" <indexList count=\"%d\">\n", listCnt );
1082 if( spectra.size() > 0 ) {
1083 fprintf( fp,
" <index name=\"spectrum\">\n" );
1085 for(
unsigned int i = 0; i < spectra.size(); i++ ) {
1086 kome::objects::Spectrum* spec = spectra[ i ];
1090 fprintf( fp,
" <offset idRef=\"%s\">%lld</offset>\n", spec->getName(), offset );
1094 fprintf( fp,
" </index>\n" );
1098 if( chroms.size() > 0 ) {
1099 fprintf( fp,
" <index name=\"chromatogram\">\n" );
1101 for(
unsigned int i = 0; i < chroms.size(); i++ ) {
1102 kome::objects::Chromatogram* chrom = chroms[ i ];
1106 fprintf( fp,
" <offset idRef=\"%s\">%lld</offset>\n", chrom->getName(), offset );
1110 fprintf( fp,
" </index>\n" );
1114 fprintf( fp,
" </indexList>\n" );
1118 fprintf( fp,
"<indexListOffset>%lld</indexListOffset>\n", idxOffset );
1122 fprintf( fp,
"</indexedmzML>\n" );
1128 if( s0 == NULL || s1 == NULL ) {
1129 return ( - FLT_MAX );
1133 unsigned int l0 = strlen( s0 );
1134 unsigned int l1 = strlen( s1 );
1136 if( l0 == 0 && l1 == 0 ) {
1139 else if( l0 == 0 || l1 == 0 ) {
1140 return ( - FLT_MAX );
1144 kome::numeric::DynamicPrograming dp( l0, l1 );
1145 dp.calculate( boost::bind(
getMatchScore, s0, _1, s1, _2 ), 0.1 );
1147 return dp.getAccumulatedScore( (
int)l0 - 1, (
int)l1 - 1 );
1153 char c0 = s0[ idx0 ];
1154 char c1 = s1[ idx1 ];
1156 bool a0 = ( isalnum( c0 ) != 0 );
1157 bool a1 = ( isalnum( c1 ) != 0 );
1161 if( tolower( c0 ) == tolower( c1 ) ) {
1187 return ( spec0->getRt() < spec1->getRt() );
std::map< kome::objects::Chromatogram *, long long > m_chromIdxMap
static double getMatchScore(const char *s0, int idx0, const char *s1, int idx1)
gets match score
static AccessionManager & getInstance()
gets accession manager object (This is the only object.)
static bool lessSpec(kome::objects::Spectrum *spec0, kome::objects::Spectrum *spec1)
compare spectra to sort
void writeRun(FILE *fp, std::vector< kome::objects::Sample * > &samples, std::vector< kome::objects::Spectrum * > &spectra, std::vector< kome::objects::Chromatogram * > &chroms, kome::core::Progress *specPrgs, kome::core::Progress *chromPrgs, kome::objects::SettingParameterValues *saveSettings)
writes run tag
void writeInstrumentList(FILE *fp, std::vector< kome::objects::Sample * > &samples)
writes instrument list
std::map< kome::objects::Spectrum *, long long > m_specIdxMap
void writeChromatogram(FILE *fp, kome::objects::Chromatogram &chrom, kome::objects::SettingParameterValues *saveSettings)
writes chromatogram
const char * getId()
gets accession ID
const char * getName()
gets accession name
Accession * getOrigin()
gets origin accesion
void writeSourceFileList(FILE *fp, std::vector< kome::objects::Sample * > &samples)
writes source file list
interfaces of MzmlManager class
interfaces of Accession class
void writeHeader(FILE *fp)
writes header
Accession * getAccession(const unsigned int idx)
gets accession
void init()
initializes variables
void writeFileContent(FILE *fp, std::vector< kome::objects::Sample * > &samples)
writes file content
accession object management class
virtual ~MzmlManager()
destructor
void writeIndexList(FILE *fp, std::vector< kome::objects::Spectrum * > &spectra, std::vector< kome::objects::Chromatogram * > &chroms)
writes index list
accession information class
static double getSimilarityScore(const char *s0, const char *s1)
gets similarity score between two character strings
static MzmlManager & getInstance()
gets mzML IO management object
void writeFileDescription(FILE *fp, std::vector< kome::objects::Sample * > &samples)
writes file description
void writeReferenceableParamGroup(FILE *fp, const bool specFlg, const bool chromFlg)
writes referenceable parameters group
void writeSoftwareList(FILE *fp, std::vector< kome::objects::Sample * > &samples)
writes software list
void writeProcessingList(FILE *fp)
writes processing list
void writeSpectrum(FILE *fp, kome::objects::Spectrum &spec, kome::objects::SettingParameterValues *saveSettings)
writes spectrum
unsigned int getNumberOfAccessions()
gets the number of accessions