diff --git a/src/gui/protein_list_view/proteinlistwindow.h b/src/gui/protein_list_view/proteinlistwindow.h
index a4460a4eadd9225c81d7986ed7153e6ff7851754..b14502a7ab15e98c85f8cdfea202a8e9f5dfee41 100644
--- a/src/gui/protein_list_view/proteinlistwindow.h
+++ b/src/gui/protein_list_view/proteinlistwindow.h
@@ -57,7 +57,7 @@ public slots:
     // void setShape(Shape shape);
 signals:
     void identificationGroupEdited(IdentificationGroup * p_identification_group);
-   void proteinDataChanged();
+    void proteinDataChanged();
 
 
 protected slots:
@@ -71,7 +71,7 @@ protected slots:
     void updateStatusBar();
     void onProteinSearchEdit(QString protein_search_string);
     void doSearchOn(QString search_on);
-    
+
 protected :
     void askProteinDetailView(ProteinMatch * p_protein_match);
     void askPeptideListView(ProteinMatch * p_protein_match);
diff --git a/src/gui/protein_list_view/proteintablemodel.cpp b/src/gui/protein_list_view/proteintablemodel.cpp
index 46b10f6c74012596c4c0b6cd523ee5259fd5318b..6b499c28374942da840f80273f98707d5b6daaeb 100644
--- a/src/gui/protein_list_view/proteintablemodel.cpp
+++ b/src/gui/protein_list_view/proteintablemodel.cpp
@@ -32,7 +32,7 @@
 
 ProteinTableModel::columnMap ProteinTableModel::_column_assignment = {
     (std::int8_t)ProteinListColumn::checked,
-    (std::int8_t)ProteinListColumn::group,
+    (std::int8_t)ProteinListColumn::protein_grouping_id,
     (std::int8_t)ProteinListColumn::accession,
     (std::int8_t)ProteinListColumn::description,
     (std::int8_t)ProteinListColumn::log_evalue,
@@ -81,15 +81,21 @@ int ProteinTableModel::columnCount(const QModelIndex &parent ) const {
     }
     return 0;
 }
+    const QString ProteinTableModel::getTitle(ProteinListColumn column) {
+      ProteinTableModel::getTitle((std::int8_t) column);
+    }
+    const QString ProteinTableModel::getDescription(ProteinListColumn column) {
+      ProteinTableModel::getDescription((std::int8_t) column);
+    }
 
