Mass++ Common Libraries v2.7.5
 All Classes Namespaces Files Functions Variables Enumerations Macros
Peaks.cpp
Go to the documentation of this file.
1 
14 #include "stdafx.h"
15 #include "Peaks.h"
16 
17 #include "PeakElement.h"
18 
19 
20 using namespace kome::objects;
21 
22 
23 #include <crtdbg.h>
24 #ifdef _DEBUG
25  #define new new( _NORMAL_BLOCK, __FILE__, __LINE__ )
26  #define malloc( s ) _malloc_dbg( s, _NORMAL_BLOCK, __FILE__, __LINE__ )
27 #endif // _DEBUG
28 
29 
30 
31 #define MAX_PEAK_NUM 10000
32 
33 // constructor
35  m_precursor = -1.0;
36 // @date 2011.03.03 <Mod> M.Aihara ->
37 // soft cache DataPoints
38 #ifdef DATAPOINTS_SOFT_CACHE_TBB
39  m_dps = NULL;
40 #endif // DATAPOINTS_SOFT_CACHE_TBB
41 // <Mod> M.Aihara <-
42 }
43 
44 // copy constructor
45 Peaks::Peaks( const Peaks& peaks ) : kome::core::XYData( peaks ) {
46  // initialize
47  m_title = peaks.m_title;
48  m_precursor = peaks.m_precursor;
49  for( unsigned int i = 0; i < peaks.m_charges.size(); i++ ) {
50  m_charges.push_back( peaks.m_charges[ i ] );
51  }
52 
53 // @date 2011.03.03 <Mod> M.Aihara ->
54 // soft cache DataPoints
55 #ifdef DATAPOINTS_SOFT_CACHE_TBB
56  if(peaks.m_dps){
57  m_dps = new kome::core::DataPoints( kome::core::DataPoints::FLOAT );
58  *m_dps = *(peaks.m_dps);
59  }else{
60  m_dps = NULL;
61  }
62 #endif // DATAPOINTS_SOFT_CACHE_TBB
63 // <Mod> M.Aihara <-
64 
65  m_title = peaks.m_title;
66  m_charges = peaks.m_charges;
67  m_precursor = peaks.m_precursor;
68  m_dataFile = peaks.m_dataFile;
69 
70  // copy peaks
71  if( peaks.m_peaks.size() == 0 ) {
72  return;
73  }
74 
75  m_peaks.reserve( peaks.m_peaks.size() );
76  for( unsigned int i = 0; i < peaks.m_peaks.size(); i++ ) {
77  // source peak
78  PeakElement* src = peaks.m_peaks[ i ];
79 
80  // copy peak
81  PeakElement* peak = new PeakElement( this );
82  m_peaks.push_back( peak );
83 
84  peak->setX( src->getX() );
85  peak->setY( src->getY() );
86  peak->setLeft( src->getLeftX(), src->getLeftY() );
87  peak->setRight( src->getRightX(), src->getRightY() );
88  peak->setApex( src->getApexX(), src->getApexY() );
89  }
90 }
91 
92 // destructor
94  // manager
96 
97 // @date 2011.03.03 <Mod> M.Aihara ->
98 // soft cache DataPoints
99 #ifdef DATAPOINTS_SOFT_CACHE_TBB
100  if(m_dps) delete m_dps;
101 #endif // DATAPOINTS_SOFT_CACHE_TBB
102 // <Mod> M.Aihara <-
103 
104  // clear points
105  onClearPoints();
106 
107  // delete profile data
108  if( !m_dataFile.empty() ) {
109  std::string oldDataPath = getpath( msppMgr.getTmpDir(), m_dataFile.c_str() );
110 
111  if( fileexists( oldDataPath.c_str() ) ) {
112  removefile( oldDataPath.c_str() );
113  }
114  }
115 }
116 
117 // substitution operator
118 Peaks& Peaks::operator=( const Peaks& other ) {
119  // initialize
120  m_title = other.m_title;
121  m_precursor = other.m_precursor;
122  for( unsigned int i = 0; i < other.m_charges.size(); i++ ) {
123  m_charges.push_back( other.m_charges[ i ] );
124  }
125 
126  // clear points
127  clearPoints();
128  // copy peaks
129  if( other.m_peaks.size() == 0 ) {
130  return *this;
131  }
132 
133  // add peaks
134  reserve( other.m_peaks.size() );
135  for( unsigned int i = 0; i < other.m_peaks.size(); i++ ) {
136  // source peak
137  PeakElement* src = other.m_peaks[ i ];
138 
139  // copy peak
140  PeakElement* peak = createPeak( src->getX(), src->getY() );
141 
142  peak->setLeft( src->getLeftX(), src->getLeftY() );
143  peak->setRight( src->getRightX(), src->getRightY() );
144  peak->setApex( src->getApexX(), src->getApexY() );
145  peak->setArea( src->getArea() );
146  }
147 
148  return *this;
149 }
150 
151 // clear charge
153  m_charges.clear();
154 }
155 
156 // add charge
157 void Peaks::addCharge( const short charge ) {
158  m_charges.push_back( charge );
159 }
160 
161 // get number of charges
163  return m_charges.size();
164 }
165 
166 // get charge
167 short Peaks::getCharge( const unsigned int index ) {
168  // check index
169  if( index >= m_charges.size() ) {
170  LOG_WARN(
171  FMT(
172  "Charge index must be less than the number of charges. [%d/%d] ",
173  index,
174  m_charges.size()
175  )
176  );
177  return 0;
178  }
179 
180  return m_charges[ index ];
181 }
182 
183 // set precursor
184 void Peaks::setPrecursor( const double precursor ) {
185  m_precursor = precursor;
186 }
187 
188 // get precursor
190  return m_precursor;
191 }
192 
193 // @date 2011.03.03 <Mod> M.Aihara ->
194 // soft cache DataPoints
195 #ifdef DATAPOINTS_SOFT_CACHE_TBB
196 void Peaks::calcArea() {
197 
198  // get data points
199  if( m_dps == NULL ) {
200  LOG_WARN( FMT( "Failed to calculate area. Data points object is not set up." ) );
201  return;
202  }
203 
204  if( m_dps->getLength() < 2 ) {
205  return;
206  }
207 
208  // peaks
209  for( unsigned int i = 0; i < m_peaks.size(); i++ ) {
210  PeakElement* peak = m_peaks[ i ];
211 
212  // area
213  if( !peak->hasArea() ) {
214  // area
215  double area = peak->calcArea( *m_dps );
216  peak->setArea( area );
217  }
218 
219  peak->searchApex( *m_dps );
220  }
221 }
222 
223 #else // DATAPOINTS_SOFT_CACHE_TBB
224 
225 // calculate area
227  // manager
229 
230  // get data points
231  if( m_dataFile.empty() ) {
232  LOG_WARN( FMT( "Failed to calculate area. Data points object is not set up." ) );
233  return;
234  }
235 
236  // tmp file
237  std::string tmpPath = getpath( msppMgr.getTmpDir(), m_dataFile.c_str() );
238  FILE* fp = fileopen( tmpPath.c_str(), "rb" );
239  if( fp == NULL ) {
240  return;
241  }
242 
243  // import
244  kome::core::DataPoints dps( kome::core::DataPoints::FLOAT );
245  kome::core::FileAccessor acc( fp );
246  dps.importData( boost::bind( &kome::core::FileAccessor::read, &acc, _1, _2 ) );
247  fclose( fp );
248  if( dps.getLength() < 2 ) {
249  return;
250  }
251 
252  // peaks
253  for( unsigned int i = 0; i < m_peaks.size(); i++ ) {
254  PeakElement* peak = m_peaks[ i ];
255 
256  // area
257  if( !peak->hasArea() ) {
258  // area
259  double area = peak->calcArea( dps );
260  peak->setArea( area );
261  }
262 
263  // apex
264  peak->searchApex( dps );
265 
266  // fwhm
267  double fwhm = peak->calcFwhm( dps );
268  peak->setFwhm( fwhm );
269  }
270 }
271 #endif // DATAPOINTS_SOFT_CACHE_TBB
272 // <Mod> M.Aihara <-
273 
274 // @date 2011.03.03 <Mod> M.Aihara ->
275 // soft cache DataPoints
276 #ifdef DATAPOINTS_SOFT_CACHE_TBB
278 
279  // init area
280  for( unsigned int i = 0; i < m_peaks.size(); i++ ) {
281  m_peaks[ i ]->setArea( -1.0 );
282  }
283 
284  // delete previous data
285  if(m_dps){
286  delete m_dps;
287  m_dps = NULL;
288  }
289 
290  m_dps = new kome::core::DataPoints( kome::core::DataPoints::FLOAT );
291 
292  // copy data
293  for( unsigned int i = 0; i < xyData.getLength(); i++ ) {
294  m_dps->addPoint( xyData.getX( i ), xyData.getY( i ) );
295  }
296 }
297 
298 #else // DATAPOINTS_SOFT_CACHE_TBB
299 
300 // set data points
302 
303  // manager
305 
306  // init area
307  for( unsigned int i = 0; i < m_peaks.size(); i++ ) {
308  m_peaks[ i ]->setArea( -1.0 );
309  }
310 
311  // delete previous data
312  if( !m_dataFile.empty() ) {
313  std::string oldDataPath = getpath( msppMgr.getTmpDir(), m_dataFile.c_str() );
314 
315  if( fileexists( oldDataPath.c_str() ) ) {
316  removefile( oldDataPath.c_str() );
317  }
318  }
319 
320  // data file path
321  static int tmpDirCnt = 0;
322 
323  std::string dir = getpath( "peaks_data", FMT( "%02x", tmpDirCnt ).c_str() );
324  tmpDirCnt = ( tmpDirCnt + 1 ) % 0x100;
325 
326  std::string tmpFileName = msppMgr.getTmpFileName( "profile_data", ".xyd", dir.c_str() );
327  m_dataFile = getpath( dir.c_str(), tmpFileName.c_str() );
328  std::string tmpFilePath = getpath( msppMgr.getTmpDir(), m_dataFile.c_str() );
329 
330  // open file
331  FILE* fp = fileopen( tmpFilePath.c_str(), "wb" );
332  if( fp == NULL ) {
333  m_dataFile.clear();
334  return;
335  }
336 
337  // copy data
338  kome::core::DataPoints dps( kome::core::DataPoints::FLOAT );
339  for( unsigned int i = 0; i < xyData.getLength(); i++ ) {
340  dps.addPoint( xyData.getX( i ), xyData.getY( i ) );
341  }
342 
343  // save data
344  kome::core::FileAccessor acc( fp );
345  dps.exportData( boost::bind( &kome::core::FileAccessor::write, &acc, _1, _2 ) );
346 
347  fclose( fp );
348 }
349 #endif // DATAPOINTS_SOFT_CACHE_TBB
350 // <Mod> M.Aihara <-
351 
352 // create peak
353 PeakElement* Peaks::createPeak( const double x, const double y ) {
354  // add peak
355  PeakElement* peak = new PeakElement( this, x, y );
356  m_peaks.push_back( peak );
357 
358  // length
359  unsigned int len = m_peaks.size();
360 
361  // set range
362  if( x < m_minX || len == 0 ) {
363  m_minX = x;
364  }
365  if( x > m_maxX || len == 0 ) {
366  m_maxX = x;
367  }
368  if( y < m_minY || len == 0 ) {
369  m_minY = y;
370  }
371  if( y > m_maxY || len == 0 ) {
372  m_maxY = y;
373  }
374 
375  m_updated = true;
376 
377  return peak;
378 }
379 
380 // get peak
381 PeakElement* Peaks::getPeak( const unsigned int index ) {
382  if( index >= m_peaks.size() ) {
383  return NULL;
384  }
385  double x = getX( index );
386  return m_peaks[ index ];
387 }
388 
389 // on clear points
391  for( unsigned int i = 0; i < m_peaks.size(); i++ ) {
392  delete m_peaks[ i ];
393  }
394  m_peaks.clear();
395 }
396 
397 // sort peak
398 void Peaks::sort() {
399  std::sort( m_peaks.begin(), m_peaks.end(), lessPeakX );
400 }
401 
402 // arrange peaks
404  // check the array size
405  if( m_peaks.size() <= MAX_PEAK_NUM ) {
406  return;
407  }
408 
409  // remove small peaks
410  std::vector< PeakElement* > peaks;
411  for( unsigned int i = 0; i < m_peaks.size(); i++ ) {
412  peaks.push_back( m_peaks[ i ] );
413  }
414 
415  std::sort( peaks.begin(), peaks.end(), lessPeakY );
416 
417  m_peaks.clear();
418  for( unsigned int i = 0; i < MAX_PEAK_NUM; i++ ) {
419  m_peaks.push_back( peaks[ i ] );
420  }
421  sort();
422 
423  for( unsigned int i = MAX_PEAK_NUM; i < peaks.size(); i++ ) {
424  delete peaks[ i ];
425  }
426 }
427 
428 // on load file
429 bool Peaks::onLoadData( boost::function< int ( void*, int ) > readFun ) {
430  // length
431  unsigned long len = 0;
432  readFun( &len, sizeof( len ) );
433 
434  // read data
435  if( len > 0 ) {
436  double* arr = new double[ len * 10 ];
437  readFun( arr, sizeof( double ) * len * 10 );
438 
439  int* charges = new int[ len ];
440  readFun( charges, sizeof( int ) * len );
441 
442  m_peaks.reserve( len );
443  for( unsigned int i = 0; i < len; i++ ) {
444  int idx = i * 10;
445  double x = arr[ idx + 0 ];
446  double y = arr[ idx + 1 ];
447  double lx = arr[ idx + 2 ];
448  double ly = arr[ idx + 3 ];
449  double rx = arr[ idx + 4 ];
450  double ry = arr[ idx + 5 ];
451  double ax = arr[ idx + 6 ];
452  double ay = arr[ idx + 7 ];
453  double ar = arr[ idx + 8 ];
454  double wi = arr[ idx + 9 ];
455  int c = charges[ i ];
456 
457  PeakElement* peak = new PeakElement( this, x, y );
458  peak->setLeft( lx, ly );
459  peak->setRight( rx, ry );
460  peak->setApex( ax, ay );
461  peak->setArea( ar );
462  peak->setFwhm( wi );
463  peak->setCharge( c );
464 
465  m_peaks.push_back( peak );
466  }
467 
468  delete[] arr;
469  delete[] charges;
470  }
471 
472  return true;
473 }
474 
475 // on write file
476 bool Peaks::onSaveData( boost::function< int ( void*, int ) > writeFun ) {
477  // length
478  unsigned long len = m_peaks.size();
479  writeFun( &len, sizeof( len ) );
480 
481  // write data
482  if( len > 0 ) {
483  double* arr = new double[ len * 10 ];
484 
485  for( unsigned int i = 0; i < len; i++ ) {
486  // peak
487  PeakElement* peak = m_peaks[ i ];
488 
489  // array
490  int idx = i * 10;
491  arr[ idx + 0 ] = peak->getX();
492  arr[ idx + 1 ] = peak->getY();
493  arr[ idx + 2 ] = peak->getLeftX();
494  arr[ idx + 3 ] = peak->getLeftY();
495  arr[ idx + 4 ] = peak->getRightX();
496  arr[ idx + 5 ] = peak->getRightY();
497  arr[ idx + 6 ] = ( peak->hasApex() ? peak->getApexX() : -1.0 );
498  arr[ idx + 7 ] = ( peak->hasApex() ? peak->getApexY() : -1.0 );
499  arr[ idx + 8 ] = ( peak->hasArea() ? peak->getArea() : -1.0 );
500  arr[ idx + 9 ] = ( peak->hasFwhm() ? peak->getFwhm() : -1.0 );
501  }
502 
503  writeFun( arr, sizeof( double ) * len * 10 );
504 
505  delete[] arr;
506 
507  // charges
508  int* charges = new int[ len ];
509  for( unsigned int i = 0; i < len; i++ ) {
510  // peak
511  PeakElement* peak = m_peaks[ i ];
512 
513  charges[ i ] = peak->getCharge();
514  }
515 
516  writeFun( charges, sizeof( int ) * len );
517 
518  delete[] charges;
519  }
520 
521  return true;
522 }
523 
524 // on add point
525 void Peaks::onAddPoint( const double x, const double y ) {
526  createPeak( x, y );
527 }
528 
529 // on insert point
530 void Peaks::onInsertPoint( const unsigned int index, const double x, const double y ) {
531  // index
532  int idx = std::min( (int)index, (int)m_peaks.size() );
533 
534  // insert
535  PeakElement* peak = new PeakElement( this, x, y );
536  m_peaks.insert( m_peaks.begin() + idx, peak );
537 }
538 
539 // on delete point
540 void Peaks::onDeletePoint( const unsigned int index ) {
541  delete m_peaks[ index ];
542  m_peaks.erase( m_peaks.begin() + index );
543 }
544 
545 // on get length
546 unsigned int Peaks::onGetLength() {
547  arrangePeaks();
548  return m_peaks.size();
549 }
550 
551 // on get x
552 double Peaks::onGetX( const unsigned int index ) {
553  arrangePeaks();
554  return m_peaks[ index ]->getX();
555 }
556 
557 // on get y
558 double Peaks::onGetY( const unsigned int index ) {
559  arrangePeaks();
560  return m_peaks[ index ]->getY();
561 }
562 
563 // on reserve
564 void Peaks::onReserve( const unsigned int num ) {
565  m_peaks.reserve( num );
566 }
567 
568 // sort by x
570  return ( p0->getX() < p1->getX() );
571 }
572 
573 // sort by y
575  return ( p0->getY() > p1->getY() );
576 }
577 
578 // issue peak id
579 int Peaks::issueId( PeakElement* peakElement ){
580  if( peakElement != NULL && peakElement->getId() > 0 ){
581  return peakElement->getId()+1;
582  }
583  return 0;
584 }
585 
586 // get peak by id
588  arrangePeaks();
589 
590  for( unsigned int i=0; i < m_peaks.size(); i++ ){
591  if( m_peaks[i]->getId() == id ){
592  return m_peaks[i];
593  }
594  }
595  return NULL;
596 }
PeakElement * getPeak(const unsigned int index)
gets peak
Definition: Peaks.cpp:381
double calcFwhm(kome::core::XYData &xyData)
calculates FWHM
abstraction class of two dimention coordinate data
Definition: XYData.h:34
unsigned int getNumberOfCharges()
gets the number of charges
Definition: Peaks.cpp:162
double getArea()
gets peak area
int issueId(PeakElement *peakElement)
to issue the peak id
Definition: Peaks.cpp:579
static MsppManager & getInstance()
gets MsppManager object (This is the only object.)
void setX(const double x)
sets x element value
Definition: PeakElement.cpp:88
file accessor class
Definition: FileAccessor.h:26
data points data of profile management class
Definition: DataPoints.h:25
double getPrecursor()
gets precursor
Definition: Peaks.cpp:189
bool hasFwhm()
judges whether this peak has FWHM value of not
virtual int read(void *addr, int size)
reads data (override method)
void setPrecursor(const double precursor)
sets precursor
Definition: Peaks.cpp:184
double getX(const unsigned int index)
gets x coordinate
Definition: XYData.cpp:224
virtual ~Peaks()
destructor
Definition: Peaks.cpp:93
virtual void onDeletePoint(const unsigned int index)
This method is called by deletePoint method. (override method)
Definition: Peaks.cpp:540
virtual unsigned int onGetLength()
this method is called by getLength method (override method)
Definition: Peaks.cpp:546
void setRight(const double x, const double y)
sets peak right
void searchApex(kome::core::XYData &xyData)
searches apex
virtual void onReserve(const unsigned int num)
This method is called by reserve method. (override method)
Definition: Peaks.cpp:564
virtual double onGetY(const unsigned int index)
This method is called by getY method. (override method)
Definition: Peaks.cpp:558
Mass++ manager class.
Definition: MsppManager.h:28
void calcArea()
calculates area
Definition: Peaks.cpp:226
void setDataPoints(kome::core::XYData &xyData)
sets data points
Definition: Peaks.cpp:301
void clearPoints()
clear all data points
Definition: XYData.cpp:137
void clearCharge()
clears charge
Definition: Peaks.cpp:152
double calcArea(kome::core::XYData &xyData)
calculates area
short getCharge(const unsigned int index)
gets charge
Definition: Peaks.cpp:167
std::string m_dataFile
Definition: Peaks.h:79
void setArea(const double area)
sets area
double getRightX()
gets x element of peak right
double getY(const unsigned int index)
gets y coordinate
Definition: XYData.cpp:243
bool fileexists(const char *path)
judge whether file exists
double m_maxY
Definition: XYData.h:62
double getRightY()
gets y elemtn of peak right
std::vector< short > m_charges
Definition: Peaks.h:73
void setFwhm(const double fwhm)
sets the FWHM
static bool lessPeakX(PeakElement *p0, PeakElement *p1)
compares to sort peaks by x coordinate
Definition: Peaks.cpp:569
interfaces of Peaks class
void setCharge(const int charge)
sets the charge state
const char * getTmpDir()
gets temporary file directory name
interfaces of PeakElement class
#define NULL
Definition: CoreMacros.h:18
std::string m_title
Definition: Peaks.h:70
double getLeftX()
gets x element of peak left
double getApexX()
gets x element of peak apex
void sort()
sorts peaks
Definition: Peaks.cpp:398
double m_maxX
Definition: XYData.h:56
void addCharge(const short charge)
adds charge
Definition: Peaks.cpp:157
FILE * fileopen(const char *path, const char *mode)
opens file
std::vector< PeakElement * > m_peaks
Definition: Peaks.h:67
double m_precursor
Definition: Peaks.h:76
Peaks & operator=(const Peaks &other)
substitution operator
Definition: Peaks.cpp:118
void reserve(const unsigned int num)
reserves enough contiguous memory of array
Definition: XYData.cpp:262
Peaks()
constructor
Definition: Peaks.cpp:34
double getY()
gets y element value
double getApexY()
gets y element of peak apex
bool importData(boost::function< int(void *, int) > readFun)
imports data
Definition: XYData.cpp:403
PeakElement * getPeakById(int id)
gets peak element by peak id
Definition: Peaks.cpp:587
virtual bool onLoadData(boost::function< int(void *, int) > readFun)
loads data from file (override method)
Definition: Peaks.cpp:429
bool exportData(boost::function< int(void *, int) > writeFun)
exports data
Definition: XYData.cpp:414
virtual int write(void *addr, int size)
writes data (override method)
int getId()
gets peak ID
bool hasApex()
judges whether this peak has apex information or not.
virtual bool onSaveData(boost::function< int(void *, int) > writeFun)
saves data to file (override method)
Definition: Peaks.cpp:476
static bool lessPeakY(PeakElement *p0, PeakElement *p1)
compares to sort peaks by y coordinate
Definition: Peaks.cpp:574
void setApex(const double x, const double y)
sets peak apex
virtual void onClearPoints()
This method is called by clearPoints method. (override method)
Definition: Peaks.cpp:390
void setLeft(const double x, const double y)
sets peak left
double getX()
gets x element value
bool hasArea()
judges whether this peak has area value or not
bool removefile(const char *path)
removes file
double getFwhm()
gets the FWHM
void addPoint(const double x, const double y)
adds point
Definition: XYData.cpp:149
virtual void onInsertPoint(const unsigned int index, const double x, const double y)
This method is called by insertPoint method. (override method)
Definition: Peaks.cpp:530
peaks information class
Definition: Peaks.h:35
void setY(const double y)
sets y element value
void arrangePeaks()
arrange peaks
Definition: Peaks.cpp:403
virtual void onAddPoint(const double x, const double y)
This method is called by addPoint method. (override method)
Definition: Peaks.cpp:525
virtual double onGetX(const unsigned int index)
This method is called by getX method. (override method)
Definition: Peaks.cpp:552
double m_minY
Definition: XYData.h:59
double m_minX
Definition: XYData.h:53
std::string getTmpFileName(const char *prefix, const char *suffix, const char *dir=NULL)
gets temporary file name
int getCharge()
gets the charge state
PeakElement * createPeak(const double x, const double y)
creates peak
Definition: Peaks.cpp:353
std::string getpath(const char *dir, const char *file)
get file path
unsigned int getLength()
gets the number of points @return the number of points
Definition: XYData.cpp:216
double getLeftY()
gets y element of peak left