pymzml / pymzML

pymzML - an interface between Python and mzML Mass spectrometry Files
https://pymzml.readthedocs.io/en/latest/
MIT License
162 stars 92 forks source link

Fail for empty specs #132

Closed StSchulze closed 5 years ago

StSchulze commented 5 years ago

I recently started using the ThermoRawFileParser to generate mzML files. However, it seems like there can be empty spectra in these outputs (which doesn't seem to be the case for conversion with ProteoWizard). spec.peaks fails for these empty specs with the following error;

Traceback (most recent call last): File "do_it_all_folder_wide_PXD000202_new.py", line 328, in target_decoy_database = sys.argv[3], File "do_it_all_folder_wide_PXD000202_new.py", line 179, in main engine='mzml2mgf_2_0_0', File "/home/sschulze/analysis/ursgal/ucontroller.py", line 899, in convert output_file_name = output_file_name File "/home/sschulze/analysis/ursgal/ucontroller.py", line 351, in convert_to_mgf_and_update_rt_lookup force, engine_name, answer File "/home/sschulze/analysis/ursgal/ucontroller.py", line 2186, in run_unode_if_required json_path = json_path, File "/home/sschulze/analysis/ursgal/unode.py", line 1400, in run report['execution'] = self._execute() File "/home/sschulze/analysis/ursgal/wrappers/mzml2mgf_2_0_0.py", line 79, in _execute spec_id_attribute=self.params['translations']['pymzml_spec_id_attribute'], File "/home/sschulze/analysis/ursgal/resources/platform_independent/arc_independent/mzml2mgf_2_0_0/mzml2mgf_2_0_0.py", line 133, in main peaks_2_write = spec.peaks('centroided') File "/home/sschulze/analysis/pymzml/spec.py", line 990, in peaks mz_params = self._get_encoding_parameters('m/z array') File "/home/sschulze/analysis/pymzml/spec.py", line 197, in _get_encoding_parameters for cvParam in b_data_array.iterfind("./{ns}cvParam".format(ns = self.ns)): AttributeError: 'NoneType' object has no attribute 'iterfind'

I guess one could change _get_encoding_parameters() to return None for empty specs, but I'm not exactly sure how this would effect everything else!?

Byt the way, the empty spec looks like this:

<spectrum id="controllerType=0 controllerNumber=1 scan=10883" index="10882" defaultArrayLength="0">
        <cvParam cvRef="MS" accession="MS:1000511" value="2" name="ms level" />
        <cvParam cvRef="MS" accession="MS:1000580" value="" name="MSn spectrum" />
        <cvParam cvRef="MS" accession="MS:1000130" value="" name="positive scan" />
        <cvParam cvRef="MS" accession="MS:1000285" value="0" name="total ion current" />
        <cvParam cvRef="MS" accession="MS:1000504" value="0" name="base peak m/z" unitAccession="MS:1000040" unitName="m/z" unitCvRef="MS" />
        <cvParam cvRef="MS" accession="MS:1000505" value="0" name="base peak intensity" unitAccession="MS:1000131" unitName="number of detector counts" unitCvRef="MS" />
        <scanList count="1">
          <cvParam cvRef="MS" accession="MS:1000795" value="" name="no combination" />
          <scan instrumentConfigurationRef="IC2">
            <cvParam cvRef="MS" accession="MS:1000016" value="86.4864433333333" name="scan start time" unitAccession="UO:0000031" unitName="minute" unitCvRef="UO" />
            <cvParam cvRef="MS" accession="MS:1000512" value="ITMS + c NSI d w Full ms2 684.36@cid35.00 [175.00-1380.00]" name="filter string" />
            <cvParam cvRef="MS" accession="MS:1000927" value="200" name="ion injection time" unitAccession="UO:0000028" unitName="millisecond" unitCvRef="UO" />
            <userParam name="[Thermo Trailer Extra]Monoisotopic M/Z:" type="xsd:float" value="684.3646" />
            <scanWindowList count="1">
              <scanWindow>
                <cvParam cvRef="MS" accession="MS:1000501" value="175" name="scan window lower limit" unitAccession="MS:1000040" unitName="m/z" unitCvRef="MS" />
                <cvParam cvRef="MS" accession="MS:1000500" value="1380" name="scan window upper limit" unitAccession="MS:1000040" unitName="m/z" unitCvRef="MS" />
              </scanWindow>
            </scanWindowList>
          </scan>
        </scanList>
        <precursorList count="1">
          <precursor spectrumRef="controllerType=0 controllerNumber=1 scan=10882">
            <isolationWindow>
              <cvParam cvRef="MS" accession="MS:1000827" value="684.364562988281" name="isolation window target m/z" unitAccession="MS:1000040" unitName="m/z" unitCvRef="MS" />
              <cvParam cvRef="MS" accession="MS:1000828" value="0.5" name="isolation window lower offset" unitAccession="MS:1000040" unitName="m/z" unitCvRef="MS" />
              <cvParam cvRef="MS" accession="MS:1000829" value="0.5" name="isolation window upper offset" unitAccession="MS:1000040" unitName="m/z" unitCvRef="MS" />
            </isolationWindow>
            <selectedIonList count="1">
              <selectedIon>
                <cvParam cvRef="MS" accession="MS:1000744" value="684.364562988281" name="selected ion m/z" unitAccession="MS:1000040" unitName="m/z" unitCvRef="MS" />
                <cvParam cvRef="MS" accession="MS:1000041" value="2" name="charge state" />
              </selectedIon>
            </selectedIonList>
            <activation>
              <cvParam cvRef="MS" accession="MS:1000045" value="35" name="collision energy" unitAccession="UO:0000266" unitName="electronvolt" unitCvRef="UO" />
              <cvParam cvRef="MS" accession="MS:1000133" value="" name="collision-induced dissociation" />
            </activation>
          </precursor>
        </precursorList>
      </spectrum>
MKoesters commented 5 years ago

I hacked in a little fix and did one small test which worked. I'll do further testing before merging, but it would be nice if this works for you

StSchulze commented 5 years ago

Great, thanks, that seems to do the trick. At least this spectrum is not causing problems anymore. I'll let you know if some other issue related to this shows up.

MKoesters commented 5 years ago

Fixed with #133