source: trunk/id-mapper/crossreftitles.py @ 6

Last change on this file since 6 was 6, checked in by rob.hooft@…, 6 years ago

first cut at the pmid2doi upfdater

File size: 4.6 KB
Line 
1# Use the crossref titleFile to make sure they have information about a journal/year.
2# coding=utf-8
3
4def _update():
5    # Make sure the latest version of the title file is local
6    import os
7    os.system('wget -N http://www.crossref.org/titlelist/titleFile.csv')
8
9def _cUpdate():
10    # update the title file, but only once per day at the most
11    import os
12    import time
13    if not os.path.exists('titleFile.csv') or os.stat('titleFile.csv').st_ctime < time.time() - 86400:
14        _update()
15
16_cUpdate()
17
18_fixup = {
19    'science (new york, n.y.)': 'science',
20    'zeitschrift f\xfcr parasitenkunde (berlin, germany)': 'zeitschrift f\xfcr parasitenkunde parasitology research',
21    'proceedings of the national academy of sciences of the united states of america': 'proceedings of the national academy of sciences'
22    }
23
24def _titleclean(title):
25    title = title.lower()
26    if title.startswith('the '):
27        title = title[4:]
28    title = title.replace(' & ',' and ')
29    if _fixup.has_key(title):
30        title = _fixup[title]
31    for separ in (' (', ' : ',': ',' / ',' = '):
32        if separ in title:
33            title = title.split(separ)[0]
34    return title
35
36def _load():
37    import csv
38    import re
39    global _j
40    global _bbav
41    global _mrv
42
43    Ry=re.compile('\((\d\d\d\d)\)')
44    Rv=re.compile('\[(\d+)\]')
45    r = csv.reader(open('titleFile.csv'))
46    _j = {}
47    _bbav = {}
48    _mrv = {}
49    for row in r:
50        k = _titleclean(row[0])
51        v = map(int,Ry.findall(row[5]))
52        if _j.has_key(k):
53            # Two publishers with the same journal name? See "Journal of Allergy"
54            _j[k].extend(v)
55        else:
56            _j[k] = v
57        if row[0].lower().startswith('biochimica et biophysica acta'):
58            for vol in Rv.findall(row[5]):
59                if not vol in _bbav:
60                    _bbav[vol]=[row[0]]
61                elif not row[0] in _bbav[vol]:
62                    _bbav[vol].append(row[0])
63        if row[0].lower().startswith('mutation research'):
64            for vol in Rv.findall(row[5]):
65                if not vol in _mrv:
66                    _mrv[vol]=[row[0]]
67                elif not row[0] in _mrv[vol]:
68                    _mrv[vol].append(row[0])
69
70_load()
71
72def lookup(journal):
73    journal = _titleclean(journal)
74    return journal in _j
75
76def lookup2(journal, date):
77    if hasattr(date, 'year'):
78        date = date.year
79    if type(date) == type(''):
80        date = int(date[:4])
81    journal = _titleclean(journal)
82    if not journal in _j:
83        return False
84    if not date in _j[journal]:
85        return False
86    return True
87
88def bbatitles(volume):
89    try:
90        return _bbav[volume]
91    except KeyError:
92        return []
93
94def mrtitles(volume):
95    try:
96        return _mrv[volume]
97    except KeyError:
98        return []
99
100_once = set()
101
102def _test(fn, cursor):
103    import re
104    import map_pmid_2_doi_crossref_continuous as pmap
105
106    R = re.compile('Mapped (\d+)')
107    for line in open(fn):
108        m = R.search(line)
109        if m:
110            pmid = m.group(1)
111            cursor.execute('select journal_title,pub_date from '
112                           '%s.medline_citation where pmid=%s limit 1;' % 
113                             (pmap.config.mysql('db_medline'), pmid))
114            row = cursor.fetchone()
115            if not lookup(row[0], row[1]):
116                if not row[0] in _once:
117                    sys.stderr.write('Failed to find %s: %s %s\n' % (pmid, repr(row[0]), row[1]))
118                    _once.add(row[0])
119                #sys.exit(1)
120
121def _testall():
122    import glob
123    import map_pmid_2_doi_crossref_continuous as pmap
124    conn = pmap.opendb()
125    cursor = conn.cursor()
126    for fn in glob.glob('run.log*'):
127        print "Testing %s" % fn
128        _test(fn, cursor)
129
130if __name__ == "__main__":
131    import os
132    import sys
133    if len(sys.argv) > 1:
134        if len(sys.argv) == 2 and sys.argv[1] == 'test':
135            _testall()
136            sys.exit(0)
137        sys.stderr.write("Only accept 'test' argument, or no argument at all\n")
138        sys.exit(1)
139    # Without argument, check the contents of the unmapped database   
140    import map_pmid_2_doi_crossref_continuous as pmap
141    n = 0
142    nfound = 0
143    conn = pmap.opendb()
144    cursor = conn.cursor()
145    cursor.execute('select journal_title,pub_date from %s;' % pmap.inputTable)
146    row = cursor.fetchone()
147    while row:
148        n += 1
149        if lookup(row[0], row[1]):
150            nfound += 1
151        row = cursor.fetchone()
152        if n%1000000 == 0:
153            print "Only %d out of a total of %d have a chance of being found" % (nfound, n)
154    print "Only %d out of a total of %d have a chance of being found" % (nfound, n)
155
Note: See TracBrowser for help on using the repository browser.