ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/pymsxml/pymsxml.py
(Generate patch)
# Line 18 | Line 18
18          self.name_ = "PyMsXML"
19          self.majorVer = 0
20          self.minorVer = 5
21 <        self.revVer = 1
21 >        self.revVer = 3
22      def version(self):
23          return "%d.%d.%d"%(self.majorVer,self.minorVer,self.revVer)
24      def name(self):
# Line 1052 | Line 1052
1052          return "Quadrupole"
1053  
1054      def msDetector(self):
1055 <        return "LE"
1055 >        return None
1056  
1057      def acquisitionSoftware(self):
1058          return "Analyst"
# Line 1160 | Line 1160
1160              self.context = ':msRun'
1161          elif name == 'scanOrigin':
1162              self.scanmd['scanOrigin'] = attrs
1163 +        elif self.context.endswith(':scan:nameValue'):
1164 +            self.scanmd['nameValue.%s:%%s'%attrs['name']] = attrs['value']
1165              
1166      def characters(self, content):
1167          if self.scancount >= self.scanstart:
# Line 1171 | Line 1173
1173          if self.scancount >= self.scanstart:
1174              if self.context.endswith('scan:peaks'):
1175                  
1176 <                spec = array('f')
1176 >                self.spec = array('f')
1177                  # print >>sys.stderr, len(self.content), len(b64decode(self.content)), self.content
1178 <                spec.fromstring(b64decode(self.content))
1178 >                self.spec.fromstring(b64decode(self.content))
1179                  if sys.byteorder != 'big':
1180 <                    spec.byteswap()
1180 >                    self.spec.byteswap()
1181 >            elif self.context.endswith(':scan'):
1182                  d = {'msLevel':self.scanlevel}
1183                  # Optional ('scan.' and prefixformat spec. needed)
1184                  if hasattr(self,'rt'):
# Line 1190 | Line 1193
1193                      d.update({'precursorMz':self.precursorMz})
1194                  if self.scanmd.has_key('scanOrigin'):
1195                      d.update({'scanOrigin.parentFileID:%s': self.scanmd['scanOrigin']['parentFileID'],
1196 <                              'scanOrigin.num:%d': self.scanmd['scanOrigin']['num']})
1196 >                              'scanOrigin.num:%d': int(self.scanmd['scanOrigin']['num'])})
1197                  for (k,v) in self.scanmd.items():
1198                      if not d.has_key(k):
1199                          d[k] = v
1200 <                self.spectra.append((spec,d))
1200 >                self.spectra.append((self.spec,d))
1201                  if len(self.spectra) >= self.scanmax:
1202                      self.scanstart = self.scancount+1
1203                      raise SAXException("Early termination")
# Line 1351 | Line 1354
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 \
1377 <                           (kw == 'SPOT' and \
1378 <                            (k in ('plateID','spotID','spotXPosition','spotYPosition','maldiMatrix'))) or \
1379 <                           (kw == 'SCAN' and \
1380 <                            (k in ('plateID','spotID','filename','index'))):
1381 <                            self.metadata[kw][-1][k] = v
1382 <                        elif k == '':
1383 <                            break
1384 <                        else:
1385 <                            print >>sys.stderr,"Bad key %s for %s row"%(k,kw)
1386 <                            sys.exit(1)
1387 <            h.close()
1388 <
1389 <            for pd in self.metadata['PLATEDEF']:
1390 <                # insert all the gory details needed for a particular plate model etc...
1391 <                if pd['plateManufacturer'] == 'ABI / SCIEX' and pd['plateModel'] == '01-192+06-BB':
1392 <                    if not pd.has_key('spotNaming') or not pd.has_key('maldiMatrix') or \
1393 <                       not pd['spotNaming'] in ('alpha','parallel','antiparallel'):
1394 <                        print >>sys.stderr,"Bad plate definition, missing maldiMatrix or spotNaming, or bad spotNaming value."
1395 <                        sys.exit(1)
1396 <                    self.metadata['PLATE'].append({
1397 <                        'plateID':pd['plateID'],
1398 <                        'plateManufacturer':pd['plateManufacturer'],
1399 <                        'plateModel':pd['plateModel'],
1400 <                        'spotXCount':24,
1401 <                        'spotYCount':8,
1402 <                        })
1403 <                    if pd['spotNaming'] == 'alpha':
1404 <                            for y in xrange(0,8):
1405 <                                for x in xrange(0,24):
1406 <                                    self.metadata['SPOT'].append({
1407 <                                        'plateID':pd['plateID'],
1408 <                                        'spotID':"%c%d"%(y+ord('A'),x+1),
1409 <                                        'spotXPosition':x,
1410 <                                        'spotYPosition':2*y+(x%2),
1411 <                                        'maldiMatrix':pd['maldiMatrix']
1412 <                                        })
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 pl in self.metadata['PLATE']:
1392 <                self.platespots[pl['plateID']] = []
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 sp in self.metadata['SPOT']:
1420 <                self.platespots[sp['plateID']].append(sp)
1419 >        for pl in self.metadata['PLATE']:
1420 >            self.platespots[pl['plateID']] = []
1421  
1422 <            self.datafiles = [ (os.path.join(self.dir,md['filename']),int(md['index'])) for md in self.metadata['SCAN'] ]
1423 <            self.distinct_datafiles = dict([(os.path.join(self.dir,md['filename']),
1424 <                                            fileSHA(os.path.join(self.dir,md['filename']))) for md in self.metadata['SCAN']])
1425 <
1426 <            self.maptoscan = {}
1427 <            index = 0
1428 <            for md in self.metadata['SCAN']:
1429 <                self.maptoscan[(os.path.join(self.dir,md['filename']),int(md['index']))] = index
1430 <                index += 1
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
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',
1455                                    resultCLSID='{3FED40F1-D409-11D1-8B56-0060971CB54B}')
1456              self.delib = gencache.EnsureModule('{06972F50-13F6-11D3-A5CB-0060971CB54B}',0,4,2)
1457 <            self.deapp.AutomatedProcessing = 1
1458 <            self.deapp.Visible             = 0
1457 >            try:
1458 >                self.deapp.AutomatedProcessing = 1
1459 >            except AttributeError:
1460 >                pass
1461 >            try:
1462 >                self.deapp.Visible = 0
1463 >            except AttributeError:
1464 >                pass
1465 >            
1466 >            try:
1467 >                self.read_metadata()
1468 >            except:
1469 >                self.make_metadata()
1470  
1471      def close(self):
1472  
# Line 1479 | Line 1510
1510              doc = self.deapp.Documents.Item(0)
1511              sv = doc.SpecView
1512  
1513 +            if i > sv.TotalSpectrum:
1514 +                prevfile = f
1515 +                continue
1516 +            
1517              sv.SetSpectrumAt(i-1)
1518  
1519              (tf,fixedMass) = doc.InstrumentSettings.GetSetting(self.delib.constants.dePreCursorIon,i-1,None)
# Line 1525 | Line 1560
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:
# Line 1570 | Line 1606
1606          return "TOF"
1607  
1608      def msDetector(self):
1609 <        return "LE"
1609 >        return None
1610  
1611      def acquisitionSoftware(self):
1612          return "DataExplorer"
# Line 1585 | Line 1621
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()
# Line 1738 | Line 1774
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.")

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines