diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 31306669d401a370912f668b5c15a651dc8bbcc0..946b28a0c6d213b5b2521c9e5d53df62a0d0684a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -105,6 +105,7 @@ set(CPP_FILES output/ods/simplesheet.cpp output/ods/spectrasheet.cpp output/ods/spectrasheetall.cpp + output/ods/xicareasheet.cpp output/exportfastafile.cpp output/masschroqml.cpp output/masschroqprm.cpp diff --git a/src/core/tandem_run/tandembatchprocess.cpp b/src/core/tandem_run/tandembatchprocess.cpp index 7497799a1a339ef99c6f14dc0977864904860bef..74abc820c1d3148c063938b3db8f95d4097898db 100644 --- a/src/core/tandem_run/tandembatchprocess.cpp +++ b/src/core/tandem_run/tandembatchprocess.cpp @@ -263,7 +263,14 @@ TandemBatchProcess::writeXmlInputFile(QXmlStreamWriter *p_out, p_out->writeStartElement("note"); p_out->writeAttribute("type", "input"); p_out->writeAttribute("label", "spectrum, path"); - p_out->writeCharacters(mz_file); + if(mz_file_info.isDir()) + { + p_out->writeCharacters(mz_file + "/analysis.tdf"); + } + else + { + p_out->writeCharacters(mz_file); + } p_out->writeEndElement(); //<note type="heading">Protein general</note> @@ -292,8 +299,18 @@ TandemBatchProcess::writeXmlInputFile(QXmlStreamWriter *p_out, p_out->writeAttribute("label", "output, path"); if(mz_file_info.completeSuffix() == "tdf") { + QString output_name = QFileInfo(mz_file_info.absoluteDir().dirName()).baseName(); + qDebug() << output_name; + p_out->writeCharacters(QString("%1/%2.xml") + .arg(_tandem_run_batch._output_directory) + .arg(output_name)); + } + else if(mz_file_info.isDir()) + { + QString output_name = QFileInfo(mz_file_info).baseName(); + qDebug() << output_name; p_out->writeCharacters(QString("%1/%2.xml") .arg(_tandem_run_batch._output_directory) .arg(output_name)); @@ -316,8 +333,6 @@ TandemBatchProcess::writeXmlInputFile(QXmlStreamWriter *p_out, void TandemBatchProcess::runOne(const QString &mz_file) { - - QTemporaryFile xml_input_file; xml_input_file.setAutoRemove(true); if(xml_input_file.open()) diff --git a/src/grouping/ptm/ptmgroupingexperiment.cpp b/src/grouping/ptm/ptmgroupingexperiment.cpp index 827a8d578b9a2d614c4aecf0997644596828ff0f..2e25dcf0ff9f99453ef7de29579e522aba0be6fb 100644 --- a/src/grouping/ptm/ptmgroupingexperiment.cpp +++ b/src/grouping/ptm/ptmgroupingexperiment.cpp @@ -152,7 +152,7 @@ PtmGroupingExperiment::setValidationState(ValidationState validation_state) _peptide_validation_state = validation_state; } void -PtmGroupingExperiment::addProteinMatch(const ProteinMatch *p_protein_match) +PtmGroupingExperiment::addProteinMatch(ProteinMatch *p_protein_match) { if(p_protein_match->getValidationState() >= _peptide_validation_state) { diff --git a/src/grouping/ptm/ptmgroupingexperiment.h b/src/grouping/ptm/ptmgroupingexperiment.h index bf1cdfae4aca808c04812983c2044bee4ac86340..7ceaeb8344ebc0d3b51ce92a357c37de8c490c9e 100644 --- a/src/grouping/ptm/ptmgroupingexperiment.h +++ b/src/grouping/ptm/ptmgroupingexperiment.h @@ -50,7 +50,7 @@ class PtmGroupingExperiment * experiment */ void setValidationState(ValidationState validation_state); - void addProteinMatch(const ProteinMatch *p_protein_match); + void addProteinMatch(ProteinMatch *p_protein_match); void startGrouping(); /** @brief get the ptm island subgroup list diff --git a/src/grouping/ptm/ptmisland.cpp b/src/grouping/ptm/ptmisland.cpp index 25568a9084ef0910427b3ab8630d95d76ffd2068..10b5c86aac66694012eda8aedec10334ed4a6976 100644 --- a/src/grouping/ptm/ptmisland.cpp +++ b/src/grouping/ptm/ptmisland.cpp @@ -36,7 +36,7 @@ #include <pappsomspp/utils.h> #include <set> -PtmIsland::PtmIsland(const ProteinMatch *p_protein_match, unsigned int position) +PtmIsland::PtmIsland(ProteinMatch *p_protein_match, unsigned int position) : _protein_match_p(p_protein_match) { _position_list.push_back(position); @@ -62,6 +62,16 @@ PtmIsland::size() const return _protein_stop - _protein_start; } +bool PtmIsland::isChecked() const +{ + return m_checked; +} + +void PtmIsland::setChecked(bool check_status) +{ + m_checked = check_status; +} + unsigned int PtmIsland::countSampleScanMultiPtm( const PtmGroupingExperiment *p_ptm_grouping_experiment) const @@ -142,8 +152,8 @@ PtmIsland::setProteinNumber(unsigned int prot_number) { _prot_number = prot_number; } -const ProteinMatch * -PtmIsland::getProteinMatch() const +ProteinMatch * +PtmIsland::getProteinMatch() { return _protein_match_p; } diff --git a/src/grouping/ptm/ptmisland.h b/src/grouping/ptm/ptmisland.h index e02d24fa5ebd0e664a1e102959bd06ba32348885..9dc609af8962016920bade395446efc648c40ff8 100644 --- a/src/grouping/ptm/ptmisland.h +++ b/src/grouping/ptm/ptmisland.h @@ -48,7 +48,7 @@ typedef std::shared_ptr<PtmIsland> PtmIslandSp; class PtmIsland { public: - PtmIsland(const ProteinMatch *p_protein_match, unsigned int position); + PtmIsland(ProteinMatch *p_protein_match, unsigned int position); PtmIsland(const PtmIsland &other); ~PtmIsland(); void addPeptideMatch(const PeptideMatch &peptide_match); @@ -60,7 +60,7 @@ class PtmIsland bool containsPeptideMatch(const PeptideMatch &element) const; std::vector<std::size_t> getSampleScanSet() const; - const ProteinMatch *getProteinMatch() const; + ProteinMatch *getProteinMatch(); unsigned int getProteinStartPosition() const; void setPtmIslandSubgroup(PtmIslandSubgroup *p_ptm_island_subgroup); void setProteinNumber(unsigned int prot_number); @@ -76,13 +76,15 @@ class PtmIsland const PtmGroupingExperiment *p_ptm_grouping_experiment) const; unsigned int getStart() const; unsigned int size() const; + void setChecked(bool check_status); + bool isChecked() const; std::vector<PtmSampleScanSp> getPtmSampleScanSpList() const; const std::vector<PeptideMatch> &getPeptideMatchList() const; private: - const ProteinMatch *_protein_match_p; + ProteinMatch *_protein_match_p; std::vector<PeptideMatch> _peptide_match_list; // std::vector<std::size_t> _sample_scan_set; std::vector<unsigned int> _position_list; @@ -91,6 +93,7 @@ class PtmIsland /** @brief protein rank number in the PTM subgroup * */ unsigned int _prot_number = 0; + bool m_checked = true; PtmIslandSubgroup *_ptm_island_subgroup_p = nullptr; }; diff --git a/src/gui/edit/edit_settings/edit_settings.ui b/src/gui/edit/edit_settings/edit_settings.ui index d28c7a503169d6c945df0693240086aed7f93ab5..397e318a05f46772dc967fba7ba9f3b156e2ff08 100644 --- a/src/gui/edit/edit_settings/edit_settings.ui +++ b/src/gui/edit/edit_settings/edit_settings.ui @@ -9,8 +9,8 @@ <rect> <x>0</x> <y>0</y> - <width>366</width> - <height>348</height> + <width>422</width> + <height>395</height> </rect> </property> <property name="windowTitle"> @@ -61,6 +61,36 @@ </item> </layout> </item> + <item> + <widget class="QGroupBox" name="groupBox"> + <property name="title"> + <string>XIC export</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout_4"> + <item> + <widget class="QRadioButton" name="radioButton_3"> + <property name="text"> + <string>Area onl&y</string> + </property> + </widget> + </item> + <item> + <widget class="QRadioButton" name="all_point_radioButton"> + <property name="text"> + <string>All points only</string> + </property> + </widget> + </item> + <item> + <widget class="QRadioButton" name="area_radioButton"> + <property name="text"> + <string>Area + All points</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> <item> <widget class="QGroupBox" name="timstof_setting_group"> <property name="title"> diff --git a/src/gui/edit/edit_settings/editsettings.cpp b/src/gui/edit/edit_settings/editsettings.cpp index b1e42c80e655ec8af67fa887f4bd2aaf2508986b..7b013f9f8ad039c0fbf2fe0c749e9ef1201111a7 100644 --- a/src/gui/edit/edit_settings/editsettings.cpp +++ b/src/gui/edit/edit_settings/editsettings.cpp @@ -53,6 +53,17 @@ EditSettings::EditSettings(MainWindow *parent) { ui->xic_reader_buffered_button->setChecked(false); } + QString xic_export_type = + settings.value("export/xic_files", "area").toString(); + ui->area_radioButton->setChecked(true); + if(xic_export_type == "all") + { + ui->all_point_radioButton->setChecked(true); + } + else if(xic_export_type == "both") + { + ui->radioButton_3->setChecked(true); + } QString tandemwrapper_path = settings.value("timstof/tandemwrapper_path", "").toString(); @@ -96,6 +107,17 @@ EditSettings::done(int r) } settings.setValue("global/xic_extractor", xic_extraction_method); + QString xic_export_type = "area"; + if(ui->all_point_radioButton->isChecked()) + { + xic_export_type = "all"; + } + else if(ui->radioButton_3->isChecked()) + { + xic_export_type = "both"; + } + settings.setValue("export/xic_files", xic_export_type); + QString tandemwrapper_path = ui->tandemwrapper_path_line->text(); QFileInfo tandemwrapper_file = QFileInfo(tandemwrapper_path); if(tandemwrapper_file.exists() && tandemwrapper_file.isExecutable()) diff --git a/src/gui/export/export_masschroq_dialog/export_masschroq_dialog.ui b/src/gui/export/export_masschroq_dialog/export_masschroq_dialog.ui index 086b533324245e57585afeddb8ff8a952839d575..b648eba550df9373e7cebfdb3df5e486e4527f8b 100644 --- a/src/gui/export/export_masschroq_dialog/export_masschroq_dialog.ui +++ b/src/gui/export/export_masschroq_dialog/export_masschroq_dialog.ui @@ -120,7 +120,7 @@ <item> <widget class="QPushButton" name="pushButton"> <property name="text"> - <string>Best</string> + <string>Find Best</string> </property> </widget> </item> @@ -464,8 +464,8 @@ <slot>doBrowseMsrunDirectory()</slot> <hints> <hint type="sourcelabel"> - <x>195</x> - <y>381</y> + <x>214</x> + <y>421</y> </hint> <hint type="destinationlabel"> <x>736</x> @@ -473,6 +473,22 @@ </hint> </hints> </connection> + <connection> + <sender>msrun_list_combo_box</sender> + <signal>activated(int)</signal> + <receiver>ExportMasschroqDialog</receiver> + <slot>doUpdateReferenceInSelectedGroup(int)</slot> + <hints> + <hint type="sourcelabel"> + <x>417</x> + <y>432</y> + </hint> + <hint type="destinationlabel"> + <x>817</x> + <y>444</y> + </hint> + </hints> + </connection> </connections> <slots> <slot>reject()</slot> @@ -481,5 +497,6 @@ <slot>doBrowseMsrunDirectory()</slot> <slot>doFindBestMsrunForAlignment()</slot> <slot>doShowMsRunsInAlignmentGroup(QModelIndex)</slot> + <slot>doUpdateReferenceInSelectedGroup(int)</slot> </slots> </ui> diff --git a/src/gui/export/export_masschroq_dialog/exportmasschroqdialog.cpp b/src/gui/export/export_masschroq_dialog/exportmasschroqdialog.cpp index 8d2f10718cac5f9e9833e0f6fd3538a3d7b3e105..9458e97b867e05f0684c3e94504046da3a24d5a1 100644 --- a/src/gui/export/export_masschroq_dialog/exportmasschroqdialog.cpp +++ b/src/gui/export/export_masschroq_dialog/exportmasschroqdialog.cpp @@ -157,16 +157,6 @@ ExportMasschroqDialog::getMasschroqFileParameters() const params.xic_extraction_method = ui->xic_extraction_method_widget->getXicExtractionMethod(); - - int index = ui->msrun_list_combo_box->currentIndex(); - if(index != -1) - { - MsRunSp msrun_sp = - qvariant_cast<MsRunSp>(ui->msrun_list_combo_box->itemData(index)); - params.msrun_alignment_reference = msrun_sp; - } - - qDebug() << __FILE__ << " " << __FUNCTION__ << " " << __LINE__ << " " << (int)params.xic_extraction_method; return params; @@ -256,11 +246,19 @@ ExportMasschroqDialog::doBrowseMsrunDirectory() void ExportMasschroqDialog::doFindBestMsrunForAlignment() { - mp_main->showWaitingMessage(tr("Looking for MSrun reference")); - MsRunAlignmentGroupSp group = - msp_alignmentGroups.at(ui->group_listView->currentIndex().row()); + if(msp_selected_group != nullptr) + { + mp_main->showWaitingMessage(tr("Looking for MSrun reference")); - emit operateFindBestMsrunForAlignment(msp_project, group); + emit operateFindBestMsrunForAlignment(msp_project, msp_selected_group); + } + else + { + QMessageBox::warning( + this, + "Select a group", + "The reference is linked to a group.\n You have to select one."); + } } void @@ -270,17 +268,17 @@ ExportMasschroqDialog::setBestMsrunForAlignment(MsRunSp best_msrun_sp) mp_main->hideWaitingMessage(); if(best_msrun_sp != nullptr) { - qDebug() << __FILE__ << " " << __FUNCTION__ << " " << __LINE__ << " " - << best_msrun_sp.get()->getXmlId(); + qDebug() << best_msrun_sp.get(); - for(int index = 0; index < ui->msrun_list_combo_box->count(); index++) + int index = 0; + for(MsRunSp ms_run : msp_selected_group->getMsRunsInAlignmentGroup()) { - MsRunSp msrun_sp = - qvariant_cast<MsRunSp>(ui->msrun_list_combo_box->itemData(index)); - if(msrun_sp.get() == best_msrun_sp.get()) + if(ms_run == best_msrun_sp) { ui->msrun_list_combo_box->setCurrentIndex(index); + msp_selected_group->setMsRunReference(best_msrun_sp); } + index++; } } } @@ -328,26 +326,43 @@ ExportMasschroqDialog::doShowMsRunsInAlignmentGroup(QModelIndex index) { ui->listWidget->clear(); ui->msrun_list_combo_box->clear(); - MsRunAlignmentGroupSp selected_group = msp_alignmentGroups.at(index.row()); + msp_selected_group = msp_alignmentGroups.at(index.row()); ui->groupBox_5->setTitle("Ms runs in " + - selected_group->getMsRunAlignmentGroupName()); - for(MsRunSp ms_run : selected_group->getMsRunsInAlignmentGroup()) + msp_selected_group->getMsRunAlignmentGroupName()); + for(MsRunSp ms_run : msp_selected_group->getMsRunsInAlignmentGroup()) { ui->listWidget->addItem(ms_run->getSampleName()); ui->msrun_list_combo_box->addItem(ms_run->getSampleName()); } - if(selected_group->getMsRunReference() != nullptr) + if(msp_selected_group->getMsRunReference() != nullptr) { - std::list<MsRunSp>::iterator it; - it = std::find(selected_group->getMsRunsInAlignmentGroup().begin(), - selected_group->getMsRunsInAlignmentGroup().end(), - selected_group->getMsRunReference()); - int idx = - std::distance(selected_group->getMsRunsInAlignmentGroup().begin(), it); - ui->msrun_list_combo_box->setCurrentIndex(idx); + int index = 0; + for(MsRunSp ms_run : msp_selected_group->getMsRunsInAlignmentGroup()) + { + if(ms_run == msp_selected_group->getMsRunReference()) + { + ui->msrun_list_combo_box->setCurrentIndex(index); + } + index++; + } } else { ui->msrun_list_combo_box->setCurrentIndex(-1); } } + +void +ExportMasschroqDialog::doUpdateReferenceInSelectedGroup(int index) +{ + int temp_index = 0; + for(MsRunSp ms_run : msp_selected_group->getMsRunsInAlignmentGroup()) + { + if(temp_index == index) + { + msp_selected_group->setMsRunReference(ms_run); + } + temp_index++; + } + qDebug() << index; +} diff --git a/src/gui/export/export_masschroq_dialog/exportmasschroqdialog.h b/src/gui/export/export_masschroq_dialog/exportmasschroqdialog.h index 2d4c1353a85309edee8faf9fabc36e3557c63af4..1c76f2a88181be0ca7a804e54b154cfa77abf3cf 100644 --- a/src/gui/export/export_masschroq_dialog/exportmasschroqdialog.h +++ b/src/gui/export/export_masschroq_dialog/exportmasschroqdialog.h @@ -71,18 +71,18 @@ class ExportMasschroqDialog : public QDialog void setBestMsrunForAlignment(MsRunSp msrun_sp); void setCheckMsrunFilePathOk(MsRunSp msrun_sp); - private: - Ui::ExportMasschroqDialog *ui; - ProjectSp msp_project; - MainWindow *mp_main; - std::vector<MsRunAlignmentGroupSp> msp_alignmentGroups; - QStandardItemModel *mp_poModel; - protected slots: void doCheckMsrunFilepath(); void doBrowseMsrunDirectory(); void doFindBestMsrunForAlignment(); void doShowMsRunsInAlignmentGroup(QModelIndex index); + void doUpdateReferenceInSelectedGroup(int index); private: + Ui::ExportMasschroqDialog *ui; + ProjectSp msp_project; + MainWindow *mp_main; + std::vector<MsRunAlignmentGroupSp> msp_alignmentGroups; + QStandardItemModel *mp_poModel; + MsRunAlignmentGroupSp msp_selected_group; }; diff --git a/src/gui/export/export_masschroq_dialog/masschroqfileparameters.h b/src/gui/export/export_masschroq_dialog/masschroqfileparameters.h index 55b61563cd6b9e6ee3312fcb1e16306d1390305e..9015506e7e642b0b6766402631836ff418d8f244 100644 --- a/src/gui/export/export_masschroq_dialog/masschroqfileparameters.h +++ b/src/gui/export/export_masschroq_dialog/masschroqfileparameters.h @@ -61,6 +61,5 @@ struct MasschroqFileParameters pappso::XicExtractMethod xic_extraction_method; // sum or max - MsRunSp msrun_alignment_reference; std::vector<MsRunAlignmentGroupSp> alignment_groups; }; diff --git a/src/gui/project_view/projectwindow.cpp b/src/gui/project_view/projectwindow.cpp index 33b2d0ad60692e86ec59b95db31a75d7c7a79d13..5d46f14f6d4f322efae45951b50498aea27f0d86 100644 --- a/src/gui/project_view/projectwindow.cpp +++ b/src/gui/project_view/projectwindow.cpp @@ -111,6 +111,7 @@ ProjectWindow::ProjectWindow(MainWindow *parent) &ProjectWindow::operateMassChroqExportDialog, main_window, &MainWindow::doActionMassChroQ); + // // grouping /* @@ -1140,6 +1141,20 @@ ProjectWindow::doCleanMsRunReaders() void ProjectWindow::doOpenMassChroQDialog() { - qDebug() << "AAAAAAAA"; emit operateMassChroqExportDialog(); } + +void +ProjectWindow::doExportXicAreaToCsv(QString filename, + std::vector<XicBox *> xic_boxs) +{ + qDebug() << "Export Xic to csv"; + showWaitingMessage("Export All XIC area to CSV"); + emit operateWriteXicAreaInCsv(filename, xic_boxs); +} +void +ProjectWindow::doExportXicAreaToCsvFinished() +{ + hideWaitingMessage(); + qDebug() << "Export Finished"; +} diff --git a/src/gui/project_view/projectwindow.h b/src/gui/project_view/projectwindow.h index 0fd7272deab46958aa62a9f1630b5bd7c6b24b16..e8f06cab9ea8a261047ad711df271a6b13ef91e6 100644 --- a/src/gui/project_view/projectwindow.h +++ b/src/gui/project_view/projectwindow.h @@ -54,6 +54,7 @@ class ProjectWindow : public QMainWindow friend class ProteinListWindow; friend class PeptideListWindow; friend class MsRunIdListWindow; + friend class PtmIslandListWindow; public: explicit ProjectWindow(MainWindow *parent = 0); @@ -94,6 +95,8 @@ class ProjectWindow : public QMainWindow void doBestMsRunForAlignmentFinished(MsRunSp msrun_sp); void doCleanMsRunReaders(); void doOpenMassChroQDialog(); + void doExportXicAreaToCsv(QString filename, std::vector<XicBox *> xic_boxs); + void doExportXicAreaToCsvFinished(); // void setColor(const QColor &color); // void setShape(Shape shape); @@ -115,6 +118,8 @@ class ProjectWindow : public QMainWindow void projectStatusChanged(); void bestMsRunFound(MsRunSp msrun_sp); void operateMassChroqExportDialog(); + void operateWriteXicAreaInCsv(QString filename, + std::vector<XicBox *> xic_boxs); protected: void doViewPeptideList(IdentificationGroup *p_ident_group, diff --git a/src/gui/ptm_island_list_view/ptm_island_list_view.ui b/src/gui/ptm_island_list_view/ptm_island_list_view.ui index 10d234c13099216a603877f052c95adaa48a3732..84599b85fda0a9749a0281cc8a31fc2e4cae22e1 100644 --- a/src/gui/ptm_island_list_view/ptm_island_list_view.ui +++ b/src/gui/ptm_island_list_view/ptm_island_list_view.ui @@ -79,11 +79,38 @@ <x>0</x> <y>0</y> <width>826</width> - <height>25</height> + <height>22</height> </rect> </property> + <widget class="QMenu" name="menu_Columns"> + <property name="title"> + <string>&Columns</string> + </property> + </widget> + <widget class="QMenu" name="menu_Show_Only"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="title"> + <string>&Show Only</string> + </property> + <addaction name="actionChecked_PTM"/> + </widget> + <addaction name="menu_Columns"/> + <addaction name="menu_Show_Only"/> </widget> <widget class="QStatusBar" name="statusbar"/> + <action name="actionChecked_PTM"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="text"> + <string>Checked PTM</string> + </property> + </action> </widget> <resources/> <connections> @@ -119,6 +146,22 @@ </hint> </hints> </connection> + <connection> + <sender>actionChecked_PTM</sender> + <signal>toggled(bool)</signal> + <receiver>PtmIslandListWindow</receiver> + <slot>doNotCheckedHide(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>-1</x> + <y>-1</y> + </hint> + <hint type="destinationlabel"> + <x>412</x> + <y>201</y> + </hint> + </hints> + </connection> </connections> <slots> <slot>doNotValidHide(bool)</slot> diff --git a/src/gui/ptm_island_list_view/ptmislandlistwindow.cpp b/src/gui/ptm_island_list_view/ptmislandlistwindow.cpp index b9a80f64932f4771d7b12cfd1242cf09d7aa3cab..caf4eb99aa3b605346e4854a9a5eb0f73368b287 100644 --- a/src/gui/ptm_island_list_view/ptmislandlistwindow.cpp +++ b/src/gui/ptm_island_list_view/ptmislandlistwindow.cpp @@ -36,6 +36,35 @@ #include <QSettings> #include "../ptm_peptide_list_view/ptmpeptidelistwindow.h" +PtmIslandListQActionColumn::PtmIslandListQActionColumn( + PtmIslandListWindow *parent, PtmIslandListColumn column) + : QAction(parent) +{ + this->setText(PtmIslandTableModel::getTitle(column)); + + this->setCheckable(true); + this->setChecked(parent->getPtmIslandListColumnDisplay(column)); + + m_column = column; + mp_ptmIslandWindow = parent; + + connect(this, + &PtmIslandListQActionColumn::toggled, + this, + &PtmIslandListQActionColumn::doToggled); +} + +PtmIslandListQActionColumn::~PtmIslandListQActionColumn() +{ +} + +void +PtmIslandListQActionColumn::doToggled(bool toggled) +{ + setChecked(toggled); + mp_ptmIslandWindow->setPtmIslandListColumnDisplay(m_column, toggled); +} + PtmIslandListWindow::PtmIslandListWindow(ProjectWindow *parent) : QMainWindow(parent), ui(new Ui::PtmIslandListWindow) @@ -140,6 +169,48 @@ PtmIslandListWindow::setIdentificationGroup( qDebug() << "PtmIslandListWindow::setIdentificationGroup end"; } +void +PtmIslandListWindow::setPtmIslandListColumnDisplay(PtmIslandListColumn column, + bool toggled) +{ + _ptm_proxy_model_p->setPtmIslandListColumnDisplay(column, toggled); +} + +bool +PtmIslandListWindow::getPtmIslandListColumnDisplay( + PtmIslandListColumn column) const +{ + return _ptm_proxy_model_p->getPtmIslandListColumnDisplay(column); +} + +void +PtmIslandListWindow::setColumnMenuList() +{ + if(ui->menu_Columns->isEmpty()) + { + PtmIslandListQActionColumn *p_action; + for(int i = 0; i < _ptm_table_model_p->columnCount(); i++) + { + p_action = new PtmIslandListQActionColumn( + this, PtmIslandTableModel::getPtmIslandListColumn(i)); + ui->menu_Columns->addAction(p_action); + } + } +} + +void PtmIslandListWindow::edited() +{ + _project_window->doPtmIslandGrouping(_p_identification_group); +} + +void +PtmIslandListWindow::doNotCheckedHide(bool hide) +{ + _ptm_proxy_model_p->hideNotChecked(hide); + emit ptmIslandDataChanged(); +} + + void PtmIslandListWindow::doIdentificationGroupGrouped( IdentificationGroup *p_identification_group) @@ -177,7 +248,7 @@ PtmIslandListWindow::doIdentificationPtmGroupGrouped( .arg(p_ptm_grouping_experiment->getPtmIslandList().size())); // ui->ptm_island_tableview->resizeRowToContents(_ptm_table_model_p->rowCount()); } - + setColumnMenuList(); qDebug() << "PtmIslandListWindow::doIdentificationPtmGroupGrouped end"; } @@ -215,13 +286,21 @@ PtmIslandListWindow::askViewPtmPeptideList(PtmIsland *ptm_island) _p_current_ptm_peptide_list_window->show(); } +void +PtmIslandListWindow::askProteinDetailView(ProteinMatch *p_protein_match) +{ + qDebug() << "begin"; + _project_window->doViewProteinDetail(p_protein_match); + qDebug() << "end"; + // updateStatusBar(); +} + const IdentificationGroup * PtmIslandListWindow::getIdentificationGroup() const { return _p_identification_group; } - void PtmIslandListWindow::updateStatusBar() { @@ -235,7 +314,6 @@ PtmIslandListWindow::updateStatusBar() } } - void PtmIslandListWindow::doPtmSearchEdit(QString ptm_search_string) { diff --git a/src/gui/ptm_island_list_view/ptmislandlistwindow.h b/src/gui/ptm_island_list_view/ptmislandlistwindow.h index e5f49d377f648a53de01181f83308767ad0203ca..6130ba50597316422c301d4c5d5af174b6c0f020 100644 --- a/src/gui/ptm_island_list_view/ptmislandlistwindow.h +++ b/src/gui/ptm_island_list_view/ptmislandlistwindow.h @@ -28,10 +28,11 @@ *implementation ******************************************************************************/ -#ifndef PTMISLANDLISTWINDOW_H -#define PTMISLANDLISTWINDOW_H +#pragma once + #include <QMainWindow> #include <QLabel> +#include <QAction> #include "ptmislandtablemodel.h" #include "ptmislandproxymodel.h" #include "../../core/identificationgroup.h" @@ -45,6 +46,24 @@ namespace Ui class PtmIslandListWindow; } +class PtmIslandListWindow; +class PtmIslandListQActionColumn : public QAction +{ + Q_OBJECT + public: + explicit PtmIslandListQActionColumn(PtmIslandListWindow *parent, + PtmIslandListColumn column); + ~PtmIslandListQActionColumn(); + + + public slots: + void doToggled(bool toggled); + + private: + PtmIslandListWindow *mp_ptmIslandWindow; + PtmIslandListColumn m_column; +}; + class PtmIslandListWindow : public QMainWindow { Q_OBJECT @@ -57,8 +76,11 @@ class PtmIslandListWindow : public QMainWindow void resizeColumnsToContents(); const IdentificationGroup *getIdentificationGroup() const; ProjectWindow *getProjectWindowP(); - - + void setPtmIslandListColumnDisplay(PtmIslandListColumn column, bool toggled); + bool getPtmIslandListColumnDisplay(PtmIslandListColumn column) const; + void setColumnMenuList(); + void edited(); + public slots: void doIdentificationPtmGroupGrouped(IdentificationGroup *p_identification_group); @@ -69,6 +91,7 @@ class PtmIslandListWindow : public QMainWindow void updateStatusBar(); void doPtmSearchEdit(QString ptm_search_string); void doSearchOn(QString search_on); + void doNotCheckedHide(bool hide); signals: @@ -76,6 +99,7 @@ class PtmIslandListWindow : public QMainWindow protected: void askViewPtmPeptideList(PtmIsland *ptm_island); + void askProteinDetailView(ProteinMatch *p_protein_match); private: void connectNewPtmPeptideListWindow(); @@ -93,5 +117,3 @@ class PtmIslandListWindow : public QMainWindow QLabel *_statusbar_displayed_label; QLabel *_statusbar_ptm_islands_label; }; - -#endif // PTMISLANDLISTWINDOW_H diff --git a/src/gui/ptm_island_list_view/ptmislandproxymodel.cpp b/src/gui/ptm_island_list_view/ptmislandproxymodel.cpp index 2cb3ca3167f56a11d3e7b7620c6114b2efc4f7cd..252fad4660ef1ab37800cc66b088ec4e6cd0d2e8 100644 --- a/src/gui/ptm_island_list_view/ptmislandproxymodel.cpp +++ b/src/gui/ptm_island_list_view/ptmislandproxymodel.cpp @@ -28,6 +28,7 @@ *implementation ******************************************************************************/ +#include <QSettings> #include "ptmislandproxymodel.h" #include "ptmislandtablemodel.h" #include "ptmislandlistwindow.h" @@ -43,12 +44,32 @@ PtmIslandProxyModel::PtmIslandProxyModel( _p_ptm_island_table_model = ptm_table_model_p; _ptm_search_string = ""; _search_on = "accession"; + m_column_display.resize(30); + qDebug() << "Test creation data"; + QSettings settings; + for(std::size_t i = 0; i < m_column_display.size(); i++) + { + m_column_display[i] = + settings + .value( + QString("ptm_island_columns/%1") + .arg(_p_ptm_island_table_model->getTitle((PtmIslandListColumn)i)), + "true") + .toBool(); + } } PtmIslandProxyModel::~PtmIslandProxyModel() { } +bool +PtmIslandProxyModel::filterAcceptsColumn(int source_column, + const QModelIndex &source_parent) const +{ + return m_column_display[source_column]; +} + bool PtmIslandProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent @@ -62,9 +83,16 @@ PtmIslandProxyModel::filterAcceptsRow(int source_row, _p_ptm_island_table_model->getPtmGroupingExperiment() ->getPtmIslandList() .at(source_row); + // qDebug() << "Prote // qDebug() << "ProteinTableProxyModel::filterAcceptsRow protein_match " // << source_row; - + if(m_hideNotChecked) + { + if(!sp_ptm_island->isChecked()) + { + return false; + } + } if(!_ptm_search_string.isEmpty()) { if(_search_on == "accession") @@ -169,18 +197,32 @@ PtmIslandProxyModel::onTableClicked(const QModelIndex &index) qDebug() << "PtmIslandProxyModel::onTableClicked begin " << this->mapToSource(index).row(); - //_protein_table_model_p->onTableClicked(this->mapToSource(index)); + // _protein_table_model_p->onTableClicked(this->mapToSource(index)); QModelIndex source_index(this->mapToSource(index)); int row = source_index.row(); int col = source_index.column(); - // ProteinMatch* p_protein_match = - // _p_ptm_island_table_model->getIdentificationGroup()->getProteinMatchList().at(row); + PtmIslandSp ptm_island_sp = _p_ptm_island_table_model->getPtmGroupingExperiment() + ->getPtmIslandList() + .at(row); - if((col == (std::int8_t)PtmIslandListColumn::accession) || - (col == (std::int8_t)PtmIslandListColumn::description)) + if(col == (std::int8_t)PtmIslandListColumn::checked) { - //_p_ptm_island_table_model->askPtmProteinDetailView(p_protein_match); + if(ptm_island_sp->isChecked()) + { + ptm_island_sp->setChecked(false); + } + else + { + ptm_island_sp->setChecked(true); + } + _p_ptm_island_list_window->edited(); + } + else if((col == (std::int8_t)PtmIslandListColumn::accession) || + (col == (std::int8_t)PtmIslandListColumn::description)) + { + ProteinMatch *p_protein_match = ptm_island_sp->getProteinMatch(); + _p_ptm_island_list_window->askProteinDetailView(p_protein_match); } else { @@ -194,6 +236,34 @@ PtmIslandProxyModel::onTableClicked(const QModelIndex &index) qDebug() << "PtmIslandProxyModel::onTableClicked end " << index.row(); } +bool +PtmIslandProxyModel::getPtmIslandListColumnDisplay( + PtmIslandListColumn column) const +{ + return m_column_display[(std::int8_t)column]; +} + +void +PtmIslandProxyModel::setPtmIslandListColumnDisplay(PtmIslandListColumn column, + bool toggled) +{ + qDebug() << "begin " << toggled; + beginResetModel(); + QSettings settings; + settings.setValue(QString("ptm_island_columns/%1") + .arg(_p_ptm_island_table_model->getTitle(column)), + toggled); + + m_column_display[(std::int8_t)column] = toggled; + endResetModel(); +} + +void +PtmIslandProxyModel::hideNotChecked(bool hide) +{ + m_hideNotChecked = hide; +} + void PtmIslandProxyModel::setSearchOn(QString search_on) diff --git a/src/gui/ptm_island_list_view/ptmislandproxymodel.h b/src/gui/ptm_island_list_view/ptmislandproxymodel.h index b65464b89f63b4e8c7c3eb660906511195df60d0..0f6b02d1c9e6fce9487e1325f1abd23a5ad368f0 100644 --- a/src/gui/ptm_island_list_view/ptmislandproxymodel.h +++ b/src/gui/ptm_island_list_view/ptmislandproxymodel.h @@ -28,11 +28,11 @@ *implementation ******************************************************************************/ -#ifndef PTMISLANDPROXYMODEL_H -#define PTMISLANDPROXYMODEL_H +#pragma once #include <QAbstractTableModel> #include <QSortFilterProxyModel> +#include "ptmislandtablemodel.h" class PtmIslandListWindow; @@ -45,12 +45,16 @@ class PtmIslandProxyModel : public QSortFilterProxyModel PtmIslandProxyModel(PtmIslandListWindow *p_ptm_island_list_window, PtmIslandTableModel *ptm_table_model_p); ~PtmIslandProxyModel(); + bool filterAcceptsColumn(int source_column, + const QModelIndex &source_parent) const override; bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override; void setSearchOn(QString search_on); - + void hideNotChecked(bool hide); void setPtmSearchString(QString ptm_search_string); + void setPtmIslandListColumnDisplay(PtmIslandListColumn column, bool toggled); + bool getPtmIslandListColumnDisplay(PtmIslandListColumn column) const; public slots: void onTableClicked(const QModelIndex &index); @@ -58,8 +62,8 @@ class PtmIslandProxyModel : public QSortFilterProxyModel private: PtmIslandListWindow *_p_ptm_island_list_window; PtmIslandTableModel *_p_ptm_island_table_model; + std::vector<bool> m_column_display; + bool m_hideNotChecked = false; QString _search_on; QString _ptm_search_string; }; - -#endif // PTMISLANDPROXYMODEL_H diff --git a/src/gui/ptm_island_list_view/ptmislandtablemodel.cpp b/src/gui/ptm_island_list_view/ptmislandtablemodel.cpp index 660556ec4c861e38c6a9da5e661470eeed012df6..45dc6ce3d70dea86ea94609dcc0245a65848b9ae 100644 --- a/src/gui/ptm_island_list_view/ptmislandtablemodel.cpp +++ b/src/gui/ptm_island_list_view/ptmislandtablemodel.cpp @@ -57,12 +57,20 @@ PtmIslandTableModel::getDescription(PtmIslandListColumn column) // qDebug() << "ProteinTableModel::columnCount end "; } +PtmIslandListColumn +PtmIslandTableModel::getPtmIslandListColumn(std::int8_t column) +{ + return static_cast<PtmIslandListColumn>(column); +} + const QString PtmIslandTableModel::getTitle(std::int8_t column) { switch(column) { - + case(std::int8_t)PtmIslandListColumn::checked: + return "Checked"; + break; case(std::int8_t)PtmIslandListColumn::spectrum: return "spectrum"; break; @@ -101,7 +109,9 @@ PtmIslandTableModel::getDescription(std::int8_t column) { switch(column) { - + case(std::int8_t)PtmIslandListColumn::checked: + return "Checked PTM"; + break; case(std::int8_t)PtmIslandListColumn::spectrum: return "number of distinct spectrum assigned to this PTM island"; break; @@ -150,6 +160,13 @@ PtmIslandTableModel::setIdentificationGroup( this->_p_ptm_island_list_window->resizeColumnsToContents(); } + +IdentificationGroup * +PtmIslandTableModel::getIdentificationGroup() +{ + return _p_identification_group; +} + const PtmGroupingExperiment * PtmIslandTableModel::getPtmGroupingExperiment() const { @@ -213,6 +230,20 @@ PtmIslandTableModel::data(const QModelIndex &index, int role) const int col = index.column(); switch(role) { + case Qt::CheckStateRole: + if(col == (std::int8_t) + PtmIslandListColumn::checked) // add a checkbox to cell(1,0) + { + if(getPtmGroupingExperiment()->getPtmIslandList().at(row)->isChecked()) + { + return Qt::Checked; + } + else + { + return Qt::Unchecked; + } + } + break; case Qt::SizeHintRole: // qDebug() << "ProteinTableModel::headerData " << // ProteinTableModel::getColumnWidth(section); @@ -225,7 +256,9 @@ PtmIslandTableModel::data(const QModelIndex &index, int role) const } switch(col) { - + case(std::int8_t)PtmIslandListColumn::checked: + return QVariant(); + break; case(std::int8_t)PtmIslandListColumn::spectrum: return QVariant((quint64)getPtmGroupingExperiment() ->getPtmIslandList() @@ -331,6 +364,8 @@ PtmIslandTableModel::getColumnWidth(int column) qDebug() << "PtmIslandTableModel::getColumnWidth " << column; switch(column) { + case(int)PtmIslandListColumn::checked: + break; case(int)PtmIslandListColumn::accession: qDebug() << "PtmIslandTableModel::getColumnWidth accession " << column; return 250; diff --git a/src/gui/ptm_island_list_view/ptmislandtablemodel.h b/src/gui/ptm_island_list_view/ptmislandtablemodel.h index 38581f3650cb538aecef3ff944b0d1889c6635be..fe9648fc1c0727377d80e26eb01c695acd0ea9da 100644 --- a/src/gui/ptm_island_list_view/ptmislandtablemodel.h +++ b/src/gui/ptm_island_list_view/ptmislandtablemodel.h @@ -28,8 +28,7 @@ *implementation ******************************************************************************/ -#ifndef PTMISLANDTABLEMODEL_H -#define PTMISLANDTABLEMODEL_H +#pragma once #include <QAbstractTableModel> #include "../../core/identificationgroup.h" @@ -43,17 +42,18 @@ enum class PtmIslandListColumn : std::int8_t { - ptm_island_id = 0, ///< ptm_island_id - accession = 1, ///< protein accession - description = 2, ///< protein description - ptm_position_list = 3, ///< ptm position list - spectrum = 4, ///< count sample scans - ptm_spectrum = 5, ///< count scan with ptm - sequence = 6, ///< unique sequence count - multiptm = 7, ///< count multi ptm peptide match - ptm_island_start = 8, ///< start position of the ptm island on the protein - ptm_island_length = 9, ///< length of the ptm island - last = 10, + checked = 0, ///< checked ptm + ptm_island_id = 1, ///< ptm_island_id + accession = 2, ///< protein accession + description = 3, ///< protein description + ptm_position_list = 4, ///< ptm position list + spectrum = 5, ///< count sample scans + ptm_spectrum = 6, ///< count scan with ptm + sequence = 7, ///< unique sequence count + multiptm = 8, ///< count multi ptm peptide match + ptm_island_start = 9, ///< start position of the ptm island on the protein + ptm_island_length = 10, ///< length of the ptm island + last = 11, }; @@ -68,6 +68,8 @@ class PtmIslandTableModel : public QAbstractTableModel ~PtmIslandTableModel(); void setIdentificationGroup(IdentificationGroup *p_identification_group); + IdentificationGroup *getIdentificationGroup(); + virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override; virtual int @@ -79,6 +81,7 @@ class PtmIslandTableModel : public QAbstractTableModel static const QString getTitle(PtmIslandListColumn column); static const QString getDescription(PtmIslandListColumn column); + static PtmIslandListColumn getPtmIslandListColumn(std::int8_t column); const PtmGroupingExperiment *getPtmGroupingExperiment() const; @@ -94,5 +97,3 @@ class PtmIslandTableModel : public QAbstractTableModel IdentificationGroup *_p_identification_group = nullptr; PtmIslandListWindow *_p_ptm_island_list_window = nullptr; }; - -#endif // PTMISLANDTABLEMODEL_H diff --git a/src/gui/tandem_run_dialog/tandemrundialog.cpp b/src/gui/tandem_run_dialog/tandemrundialog.cpp index 11a5e05afd3233a779b11dda546f6c3334be93e2..ee4d5c24f3c452f8ca18d581360a73fa03f12317 100644 --- a/src/gui/tandem_run_dialog/tandemrundialog.cpp +++ b/src/gui/tandem_run_dialog/tandemrundialog.cpp @@ -405,8 +405,9 @@ TandemRunDialog::selectTdfFolder() { QSettings settings; QString default_tdf_location = - settings.value("path/tandemrun_tdf_directory", "").toString(); + settings.value("path/tandemrun_tdf_directory", "/").toString(); QFileDialog directories_dialog; + directories_dialog.setDirectory(default_tdf_location); directories_dialog.setFileMode(QFileDialog::DirectoryOnly); directories_dialog.setOption(QFileDialog::DontUseNativeDialog, true); directories_dialog.setWindowTitle("Select the timsTOF folders"); @@ -424,13 +425,15 @@ TandemRunDialog::selectTdfFolder() directories_names = directories_dialog.selectedFiles(); } - if(directories_names.size() > 0) + if(directories_names.size() > 1) { settings.setValue("path/tandemrun_tdf_directory", QFileInfo(directories_names[0]).absolutePath()); + directories_names.pop_front(); } for(QString directory_name : directories_names) { + // qDebug() << directory_name+"/analysis.tdf"; if(!QFileInfo(directory_name + "/analysis.tdf").exists()) { throw pappso::PappsoException( @@ -444,7 +447,6 @@ TandemRunDialog::selectTdfFolder() QStringList file_list = _p_mz_file_list->stringList(); file_list.append(directories_names); _p_mz_file_list->setStringList(file_list); - } catch(pappso::PappsoException &error) { diff --git a/src/gui/workerthread.cpp b/src/gui/workerthread.cpp index 3c932485547366093510f96763e65fbde3ce8f0e..2892484ace67935feb3a2e8232358b78075adc94 100644 --- a/src/gui/workerthread.cpp +++ b/src/gui/workerthread.cpp @@ -46,6 +46,7 @@ #include "project_view/projectwindow.h" #include "../core/tandem_run/tandembatchprocess.h" #include "../core/tandem_run/tandemcondorprocess.h" +#include "../output/ods/xicareasheet.h" #include <QSettings> WorkerThread::WorkerThread(MainWindow *p_main_window) @@ -225,6 +226,15 @@ WorkerThread::connectProjectWindow(ProjectWindow *p_project_window) &WorkerThread::operationFinished, p_project_window, &ProjectWindow::doOperationFinished); + + connect(p_project_window, + &ProjectWindow::operateWriteXicAreaInCsv, + this, + &WorkerThread::doWriteXicAreaInCsv); + connect(this, + &WorkerThread::exportXicToCsvFinished, + p_project_window, + &ProjectWindow::doExportXicAreaToCsvFinished); qDebug(); } @@ -861,3 +871,33 @@ WorkerThread::doCheckMsrunFilePath(ProjectSp msp_project) emit checkingMsrunFilePathFinished(msrun_sp); } + +void +WorkerThread::doWriteXicAreaInCsv(QString filename, + std::vector<XicBox *> xic_boxs) +{ + CalcWriterInterface *p_writer = nullptr; + + emit loadingMessage(tr("writing TSV files, please wait")); + QSettings settings; + QString xic_export_file = + settings.value("export/xic_files", "area").toString(); + p_writer = new TsvDirectoryWriter(filename); + if(xic_export_file == "both") + { + XicAreaSheet(p_writer, xic_boxs); + bool all_data = true; + XicAreaSheet(p_writer, xic_boxs, all_data); + } + else if(xic_export_file == "all") + { + bool all_data = true; + XicAreaSheet(p_writer, xic_boxs, all_data); + } + else // xic_export_file == "area" + { + XicAreaSheet(p_writer, xic_boxs); + } + p_writer->close(); + emit exportXicToCsvFinished(); +} diff --git a/src/gui/workerthread.h b/src/gui/workerthread.h index ba3f93225dde9f92a14abe76ba24fa2d050f47b0..0b38f33b250bf096ca3bf19dc81a4d8b4a6cd0dc 100644 --- a/src/gui/workerthread.h +++ b/src/gui/workerthread.h @@ -37,6 +37,7 @@ #include "../utils/workmonitor.h" #include "../core/tandem_run/tandemrunbatch.h" #include "../gui/export/export_masschroq_dialog/masschroqfileparameters.h" +#include "../gui/xic_view/xic_box/xicbox.h" class MainWindow; class ProjectWindow; @@ -87,7 +88,7 @@ class WorkerThread : public QObject void doFindBestMsrunForAlignment(ProjectSp project_sp, MsRunAlignmentGroupSp alignment_group); void doCheckMsrunFilePath(ProjectSp project_sp); - + void doWriteXicAreaInCsv(QString filename, std::vector<XicBox *> xic_boxs); signals: void loadingMessage(QString message); @@ -108,6 +109,7 @@ class WorkerThread : public QObject * that was not found if so */ void checkingMsrunFilePathFinished(MsRunSp msrun_sp); + void exportXicToCsvFinished(); private: WorkMonitor *_p_work_monitor; diff --git a/src/gui/xic_view/xic_box/xic_box.ui b/src/gui/xic_view/xic_box/xic_box.ui index 4b2afe9bf461c2842850bd4c4d8e09a221918a6d..df7e1572a2b2666a29838554c78c508eb577cc5b 100644 --- a/src/gui/xic_view/xic_box/xic_box.ui +++ b/src/gui/xic_view/xic_box/xic_box.ui @@ -87,6 +87,9 @@ <property name="text"> <string>new XIC</string> </property> + <property name="icon"> + <iconset theme="tab-new"/> + </property> </widget> </item> <item> @@ -152,15 +155,15 @@ <item> <widget class="QToolButton" name="close_button"> <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="maximumSize"> <size> - <width>24</width> - <height>24</height> + <width>16000</width> + <height>1600</height> </size> </property> <property name="acceptDrops"> @@ -173,8 +176,7 @@ <string/> </property> <property name="icon"> - <iconset resource="../../../xtpcpp.qrc"> - <normaloff>:/icons/resources/icons/mit/jamicons/icon_close.svg</normaloff>:/icons/resources/icons/mit/jamicons/icon_close.svg</iconset> + <iconset theme="window-close"/> </property> <property name="iconSize"> <size> @@ -383,8 +385,8 @@ <slot>onIsotopicDistributionClick()</slot> <hints> <hint type="sourcelabel"> - <x>1004</x> - <y>32</y> + <x>980</x> + <y>39</y> </hint> <hint type="destinationlabel"> <x>1163</x> @@ -400,5 +402,6 @@ <slot>onXicWidgetClick(double,double)</slot> <slot>setXicPeakList(pappso::XicXicPeakPairList)</slot> <slot>onIsotopicDistributionClick()</slot> + <slot>onExportToCsvClick()</slot> </slots> </ui> diff --git a/src/gui/xic_view/xic_box/xicbox.cpp b/src/gui/xic_view/xic_box/xicbox.cpp index 7bd6ba88cc4089effc238aa472670b95c83fdf19..5533d0e07813ed799d137314495542178b240e59 100644 --- a/src/gui/xic_view/xic_box/xicbox.cpp +++ b/src/gui/xic_view/xic_box/xicbox.cpp @@ -337,6 +337,12 @@ XicBox::setPeptideEvidenceInMsRun(const PeptideEvidence *p_peptide_evidence, ui->isotopic_distribution_spinbox->value()); } +MsRunSp +XicBox::getMsRunSp() +{ + return _msrun_sp; +} + void XicBox::setXic(std::vector<pappso::XicCstSPtr> xic_sp_list) { @@ -563,13 +569,11 @@ XicBox::setIsotopeMassList( // histogram if(m_theoreticalRatioBars == nullptr) { - qDebug() << "ZZZZZZZZZZZZZ"; m_theoreticalRatioBars = new QCPBars(ui->histo_widget->xAxis, ui->histo_widget->yAxis); } else { - qDebug() << "EEEEEEEEEEE"; m_theoreticalRatioBars->data()->clear(); } m_theoreticalRatioBars->setName("th. ratio"); @@ -778,3 +782,9 @@ XicBox::addCommonRt(std::vector<std::size_t> &common_peak_rt_measure_list, */ } } + +std::vector<XicBoxNaturalIsotope> +XicBox::getNaturalIsotopList() const +{ + return _natural_isotope_list; +} diff --git a/src/gui/xic_view/xic_box/xicbox.h b/src/gui/xic_view/xic_box/xicbox.h index c424f9ccdec8fa87611e309998bff920105e787f..56fe931806a8fc55c5a44b5a48a0f0d48a802dfe 100644 --- a/src/gui/xic_view/xic_box/xicbox.h +++ b/src/gui/xic_view/xic_box/xicbox.h @@ -68,6 +68,8 @@ class XicBox : public QWidget void setPeptideEvidence(const PeptideEvidence *p_peptide_evidence); void setPeptideEvidenceInMsRun(const PeptideEvidence *p_peptide_evidence, MsRunSp msrun_sp); + std::vector<XicBoxNaturalIsotope> getNaturalIsotopList() const; + MsRunSp getMsRunSp(); signals: void loadXic(MsRunSp p_msrun, @@ -118,8 +120,7 @@ class XicBox : public QWidget std::vector<pappso::XicWidget *> _xic_widget_list; QCPBars *m_observedAreaBars = nullptr; - - bool _scaled = false; + bool _scaled = false; // QFrame * _popup_peak_info = nullptr; }; diff --git a/src/gui/xic_view/xic_window.ui b/src/gui/xic_view/xic_window.ui index 1047423eda84be90ddecfa00ffa7d3e16b02b1fb..10b6f0031f6deb9188afdeca42212da306a75fbf 100644 --- a/src/gui/xic_view/xic_window.ui +++ b/src/gui/xic_view/xic_window.ui @@ -82,11 +82,35 @@ </property> </spacer> </item> + <item> + <widget class="QToolButton" name="export_toolButton"> + <property name="text"> + <string>...</string> + </property> + <property name="icon"> + <iconset theme="spreadsheet"> + <normaloff>.</normaloff>.</iconset> + </property> + <property name="iconSize"> + <size> + <width>24</width> + <height>24</height> + </size> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + </widget> + </item> <item> <widget class="QPushButton" name="edit_zivy_params_pushbutton"> <property name="text"> <string>Edit</string> </property> + <property name="icon"> + <iconset theme="edit"> + <normaloff>.</normaloff>.</iconset> + </property> </widget> </item> </layout> @@ -103,7 +127,7 @@ <x>0</x> <y>0</y> <width>1172</width> - <height>499</height> + <height>495</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout"/> @@ -187,8 +211,8 @@ <slot>doEditZivyParams()</slot> <hints> <hint type="sourcelabel"> - <x>710</x> - <y>59</y> + <x>1182</x> + <y>61</y> </hint> <hint type="destinationlabel"> <x>918</x> @@ -212,12 +236,29 @@ </hint> </hints> </connection> + <connection> + <sender>export_toolButton</sender> + <signal>clicked()</signal> + <receiver>XicWindow</receiver> + <slot>doExportXicToCsv()</slot> + <hints> + <hint type="sourcelabel"> + <x>1084</x> + <y>42</y> + </hint> + <hint type="destinationlabel"> + <x>1496</x> + <y>107</y> + </hint> + </hints> + </connection> </connections> <slots> <slot>xicPrecisionChanged(pappso::PrecisionPtr)</slot> <slot>rtUnitChanged(QAbstractButton*)</slot> <slot>doEditZivyParams()</slot> <slot>doXicExtractionMethodChanged(pappso::XicExtractMethod)</slot> + <slot>doExportXicToCsv()</slot> </slots> <buttongroups> <buttongroup name="rt_unit_buttongroup"/> diff --git a/src/gui/xic_view/xicwindow.cpp b/src/gui/xic_view/xicwindow.cpp index 06373f04de793098823cf43517c9c017f371156e..f8abdb6ca11d001c1a600ff102ff2ae91ded37b9 100644 --- a/src/gui/xic_view/xicwindow.cpp +++ b/src/gui/xic_view/xicwindow.cpp @@ -60,6 +60,10 @@ XicWindow::XicWindow(ProjectWindow *parent) &ZivyDialog::accepted, this, &XicWindow::doAcceptedZivyDialog); + connect(this, + &XicWindow::operateXicAreaToCsv, + _project_window, + &ProjectWindow::doExportXicAreaToCsv); #if QT_VERSION >= 0x050000 // Qt5 code @@ -185,3 +189,27 @@ XicWindow::doXicExtractionMethodChanged(pappso::XicExtractMethod xic_method { emit reExtractXicNeeded(); } + +void +XicWindow::doExportXicToCsv() +{ + QSettings settings; + QString default_location = settings.value("path/export_ods", "").toString(); + + QString filename = + QFileDialog::getSaveFileName(this, + tr("Save CSV directory"), + QString("%1/new_dir").arg(default_location)); + + settings.setValue("path/export_ods", QFileInfo(filename).absolutePath()); + + + std::vector<XicBox *> xic_boxs; + + for(int i = 0; i < ui->verticalLayout->layout()->count(); i++) + { + xic_boxs.push_back( + dynamic_cast<XicBox *>(ui->verticalLayout->itemAt(i)->widget())); + } + emit operateXicAreaToCsv(filename, xic_boxs); +} diff --git a/src/gui/xic_view/xicwindow.h b/src/gui/xic_view/xicwindow.h index d20888a367c7972a067a272f0725afd682dd5f4a..5435a0093a33f339c71fbc2cad8e41e315b2c39c 100644 --- a/src/gui/xic_view/xicwindow.h +++ b/src/gui/xic_view/xicwindow.h @@ -74,10 +74,12 @@ class XicWindow : public QMainWindow void doEditZivyParams(); void doAcceptedZivyDialog(); void doXicExtractionMethodChanged(pappso::XicExtractMethod xic_method); + void doExportXicToCsv(); signals: void reExtractXicNeeded(); void rtUnitChangeNeeded(); + void operateXicAreaToCsv(QString filename, std::vector<XicBox *> xic_boxs); protected: diff --git a/src/main.cpp b/src/main.cpp index 3ff915de29c96e846c3f5468ab93b50d5a89deac..d98d217232f72fd712eec1719b8718e273fdf8db 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -57,6 +57,7 @@ main(int argc, char *argv[]) qRegisterMetaType<IdentificationDataSourceSp>("IdentificationDataSourceSp"); qRegisterMetaType<ContaminantRemovalMode>("ContaminantRemovalMode"); qRegisterMetaType<PtmMode>("PtmMode"); + qRegisterMetaType<std::vector<XicBox *>>("<std::vector<XicBox *>>"); // qRegisterMetaType<pappso::PeakIonIsotopeMatch>("pappso::PeakIonIsotopeMatch"); diff --git a/src/output/masschroqml.cpp b/src/output/masschroqml.cpp index b07344f48c3887614a3bf2c96b874fbdedb4a691..10dd89fe02e9ce13fa1c618167ed4a66bec2b4ab 100644 --- a/src/output/masschroqml.cpp +++ b/src/output/masschroqml.cpp @@ -263,44 +263,50 @@ MassChroQml::writeQuantificationTraces() void MassChroQml::writeQuantify() { - //<quantify id="q1" withingroup="G1" quantification_method_id="my_qzivy"> - _output_stream->writeStartElement("quantify"); - _output_stream->writeAttribute("id", "q1"); - _output_stream->writeAttribute("withingroup", "fractiona1"); - _output_stream->writeAttribute("quantification_method_id", "quant1"); - //<peptides_in_peptide_list mode="real_or_mean" /> - //</quantify> - //<quantify id="q2" withingroup="G2" quantification_method_id="my_moulon"> - //<peptides_in_peptide_list mode="post_matching" - // isotope_label_refs="iso1 iso2" /> - - _output_stream->writeStartElement("peptides_in_peptide_list"); - _output_stream->writeAttribute("mode", "post_matching"); - _output_stream->writeAttribute("ni_min_abundance", "0.8"); - - LabelingMethod *p_labeling_method = - _sp_project.get()->getLabelingMethodSp().get(); - if(p_labeling_method != nullptr) + for(MsRunAlignmentGroupSp group_sp : m_params.alignment_groups) { - QStringList isotope_label_ref; - for(const Label *p_label : p_labeling_method->getLabelList()) + //<quantify id="q1" withingroup="G1" quantification_method_id="my_qzivy"> + _output_stream->writeStartElement("quantify"); + _output_stream->writeAttribute("id", "q1"); + + _output_stream->writeAttribute("withingroup", + group_sp->getMsRunAlignmentGroupName()); + _output_stream->writeAttribute("quantification_method_id", "quant1"); + //<peptides_in_peptide_list mode="real_or_mean" /> + //</quantify> + //<quantify id="q2" withingroup="G2" quantification_method_id="my_moulon"> + //<peptides_in_peptide_list mode="post_matching" + // isotope_label_refs="iso1 iso2" /> + + _output_stream->writeStartElement("peptides_in_peptide_list"); + _output_stream->writeAttribute("mode", "post_matching"); + _output_stream->writeAttribute("ni_min_abundance", "0.8"); + + LabelingMethod *p_labeling_method = + _sp_project.get()->getLabelingMethodSp().get(); + if(p_labeling_method != nullptr) { - isotope_label_ref << p_label->getXmlId(); + QStringList isotope_label_ref; + for(const Label *p_label : p_labeling_method->getLabelList()) + { + isotope_label_ref << p_label->getXmlId(); + } + _output_stream->writeAttribute("isotope_label_refs", + isotope_label_ref.join(" ")); } - _output_stream->writeAttribute("isotope_label_refs", - isotope_label_ref.join(" ")); - } - _output_stream->writeEndElement(); + _output_stream->writeEndElement(); - _output_stream->writeComment( - "<mz_list>732.317 449.754 552.234 464.251 " - "381.577 569.771 575.256</mz_list>"); - _output_stream->writeComment( - "<mzrt_list>\n <mzrt mz=\"732.317\" rt=\"230.712\" />\n <mzrt " - "mz=\"575.256\" rt=\"254.788\" />\n </mzrt_list>"); + _output_stream->writeComment( + "<mz_list>732.317 449.754 552.234 464.251 " + "381.577 569.771 575.256</mz_list>"); + _output_stream->writeComment( + "<mzrt_list>\n <mzrt mz=\"732.317\" rt=\"230.712\" />\n " + "<mzrt " + "mz=\"575.256\" rt=\"254.788\" />\n </mzrt_list>"); - //</quantify> - _output_stream->writeEndElement(); + //</quantify> + _output_stream->writeEndElement(); + } } void diff --git a/src/output/ods/ptm/ptmislandsheet.cpp b/src/output/ods/ptm/ptmislandsheet.cpp index 15c6f86b4e9084b1294f4d01fa0b454ab0086ca2..97d18c85f0e89a2196c34cccc97c43f7e2275dcf 100644 --- a/src/output/ods/ptm/ptmislandsheet.cpp +++ b/src/output/ods/ptm/ptmislandsheet.cpp @@ -142,7 +142,10 @@ PtmIslandSheet::writeIdentificationGroup(IdentificationGroup *p_ident) for(auto ptm_island_sp : _p_ptm_grouping_experiment->getPtmIslandList()) { qDebug(); - ptm_island_list.push_back(ptm_island_sp); + if(ptm_island_sp->isChecked()) + { + ptm_island_list.push_back(ptm_island_sp); + } } qDebug(); std::sort(ptm_island_list.begin(), diff --git a/src/output/ods/ptm/ptmspectrasheet.cpp b/src/output/ods/ptm/ptmspectrasheet.cpp index 21e2523af9b6440f6f554d7518c0538483867a94..b79114dda1c27b2f4c85de529bc58eb11633de1a 100644 --- a/src/output/ods/ptm/ptmspectrasheet.cpp +++ b/src/output/ods/ptm/ptmspectrasheet.cpp @@ -237,7 +237,10 @@ PtmSpectraSheet::writeBestPeptideEvidence( // return _ptm_sample_scan_list.at(row).get()->getObservedPtmPositionList(); for(const PtmIsland *ptm_island : ptmisland_occurence_list) { - position_list << ptm_island->getGroupingId(); + if(ptm_island->isChecked()) + { + position_list << ptm_island->getGroupingId(); + } } _p_writer->writeCell(position_list.join(" ")); @@ -286,41 +289,48 @@ PtmSpectraSheet::writePtmIslandSubgroupSp( for(PtmIslandSp ptm_island_sp : ptm_island_subgroup_sp.get()->getPtmIslandList()) { - - qDebug() << __FILE__ << " " << __FUNCTION__ << " " << __LINE__; - for(PeptideMatch peptide_match : - ptm_island_sp.get()->getPeptideMatchList()) + if(ptm_island_sp->isChecked()) { - qDebug() << __FILE__ << " " << __FUNCTION__ << " " << __LINE__; - std::vector<PtmSampleScanOccurence>::iterator it_ptm = - ptm_sample_scan_occurence_list.begin(); - std::vector<PtmSampleScanOccurence>::iterator it_ptm_end = - ptm_sample_scan_occurence_list.end(); - while((it_ptm != it_ptm_end) && - (it_ptm->ptm_sample_scan.add(peptide_match) == false)) - { - // peptide added - it_ptm++; - } - if(it_ptm == it_ptm_end) + for(PeptideMatch peptide_match : + ptm_island_sp.get()->getPeptideMatchList()) { - qDebug() << __FILE__ << " " << __FUNCTION__ << " " << __LINE__; - // peptide NOT added - PtmSampleScanOccurence new_occurence = { - PtmSampleScan(peptide_match), std::set<const PtmIsland *>()}; - new_occurence.ptmisland_occurence_list.insert( - ptm_island_sp.get()); - ptm_sample_scan_occurence_list.push_back(new_occurence); - qDebug() << __FILE__ << " " << __FUNCTION__ << " " << __LINE__; - } - else - { - // peptide added - qDebug() << __FILE__ << " " << __FUNCTION__ << " " << __LINE__; - it_ptm->ptmisland_occurence_list.insert(ptm_island_sp.get()); qDebug() << __FILE__ << " " << __FUNCTION__ << " " << __LINE__; + std::vector<PtmSampleScanOccurence>::iterator it_ptm = + ptm_sample_scan_occurence_list.begin(); + std::vector<PtmSampleScanOccurence>::iterator it_ptm_end = + ptm_sample_scan_occurence_list.end(); + while((it_ptm != it_ptm_end) && + (it_ptm->ptm_sample_scan.add(peptide_match) == false)) + { + // peptide added + it_ptm++; + } + if(it_ptm == it_ptm_end) + { + qDebug() << __FILE__ << " " << __FUNCTION__ << " " + << __LINE__; + // peptide NOT added + PtmSampleScanOccurence new_occurence = { + PtmSampleScan(peptide_match), + std::set<const PtmIsland *>()}; + new_occurence.ptmisland_occurence_list.insert( + ptm_island_sp.get()); + ptm_sample_scan_occurence_list.push_back(new_occurence); + qDebug() << __FILE__ << " " << __FUNCTION__ << " " + << __LINE__; + } + else + { + // peptide added + qDebug() << __FILE__ << " " << __FUNCTION__ << " " + << __LINE__; + it_ptm->ptmisland_occurence_list.insert(ptm_island_sp.get()); + + qDebug() << __FILE__ << " " << __FUNCTION__ << " " + << __LINE__; + } } } } diff --git a/src/output/ods/xicareasheet.cpp b/src/output/ods/xicareasheet.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c61699b74a89828cb90f6004a852621b6ad471fd --- /dev/null +++ b/src/output/ods/xicareasheet.cpp @@ -0,0 +1,134 @@ +/** + * \file /output/xicareasheet.cpp + * \date 16/10/2020 + * \author Olivier Langella + * \brief ODS grouping sheet + */ + +/******************************************************************************* + * Copyright (c) 2020 Thomas Renne <thomas.renne@u-psud.fr>. + * + * This file is part of XTPcpp. + * + * XTPcpp is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * XTPcpp is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XTPcpp. If not, see <http://www.gnu.org/licenses/>. + * + * Contributors: + * Thomas Renne <thomas.renne@u-psud.fr> - initial API and + *implementation + ******************************************************************************/ + +#include "xicareasheet.h" + +XicAreaSheet::XicAreaSheet(CalcWriterInterface *p_writer, + const std::vector<XicBox *> xic_boxs, + bool all_data) +{ + mp_writer = p_writer; + + mp_xicBoxList = xic_boxs; + + OdsTableSettings table_settings; + table_settings.setVerticalSplit(1); + mp_writer->setCurrentOdsTableSettings(table_settings); + if(all_data) + { + mp_writer->writeSheet("xic_all_data"); + writeHeadersAllData(); + for(XicBox *xic : mp_xicBoxList) + { + writeXicAllData(xic); + } + } + else + { + mp_writer->writeSheet("xic_area"); + writeHeaders(); + for(XicBox *xic : mp_xicBoxList) + { + writeAreaPeackdata(xic); + } + } +} + +void +XicAreaSheet::writeHeaders() +{ + mp_writer->writeLine(); + mp_writer->setCellAnnotation("ms run name"); + mp_writer->writeCell("msrun"); + mp_writer->setCellAnnotation("area of the peak"); + mp_writer->writeCell("area"); + mp_writer->setCellAnnotation("left boundary of the peak"); + mp_writer->writeCell("rt_begin"); + mp_writer->setCellAnnotation( + "retention time of the max intensity in the peak"); + mp_writer->writeCell("rt_max"); + mp_writer->setCellAnnotation("right boundary of the peak"); + mp_writer->writeCell("rt_end"); + mp_writer->setCellAnnotation("Isotope"); + mp_writer->writeCell("isotope"); +} + +void +XicAreaSheet::writeHeadersAllData() +{ + mp_writer->writeLine(); + mp_writer->setCellAnnotation("ms run name"); + mp_writer->writeCell("msrun"); + mp_writer->setCellAnnotation("Isotope"); + mp_writer->writeCell("isotope"); + mp_writer->setCellAnnotation("retention time of point"); + mp_writer->writeCell("rt"); + mp_writer->setCellAnnotation("intensity of point"); + mp_writer->writeCell("intensity"); +} + + +void +XicAreaSheet::writeAreaPeackdata(XicBox *xic_box) +{ + for(XicBoxNaturalIsotope isotope : xic_box->getNaturalIsotopList()) + { + for(pappso::TracePeakCstSPtr trace : isotope.detected_peak_list) + { + mp_writer->writeLine(); + mp_writer->writeCell( + QFileInfo(xic_box->getMsRunSp()->getFileName()).fileName()); + mp_writer->writeCell(trace->getArea()); + mp_writer->writeCell(trace->getLeftBoundary().x); + mp_writer->writeCell(trace->getMaxXicElement().x); + mp_writer->writeCell(trace->getRightBoundary().x); + mp_writer->writeCell( + int(isotope.peptide_natural_isotope_sp->getIsotopeNumber())); + } + } +} + +void +XicAreaSheet::writeXicAllData(XicBox *xic_box) +{ + for(XicBoxNaturalIsotope isotope : xic_box->getNaturalIsotopList()) + { + for(std::size_t i = 0; i < isotope.xic_sp->xValues().size(); i++) + { + mp_writer->writeLine(); + mp_writer->writeCell( + QFileInfo(xic_box->getMsRunSp()->getFileName()).fileName()); + mp_writer->writeCell( + int(isotope.peptide_natural_isotope_sp->getIsotopeNumber())); + mp_writer->writeCell(isotope.xic_sp->xValues().at(i)); + mp_writer->writeCell(isotope.xic_sp->yValues().at(i)); + } + } +} diff --git a/src/output/ods/xicareasheet.h b/src/output/ods/xicareasheet.h new file mode 100644 index 0000000000000000000000000000000000000000..c6a9a1431b9f5672a9994da867095733f6d31002 --- /dev/null +++ b/src/output/ods/xicareasheet.h @@ -0,0 +1,52 @@ +/** + * \file /output/xicareasheet.h + * \date 16/10/2020 + * \author Thomas Renne + * \brief ODS grouping sheet + */ + +/******************************************************************************* + * Copyright (c) 2020 Thomas Renne <thomas.renne@u-psud.fr>. + * + * This file is part of XTPcpp. + * + * XTPcpp is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * XTPcpp is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XTPcpp. If not, see <http://www.gnu.org/licenses/>. + * + * Contributors: + * Thomas Renne <thomas.renne@u-psud.fr> - initial API and + *implementation + ******************************************************************************/ +#pragma once + +#include <odsstream/calcwriterinterface.h> +#include "../../core/project.h" +#include "../../gui/xic_view/xic_box/xicbox.h" + +class XicAreaSheet +{ + public: + XicAreaSheet(CalcWriterInterface *p_writer, + const std::vector<XicBox *> xic_boxs, + bool all_data = false); + + private: + void writeAreaPeackdata(XicBox *xic_box); + void writeXicAllData(XicBox *xic_box); + void writeHeaders(); + void writeHeadersAllData(); + + private: + std::vector<XicBox *> mp_xicBoxList; + CalcWriterInterface *mp_writer; +}; diff --git a/src/resources/icons/apache/firefox/check_icon.svg b/src/resources/icons/apache/firefox/check_icon.svg index 29832431824775dac18518065dc9bf0c48168915..4ab810802a4b88593f3b91e67ce0704aec16a7f0 100644 --- a/src/resources/icons/apache/firefox/check_icon.svg +++ b/src/resources/icons/apache/firefox/check_icon.svg @@ -1,2 +1,7 @@ - -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" focusable="false" width="1em" height="1em" style="-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg);" preserveAspectRatio="xMidYMid meet" viewBox="0 0 512 512"><path fill="#60bc03" d="M484.065 66.324l-71.534-41.759c-8.811-5.143-20.123-2.17-25.266 6.641L211.883 331.642L96.414 264.236c-7.143-4.17-16.314-1.76-20.484 5.384l-45.284 77.573c-4.17 7.143-1.76 16.314 5.384 20.484l205.968 120.235c7.143 4.17 16.314 1.76 20.484-5.384l1.669-2.86c.034-.056.074-.106.107-.163L490.706 91.59c5.143-8.811 2.17-20.123-6.641-25.266z"/><rect x="0" y="0" width="512" height="512" fill="rgba(0, 0, 0, 0)" /></svg> +<?xml version="1.0" encoding="iso-8859-1"?> +<!-- Generator: Adobe Illustrator 19.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" focusable="false" width="1em" height="1em" style="-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg);" preserveAspectRatio="xMidYMid meet" viewBox="0 0 512 512"> + <path fill="#60bc03" d="M484.065 66.324l-71.534-41.759c-8.811-5.143-20.123-2.17-25.266 6.641L211.883 331.642L96.414 264.236c-7.143-4.17-16.314-1.76-20.484 5.384l-45.284 77.573c-4.17 7.143-1.76 16.314 5.384 20.484l205.968 120.235c7.143 4.17 16.314 1.76 20.484-5.384l1.669-2.86c.034-.056.074-.106.107-.163L490.706 91.59c5.143-8.811 2.17-20.123-6.641-25.266z"/> + <rect x="0" y="0" width="512" height="512" fill="rgba(0, 0, 0, 0)" /> +</svg>