From fb6c876aa2b186d3dd67ab73c590688621644800 Mon Sep 17 00:00:00 2001
From: Stefan Bienert <stefan.bienert@unibas.ch>
Date: Thu, 6 Sep 2018 11:15:54 +0200
Subject: [PATCH] Use book publisher info in mmCIF reader

---
 modules/io/src/mol/mmcif_reader.cc    | 12 ++++++++++++
 modules/io/src/mol/mmcif_reader.hh    |  2 ++
 modules/io/tests/test_mmcif_reader.cc | 10 ++++++++++
 3 files changed, 24 insertions(+)

diff --git a/modules/io/src/mol/mmcif_reader.cc b/modules/io/src/mol/mmcif_reader.cc
index 1bd0011c8..213e6e922 100644
--- a/modules/io/src/mol/mmcif_reader.cc
+++ b/modules/io/src/mol/mmcif_reader.cc
@@ -191,6 +191,8 @@ bool MMCifReader::OnBeginLoop(const StarLoopDesc& header)
     indices_[ABSTRACT_ID_CAS]         = header.GetIndex("abstract_id_CAS");
     indices_[BOOK_ID_ISBN]            = header.GetIndex("book_id_ISBN");
     indices_[BOOK_TITLE]              = header.GetIndex("book_title");
+    indices_[BOOK_PUBLISHER]          = header.GetIndex("book_publisher");
+    indices_[BOOK_PUBLISHER_CITY]     = header.GetIndex("book_publisher_city");
     indices_[JOURNAL_ABBREV]          = header.GetIndex("journal_abbrev");
     indices_[YEAR]                    = header.GetIndex("year");
     indices_[TITLE]                   = header.GetIndex("title");
@@ -816,6 +818,16 @@ void MMCifReader::ParseCitation(const std::vector<StringRef>& columns)
       // the journal_abbrev attribute.
       cit.SetPublishedIn(columns[indices_[BOOK_TITLE]].str());
       cit.SetCitationTypeBook();
+      
+      // In theory, book_publisher and book_publisher_city are only set for
+      // books and book chapters, so we only try to fetch them if the citation
+      // type points to book.
+      if (indices_[BOOK_PUBLISHER] != -1) {
+        cit.SetBookPublisher(columns[indices_[BOOK_PUBLISHER]].str());
+      }
+      if (indices_[BOOK_PUBLISHER_CITY] != -1) {
+        cit.SetBookPublisherCity(columns[indices_[BOOK_PUBLISHER_CITY]].str());
+      }
     }
   }
   if (indices_[JOURNAL_VOLUME] != -1) {
diff --git a/modules/io/src/mol/mmcif_reader.hh b/modules/io/src/mol/mmcif_reader.hh
index edd249f38..fa747a2ab 100644
--- a/modules/io/src/mol/mmcif_reader.hh
+++ b/modules/io/src/mol/mmcif_reader.hh
@@ -400,6 +400,8 @@ private:
     ABSTRACT_ID_CAS,              ///< CAS identifier
     BOOK_ID_ISBN,                 ///< ISBN code assigned, if book cited
     BOOK_TITLE,                   ///< title of book storing the citation
+    BOOK_PUBLISHER,               ///< name of publisher f a book
+    BOOK_PUBLISHER_CITY,          ///< location of a publisher of a book
     JOURNAL_ABBREV,               ///< abbreviated journal title for articles
     JOURNAL_VOLUME,               ///< volume of cited journal
     PAGE_FIRST,                   ///< first page of citation
diff --git a/modules/io/tests/test_mmcif_reader.cc b/modules/io/tests/test_mmcif_reader.cc
index 233403c61..682e43c31 100644
--- a/modules/io/tests/test_mmcif_reader.cc
+++ b/modules/io/tests/test_mmcif_reader.cc
@@ -583,14 +583,18 @@ BOOST_AUTO_TEST_CASE(mmcif_citation_tests)
   tmmcif_h.SetCategory(StringRef("citation", 8));
   tmmcif_h.Add(StringRef("id", 2));
   tmmcif_h.Add(StringRef("year", 4));
+  tmmcif_h.Add(StringRef("book_publisher_city", 19));
   tmmcif_h.Add(StringRef("book_title", 10));
+  tmmcif_h.Add(StringRef("book_publisher", 14));
   tmmcif_h.Add(StringRef("journal_abbrev", 14));
   tmmcif_p.OnBeginLoop(tmmcif_h);
 
   // ensure that we use book_title if no journal given (no RCSB use of this)
   columns.push_back(StringRef("Foo", 3));
   columns.push_back(StringRef("1979", 4));
+  columns.push_back(StringRef("The restaurant", 14));
   columns.push_back(StringRef("The Guide", 9));
+  columns.push_back(StringRef("Doug", 4));
   columns.push_back(StringRef(".", 1));
 
   BOOST_CHECK_NO_THROW(tmmcif_p.ParseCitation(columns));
@@ -598,12 +602,16 @@ BOOST_AUTO_TEST_CASE(mmcif_citation_tests)
   BOOST_CHECK_EQUAL(cit.GetID(), String("Foo"));
   BOOST_CHECK_EQUAL(cit.GetYear(), 1979);
   BOOST_CHECK_EQUAL(cit.GetPublishedIn(), String("The Guide"));
+  BOOST_CHECK_EQUAL(cit.GetBookPublisher(), String("Doug"));
+  BOOST_CHECK_EQUAL(cit.GetBookPublisherCity(), String("The restaurant"));
   BOOST_CHECK_EQUAL(cit.IsCitationTypeBook(), true);
 
   // ensure that we override book_title if not properly given
   columns.pop_back();
   columns.pop_back();
+  columns.pop_back();
   columns.push_back(StringRef(".", 1));
+  columns.push_back(StringRef("Doug", 4));
   columns.push_back(StringRef("Hitch", 5));
 
   BOOST_CHECK_NO_THROW(tmmcif_p.ParseCitation(columns));
@@ -613,7 +621,9 @@ BOOST_AUTO_TEST_CASE(mmcif_citation_tests)
   // ensure that we override journal if book_title given
   columns.pop_back();
   columns.pop_back();
+  columns.pop_back();
   columns.push_back(StringRef("The Guide", 9));
+  columns.push_back(StringRef("Doug", 4));
   columns.push_back(StringRef("Hitch", 5));
 
   BOOST_CHECK_NO_THROW(tmmcif_p.ParseCitation(columns));
-- 
GitLab