QTc 3.5

QTc 3.5

David Mann 维护。



QTc 3.5

QTc

Version Build Status

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计算器的类型为QTcCalculatorQTpCalculator,是基类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

计算函数

当使用 QTcCalculatorQTpCalculator 类时,每个计算函数有 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,医学博士

邮箱: [email protected] 网站:https://www.epstudiossoftware.com