18 |
|
self.name_ = "PyMsXML" |
19 |
|
self.majorVer = 0 |
20 |
|
self.minorVer = 5 |
21 |
< |
self.revVer = 2 |
21 |
> |
self.revVer = 3 |
22 |
|
def version(self): |
23 |
|
return "%d.%d.%d"%(self.majorVer,self.minorVer,self.revVer) |
24 |
|
def name(self): |
1052 |
|
return "Quadrupole" |
1053 |
|
|
1054 |
|
def msDetector(self): |
1055 |
< |
return "LE" |
1055 |
> |
return None |
1056 |
|
|
1057 |
|
def acquisitionSoftware(self): |
1058 |
|
return "Analyst" |
1354 |
|
# Probably unnecessary |
1355 |
|
self.close() |
1356 |
|
|
1357 |
< |
def open(self): |
1357 |
> |
def read_metadata(self): |
1358 |
> |
|
1359 |
> |
h = open(self.filename,'rb') |
1360 |
> |
r = csv.reader(h,'excel-tab') |
1361 |
|
|
1362 |
< |
if self.deapp is None: |
1362 |
> |
self.metadata['PLATEDEF'] = [] |
1363 |
> |
self.metadata['PLATE'] = [] |
1364 |
> |
self.metadata['SPOT'] = [] |
1365 |
> |
self.metadata['SCAN'] = [] |
1366 |
|
|
1367 |
< |
self.metadata['PLATEDEF'] = [] |
1368 |
< |
self.metadata['PLATE'] = [] |
1369 |
< |
self.metadata['SPOT'] = [] |
1370 |
< |
self.metadata['SCAN'] = [] |
1371 |
< |
|
1372 |
< |
h = open(self.filename,'rb') |
1373 |
< |
r = csv.reader(h,'excel-tab') |
1374 |
< |
for l in r: |
1375 |
< |
if len(l) == 0: |
1376 |
< |
continue |
1377 |
< |
kw = l.pop(0).upper() |
1378 |
< |
if kw in ('PLATEDEF','PLATE','SPOT','SCAN'): |
1379 |
< |
self.metadata[kw].append({}) |
1380 |
< |
while len(l)>=2: |
1381 |
< |
k = l.pop(0);v = l.pop(0); |
1382 |
< |
if (kw == 'PLATE' and \ |
1383 |
< |
(k in ('plateID','spotXCount','spotYCount','plateManufacturer','plateModel'))) or \ |
1384 |
< |
(kw == 'PLATEDEF' and \ |
1385 |
< |
(k in ('plateID','plateManufacturer','plateModel','spotNaming','maldiMatrix'))) or \ |
1380 |
< |
(kw == 'SPOT' and \ |
1381 |
< |
(k in ('plateID','spotID','spotXPosition','spotYPosition','maldiMatrix'))) or \ |
1382 |
< |
(kw == 'SCAN' and \ |
1383 |
< |
(k in ('plateID','spotID','filename','index'))): |
1384 |
< |
self.metadata[kw][-1][k] = v |
1385 |
< |
elif k == '': |
1386 |
< |
break |
1387 |
< |
else: |
1388 |
< |
print >>sys.stderr,"Bad key %s for %s row"%(k,kw) |
1389 |
< |
sys.exit(1) |
1390 |
< |
h.close() |
1391 |
< |
|
1392 |
< |
for pd in self.metadata['PLATEDEF']: |
1393 |
< |
# insert all the gory details needed for a particular plate model etc... |
1394 |
< |
if pd['plateManufacturer'] == 'ABI / SCIEX' and pd['plateModel'] == '01-192+06-BB': |
1395 |
< |
if not pd.has_key('spotNaming') or not pd.has_key('maldiMatrix') or \ |
1396 |
< |
not pd['spotNaming'] in ('alpha','parallel','antiparallel'): |
1397 |
< |
print >>sys.stderr,"Bad plate definition, missing maldiMatrix or spotNaming, or bad spotNaming value." |
1398 |
< |
sys.exit(1) |
1399 |
< |
self.metadata['PLATE'].append({ |
1400 |
< |
'plateID':pd['plateID'], |
1401 |
< |
'plateManufacturer':pd['plateManufacturer'], |
1402 |
< |
'plateModel':pd['plateModel'], |
1403 |
< |
'spotXCount':24, |
1404 |
< |
'spotYCount':8, |
1405 |
< |
}) |
1406 |
< |
if pd['spotNaming'] == 'alpha': |
1407 |
< |
for y in xrange(0,8): |
1408 |
< |
for x in xrange(0,24): |
1409 |
< |
self.metadata['SPOT'].append({ |
1410 |
< |
'plateID':pd['plateID'], |
1411 |
< |
'spotID':"%c%d"%(y+ord('A'),x+1), |
1412 |
< |
'spotXPosition':x, |
1413 |
< |
'spotYPosition':2*y+(x%2), |
1414 |
< |
'maldiMatrix':pd['maldiMatrix'] |
1415 |
< |
}) |
1367 |
> |
for l in r: |
1368 |
> |
if len(l) == 0: |
1369 |
> |
continue |
1370 |
> |
kw = l.pop(0).upper() |
1371 |
> |
if kw in ('PLATEDEF','PLATE','SPOT','SCAN'): |
1372 |
> |
self.metadata[kw].append({}) |
1373 |
> |
while len(l)>=2: |
1374 |
> |
k = l.pop(0);v = l.pop(0); |
1375 |
> |
if (kw == 'PLATE' and \ |
1376 |
> |
(k in ('plateID','spotXCount','spotYCount','plateManufacturer','plateModel'))) or \ |
1377 |
> |
(kw == 'PLATEDEF' and \ |
1378 |
> |
(k in ('plateID','plateManufacturer','plateModel','spotNaming','maldiMatrix'))) or \ |
1379 |
> |
(kw == 'SPOT' and \ |
1380 |
> |
(k in ('plateID','spotID','spotXPosition','spotYPosition','maldiMatrix'))) or \ |
1381 |
> |
(kw == 'SCAN' and \ |
1382 |
> |
(k in ('plateID','spotID','filename','index'))): |
1383 |
> |
self.metadata[kw][-1][k] = v |
1384 |
> |
elif k == '': |
1385 |
> |
break |
1386 |
|
else: |
1387 |
< |
print >>sys.stderr,"Valid spotNaming value, not yet implemented." |
1387 |
> |
print >>sys.stderr,"Bad key %s for %s row"%(k,kw) |
1388 |
|
sys.exit(1) |
1389 |
+ |
h.close() |
1390 |
+ |
|
1391 |
+ |
for pd in self.metadata['PLATEDEF']: |
1392 |
+ |
# insert all the gory details needed for a particular plate model etc... |
1393 |
+ |
if pd['plateManufacturer'] == 'ABI / SCIEX' and pd['plateModel'] == '01-192+06-BB': |
1394 |
+ |
if not pd.has_key('spotNaming') or not pd.has_key('maldiMatrix') or \ |
1395 |
+ |
not pd['spotNaming'] in ('alpha','parallel','antiparallel'): |
1396 |
+ |
print >>sys.stderr,"Bad plate definition, missing maldiMatrix or spotNaming, or bad spotNaming value." |
1397 |
+ |
sys.exit(1) |
1398 |
+ |
self.metadata['PLATE'].append({ |
1399 |
+ |
'plateID':pd['plateID'], |
1400 |
+ |
'plateManufacturer':pd['plateManufacturer'], |
1401 |
+ |
'plateModel':pd['plateModel'], |
1402 |
+ |
'spotXCount':24, |
1403 |
+ |
'spotYCount':8, |
1404 |
+ |
}) |
1405 |
+ |
if pd['spotNaming'] == 'alpha': |
1406 |
+ |
for y in xrange(0,8): |
1407 |
+ |
for x in xrange(0,24): |
1408 |
+ |
self.metadata['SPOT'].append({ |
1409 |
+ |
'plateID':pd['plateID'], |
1410 |
+ |
'spotID':"%c%d"%(y+ord('A'),x+1), |
1411 |
+ |
'spotXPosition':x, |
1412 |
+ |
'spotYPosition':2*y+(x%2), |
1413 |
+ |
'maldiMatrix':pd['maldiMatrix'] |
1414 |
+ |
}) |
1415 |
+ |
else: |
1416 |
+ |
print >>sys.stderr,"Valid spotNaming value, not yet implemented." |
1417 |
+ |
sys.exit(1) |
1418 |
|
|
1419 |
< |
for pl in self.metadata['PLATE']: |
1420 |
< |
self.platespots[pl['plateID']] = [] |
1419 |
> |
for pl in self.metadata['PLATE']: |
1420 |
> |
self.platespots[pl['plateID']] = [] |
1421 |
|
|
1422 |
< |
for sp in self.metadata['SPOT']: |
1423 |
< |
self.platespots[sp['plateID']].append(sp) |
1422 |
> |
for sp in self.metadata['SPOT']: |
1423 |
> |
self.platespots[sp['plateID']].append(sp) |
1424 |
|
|
1425 |
< |
self.datafiles = [ (os.path.join(self.dir,md['filename']),int(md['index'])) for md in self.metadata['SCAN'] ] |
1426 |
< |
self.distinct_datafiles = dict([(os.path.join(self.dir,md['filename']), |
1427 |
< |
fileSHA(os.path.join(self.dir,md['filename']))) for md in self.metadata['SCAN']]) |
1428 |
< |
|
1429 |
< |
self.maptoscan = {} |
1430 |
< |
index = 0 |
1431 |
< |
for md in self.metadata['SCAN']: |
1432 |
< |
self.maptoscan[(os.path.join(self.dir,md['filename']),int(md['index']))] = index |
1433 |
< |
index += 1 |
1425 |
> |
self.datafiles = [ (os.path.join(self.dir,md['filename']),int(md['index'])) for md in self.metadata['SCAN'] ] |
1426 |
> |
self.distinct_datafiles = dict([(os.path.join(self.dir,md['filename']), |
1427 |
> |
fileSHA(os.path.join(self.dir,md['filename']))) for md in self.metadata['SCAN']]) |
1428 |
> |
|
1429 |
> |
self.maptoscan = {} |
1430 |
> |
index = 0 |
1431 |
> |
for md in self.metadata['SCAN']: |
1432 |
> |
self.maptoscan[(os.path.join(self.dir,md['filename']),int(md['index']))] = index |
1433 |
> |
index += 1 |
1434 |
> |
|
1435 |
> |
def make_metadata(self): |
1436 |
> |
self.deapp.Documents.Open(self.filename) |
1437 |
> |
doc = self.deapp.Documents.Item(0) |
1438 |
> |
sv = doc.SpecView |
1439 |
> |
nspectra = sv.TotalSpectrum; |
1440 |
> |
self.deapp.Documents.Close() |
1441 |
> |
self.remsettingsfile(self.filename) |
1442 |
> |
|
1443 |
> |
self.datafiles = [ (self.filename,i) for i in range(1,nspectra+1) ] |
1444 |
> |
self.distinct_datafiles = dict([ (self.filename, fileSHA(self.filename)) ]) |
1445 |
> |
self.maptoscan = {} |
1446 |
> |
for (f,i) in self.datafiles: |
1447 |
> |
self.maptoscan[(f,i)] = i |
1448 |
> |
|
1449 |
> |
def open(self): |
1450 |
> |
|
1451 |
> |
if self.deapp is None: |
1452 |
|
|
1453 |
|
from win32com.client import Dispatch, gencache |
1454 |
|
self.deapp = Dispatch('DataExplorer.Application', |
1463 |
|
except AttributeError: |
1464 |
|
pass |
1465 |
|
|
1466 |
+ |
try: |
1467 |
+ |
self.read_metadata() |
1468 |
+ |
except: |
1469 |
+ |
self.make_metadata() |
1470 |
|
|
1471 |
|
def close(self): |
1472 |
|
|
1560 |
|
}) |
1561 |
|
|
1562 |
|
scanindex = self.maptoscan[(f,i)] |
1563 |
< |
d.update({ |
1564 |
< |
'plateID':self.metadata['SCAN'][scanindex]['plateID'], |
1565 |
< |
'spotID':self.metadata['SCAN'][scanindex]['spotID'], |
1566 |
< |
}) |
1563 |
> |
if len(self.metadata['SCAN']) > 0: |
1564 |
> |
d.update({ |
1565 |
> |
'plateID':self.metadata['SCAN'][scanindex]['plateID'], |
1566 |
> |
'spotID':self.metadata['SCAN'][scanindex]['spotID'], |
1567 |
> |
}) |
1568 |
|
d.update({'scanOrigin.parentFileID:%s': self.distinct_datafiles[f], |
1569 |
|
'scanOrigin.num:%d': i}) |
1570 |
|
if msLevel == 1: |
1606 |
|
return "TOF" |
1607 |
|
|
1608 |
|
def msDetector(self): |
1609 |
< |
return "LE" |
1609 |
> |
return None |
1610 |
|
|
1611 |
|
def acquisitionSoftware(self): |
1612 |
|
return "DataExplorer" |
1621 |
|
return False |
1622 |
|
|
1623 |
|
def lc(self): |
1624 |
< |
return False |
1624 |
> |
return len(self.metadata['PLATE']) == 0 |
1625 |
|
|
1626 |
|
def maldi(self): |
1627 |
|
return not self.lc() |
1774 |
|
x = ToMzXML(r,o,opts.compress,filt,opts.compress_peaks,opts.version) |
1775 |
|
elif opts.xmlformat.lower() == 'mzdata': |
1776 |
|
x = ToMzData(r,o,opts.compress,filt) |
1777 |
< |
elif opts.output[-6:].lower() in ('.mzxml',): |
1777 |
> |
elif re.search(r'\.mzxml(\.gz)?$',opts.output,re.IGNORECASE): |
1778 |
|
x = ToMzXML(r,opts.output,opts.compress,filt,opts.compress_peaks,opts.version) |
1779 |
< |
elif opts.output[-7:].lower() in ('.mzdata',): |
1779 |
> |
elif re.search(r'\.mzdata(\.gz)?$',opts.output,re.IGNORECASE): |
1780 |
|
x = ToMzData(r,opts.output,opts.compress,filt) |
1781 |
|
else: |
1782 |
|
parser.error("Bad xml format specification.") |