-const QString ProteinTableModel::getTitle(std::int8_t column) const {
+const QString ProteinTableModel::getTitle(std::int8_t column) {
     switch (column) {
 
     case (std::int8_t) ProteinListColumn::checked:
         return "checked";
         break;
 
-    case (std::int8_t) ProteinListColumn::group:
+    case (std::int8_t) ProteinListColumn::protein_grouping_id:
         return "group";
         break;
     case (std::int8_t) ProteinListColumn::accession:
@@ -119,6 +125,9 @@ const QString ProteinTableModel::getTitle(std::int8_t column) const {
     case (std::int8_t) ProteinListColumn::pai:
         return "PAI";
         break;
+    case (std::int8_t) ProteinListColumn::empai:
+        return "emPAI";
+        break;
     case (std::int8_t) ProteinListColumn::specific_sequence:
         return "specific sequence";
 
@@ -126,15 +135,15 @@ const QString ProteinTableModel::getTitle(std::int8_t column) const {
     return "";
 }
 
-const QString ProteinTableModel::getDescription(std::int8_t column) const {
+const QString ProteinTableModel::getDescription(std::int8_t column) {
     switch (column) {
 
     case (std::int8_t) ProteinListColumn::checked:
         return "manual protein check";
         break;
 
-    case (std::int8_t) ProteinListColumn::group:
-        return "unique protein grouping identifier";
+    case (std::int8_t) ProteinListColumn::protein_grouping_id:
+        return "unique protein identifier within this grouping experiment";
         break;
     case (std::int8_t) ProteinListColumn::accession:
         return "protein accession";
@@ -163,6 +172,9 @@ const QString ProteinTableModel::getDescription(std::int8_t column) const {
     case (std::int8_t) ProteinListColumn::pai:
         return "Protein Abundance Index (Rappsilber et al. 2002)";
         break;
+    case (std::int8_t) ProteinListColumn::empai:
+        return "Exponentially Modified Protein Abundance Index (emPAI) as described by Ishihama 2005";
+        break;
     case (std::int8_t) ProteinListColumn::specific_sequence:
         return "number of unique distinct peptide sequences only assigned to this protein within the group";
 
@@ -230,7 +242,7 @@ QVariant ProteinTableModel::data(const QModelIndex &index, int role ) const {
             return QVariant();
             break;
 
-        case (std::int8_t)ProteinListColumn::group:
+        case (std::int8_t)ProteinListColumn::protein_grouping_id:
             pappso::GrpProtein * p_grp_prot = _p_identification_group->getProteinMatchList().at(row)->getGrpProteinSp().get();
             if (p_grp_prot != nullptr) return p_grp_prot->getGroupingId();
             return QVariant();
diff --git a/src/gui/protein_list_view/proteintablemodel.h b/src/gui/protein_list_view/proteintablemodel.h
index f6cb458292f3c38b98222b5f10108933fc029dee..e662974b8abb8c19eff8890551ded63b6d571e79 100644
--- a/src/gui/protein_list_view/proteintablemodel.h
+++ b/src/gui/protein_list_view/proteintablemodel.h
@@ -34,7 +34,7 @@
 
 enum class ProteinListColumn {
      checked, ///< manual checked
-     group, ///< group id
+     protein_grouping_id, ///< protein grouping id
      accession, ///< accession
      description, ///< protein description
      log_evalue, ///< log(Evalue)
@@ -45,6 +45,7 @@ enum class ProteinListColumn {
      specific_sequence, ///< specific unique sequence
      coverage, ///< protein coverage
      pai, ///< PAI
+     empai, ///< emPAI
 };
 
 class ProteinListWindow;
@@ -58,9 +59,10 @@ public:
     virtual int columnCount(const QModelIndex &parent = QModelIndex()) const override;
     virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
     virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
+    
+    static const QString getTitle(ProteinListColumn column);
+    static const QString getDescription(ProteinListColumn column);
 
-    const QString getTitle(std::int8_t column) const;
-    const QString getDescription(std::int8_t column) const;
 
     void setIdentificationGroup(IdentificationGroup * p_identification_group);
     IdentificationGroup * getIdentificationGroup();
@@ -69,6 +71,9 @@ public:
 public slots:
     void onProteinDataChanged();
 private :
+      static const QString getTitle(std::int8_t column);
+    static const QString getDescription(std::int8_t column);
+
     void refresh();
 private :
     IdentificationGroup * _p_identification_group = nullptr;
diff --git a/src/gui/ptm_island_list_view/ptmislandtablemodel.cpp b/src/gui/ptm_island_list_view/ptmislandtablemodel.cpp
index 4c137e57cd55b6ce5b6485b42aa48f3bfe22859a..ebddc2a5fb8257626b01317e8f1ecf03422ad3c7 100644
--- a/src/gui/ptm_island_list_view/ptmislandtablemodel.cpp
+++ b/src/gui/ptm_island_list_view/ptmislandtablemodel.cpp
@@ -54,7 +54,7 @@ PtmIslandTableModel::~PtmIslandTableModel()
 {
 
 }
-const QString PtmIslandTableModel::getTitle(std::int8_t column) const {
+const QString PtmIslandTableModel::getTitle(std::int8_t column) {
     switch (column) {
 
     case (std::int8_t) PtmIslandListColumn::spectrum:
@@ -89,7 +89,7 @@ const QString PtmIslandTableModel::getTitle(std::int8_t column) const {
     return "";
 }
 
-const QString PtmIslandTableModel::getDescription(std::int8_t column) const {
+const QString PtmIslandTableModel::getDescription(std::int8_t column) {
     switch (column) {
 
     case (std::int8_t) PtmIslandListColumn::spectrum:
diff --git a/src/gui/ptm_island_list_view/ptmislandtablemodel.h b/src/gui/ptm_island_list_view/ptmislandtablemodel.h
index 25b472aa1fd264fd265de93cbef875986e9887b9..b976ef8eaebb811cf91edd7687a50bc2586184d1 100644
--- a/src/gui/ptm_island_list_view/ptmislandtablemodel.h
+++ b/src/gui/ptm_island_list_view/ptmislandtablemodel.h
@@ -70,8 +70,8 @@ public:
     virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
     
     
-    const QString getTitle(std::int8_t column) const;
-    const QString getDescription(std::int8_t column) const;
+    static const QString getTitle(std::int8_t column);
+    static const QString getDescription(std::int8_t column);
     
     
     using columnMap = std::int8_t[20];
diff --git a/src/output/ods/proteinsheet.cpp b/src/output/ods/proteinsheet.cpp
index 13d3150523cd2c31e0c9e03d122f5352bc0c1325..15fefe3d99ca0889afccf444d9c69ea1f1f04f58 100644
--- a/src/output/ods/proteinsheet.cpp
+++ b/src/output/ods/proteinsheet.cpp
@@ -43,6 +43,10 @@ ProteinSheet::ProteinSheet (OdsExport * p_ods_export, CalcWriterInterface * p_wr
         writeIdentificationGroup(p_ident);
     }
 }
+void ProteinSheet::writeCellHeader(ProteinListColumn column) {
+    _p_writer->setCellAnnotation(ProteinTableModel::getDescription(column));
+    _p_writer->writeCell(ProteinTableModel::getTitle(column));
+}
 
 void ProteinSheet::writeHeaders(IdentificationGroup * p_ident)  {
     // Group ID Sub-group ID Protein ID Description log(E value)
@@ -56,41 +60,39 @@ void ProteinSheet::writeHeaders(IdentificationGroup * p_ident)  {
         _p_writer->writeLine();
     }
     _p_writer->writeLine();
-    
+
     _p_writer->setCellAnnotation("group number");
     _p_writer->writeCell("Group ID");
     _p_writer->setCellAnnotation("subgroup number");
     _p_writer->writeCell("Sub-group ID");
-    _p_writer->setCellAnnotation("unique protein identifier within this grouping experiment");
-    _p_writer->writeCell("Protein ID");
-    _p_writer->setCellAnnotation("unique protein accession");
-    _p_writer->writeCell("Accession");
-    _p_writer->setCellAnnotation("protein description");
-    _p_writer->writeCell("Description");
-    _p_writer->setCellAnnotation("protein expected value computed by X!TandemPipeline");
-    _p_writer->writeCell("log(E value)");
-    _p_writer->setCellAnnotation("coverage ratio");
-    _p_writer->writeCell("Coverage");
+    writeCellHeader(ProteinListColumn::protein_grouping_id);
+    //_p_writer->setCellAnnotation("unique protein identifier within this grouping experiment");
+    //_p_writer->writeCell("Protein ID");
+
+    writeCellHeader(ProteinListColumn::accession);
+    writeCellHeader(ProteinListColumn::description);
+    writeCellHeader(ProteinListColumn::log_evalue);
+    writeCellHeader(ProteinListColumn::coverage);
     _p_writer->setCellAnnotation("computed molecular weight for this protein (sum of amino acid masses)");
     _p_writer->writeCell("MW");
     _p_writer->setCellAnnotation("number of amino acids");
     _p_writer->writeCell("size");
-    _p_writer->setCellAnnotation("number of scans (spectra) attributed to this protein");
-    _p_writer->writeCell("Spectra");
-    _p_writer->setCellAnnotation("number of scans (spectra) attributed to this protein and no other ones");
-    _p_writer->writeCell("Specific");
-    _p_writer->setCellAnnotation("number of unique peptide sequenceLI attributed to this protein");
-    _p_writer->writeCell("Uniques");
-    _p_writer->setCellAnnotation("number of unique peptide sequenceLI attributed to this protein and no other ones");
-    _p_writer->writeCell("Specific uniques");
+
+    writeCellHeader(ProteinListColumn::spectrum);
+    //_p_writer->setCellAnnotation("number of scans (spectra) attributed to this protein");
+    // _p_writer->writeCell("Spectra");
+    writeCellHeader(ProteinListColumn::specific_spectrum);
+
+    writeCellHeader(ProteinListColumn::sequence);
+
+    writeCellHeader(ProteinListColumn::specific_sequence);
     _p_writer->setCellAnnotation("number of unique peptidesequenceLI+modification+charge attributed to this protein (used to compute the PAI)");
     _p_writer->writeCell("Uniques peptide-mod-charge");
     _p_writer->setCellAnnotation("theoretical number of tryptic peptides used in the PAI computation");
     _p_writer->writeCell("Theoretical number of tryptic peptides");
-    _p_writer->setCellAnnotation("Protein Abundance Index as described by Rappsilber et al. 2002");
-    _p_writer->writeCell("PAI");
-    _p_writer->setCellAnnotation("Exponentially Modified Protein Abundance Index (emPAI) as described by Ishihama 2005");
-    _p_writer->writeCell("emPAI");
+
+    writeCellHeader(ProteinListColumn::pai);
+    writeCellHeader(ProteinListColumn::empai);
     //_p_writer->writeCell("spectral count AI");
     _p_writer->setCellAnnotation("number of proteins in the same subgroup");
     _p_writer->writeCell("Sub-group proteins");
@@ -124,68 +126,68 @@ void ProteinSheet::writeIdentificationGroup(IdentificationGroup * p_ident) {
 
 void ProteinSheet::writeOneProtein(const GroupingGroup * p_group, const ProteinMatch * p_protein_match) {
     try {
-    _p_writer->writeLine();
+        _p_writer->writeLine();
 
-    qDebug() << "ProteinSheet::writeOneProtein begin" ;
-    ValidationState validation_state = ValidationState::validAndChecked;
-
-    pappso::GrpProtein * p_grp_protein = p_protein_match->getGrpProteinSp().get();
-
-    ProteinXtp * p_protein = p_protein_match->getProteinXtpSp().get();
-
-    unsigned int group_number = p_grp_protein->getGroupNumber();
-    unsigned int subgroup_number = p_grp_protein->getSubGroupNumber();
-    _p_ods_export->setEvenOrOddStyle(group_number, _p_writer);
-    _p_writer->writeCell(pappso::Utils::getLexicalOrderedString(group_number));
-    _p_ods_export->setEvenOrOddStyle(subgroup_number, _p_writer);
-    _p_writer->writeCell(QString("%1.%2").arg(pappso::Utils::getLexicalOrderedString(group_number)).arg(pappso::Utils::getLexicalOrderedString(subgroup_number)));
-    _p_writer->clearTableCellStyleRef();
-    _p_writer->writeCell(p_grp_protein->getGroupingId());
-    _p_writer->writeCell(p_protein->getAccession());
-    _p_writer->writeCell(p_protein->getDescription());
-    _p_writer->writeCell(p_protein_match->getLogEvalue());
-    // _p_writer->writeCell("Coverage");
-    _p_writer->writeCell(p_protein_match->getCoverage());
-    // _p_writer->writeCell("MW");
-    _p_writer->writeCell(p_protein->getMass());
-    _p_writer->writeCell(p_protein->size());
-    // _p_writer->writeCell("Spectra");
-    _p_writer->writeCell(p_protein_match->countSampleScan(validation_state));
-
-    // _p_writer->writeCell("Specific");
-    _p_writer->writeCell((unsigned int) p_group->countSpecificSampleScan(p_protein_match, validation_state));
-
-    // _p_writer->writeCell("Uniques");
-    _p_writer->writeCell((unsigned int) p_protein_match->countSequenceLi(validation_state));
-
-    // _p_writer->writeCell("Specific uniques");
-    _p_writer->writeCell((unsigned int) p_group->countSpecificSequenceLi(p_protein_match, validation_state));
-
-
-    _p_writer->writeCell(p_protein_match->countPeptideMassCharge(validation_state));
-    qDebug() << "ProteinSheet::writeOneProtein tryptic" ;
-    _p_writer->writeCell(p_protein->countTrypticPeptidesForPAI());
-    // _p_writer->writeCell("PAI");
-    // _p_writer->writeCell(new Double((float) hashProt
-    // .getTotalHashSampleScan() / prot.get_PAI_count()));
-    _p_writer->writeCell(p_protein_match->getPAI());
-    // _p_writer->writeCell(match.getPAI());//this is the same
-    /*
-     * ancien PAI _p_writer->writeCell(new Double((float)
-     * top.get_spectra_numbers_to(sample) /
-     * top.get_protein_match().get_PAI_count()));
-     */
-    _p_writer->writeCell(p_protein_match->getEmPAI());
-
-    //_p_writer->writeCell(p_protein_match->getSpectralCountAI());
-
-    // _p_writer->writeCell("Redundancy");
-    _p_writer->writeCell(p_group->countProteinInSubgroup(p_grp_protein->getSubGroupNumber()));
-
-    //number of MS sample
-    _p_writer->writeCell(p_protein_match->countDistinctMsSamples(validation_state));
-    
-    qDebug() << "ProteinSheet::writeOneProtein end" ;
+        qDebug() << "ProteinSheet::writeOneProtein begin" ;
+        ValidationState validation_state = ValidationState::validAndChecked;
+
+        pappso::GrpProtein * p_grp_protein = p_protein_match->getGrpProteinSp().get();
+
+        ProteinXtp * p_protein = p_protein_match->getProteinXtpSp().get();
+
+        unsigned int group_number = p_grp_protein->getGroupNumber();
+        unsigned int subgroup_number = p_grp_protein->getSubGroupNumber();
+        _p_ods_export->setEvenOrOddStyle(group_number, _p_writer);
+        _p_writer->writeCell(pappso::Utils::getLexicalOrderedString(group_number));
+        _p_ods_export->setEvenOrOddStyle(subgroup_number, _p_writer);
+        _p_writer->writeCell(QString("%1.%2").arg(pappso::Utils::getLexicalOrderedString(group_number)).arg(pappso::Utils::getLexicalOrderedString(subgroup_number)));
+        _p_writer->clearTableCellStyleRef();
+        _p_writer->writeCell(p_grp_protein->getGroupingId());
+        _p_writer->writeCell(p_protein->getAccession());
+        _p_writer->writeCell(p_protein->getDescription());
+        _p_writer->writeCell(p_protein_match->getLogEvalue());
+        // _p_writer->writeCell("Coverage");
+        _p_writer->writeCell(p_protein_match->getCoverage());
+        // _p_writer->writeCell("MW");
+        _p_writer->writeCell(p_protein->getMass());
+        _p_writer->writeCell(p_protein->size());
+        // _p_writer->writeCell("Spectra");
+        _p_writer->writeCell(p_protein_match->countSampleScan(validation_state));
+
+        // _p_writer->writeCell("Specific");
+        _p_writer->writeCell((unsigned int) p_group->countSpecificSampleScan(p_protein_match, validation_state));
+
+        // _p_writer->writeCell("Uniques");
+        _p_writer->writeCell((unsigned int) p_protein_match->countSequenceLi(validation_state));
+
+        // _p_writer->writeCell("Specific uniques");
+        _p_writer->writeCell((unsigned int) p_group->countSpecificSequenceLi(p_protein_match, validation_state));
+
+
+        _p_writer->writeCell(p_protein_match->countPeptideMassCharge(validation_state));
+        qDebug() << "ProteinSheet::writeOneProtein tryptic" ;
+        _p_writer->writeCell(p_protein->countTrypticPeptidesForPAI());
+        // _p_writer->writeCell("PAI");
+        // _p_writer->writeCell(new Double((float) hashProt
+        // .getTotalHashSampleScan() / prot.get_PAI_count()));
+        _p_writer->writeCell(p_protein_match->getPAI());
+        // _p_writer->writeCell(match.getPAI());//this is the same
+        /*
+         * ancien PAI _p_writer->writeCell(new Double((float)
+         * top.get_spectra_numbers_to(sample) /
+         * top.get_protein_match().get_PAI_count()));
+         */
+        _p_writer->writeCell(p_protein_match->getEmPAI());
+
+        //_p_writer->writeCell(p_protein_match->getSpectralCountAI());
+
+        // _p_writer->writeCell("Redundancy");
+        _p_writer->writeCell(p_group->countProteinInSubgroup(p_grp_protein->getSubGroupNumber()));
+
+        //number of MS sample
+        _p_writer->writeCell(p_protein_match->countDistinctMsSamples(validation_state));
+
+        qDebug() << "ProteinSheet::writeOneProtein end" ;
     }
     catch (pappso::PappsoException error) {
         throw pappso::PappsoException(QObject::tr("Error writing protein %1 :\n%2").arg(p_protein_match->getProteinXtpSp().get()->getAccession()).arg(error.qwhat()));
diff --git a/src/output/ods/proteinsheet.h b/src/output/ods/proteinsheet.h
index d581e86e072518eb6448468b81796445d44ed553..c4782db5d258e1702f3fa98311fb4c4f778c2590 100644
--- a/src/output/ods/proteinsheet.h
+++ b/src/output/ods/proteinsheet.h
@@ -34,6 +34,7 @@
 #include <odsstream/calcwriterinterface.h>
 #include "../../core/proteinmatch.h"
 #include "odsexport.h"
+#include "../../gui/protein_list_view/proteintablemodel.h"
 
 class ProteinSheet
 {
@@ -44,6 +45,8 @@ private :
     void writeHeaders(IdentificationGroup * p_ident);
     void writeOneProtein(const GroupingGroup * p_group, const ProteinMatch * p_protein_match);
 
+protected:
+    void writeCellHeader(ProteinListColumn column);
 private :
   OdsExport * _p_ods_export;
     const Project * _p_project;