OpenMS / OpenMS

The codebase of the OpenMS project
https://www.openms.de
Other
478 stars 314 forks source link

Ion Mobility 1/k0 to CCS #6685

Open timosachsenberg opened 1 year ago

timosachsenberg commented 1 year ago

Currently, we only have a DriftTimeType VCCS (==1/k0). It seems to be common to convert 1/k0 to CCS using the formula: CCS=((2*pi/(((mz*charge)*28.0134/(mz*charge+28.0134)*1.66053904*(10^(-27)))*1.38064852*(10^(-23))*(305)))^0.5)*(IM*1.6021766208*(10^(-19))/(2.6867811*(10^25)))*3/16*10000*(10^20)*charge)

Can/how should we store this?

timosachsenberg commented 1 year ago

I dug a bit deeper into it and this is vendor dependent. Vor Bruker we can use these calculations/constants: https://github.com/MannLabs/alphabase/blob/main/alphabase/constants/const_files/common_constants.yaml#L4-L9 https://github.com/MannLabs/alphabase/blob/81db1ba243694f5de40d40073d095211a309f73f/alphabase/peptide/mobility.py#L10-L25

timosachsenberg commented 1 year ago

If I apply this to 1/k0 (VSSC) values I get CCS values in the range 200-800.

  void convertVSSCToCCS(MSExperiment& spectra)
  {
    OPENMS_LOG_INFO << "Converting 1/k0 to CCS values." << std::endl;
    const double bruker_CCS_coef = 1059.62245; // constant coefficient for Bruker in the Mason-Schamp equation
    const double IM_N2_gas_mass = 28;

    for (auto& s : spectra)
    {
      double IM = s.getDriftTime();
      double mz = s.getPrecursors()[0].getMZ();
      double charge = s.getPrecursors()[0].getCharge();
      double mass = mz * charge;
      double reduced_mass = mass * IM_N2_gas_mass / (mass + IM_N2_gas_mass);
      double CCS = IM * charge * bruker_CCS_coef / std::sqrt(reduced_mass); // Mason-Schamp equation
      s.setDriftTime(CCS);
    }
  }
timosachsenberg commented 1 year ago

k I was able to confirm this with alpha and MaxQuant output. I think this could be added specifically for bruker data

timosachsenberg commented 1 year ago

@cbielow

PierreSnell commented 1 year ago

Hello @timosachsenberg,

From this PR https://github.com/OpenMS/OpenMS/pull/6941 does that mean we got the drift time Ion Mobility from get_ion_df and would need to compute the formula above to get the CCS ?

If yes I can do another PR to add a column to get the IM and the CCS (as the later is more comparable across machines and experiments).

timosachsenberg commented 1 year ago

Yes this is correct. I think this is a sensible addition but I don’t know how non-bruker IM data would need to be converted. @jcharkow can you comment here?

jcharkow commented 1 year ago

I think this sounds reasonable. I am not too familiar with getting CCS for other instruments. I think that sometimes CCS is computed with internal calibrants with known CCS values? However usually I just work with the 1/k0 values.