QTc
iOS/macOS framework for QTc calculations
此 QTc 框架包含了用于 QTc 和 QTp 计算的众多公式,包括常见的和罕见的。它预期用于 iOS 和 macOS 程序中。它用 Swift 编写,但也可以用于 Objective C 项目中。此框架可以免费用于您自己的应用程序和程序中。用途包括设计简单的 QTc 计算器至医学研究中涉及计算的 QTc 和 QTp 间隔。有关此项目的更多背景信息,请参阅博客文章 Hacking the QTc。
安装
使用 Cocoapods 安装此框架。在安装 Cocoapods(有关如何安装,请参阅 Cocoapods 网站)后,将如下所示的 Podfile 添加到项目的根目录
# Set your target platform
platform :ios, '11.4'
target '<MyApp>' do
# Comment the next line if you're not using Swift and don't want to use dynamic frameworks
use_frameworks!
# Uncomment the line below to get the QTc pod from GitHub
#pod 'QTc', :git => 'https://github.com/mannd/QTc.git', :branch => 'master'
# Comment this line and uncomment the one above if you wish to get QTc from GitHub
pod 'QTc'
end
QTc 框架可在 cocoapods.org 获得。在 Podfile 中插入上面所示的 pod 'QTc'
将使用来自 cocoapods.org 的 QTc 版本。如果希望使用最新版本,请使用 pod 'QTc', :git => 'https://github.com/mannd/QTc.git', :branch => 'master'
这行代码。截至 3.3 版本的 QTc 框架使用 Swift 4.2。有关更多详细信息,请访问 cocoapods.org。
在项目目录中运行命令行以安装 pod
$ pod install
从那时起,使用 .xcworkspace 文件打开项目,而不是 .xcodeproj 文件。
使用框架
将此导入语句添加到使用此框架的任何Swift文件中
import QTc
与Objective-C文件一起使用时,请添加
#import <QTc/QTc-Swift.h>
公式
QTc和QTp公式根据Rabkin等人提出的标准命名法标注。《Rabkin等人》。正常情况下,QT间期随着心率的增加而缩短。QTc公式试图纠正QT间期以心率,并假设在60次/分钟的心率下QT = QTc。理想情况下,个体主体的QTc在不同心率下不会改变。QTp公式根据心率预测“正常”的QT。不要将QTp与在某些最近的研究中使用来指示纠正到T波峰而不是T波末端的同一术语混淆。多年来,已经开发了多种QTc和QTp公式。最常用的仍然是Bazett的1920年QTc公式,尽管它存在缺陷。
使用Formula
枚举选择QTc或QTp公式
public enum Formula {
// QTc formulas
case qtcBzt // Bazett
case qtcFrd // Fridericia
case qtcFrm // Framingham
case qtcHdg // Hodges
case qtcRtha // Rautaharju (2014)a
case qtcMyd // Mayeda
case qtcArr // Arrowood
case qtcKwt // Kawataki
// etc.
// QTp formulas
case qtpBzt // Bazett
case qtpFrd // Fridericia
// etc.
}
枚举FormulaType
区分QTc和QTp公式
public enum FormulaType {
case .qtc
case .qtp
}
您可以从Formula
获取FormulaType
let formulaType = Formula.qtcBzt.formulaType() // formulaType == FormulaType.qtc
计算器
简单方法
获取特定公式的计算器的最简单方法是使用此静态工厂类生成
let calculator = QTc.calculator(formula: .qtcBzt) // generates a Bazett QTc calculator (Swift)
Calculator calculator = [QTc calculatorWithFormula: Formula.qtcBzt]; // Qbjective C
以下大多数示例都给出为Swift代码。有关从Objective-C调用Swift函数的更多信息,请参阅Apple的参考。
这是一个QTp计算器
let calculator = QTc.calculator(formula: .qtpFrd) // Friedericia QTp calculator
QTc和QTp计算器的类型为QTcCalculator
和QTpCalculator
,是基类Calculator
的子类。使用这种方式生成的计算器计算QTc或QTp需要将一个QtMeasurement
结构传递给计算器。
QtMeasurement
QtMeasurement
结构体是一种方便的方法,可以封装计算 QTc 或 QTp 所必需的测量值。它定义为
public struct QtMeasurement {
public let qt: Double? // an optional, since QT not needed for QTp
public let intervalRate: Double // RR interval or HR
public let units: Units // may be .msec or .sec
public let intervalRateType: IntervalRateType // may be .bpm or .interval
public let sex: Sex = .unspecified // .male or .female, not required by many formulas
public let age: Int? = nil // may be nil as not always needed
}
单位可以是 .msec
或 .sec
,而 IntervalRateType
可以是 .bpm
或 .interval
(表示心率以每分钟跳动或 RR 间隔给出)。Sex
是 .male
、.female
或 .unspecified
(不是所有公式都需要性别或年龄)。使用 Bazett 公式计算 QTc 间隔的完整示例如下。
let qtMeasurement = QtMeasurement(qt: 367.0, intervalRate: 777.0, units: .msec, intervalRateType: .interval)
let qtcBztCalculator = QTc.calculator(formula: .qtcBzt)
let qtc = qtcBztCalculator.calculate(qtMeasurement) // qtc = 416.34711041
注意,如果 QtMeasurement
的单位是毫秒,计算器返回的结果也是毫秒;如果单位是秒,结果就是秒。
更多计算方式(又称不那么简单的方式)
如果您对处理 QTc 和 QTp 计算的通用计算对象不太感兴趣,则可以实例化特定的 QTc 和 QTp 计算器类。这些类不需要使用 QtMeasurement
结构体。您可以直接将秒或毫秒的参数传递给它们的计算方法。
例如
let qtcBztCalculator = QTc.qtcCalculator(formula: .qtcBzt) // Swift
QTcCalculator qtcBztCalculator = [QTc qtcCalculatorWithFormula: Formula.qtcBzt]; // Objective C
然后使用计算器计算 QTc
let qtcBzt = qtcBztCalculator.calculate(qtInSec: 0.334, rrInSec: 0.785) // Swift
double qtcBzt = [qtcBztCalculator calculateWithQtInSec: 0.334 rrInSec: 0.785]; // Objective C
计算函数
当使用 QTcCalculator
或 QTpCalculator
类时,每个计算函数有 4 种不同的签名,使用 sec 或 msec 表示 QT,RR 在 sec 或 msec 或心率(每分钟跳动数)。使用 msec 参数的函数返回 ms 的 QTc,而使用 sec 参数的函数返回 s 的 QTc。所有间隔/率参数在 Swift 中为 Double
,在 Objective C 中为 double
。例如
let qtcInMsec = qtcBztCalculator.calculate(qtInMsec: 402, rate 72) // returns QTc in msec
let qtcInSec = qtcBztCalculator.calculate(qtInSec: 0.402, rate 72) // returns QTc in sec
QTp 公式和根据性别和/或年龄确定的公式
QTp 方程式与 QTc 方程式相似,不同之处在于没有 QT 参数。计算 QTp 只需心率或 RR 间期。使用心率的 QTp 计算器返回 QTp 间期以秒为单位。
某些 QTc 和 QTp 方程式依赖于年龄和/或性别。在这种情况下,向调用函数添加性别:和/或年龄:参数。例如
let qtpBdl = QTc.qtpCalculator(formula: .qtpBdl)
let qtpInSec = qtpBdl.calculate(rrInSec: 77, sex: .male)
请注意,在这种情况下,公式使用性别但未使用年龄。如果您包含公式未使用的额外年龄或性别参数,则它们将被忽略。但是,未包含必需的参数将导致函数抛出异常(见下面)。
其他计算器变量和函数
您可以从计算器实例中获取其他信息,例如
let qtcCalculator = QTc.qtcCalculator(formula: .qtcBzt)
let longName = qtcCalculator.longName // "Bazett"
let shorName = qtcCalculator.shortName // "QTcBZT"
let reference = qtcCalculator.reference // literature reference in AMA style
let notes = qtcCalculator.notes // facts about this formula
let classification = qtcCalculator.classification // .power
// this is the type of mathematical equation: .power, .linear, .exponential, etc.
let date = qtcCalculator.publicationDate // year of publication
let numberOfSubjects = qtcCalculator.numberOfSubjects // number of subjects studied
正常值
正如有许多公式可以校准或预测 QT 间期一样,也有许多旨在定义正常 QTc 间期的建议。QTc 框架包含这些异常 QTc 定义的一些,以及相关的文献引用。
在 AbnormalQTc.swift 中的枚举 Criterion
列出了先前定义的 QTc 标准。
public enum Criterion: String {
case schwartz1985
case schwartz1993
case fda2005
case esc2005
// etc.
从 AbnormalQTc
中检索测试套件,并使用它来测试 QTc 是否正常。
// returns a QTcTestSuite? struct
if let testSuite = AbnormalQTc.qtcTestSuite(criterion: .schwartz1985)
let m = QTcMeasurement(qtc: 455, units: .msec, .sex: .male)
let severity = testSuite.severity(measurement: m) // == .abnormal
}
注意用于传递 QTc 以及其他参数(包括单位、性别和年龄,后两者为可选参数)的 struct QTcMeasurement
。结果以 struct Severity
的其中一个常量给出。这些常量是 .undefined
、.normal
、.borderline
、.abnormal
、.mild
、.moderate
、.severe
和 .error
。方法 Severity.isAbnormal() -> Bool
在结果为 .abnormal
、.mild
、.moderate
、.severe
或 .error
时返回 true。常量 .mild
、.moderate
和 .severe
用于延长 QTc 的 FDA 标准(.fda2005
)。更多信息请参阅 AbnormalQTc.swift 中的源代码。
QTp 间期按定义是正常的。Rabkin 等人提出,所有 QTp 公式之外的 QT 间期可能被视为异常,因为 QTp 公式涉及具有不同特征的大量患者。这个提议在此未实现,但在 EP QTc 演示应用中实现了(见下文)。
错误
数学错误
一些QTc和QTp公式在除以零或对负数进行分数幂运算时可能存在问题。这些有问题的输入参数不会被检查。当RR间隔为零时(通常),除以零将会得到Double.infinity
的值,而当QT和RR都为零时(通常),零除以自身或负数的分数根(如果RR为负)将会得到Double.nan
。因此,如果未对输入参数进行合理性检查,则需要按以下方式检查结果
let qtc = QTc.qtcCalculator(formula: .qtcBzt).calculate(qtInMsec: qt, rrInMsec: rr)
if qtc == Double.infinity || qtc.isNaN {
Error("Division by zero or root of negative number!")
return
} else {
// carry on
}
当然,另一个选择是永远不要将这些无效参数发送到公式中
if qt <= 0 || rr <= 0 {
Error("QT and RR can't be less than or equal to zero!")
return
} else {
let qtc = QTc.qtcCalculator(formula: .qtcBzt).calculate(qtInMsec: qt, rrInMsec: rr)
}
异常
计算方法在特定情况下可能会抛出异常。例如,如果您的QtMeasurement
结构中有一个nil的qt值,并将其传递给QTc计算器的计算方法,则会抛出CalculationError.qtMissing
异常。同样地,如果公式计算器需要提供一个性别参数而未提供,则会抛出CalculationError.sexRequired
异常。请参阅QTc.swift中的CalculationError
枚举以获取可能的异常的完整列表。请确保您的代码包含计算函数的异常处理。例如,
guard let qtc = try? calculator.calculate(qtInMsec: qt, rrInMsec: rr) else {
assertionFailure("Calculate threw an exception.")
}
print(String(format: "QTc = %.f", qtc))
转换函数
QTc框架包括静态函数,用于在秒、毫秒和心率之间进行常见转换,例如
let intervalInSec = 0.890
let intervalInMsec = QTc.secToMsec(intervalInSec) // = 890
let rate = QTc.msecToBpm(intervalInMsec) // = 67.41573
这些函数不会抛出异常,但与计算函数一样,除以零将会得到Double.infinity。
测试
QTc框架包含了众多单元测试以确认准确性。
贡献
如果您知道此处省略的QTc或QTp公式,应包含在内,请通过电子邮件[email protected]向我发送,或在Twitter (@manndmd)上联系我。
演示程序
EP QTc是一个演示程序,可在苹果应用商店下载。使用它,您可以一次性计算所有QTc和QTp公式,查看区间图,确定公式的统计数据,单独研究每个公式,总的来说,是一堆好玩的干净EP QT。
参考文献
请参阅文件Formulas.swift,获取参考文献的最新列表。
许可证
此QTc框架是开源的,受Apache许可证2.0版本许可。当通过iTunes App Store中的苹果设备使用时,将受标准苹果iOS许可协议约束。
著作权
著作权© 2017, 2018 EP Studios, Inc.
致谢
感谢Marian Stiehler帮助获取构成这些QTc和QTp公式基础的原始文献。
感谢加拿大不列颠哥伦比亚大学Simon Rabkin博士就QT间期问题与我进行通信,以及他和他团队在这篇关于大量QT公式的命名和分类的出色工作上所做的贡献,这些公式构成了该应用的基础和灵感。我也感谢多年来攻击QT间期问题的众多研究者们,他们试图用数学方法使自然的心率与复极化曲线趋于一致。
基于这篇有价值的Medium帖子创建了通用的框架模板。
作者
David Mann,医学博士