bsc

forside

dtuheader.png

Rasmus Berg Palm
Simon Ezban Grützmeier

Klinisk brugbar bestemmelse af hjertets minutvolumen ved indikatorfortyndingsmetoden

Bachelorprojekt

dtufooter.png

Klinisk brugbar bestemmelse af hjertets minutvolumen ved
indikatorfortyndingsmetoden

Rapporten er udarbejdet af:
Rasmus Berg Palm
Simon Ezban Grützmeier

Vejledere:
Kaj-Åge Henneberg
Frank Pott

DTU Elektro
Danmarks Tekniske Universitet
2800 Kgs. Lyngby
Denmark
kd.utd.ortkele|noitartsinimdaeiduts#kd.utd.ortkele|noitartsinimdaeiduts

Projektperiode: 02. feb 2009 - 01. jun 2009
ECTS: 15
Uddannelse: Bachelor
Retning: Medicin og Teknologi
Klasse: Offentlig
Udgave: 1. udgave
Bemærkninger: Denne rapport er indleveret som led i opfyldelse af kravene til ovenstående uddannelse på Danmarks Tekniske Universitet.
Rettigheder: © Rasmus Berg Palm og Simon Ezban Grützmeier, 2009

sig.bmp

Abstract

The Cardiac Output is an important diagnostic parameter, which is difficult to measure clinically. Today the cardiac output is primarily determined through the insertion of a Swan-Ganz catheter. Performing this procedure has inherent risks of complications, and is only performed when knowing the parameter is an absolute necessity. The indicator dilution method is a less invasive way of obtaining cardiac output, and it is widely recognized. Bispebjerg Hospital intensive care unit has utilized this method for research and is now hoping to expand this to clinical usage as well. So far this has not been a possibility due to long data processing time. Several days could pass before a cardiac output could be calculated from the retrieved data. The intensive care unit has therefore requested a software and hardware solution which could reduce data processing time and obtain cardiac output in real time. By doing this using existing hardware, costs for new equipment could be cut and the developed software could be modified for other uses, for example the measurement of tissue flow, which their research unit also has been engaged in.

In this paper these problems were adressed by developing software, setting up hardware and performing measurements to confirm the clinical validity of these solutions. Specifically a test of reproducibility and a Bland-Altman test were performed on prerecorded data, and measurements were obtained from a test model, which was able to simulate in vivo measurements with known flow. The reproducibility test and the Bland-Altman analysis was compared with software already developed by the research unit.

The developed software, named CORA, worked satisfactory in every aspect. It determined a cardiac output on all prerecorded data, as well as all measurements taken on the test model. A difference between results obtained from CORA and the provided software was observed, and 95 % of the results CORA produced was within -3.1 L/min to 2.7 L/min that of the provided software. This has to be viewed in context with the prerecorded data average cardiac output of 16 L/min.

It was found that neither CORA nor the provided software was dependent on the operator. CORA was shown to have a smaller variance within the same measurement. Specifically CORA had a 95 % confidence interval of $\pm$ 1.69 L/min and the provided software had $\pm$ 1.92 L/min. It wasn’t possible to determine the known flow during measurements on the test model. Whether this was due to faults in hardware or inherent in the test model couldn’t be determined. Explanations for this were proposed.

It is concluded that CORA and appertaining hardware presents a significant improvement in relation to former software and hardware used by the intensive care unit. A series of suggestions of improvements that will increase clinical applicability are proposed, and a theory for the calculation of the pulmonary blood volume from the measurements is presented as well

Resume

Hjertets minutvolumen er en vigtig diagnostisk parameter der er svært tilgængelig i klinikken. I dag bestemmes hjertets minutvolumen fortrinsvis ved anlæggelse af pulmonalt arteriekateter. Dette invasive indgreb medfører risiko for komplikationer og tages derfor kun i brug i tilfælde hvor det regnes for absolut nødvendigt at kende parameteren. Indikatorfortyndingsmetoden er en mindre invasiv metode til at bestemme denne parameter, som efterhånden anerkendes bredt. Bispebjerg Hospitals intensivafdeling har beskæftiget sig med metoden i forskningssammenhænge, og ønsker nu at udvide dette til klinikken. Den benyttede metode har hidtil været klinisk uanvendelig på grund af lang databehandlingstid. Således kunne der gå flere dage fra opsamlingen af data, til at et resultat forelå. Afdelingen har derfor udtrykt ønske om at være i besiddelse af software med tilhørende hardwareopstilling der kunne reducere den nuværende databehandlingstid og udregne hjertets minutvolumen i reel tid. Ved at gøre dette ved hjælp af eksisterende hardware kunne omkostninger til nyt apparatur spares ligesom det udviklede software kunne modificeres til andre formål, for eksempel til måling af vævsgennemblødning, hvilket afdelingen også beskæftigede sig med.

Denne rapport griber disse problemer an ved at udvikle software, opstille hardware og foretage målinger for at bekræfte disses kliniske anvendelighed. Specifikt blev der foretaget en reproducibilitetstest og Blandt-Altman test på tidligere optagede data og foretaget målinger på en forsøgsmodel, der kunne simulere in vivo målinger, med kendt flow. Under reproducibilitetstesten og Blandt-Altman blev der sammenlignet med software allerede udviklet af afdelingen.

Det udviklede software, navngivet CORA, fungerede tilfredsstillende i alle henseender. Det fandt således minutvolumen på alt udleveret data samt på alle målinger på modellen. Der blev observeret en forskel mellem CORA og det udleverede software således at et 95% konfidensinterval for CORAs resultater er -3.1 L/min til 2.7 L/min af det udleverede softwares resultater. Dette skal sammenholdes med at det gennemsnitlige minutvolumen på de udlevere data var ca. 16 L/min.

Det blev fundet at hverken det udleverede software eller CORA var afhængigt af valget af operatør. Derimod blev det vist at CORA udviste mindre varians inden for samme måling. Specifikt havde CORA et 95% konfidensinterval på $\pm$ 1.69 L/min og for det udleverede software var det $\pm$1.92 L/min. Det var ikke muligt at finde det kendte flow under forsøg foretaget på modellen i alle tilfælde. Hvorvidt dette skyldes fejl i modellen eller i hardware og opsætning kunne ikke bestemmes. Der blev udarbejdet forklaringsmodeller for de afvigende målinger.

Det konkluderes at CORA og tilhørende hardwareløsning repræsenterer en væsentlig forbedring i forhold til eksisterende løsninger. En række forslag til forbedringer i retning af klinisk brugbarhed fremføres og en teori til udregning af det pulmonære blodvolumen ud fra målingerne præsenteres.

Forord

Vi vil gerne rette en stor tak til vores vejledere, Kaj-Åge Henneberg og Frank Pott. Uden deres input var nærværende rapport ikke tilblevet.
Tak til Klaus Kaae Andersen for hjælp med hensyn til statistiske udregninger.
Derudover en speciel tak til Hans Christian Müller-Thorsen, som bidrog med mange gode ideer og hjælp med hensyn til forsøgsmodellen.
Sidst men ikke mindst en tak til Robert Boushel, hvis ekspertise på området har været uvurderlig.

Indholdsfortegnelse

Introduktion

Hjertets minutvolumen er en vigtig diagnostisk parameter, blandt andet i forbindelse med væskebehandling, der hidtil har været svært tilgængelig i klinikken. Undertiden må en patient på operationsbordet for at få udført en måling af hjertets minutvolumen ved en invasiv og besværlig procedure. At målingen bliver gennemført trods metodens besvær vidner om dens kliniske relevans og hvor vigtigt udvikling i retning af klinisk brugbare målemetoder er.

Metoder til foretagelse af målinger har hidtil være uhensigtsmæssige. Som eksempel kræver både thermo dilution og Ficks metode anlæggelsen af pulmonalt arteriekateter, et såkaldt Swan-Ganz kateter, hvilket er et indgreb, der potentielt kan give komplikationer [8]. Der findes mange andre metoder, der ikke dækkes her, men det må konstateres at ingen af disse har fundet bred anvendelse i den kliniske dagligdag [18].

Indikatorfortyndingsmetoden er efterhånden blevet en bredt anerkendt metode til måling af hjertets minutvolumen. Metoden kræver perifer arteriel og venøs adgang og kan i princippet udføres ved patientens seng på et par minutter. Bispebjerg hospitals intensivafdeling har i en årrække beskæftiget sig med denne metode på forskningsmæssigt niveau og har i forbindelse hermed ønsket at forbedre deres metode, hardware og software i retning af at gøre metoden klinisk brugbar. Specielt manglen på betjeningsvenlig software har været en blokering for yderligere udvikling og forskning eftersom resultater fra målinger først kunne findes efter betydelig offline databehandling.

I dette projekt opstilles software og hardware til at foretage denne databehandling i reel tid således at hjertets minutvolumen hurtigt kan findes ud fra målingerne. Ydermere undersøges metoden til foretagelse af målingerne med henblik på at opstille nogle forslag til optimering i retning af klinisk brugbarhed.

Projektet afgrænses til følgende.

  • Udvikling af systemkoncept og implementering af software til klinisk anvendelig reel tids måling af hjertets minutvolumen ved hjælp af indikatorfortyndingsmetoden.
  • Design og implementering af en forsøgsopstilling til analyse af systemets performance og betjeningsvenlighed.
  • Med udgangspunkt i evalueringsforsøg fremstille forslag til forbedringer af systemet.

Nærværende rapport er dokumentation for de udviklede hardware- og softwareløsningers kliniske anvendelighed gennem analyse af resultaterne, samt argumentation for vores resultater og konklusioner.
Først gennemgås den tilgrundliggende teori bag indikatorfortyndingsmetoden efterfulgt af en gennemgang af vores softwareløsning. Metoderne til validering af vores løsningers kliniske anvendelighed og resultaterne herfra følger. Slutteligt diskuteres resultaterne og vores konklusioner og anbefalinger til forbedringer præsenteres.

Teori

Cardiac output

Hjertets fysiologi

Hjertet fungerer som en pumpe der forsyner kroppens væv med næringsstoffer og ilt via blodet. Man definerer Cardiac Output (CO) som den mængde blod hjertet pumper ud i kroppen pr. minut. Mængden af blod der pumpes er afstemt efter organismens behov således at det kan variere fra omkring 5 L/min i hvilke, op til 30 L/min under makismal belastning hos veltrænede individer [6].

CO er en simpel funktion afhængig af to parametre, slagvolumen og pulsfrekvensen. Sammenhængen mellem dem er givet ved

(1)
\begin{align} CO=SV\times HR \end{align}

Hvor SV beskriver SlagVolumen og HR beskriver pulsfrekvensen (Heart Rate). Slagvolumen af hjertet bestemmes af

(2)
\begin{align} SV=\text{Endediastolisk Volumen} -\text{Endesystolisk Volumen} \end{align}

Disse volumeners størrelse reguleres ved sympatisk/parasympatisk stimulation, indflydelse af adrenalin/noradrenalin og af Starlings lov om hjertet. Sidstnævnte beskriver at der forekommer en sammenhængen mellem hvor meget hjertemuskulaturen strækkes inden kontraktion og kontraktionsstyrke. På denne måde vil en forøgelse af endediastolisk volumen føre til en større kontraktion og dermed mindre endesystolisk volumen. På denne måde kan hjertets slagvolumen forøges fra de normale 70 ml op til omkring 115 ml under fysisk anstrengelse, og hos veltrænede atleter helt op til 200 ml [6]. Trykket der fylder hjertekamrene kaldes undertiden preload, og grundet Starling's lov om hjertet, er CO meget følsomt for ændringer i dette tryk.

Pulsfrekvensen bestemmes af flere faktorer, men afhænger i høj grad af mængden af sympatisk stimulation samt indflydelse af adrenalin og noradrenalin. Indsættes normalværdierne for disse to parametre i formlen for CO får man

(3)
\begin{align} CO=72\,\frac{slag}{min}\times70\,\frac{ml}{slag}=5040\frac{ml}{min} \end{align}

Hvilket er i overensstemmelse med den forventede værdi af CO for normale individer under hvile [6].

CO relevans

Et nedsat CO kan have flere tilgrundliggende mekanismer som ophav. En af det mest almindelige er nedsat pumpefunktion som konsekvens af myokardieinfarkt [7], hvor en del af muskulaturen er blevet svært beskadiget. Herved har hjertet svært ved at opretholde normal kontraktionsstyrke og CO falder som følge heraf. Lavt blodtryk kan også sænke CO, idet at det lavere fyldningstryk (preload) ikke længere vil strække hjertevæggen i så stor en grad, og kontraktionsstyrken vil herefter falde jvf. Starlings hjertelov. Ved mange former for hjertelidelser vil man kunne gøre fund i form af nedsat CO [7], heriblandt

  • Hjerteinsufficiens, defineret ved at hjertet er ude af stand til at opretholde et tilstrækkeligt flow af blod til at imødekomme kroppens behov af ilt, eller hvis dette kun kan opnås under øget preload
  • Mitralinsufficiens, regurgitation af noget af venstre ventrikels volumen til venstre atrium grundet utætte mitralklapper
  • Restriktiv kardiomyopati, defineret ved besværet fyldning af ventriklerne grundet stivhed af myokardiet
  • Hypovolæmi, tilstanden af utilstrækkeligt lavt blodvolumen

Parameteren CO vil kunne give information om hvor fremskreden en af disse tilstande er, eller bidrage med at male et mere detaljeret sygdomsbillede.

CO er specielt en vigtig parameter i forbindelse med væskebehandling af patienter under intensiv pleje eller under det postoperative forløb. Her kan CO bruges til at differentieldiagnosticere mellem hypovolæmi og svigtende myokardiefunktion [7]. Et kendskab til CO kan forstærke mulighederne for at diagnosticere hæmodynamiske tilstande tidligere i deres forløb, og dermed før de manifesterer sig ved andre symptomer. Parameteren er også af særlig interesse ved tilstande som shock, sepsis og under fuld narkose [19].

Måling af CO

Hjertets minutvolumen kan bestemmes gennem mange forskellige metoder, herunder Ficks metode, thermo dilution, bioimpedans, rebreathing teknikker, transesophageal doppler og indikatorfortynding med blandt andet ICG og litium.

Indikatorfortyndingsmetoden er en af de mest anvendelige, på grund af dens relativt non-invasive natur og dens høje præcision og reproducerbarhed sammenlignet med standard målemetoder som Ficks metode [2]. Netop Ficks metode regnes som at være meget pålidelig og bruges som standard [2]. Denne rapport vil ikke prøve at eftervise gyldigheden af indikatorfortyndingsmetoden, da dette er blevet gjort mange gange i litteraturen.

Alle de førnævnte metoder har fordele og ulemper. Der foregår stadig omfattende forskning på området, men der findes allerede nu flere typer løsninger der implementerer metoderne og bestemmer CO både non-invasivt og effektivt. Det er dog ud over dette projekts omfang at diskutere eller evaluere disse. Derimod skulle software til indikatorfortyndingsmetoden udvikles til at fungere med det eksisterende hardware, med henblik på klinisk anvendelighed.

Indikatorfortyndingsmetoden

Introduktion

Måling af blodcirkulation ved hjælp af indikator blev første gang udført af Hering i 1824, hvor han indsprøjtede Kalium Ferrocyanid i en hests halsvene, og målte tiden indtil det optrådte i blodet fra den modsvarende vene. Det var dog ikke før 1897 at metoden blev udvidet til at kunne bestemme CO af Stewart. Som indikator brugte han hypertonisk saltvand og målte den elektriske konduktans af blodet efter et gennemløb over hjertet. Fra 1928 og to årtier fremad arbejdede Hamilton med at måle CO ved hjælp af farvestoffer og andre indikatorer. Dette førte frem til Stewart-Hamilton ligningen der beskriver sammenhængen mellem flow, koncentration og injiceret mængde indikator. Ligningen vil blive udledt i senere afsnit.
Indikatorfortyndingsmetoden blev bredt anerkendt da Hamilton i 1948 kunne producere resultater der svarede overens med dem der blev fundet ved Fick's metode [2].

I dette projekt vil der blive brugt en speciel form af indikatorfortyndingsmetoden hvor farvestof benyttes som indikator. Ved at benytte IndoCyaninGrønt (ICG) som indikator kan et densitometer, en sensor der registrerer lysabsorption, benyttes til at bestemme koncentrationen af stoffet i blodet. Densitometret gennemlyser en slange hvorigennem arterieblod løber, og producerer løbende et voltsignal proportionalt med lysoptagelsen. ICG har en meget høj absorption af lys med bølgelængden 805 nm, det nær-infrarøde spektrum, og det kan derved benyttes at blodets absorption af denne bølgelængde lys er proportional med koncentrationen af ICG.

Følgende figur viser den hardwareopsætning der er blevet benyttet af BBH intensiv afdeling i forsøg[20].

OriginalSetUp.png

Modificeret fra [20]. BBH intensivafdelings hardwareopsætning ved brug af indikatorfortyndingsmetoden.

  1. Computer til dataopsamling
  2. Harvard Apparatus er en pumpe der fungerer ved skiftevist at fylde og tømme en infusionssprøjte med en given hastighed
  3. CO-10 Cardiac output computer (Waters Inc.), bruges som voltmeter til densitometret
  4. Sprøjten tilhørende Harvard Apparatus
  5. Densitometer (Waters Inc.)
  6. 1 ml infusionssprøjte til injektion af ICG
  7. 10 ml infusionssprøjte med ICG til genopfyldning af 1 ml sprøjten
  8. En infusionssprøjte på 60 ml hvortil der trækkes NaCl og heparin til at skylle venen med efter injektion af ICG [20].
  9. NaCl opløsning opblandet med heparin

En typisk optagelse fra densitometret vil kunne se således ud:

ExpEkstrapol.png

Fra [2]. Typisk måling ved indikatorfortyndingsmetoden. Bemærk recirkulationskomponent der indtræder efter ca. 25 sekunder.


Det lokale maksimum omkring 40 sekunder skyldes recirkulation. Dette er et fænomen der skyldes at en del af indikatoren når hele vejen rundt i kredsløbet og forbi sensoren igen, før noget af indikatoren passerer første gang. Den stiplede linje beskriver hvordan kurven ville se ud uden recirkulation.
Følgende formel kan nu benyttes til at finde CO, her benævnt $Q$:(4)
\begin{align} Q = \frac{I}{\int_{0}^{\infty}y(t)\,dt} \end{align}

Hvor $I$ betegner injiceret mængde indikator og $y(t)$ er koncentrationskurven. Til at bestemme integralet $\int_{0}^{\infty}y(t)\,dt$ benytter man at koncentrationskurven følger et eksponentielt fald, inden recirkulation indtræffer. Ved at plotte på logaritmisk skala ses dette:

LogEkstrapol.png

Fra [2]. Typisk måling ved indikatorfortyndingsmetoden plottet med logaritmisk y akse. Bemærk lineær hældning før indtrædelse af recirkulation.


Det lineære stykke kan altså findes og koncentrationskurven kan ekstrapoleres. Ved at transformere den ekstrapolerede kurve tilbage, kan kurven uden recirkulation findes. Herefter kan integralet bestemmes på normal vis. Begyndelsen af kurven og den del der bruges til at lave ekstrapolation efter, kaldes Region of Interest (ROI).
ROI.png

Modificeret fra [2]. Koncentrationskurve med de tre punkter, som i denne rapport definerer ROI

Der er blevet brugt flere metoder til at bestemme kurven, herunder at modellere den som en funktion af eksponentialfunktioner eller lave direkte eksponentiel regression efter kurvestykket der forekommer før recirkulation indtræder. Kurvens forløb er også blevet vurderet og tegnet manuelt og dens areal fundet ved brug af planimeter. Sidstnævnte metode er blevet benyttet af BBH intensivafdelings og deres samarbejdspartnere indenfor forskning[11]. Derfor vil et program der automatiserer processen præsentere et stort spring fremad med hensyn til databehandlingstid.

Indikatorfortyndingsmetoden beror på altså tre antagelser.

  1. Sammenhængen mellem CO, koncentrationskurven og injiceret mængde farvestof givet ved Eq.(4)
  2. Antagelsen om at udvaskningen af indikator følger et eksponentielt forløb.
  3. Antagelsen om at målingen kan laves på en perifer arterie

Følgende er en teoretisk udledning af disse hovedtræk.

Udledning af ligningen

Vi betragter vejen fra højre atrium til venstre ventrikel som ét system hvori en perfekt opblanding af vores indikator finder sted, et såkaldt blandingskammer. Q er flowet igennem systemet.

transfunk.png

Modificeret fra [2]. Blandingskammer med homogen koncentration $y(t)$ [g/L], input koncentration $x(t)$ [g/L] og $Q$ [L/s] flow igennem systemet

Vi betragter et blandingskammer med volumen V hvori der er en homogen koncentration $y(t)$ [g/L]. $x(t)$ [g/L] er input koncentration til blandingskammeret. Der er $Q$ [L/s] flow gennem systemet.

Vi opstiller nu følgende ligning:

(5)
\begin{align} V\frac{dy(t)}{dt}=Q(x(t)-y(t)) \end{align}

Altså: forandringen i mængden af stof i blandingskammeret er lig med inflow af stof per tid, $Qx(t)$ minus outflow per tid $Qy(t)$ hvilket er benyttelse af massebevarelse. Der regnes ikke med diffusion og produktion.
Ved at integrere fra 0 til uendelig på begge sider fås:

(6)
\begin{align} V(y(\infty)-y(0))=\int_0^\infty \! Q(x(t)-y(t)) \, dt \end{align}
(7)
\begin{align} V(y(\infty)-y(0))=\int_0^\infty \! Qx(t) \, dt - \int_0^\infty \! Qy(t) \, dt \end{align}

Som beskrevet ovenfor er $Qx(t)$ inflow af stof per tid, og integralet over det fra 0 til uendelig er altså samlet inflow af stof. Samlet inflow af stof er lig injiceret mængde farvestof, I.

(8)
\begin{align} V(y(\infty)-y(0))=I - Q\int_0^\infty \! y(t) \, dt \end{align}

Nu betragtes venstresiden. $y(\infty)$ er 0 da udvaskningen af farvestof vil være komplet til den tid og $y(0)$ er 0, da dette er før injektionen. Altså kan venstresiden sættes lig 0.

(9)
\begin{align} 0=I - Q\int_0^\infty \! y(t) \, dt \end{align}
(10)
\begin{align} Q\int_0^\infty \! y(t) \, dt=I \end{align}
(11)
\begin{align} Q=\frac{I}{\int_0^\infty \! y(t) \, dt} \end{align}

Eksponentielt fald

Litteraturen benytter sig af at udvaskningen af farvestof følger et eksponentielt fald [2], for at korrigere for recirkulation, men dette er under forudsætning af at volumenet fra injektion til måling kan opfattes som et enkelt blandingskammer. Da hjertet består af flere kamre vil det være berettiget at undersøge udvaskningen når output fra et blandingskammer er input i et andet.
Til dette vil systemet fra forrige afsnit betragtes og dets overføringsfunktion findes:

transfunk.png

Modificeret fra [2]. Blandingskammer med homogen koncentration $y(t)$ [g/L], input koncentration $x(t)$ [g/L] og $Q$ [L/s] flow igennem systemet

(12)
\begin{align} V\frac{dy(t)}{dt}=Q(x(t)-y(t)) \end{align}

Overføringsfunktionen kan nu findes ved at laplacetransformere:

(13)
\begin{equation} VsY = QX - QY \end{equation}
(14)
\begin{equation} VsY + QY = QX \end{equation}
(15)
\begin{equation} Y(Vs + Q) = QX \end{equation}
(16)
\begin{align} H(s) = \frac{Y}{X} = \frac{Q}{Vs + Q} \end{align}
(17)
\begin{align} H(s) = \frac{Q}{V}\frac{1}{s+\frac{Q}{V}} \end{align}

Dette er overføringsfunktionen for et blandingskammer med volumenet V.
Ved invers laplacetransformation fås:

(18)
\begin{align} h(t) = \frac{Q}{V}e^{-\frac{Q}{V}t} \end{align}

Vi kan nu finde responset på et input der repræsenterer en hurtig injektion af ICG, nemlig en deltafunktion med arealet $\frac{I}{Q}$:

(19)
\begin{equation} y_{1}(t) = h_{1}(t) * x_{1}(t) \end{equation}
(20)
\begin{align} y_{1}(t) = \frac{Q}{V}e^{-\frac{Q}{V}t} * \frac{I}{Q}\delta(t) \end{align}
(21)
\begin{align} y_{1}(t) = \frac{I}{Q}\frac{Q}{V}e^{-\frac{Q}{V}t} \end{align}
(22)
\begin{align} y_{1}(t) = \frac{I}{V}e^{-\frac{Q}{V}t} \end{align}

Hvis stoffets rute gennem kredsløbet og hjertet nu overvejes, kan det pulmonale kredsløb og hjertekamre alle betragtes som individuelle blandingskamre i serie. Således vil output fra et blandingskammer være input til det næste.

FlowChamberSeries.png

Modificeret fra [2]. Seks blandingskamre i serie. Output fra et er input i det næste. $Q$ [L/s] flow gennem systemet.

Således vil man få

(23)
\begin{equation} y_{2}(t) = h_{2}(t) * y_{1}(t) \end{equation}

Hvis dette modelleres ved at placere N blandingskamre i serie med impulsrespons
$h_{1}... h_{N}$, kan $y_{N}$ findes. Altså output efter N blandingskamre i serie:

(24)
\begin{align} y_{N}(t) = \frac{I}{Q}h_{1}(t) * h_{2}(t) * ... * h_{N}(t) \end{align}

Alle led i ovenstående er eksponentialfunktioner med forskellige tidskonstanter $\tau_{n} = \frac{V_{n}}{Q}$.
Fra [1] har vi at foldningen af to eksponentialfunktioner giver følgende:

(25)
\begin{align} e^{\lambda_{1}t}u(t) * e^{\lambda_{2}t}u(t) = \frac{e^{\lambda_{1}t} - e^{\lambda_{2}t}}{\lambda_{1}-\lambda_{2}}u(t) \hspace{10 pt} \lambda_{1} \neq \lambda_{2} \end{align}

Da foldningsoperatoren er en lineær operation vil en foldning af N eksponentialfunktioner give en sum af N eksponentialfunktioner.
Altså:

(26)
\begin{align} y_{N}(t) = \sum_{n=1}^{N} c_{n}e^{-\frac{Q}{V_{n}}t} \end{align}

Da disse eksponentialfunktioner har forskellige tidskonstanter $\tau_{n} = \frac{V_{n}}{Q}$ vil deres indflydelse på $y_{N}(t)$ aftage med forskellig hastighed. Efter 5 af en given tidskonstant, $\tau_{n}$ vil leddet være under 1% af sin maksimale værdi, hvorfor at der kan ses bort fra dens bidrag. Efter 5 af den næststørste tidskonstant $\tau_{ns}$ vil $y_{N}(t)$ altså være domineret af én eksponentialfunktion, nemlig den med den største tidskonstant, bestemt af det største volumen. Altså:

(27)
\begin{align} y_{N}(5\tau_{ns}<t) \approx ce^{-\frac{Q}{V_{max}}t} \end{align}
(28)
\begin{align} ln(y_{N}(5\tau_{ns}<t)) \approx ln(c)-\frac{Q}{V_{max}}t \end{align}
(29)
\begin{align} \frac{dln(y_{N}(5\tau_{ns}<t))}{dt} \approx -\frac{Q}{V_{max}} \end{align}

Det er nu vist at hvis hjertet betragtes som flere blandingskamre i serie, gælder der stadig at der er et eksponentielt fald for t gående mod uendelig. Ydermere er der fundet en sammenhæng mellem hældningskoefficienten for dette eksponentielle fald, CO og volumen af det største blandingskammer.

Perifer arteriel måling

En stor del af den kliniske anvendelighed ved indikatorfortyndingsmetoden beror på at målingen kan tages i en perifer arterie, og at man altså kan undgå anlæggelse af centrale katetre som ved f.eks. thermo dillution.
Fluiddynamikken der ligger til grund for at lave betragtninger på flow i realistiske systemer er meget avanceret og betragtes oftest numerisk i computersimulationer. Nedenfor er dog en udledning der forsøger at vise at en måling kan foretages perifert.

flowbranches.png

Flow i forgrenet netværk. $y1(t),\, y2(t),\, y3(t)$, angiver koncentration [g/L], $Q1,\, Q2,\, Q3$ angiver flow [L/s] og $L$ angiver en længde der ikke er ubetydeligt kort.


Den centrale antagelse er at lige i forgreningen mellem arterierne vil koncentrationen være ligeligt fordelt i blodet hvorfor at der længden $dx$, $dx$ gående mod 0, nedstrøms fra forgreningen vil være den samme koncentration opstrøms som nedstrøms i begge forgreninger, illustreret på tegningen ved $y(t)$.
Resten er baseret på massebevarelse. Her betragtes den øverste forgrening med $Q3$ flow; hvad der kommer ind af stof i forgreningen må passere ved $y3(t)$. Altså:(30)
\begin{align} \int_0^\infty \! Q_{3}y(t) \, dt=\int_0^\infty \! Q_{3}y_{3}(t) \, dt \end{align}
(31)
\begin{align} \int_0^\infty \! y(t) \, dt=\int_0^\infty \! y_{3}(t) \, dt \end{align}

Altså arealet under kurven for koncentrationsprofilen perifert er det samme som centralt.
Man kunne fristes til at tro at $y(t)=y2(t-t2)=y3(t-t3)$, altså at koncentrationsprofilen for $y2(t)$ og $y3(t)$ blot var tidsforskudte $y(t)$, afhængig af $Q2$, $Q3$ og $L$. Dette ville være tilfældet hvis man antog at flowet havde en flad hastighedsprofil i arterierne, såkaldt plug flow. Virkeligheden er dog mere kompleks[14] og en bedre model af flowet er laminart flow. Ved laminart flow vil en lige koncentration blive spredt af den parabolske hastighedsprofil, således at de midterste partikler vil have en langt større hastighed end de radiale. Den præcise koncentrationsprofil er afhængig af radius af arterien, flow, temperatur, arteriens rumlige udformning og mange andre faktorer. Efter et ikke ubetydeligt stykke L, vil koncentrationsprofilerne altså have ændret sig betydeligt fra hinanden.

ICG

Farvestoffet der benyttes til denne undersøgelse er IndoCyaninGrønt. Det har stor praktisk anvendelighed af primært tre grunde. Over 95 % procent af stoffet binder sig til plasmaproteiner [4]. Dette betyder at kun 5 % af stoffet befinder sig frit i blodbanen og har potentiale til at diffundere over endothelet. Derfor kan man overordnet negligere effekten af diffusion og antage at den samlede stofmængde er den samme som den der forlader hjertet. Den anden grund er at ICG har sin maksimale lysabsorption ved bølgelængder på omkring 805 nm [4] og lige ved denne bølgelængde absorberer oxygeneret og deoxygeneret blod lige meget lys [3]. Det vil derfor ikke have nogen effekt i hvor stor udstrækning blodet er iltet hvis man måler absorptionen i dette område. Samtidig renses ICG hurtigt af leveren med en hastighed på omkring 0.8 mg/min [5]. Dette betyder at længerevarende farvning af blodet undgås og gentagne målinger kan udføres med ned til 15 minutter imellem. Patienten kan derved modtage op til 50 indsprøjtninger [15] før daglig maksimaldosis er opnået.

Dataopsamling

Til dataopsamling benyttes et fotodensitometer, der fungerer ved at gennemlyse det arterielle blod med infrarødt lys, og måle lysabsorptionen. Fotodensitometeret er opbygget så det har et lineært forhold mellem dens output i volt, $v(t)$ og koncentrationen af ICG i blodet, $y(t)$:

(32)
\begin{equation} v(t)=ky(t)+b \end{equation}
(33)
\begin{align} y(t)=\frac{v(t)-b}{k} \end{align}

Det ses at

(34)
\begin{equation} v(t)=b \end{equation}

for $y(t)=0$. Altså når der ingen koncentration er af ICG. Dette niveau kaldes baseline. $k$ er kalibreringsfaktoren der beskriver forholdet mellem voltsignalet og koncentrationen af ICG i blodet.
Sammenhængen mellem flow og koncentrationskurve er givet ved:

(35)
\begin{align} Q=\frac{I}{\int_{0}^{\infty}y(t)\,dt} \end{align}

Ved indsættelse:

(36)
\begin{align} Q=\frac{I}{\int_{0}^{\infty}\frac{v(t)-b}{k}\,dt} \end{align}
(37)
\begin{align} Q=\frac{Ik}{\int_{0}^{\infty}v(t)-b\,dt} \end{align}

Det ses at baseline og kalibreringsfaktoren skal bestemmes før dataopsamling, hvorved Q kan findes af ovenstående.

CORA

Introduktion

Softwaren der skulle udvikles i denne rapport er beskrevet i følgende afsnit. Der blev produceret en kravspecifikation ud fra samtale med BBH intensivafdeling. Programmet skulle:

  • Have en nem og overskuelig brugerflade
  • Analysere data kontinuerligt
  • Automatisk finde Region Of Interest (ROI)
  • Udregne og vise CO ved fund af ROI
  • Have mulighed for brugerinput til bestemmelse af ROI ved softwarefejl
  • Have mulighed for at gemme data i excelformat.

Programmet blev udviklet med henblik på læger der benytter CO som parameter i deres forskning. Det blev derfor valgt at navngive dette software CORA, en forkortelse for Cardiac Output Research Assistant. CORA er frigivet under en MIT licens [10]. Kildekoden kan findes i appendiks, samt på cd-rom, hvor CORA samt en modificeret udgave af programmet, med formål at indlæse testdata, også ligger. Den modificerede udgave hedder 'testversion'. Alt kildekode er hostet på http://code.google.com/p/codtu2009, hvor der er instruktioner i at hente det med en svn klient. Således kan eventuelle fremtidige versioner af CORA hentes her.

UI.m

UI.m er hovedfunktionen, der opsamler data og kalder de 2 andre funktioner, findCurve.m og findCO.m.

  • Når UI.m startes kan man kun trykke på 'Start'.
  • Når man har trykket på 'Start' kan der trykkes på 'Stop' og på 'Set baseline'.
  • Efter tryk på 'Set baseline' kan der kun trykkes på 'Stop'
  • Efter tryk på 'Stop' kan 'Start', 'Manual override' og 'Save' benyttes

På denne måde begrænses brugerens valg, og denne bliver herved ledt igennem processen.

Ved tryk på 'Start' initialiseres AD-kortet. Herfra begynder AD-kortet at sample fra CO computeren som densitometret er koblet til. Hver gang et defineret antal samples svarende til 0.1 s er blevet samplet til bufferen, kaldes funktionen 'update'. Denne henter data fra de sidste 0.1 s ind i MATLAB og tilføjer dem til den data der tidligere er blevet optaget. Hvis ikke 'Set Baseline' er blevet aktiveret vises de sidste fem sekunders data i brugerfladen. Ved tryk på 'Set baseline' trækkes den udregnede baseline fra data og findCurve.m bliver kaldt med dette data som input. Ved fund af ROI kaldes findCO.m med ROI som input.

UI.m indeholder funktionen setbaseline der bliver kaldt ved tryk på den tilhørende knap. Denne tager gennemsnitsværdien af de sidste 5 sekunders data, og gemmer den i den globale variabel v.baseline.

Ved tryk på 'save' åbnes en fildialog boks hvor man kan bestemme navnet på filen. Programmet benytter en global variabel v, som er en struktur der indeholder alle interessante koefficienter og parametre. Det er denne der gemmes i både .mat-fil og i excel-ark.

Et sæt af funktioner i UI.m sørger for at lade brugeren give programmet input i form af den injicerede mængde ICG og kalibreringsfaktoren. Disse benyttes af findCO.m.

En normal arbejdsgang ved brug af CORA beskrives nedenfor.

  1. CORA startes, og der trykkes på 'Start'
  2. Hardvard apparatus startes og der føres blod igennem densitometret. CORA giver brugeren besked om at trykke 'Set Baseline'
  3. Ved tryk på 'Set baseline' gives besked om at injicere ICG.
  4. Dette gøres og der ventes til den karakteristiske kurve kan observeres på grafen. ROI skulle nu automatisk identificeres og CO udregnes. Den ekstrapolerede kurve vises på grafen sammen med den målte voltkurve
  5. Der skal nu trykkes på stop
  6. Hvis ROI og CO blev tilfredsstillende bestemt kan data gemmes som .mat-fil og i excel-ark ved tryk på 'Save data'
  7. Hvis ROI af den ene eller anden grund ikke blev identificeret eller der blev foretaget fejlekstrapolation, kan der ved brug af 'Manual Overwrite' defineres et nyt ROI
  8. Dette kan gentages indtil tilfredsstillende resultater nås, hvorefter resultatet kan gemmes som før beskrevet

Nedenfor ses et flowdiagram over UI.m

UI.png

UI.m flowchart. Øverst ses brugerfladen, og nedenunder hvilke funktioner denne aktiverer.


Herunder er screenshots af CORA under brug af alle dets funktioner.
CORA1.png

CORA før der trykkes på start.

CORA2.png

Efter at der er trykket på start loades data og de sidste 5 sekunder vises

CORA3.png

Efter tryk på 'set baseline' vises alt data, og CORA leder efter ROI

CORA4.png

Efter at have fundet ROI udregnes CO, og hvis realistisk vises dette

CORA5.png

Ved tryk på stop bliver knapperne 'Manual override' og 'Save data' brugbare

CORA6.png

Ved tryk på 'Manual override' laves musen om til et sigtekorn og det første punkt 'up' skal sættes

CORA7.png

Efter 'up' er sat skal 'max' sættes. Bemærk at det kun er musens position på x aksen der har betydning, da y værdien findes på grafen

CORA8.png

Efter 'max' er sat skal 'min' sættes.

CORA9.png

Når de tre punkter er sat udregnes et nyt CO og vises

CORA10.png

Ved tryk på 'save data' åbnes et standard fil-dialog vindue.

CORA11.png

Ved tryk på 'Save' gemmes data. Data gemmes både i excel format samt i .mat format.

findCurve.m

findCurve.m leder efter ROI ved at opstille en række simple forudsætninger der vil være opfyldt af den karakteristiske kurve. ROI defineres af 3 punkter.

  • up
  • max
  • min

Først findes "max" ved at lede efter det globale maksimum for kurven ved hjælp den indbyggede MATLAB funktion max(). Det er indeksværdien der bruges til at beskrive punktet, svarende til det nummer sample punktet forekommer ved. Hvis dette punkt ligger inden for det sidste sekund forkastes det. Dette gøres for at undgå lokale maksimumpunkter der opstår på grund af støj samt for ikke at finde maksimum mens kurven stadig er stigende. Hvis "max" bliver tilskrevet en værdi, fortsætter funktionen med at at bestemme punktet "up". "up" beskriver punktet hvor den første mængde ICG kan registreres af densitometret. Dette bliver defineret som det sidste punkt hvor kurven har værdien svarende til 1 % af "max". Når variablen "up" bliver tilskrevet en ikke-nul værdi, og ikke er en tom vektor fortsætter funktionen med at bestemmes "min". Dette gøres ved at lede efter minimum på datastykket der ligger efter punktet "max", ved hjælp af MATLABs min() funktion. Igen forkastes punktet "min" hvis det er et punkt fra det sidste sekund data. Figur 21 viser funktionen som flowdiagram.

Funktionen returnerer indeksværdien for punkterne den har fundet og nul for resten. De punkter der får tilskrevet en ikke-nul værdi bliver vist løbende i brugerfladen. Når alle tre punkter får tilskrevet ikke-nul værdier, vil ROI være bestemt, og UI.m vil fortsætte med databehandling.

findCurve.png

findCurve.m flowchart

findCO.m

findCO.m udregner CO ved at modtage de tre punkter der definerer ROI samt det foreløbige datasæt som input. Derved bliver den først bliver kaldt når findCurve.m har returneret ikke-nul værdier for alle tre punkter. For at finde arealet under kurven approksimeres koncentrationskurven uden recirkulation ved ekstrapolation.

findCO.m identificerer den midterste tredjedel af kurvestykket der ligger mellem punkterne "max" og "min". Denne mængde datapunkter bruges til at lave eksponentiel regression efter ved hjælp af MATLABs fit funktion. Måden hvorpå denne datamængde udvælges er inspireret af cosimple.m's metode, der fungerer på en lignende vis.

Hvis CO er mindre end 0 eller større end 40, forkastes CO, så UI.m ikke viser det.
Dette har vist sig at være en meget bedre måde at finde det rigtige CO på end at forsøge at gøre findCurve.m bedre til at skelne støj og udsving fra den karakteristiske form. Det er muligt at findCurve.m finder flere ROI, men findCO.m forkaster de urealistiske CO disse ville give. Hvis et realistisk CO bliver fundet returneres dette til UI.m der viser det i brugerfladen. Samtidig bliver den ekstrapolerede kurve returneret til UI.m og vist i displayet så der kan foretages en vurdering af ekstrapolationen som findCO.m har foretaget. Nedenstående figur viser et flowdiagram over funktionen.

findCO.m.png

findCO.m flowchart

Metode

Introduktion

Formålet med resultatet af metoderne var at validere at CORA levede op til kravspecifikationen, samt at vurdere CORA, hardware, opsætning og metodens kliniske anvendelighed.
Til dette blev følgende metoder benyttet:

  1. CORA blev testet på 53 udleverede datasæt for at vurdere algoritmen til bestemmelse af ROI samt ekstrapolation
  2. CORA's resultater blev sammenlignet med det udleverede program cosimple.m der virkede ved offline databehandling
  3. CORA's robusthed blev testet ved at betragte variansen inden for samme operatør og mellem forskellige operatører. Disse varianser blev sammenlignet med tilsvarende for cosimple.m
  4. Funktionaliteten under realistiske forhold blev testet ved udarbejdelse af en fysisk model der repræsenterede hjertelungekredsløbet og målinger på denne.

Test på optagede data

Forberedelse

Der blev udleveret data fra et forsøg med 8 forsøgspersoner behandlet med EPO, hvor blandt andet CO var monitoreret under varierende fysisk anstrengelse. Hvert forsøg strakte sig over en længere tidsperiode og derfor blev flere individuelle segmenter klippet ud, og behandlet som individuelle målinger. Mange forskellige typer af datasegmenter blev udvalgt således, at programmet kunne testes på en bred vifte af forskellige inputs.
Herunder er vist en del af originalfilen og forskellige datasegmenter der kunne være blevet brugt som testdata til programmet.

ChartDataHel.png

Udklip af udleveret forsøgsdata. Der er samlet data kontinuert i mere end en time. Øverst ses voltkurven der er blevet genereret af densitometret, resten er data for dette projekt uvedkommende.

ChartData.png

Eksempel på udklippet datasæt

ChartData2.png

Eksempel på udklippet datasæt

53 datasæt blev udvalgt fra tidligere forsøg hvor forsøgspersonerne fik målt CO under varierende fysisk anstrengelse. Af disse 53 blev 13 målinger forkastet grundet støj, kurveudseende eller ufysiologiske resultater. De resterende 40 datasæt blev gemt som .mat filer. De blev navngivet S<x>_sheet<y>.mat hvor S<x> refererede til subjekt nummer x, altså forskellige forsøgspersoner. sheet<y> angav forskellige målinger, y, på samme forsøgsperson.
Hver .mat fil indeholdt 3 variabler:

  • data, data(:,1) er tiden [s] og data(:,2) er voltsignalet [V]
  • k, kalibreringsfaktoren [VL/g]
  • I, injiceret volumen 5 mg/ml ICG opblanding [ml]

Som nævnt kan den specielle version af CORA, navngivet 'testversion', benytte disse .mat filer som data. Ved tryk på 'start' i 'CORA testversion' bedes man om at vælge en .mat fil hvorefter denne loades ind med en frekvens på 100 Hz.

Reproducibilitetstest

For at vurdere i hvor stor grad resultaterne fra CORA var afhængige af operatør og i hvor høj grad de var reproducerbare, blev en metode opstillet til udførsel af en ANOVA test på inter- og intra-operatørvariansen.
Den samme ANOVA test blev udført på cosimple.m for at kunne vurdere CORAs præstation i forhold til den tidligere benyttede software cosimple.m. cosimple.m skulle benyttes på allerede udklippede datasæt der kun indeholdt ROI. Et program converter.m blev således udviklet til at udskære ROI fra de 40 datasæt. converter.m er vedlagt i appendix samt på cd-rom.

  • To forskellige brugere benyttede CORA testversion til at bestemme CO på de 40 udvalgte målinger
  • Dette blev gentaget 5 gange, således at 5 CO blev fundet for hver måling.
  • To forskellige brugere kørte converter.m fire gange hver og de fire gange 40 udklippede datasæt blev gemt som 'sub<x><n>_sheet<y>', hvor <n> antog værdierne a,b,c og d.
  • Et program cosimple_auto.m blev kørt, hvilket udregnede CO på samtlige fire gange 40 udklippede datasæt. cosimple_auto.m findes i appendix samt på vedlagt cd-rom
  • En nested model blev benyttet til ANOVA testen.
  • Valget af operatør blev betragtet som en tilfældig effekt.

Sammenligning med cosimple.m

Programmet cosimple.m er udviklet på BBH intensivafdeling og er tidligere blevet benyttet til at effektivisere databehandlingsprocessen ved at bestemme $\int^{\infty}_{0}y(t) dt$. Programmet krævede at der manuelt blev defineret ROI, hvilket gjorde processen en anelse langsommelig når flere datasæt skulle behandles, samt at målingerne ikke kunne foretages i reel tid. Programmet var til gengæld velegnet til at producere resultater til sammenligning med CORA, idet ROI blev bestemt manuelt.

For at få et statistisk mål for hvorvidt resultaterne stemte overens eller ej, blev der udført en Bland-Altman analyse på målingerne. Denne blev udført i overensstemmelse med metoden "Measuring Agreement Using Repeated Measurements" som forskrevet i [16]. Analysen betragter forskellene i resultaterne de to metoder producerer. Herefter findes standardafvigelsen, $\sigma$, af forskellene, og et 95 % konfidensinterval defineres ved $\mu \pm 1.96 \sigma$, hvor $\mu$ er den bias der er mellem målingerne. Når der, som i dette tilfælde, ikke tages forskellen mellem en enkelt måling, men mellem gennemsnittet af målinger der blev lavet, skulle $\sigma$ justeres, og i stedet blev parameteren ${\sigma}_{c}$ brugt, hvor

(38)
\begin{align} {\sigma}_{c}=\sqrt{{\sigma}_{D}^2+\frac{1}{4}{\sigma}_{1}^2+\frac{1}{4}{\sigma}_{2}^2} \end{align}

Hvor ${\sigma}_{D}$ var standardafvigelsen mellem gennemsnittet af resultaterne produceret af CORA og cosimple.m, mens ${\sigma}_{1}$ og ${\sigma}_{2}$ beskrev den indbyrdes standardafvigelse af de to metoder.

Test på model

Forsøgsopstilling

For at vurdere hardware, metoder og CORAs anvendelighed ved reel tids dataopsamling i et realistisk miljø blev en model konstrueret der kunne foretages målinger på.

Modellen producerede koncentrationskurver der lignede de udleverede data og CORA's algoritme til at finde ROI samt ekstrapolationen kunne altså testes. Hvis CORA fungerede og altså fandt ROI og ekstrapolerede korrekt ville der kunne tages målinger til validering af indikatorfortyndingsmetoden ved at sammenligne pumpeindstillingen med CORA's udregnede CO.
Modellen bestod af dropslanger forbundet i en cirkel for at kunne reproducere recirkulation, med tilførsel af klart saltvand for at opretholde konstant tryk og et afløb for at simulere en simpel form for lever-clearance. En infusionspumpe gav et kendt flow igennem systemet. En 60ml sprøjte udgjorde blandingskammer med variabelt volumen.

Nedenfor ses en skematisk opbygning af modellen

Model.png

Skematisk forsøgsopstilling

  1. Drop med NaCl opløsning, der holdt væskemængden i systemet konstant
  2. Leverclearance blev modelleret ved at dræne væske fra systemet med et konstant flow
  3. Infusionen blev givet på dette punkt. Simulerede en veneinjektion
  4. Modificeret 60ml sprøjte udgjorde variabelt blandingskammer
  5. Peristaltisk infusionspumpe med variabel flow, TE-171 (TERUMO)
  6. Cuvette der passede til densitometer (Waters Inc.).

Nedenfor ses modellen

frontmodel.jpg

Forsøgsmodel. Den gule spand fungerede som reservoir for det clearede væske.

infogclear.png

Infusions og clearance. 5 ml sprøjte opbevarede ICG opblandingen. 1 ml sprøjten blev brugt til at udtage præcise mængder til infusion. Bemærk 3-vejs ventilers placering. Nederst til venstre ses den trevejsventil der lod væske passere fra højre mod venstre under måling. Under infusion var den indstillet som vist. Trevejsventilen nederst til højre var indstillet som vist under måling, men under infusion blev den benyttet til at blokere for clearance for at undgå at ICG blev clearet under infusion.

blandingskammer.png

Modificeret 60ml sprøjte: kanyle gennemtrænger stempelhoved.

pumpe.png

Peristaltisk infusionspumpe TE-171 (TERUMO), benyttet under forsøg. Her indstillet på 1200ml/t

cuvette.png

Cuvette. Bemærk de to 3-vejs ventiler på hver side. De benyttes under kalibrering.

Følgende figurer vedrører kalibrering

calib1.png

De tre kalibreringssprøjter der blev benyttet. Fra højre mod venstre: 0.02 g/ml, 0.01 g/ml og 0.005 g/ml

calib2.png

Opstilling klar til at foretage kalibreringsmåling. Cuvette med densitometer påsat og kalibreringssprøjter monteret på 3-vejs ventiler. Bemærk 3-vejs ventilers orientering. Densitometer pakket ind i staniol for at afskærme mod lys.

Hardware og opsætning til måling

Hardware og opsætning til måling bestod af et rullebord med to hylder. Nederst var en nødstrømforsyning, EME Iso Box (Nicolet Biomedical Inc), der leverede strøm til alle komponenter. Ved siden af lå en standard stationær PC og oven på den CO-10 Cardiac Output Computer (Waters Inc). CO computer var indstillet på 'OP' og 'DENS' mode. Til målingerne blev et fotodensitometer (Waters Inc) benyttet. Fotodensitometeret var tilsluttet CO computer og output fra CO computer sad ind i DIN-37D Termination board (ADLINK). Output fra DIN-37D sad ind i et PCI-9114 AD kort (ADLINK) i computeren. På øverste hylde var skærm, keyboard og mus. Nedenstående figurer giver et overblik over hardware og opsætning.

front.jpg

Rullebord med opsætning til måling.

back.jpg

Opsætning set bagfra.

din37d.jpg

DIN-37D Termination board (ADLINK).

cocomp.jpg

CO-10 Cardiac Output Computer (Waters Inc) bagfra. Bemærk 'OP' og 'DENS' mode indstilling.

Fremgangsmåde

ICG pulsion 25mg blev opblandet med 25ml deioniseret sterilt vand hvilket gav en opløsning på 1mg/ml, der blev benyttet i alle injektioner.

Clearance blev bestemt og klemmeindstillingen blev tapet fast således at clearance var kendt.

Da cuvetten som densitometret sad på havde stor indflydelse på målingerne, skulle den samme cuvette benyttes under kalibrering som under måling. Der blev udviklet et system hvor der blev placeret en 3-vejs ventil på hver side af cuvetten, således at cuvetten kunne gennemskylles med en ønsket koncentration.

Der blev udført målinger på 6 pumpeniveauer, 600ml/t, 700ml/t, … , 1200ml/t og hvert pumpeniveau blev målt 2 gange i træk.

Nedenfor er beskrevet fremgangsmåder for at fastsætte clearance, kalibrere densitometret og tage målingerne som ligger til grund for modelresultaterne.

Clearance

  1. Pumpen blev tændt
  2. Pumpen blev indstillet på 1200 ml/t
  3. Clearance blev indstillet ved at justere klemmen. I forsøget blev det vurderet at en clearance på ca. 30 ml/min var passende
  4. Klemmeindstillingen blev fasttapet for at fastfolde indstilling alle forsøg igennem

Kalibrering

  1. Mængden af NaCl blev kontrolleret.
  2. 3 kalibreringssprøjter, 0.02 g/ml, 0.01 g/ml og 0.005 g/ml vandig ICG opløsning, blev præpareret.
  3. ICG blev udfældet over tid, så fuld opblanding blev sikret ved at skiftevist at tømme og injicere kalibreringsvæsken mellem to sprøjter.
  4. Cuvetten blev gennemskyllet af rent saltvand
  5. CORA blev startet
  6. CO computeren blev nulstillet ved (rød knap)
  7. Dette inducerede en form for drift af outputtet fra densitometret der først blev stabilt igen efter ca. 160 sekunder.
  8. Når stabilitet var opnået blev baseline defineret i CORA ved at trykke ’set baseline’
  9. Målingen blev gemt som Cal00.mat. Gennemsnitsværdien af de sidste 5 sekunders målinger var nu gemt i variablen v.baseline
  10. Cuvetten blev renset ved at pumpe saltvand igennem. Derefter blev den tømt for vand for at undgå fortynding af næste kalibrering
  11. Cuvetten blev fyldt med den laveste koncentration ICG opløsning
  12. CORA blev startet igen
  13. Voltsignalet varierede svagt over tid og for at simulere en målingssituation mest muligt blev det valgt at tage den indledende værdi som densitometret gav, og "set baseline" blev valgt til at begynde med
  14. Målingen blev gemt somCal20.mat
  15. pkt. 8-10 blev gentaget for alle kalibreringssprøjter
  16. Lineær regression blev lavet efter de målte datapunkter og en kalibreringsfaktor blev fundet ad denne vej
  17. Cuvetten blev skyllet med rent vand efter endt kalibrering

Flowmålinger

  1. Det blev kontrolleret om mængden af NaCl var tilstrækkelig
  2. Pumpen blev tændt og indstillet på 1200ml/t
  3. Der blev åbnet for clearance, og ventet til at systemet var frit for ICG og grundlinjen stabil
  4. Der blev lukket for clearance før injektion af ICG. Dette blev gjort da ICG ellers havde tendens til at løbe direkte ud af systemet
  5. Baseline blev defineret når signalet var stabilt
  6. 0,5ml ICG opløsning blev injiceret
  7. Der blev herefter straks genåbnet for clearance
  8. CORA fandt herefter en værdi for flow igennem slangen
  9. Målingen blev gemt
  10. Modellen blev renset ved at lukke for gennemløbet i den korte del af loopet og lade saltvand gennemskylle den store del. På denne måde blev ICG fjernet hurtigst.
  11. Normalt flow blev genoprettet og målingerne gentaget med nye pumpeindstilinger

Resultater

Test data

Introduktion

Følgende afsnit benytter sig af CORAs resultater i forbindelse med allerede udleveret data. Samtlige resultater kan findes i appendiks, i form af 42 screenshots af CORA.

Reproducibilitetstest

Resultatet fra to-vejs ANOVA med målingerne og operatør som tilfældige effekter ses herunder

SASJMP.png

Varianskomponentestimater af CORAs resultater

Kolonnen med navnet "Var Component" beskriver den estimerede varians. Til højre er anført standardafvigelsen og konfidensinterval for estimaterne. I nederste række ses det at den totale varians er fundet til 41,13. Hver række beskriver variansbidraget fra en enkelt effekt. Det ses, ikke overraskende, at størstedelen af variansen fremkommer på grund af forskelle i målingerne idet de er taget i forskellige aktivitetsniveauer. Residual beskriver variationen internt hos operatørerne og målingerne, det vil sige den varians der forekommer hvis operatør, patient og måling holdes konstant. Dette benævnes også den interne fejlkilde. Det ses at denne er relativt lille. Ligeledes er variationen i resultaterne grundet valget af operatør meget begrænset.

Som tidligere nævnt blev samme test udført med de CO der blev udregnet af cosimple.m. Analysen gav følgende output med hensyn til estimater af varians

ANOVA2.png

Varianskomponentestimater af cosimples resultater

Igen ses lav varians grundet skift af operatør, og den primære varianskilde er ligeledes ændringer af målinger, hvilket er helt som forventet. Bemærk at den interne fejlkilde er en anelse større ved cosimple end i CORA.

Sammenligning med cosimple.m

Ved at udføre Bland-Altman testen på data blev følgende plot produceret

BlandAltman.png

Bland-Altman plot. Røde streger angiver 95% konfidensinterval.

Den gennemsnitlige forskel, bias blev bestemt til at være $\mu=0.15$ og standardafvigelsen til $\sigma=1.85$. Via udregningerne tidligere beskrevet kunne der udregnes et interval der estimerede afvigelsen mellem de to metoder. Det blev bestemt at for et tilfældigt resultat fundet af CORA ville cosimple.m med 95 % sandsynlighed finde et CO der lå mellem 4.00 L/min højere og 3.69 L/min mindre.

(39)
\begin{align} P\{CO_C_O_R_A-3.69 \frac{liter}{min}\leq CO_c_o_s_i_m_p_l_e\leq CO_C_O_R_A+4.00 \frac{liter}{min}\}=0.95 \end{align}

Bemærk at intervalgrænserne er meget store i forhold til forventet CO under hvile.

Målinger på modellen

Det enkelte vigtigste resultat af målingerne på modellen var at hardware, opsætning og CORA virkede til at foretage målingerne. CORA viste koncentrationskurven i reel tid, fandt ROI og ekstrapolerede korrekt ved alle målinger foretaget på forsøgsmodellen.

Størstedelen af målingerne blev taget uden at nogen kalibrering blev målt først. Manglen på kalibreringsfaktorer skyldes at det først sent i målingerne blev indset at cuvetten spillede en stor rolle for kalibreringen. Således var der blevet taget en del kalibreringsmålinger der var ubrugelige da disse blev udført med forskellige cuvetter for hver kalibreringssprøjte.
De følgende målinger blev altså gennemført med en mere eller mindre arbitrær kalibreringskoefficient på $65.8 \frac{VL}{g}$.

uncalib1.png

Ikke kalibrerede målinger. Sæt 1


Ovenstående målinger blev udført lidt anderledes end forsøgsprotokollen. Målingerne blev taget i følgende rækkefølge. Pumpeinstilling på: 1200, 1000, 800, 600, 700, 900 og 1100ml/t. De ulige målinger ses klart at adskille sig fra de lige, med en lidt anden hældningskoefficient og med en klar forskydning i y aksen. Adskilles de lige og de ulige målinger fås:
uncalib1_sub1.png

Ikke kalibrerede målinger. Sæt 1, undersæt 1

uncalib1_sub2.png

Ikke kalibrerede målinger. Sæt 1, undersæt 2


Der ses god lineær regression på de to undersæt.
Det næste sæt af ukalibrerede målinger blev taget umiddelbart efter det første sæt og foregik i rækkefølgen: 1200, 1100, … , 600, 600, 700, … , 1200
uncalib2.png

Ikke kalibrerede målinger. Sæt 2


Der ses god lineær regression

Nedenfor ses en kalibreringsmåling udført som beskrevet i metoden

calibration.png

Kalibreringsmåling


Der ses en god lineær sammenhæng og kalibreringsfaktoren aflæses til ca. $51.5 \frac{VL}{g}$
Efter kalibreringen blev følgende målinger foretaget.
calib.png

Kalibrerede målinger


Rækkefølgen på målingerne er desværre ikke noteret, udover at de første to målinger gav de to højeste værdier ved 1200 ml/t. Gennemgående sammenhæng mellem pumpeindstilling og målt flow blev ikke observeret.

Diskussion

Støj og signalbehandling

Der optrådte en vis mængde støj på alle målinger, både dem optaget i reel tid på forsøgsmodellen og de udleverede data. Det vurderes at hardware og opstilling er relativt modtagelig overfor støj grundet de uskærmede ledninger og samlinger, navnlig ved DIN-37D. Målingerne udviser alle en pæn komponent af 50Hz støj fra lysnettet. Støj på grund af manglerne i afskærmning af hardware kunne være blevet håndteret på flere måder.

For at omgå dette er det normalt at filtrere data, enten analogt eller digitalt, før databehandling. Der var ikke adgang til analoge filtre, hvorfor der blev forsøgt med digitale filtre. Filtreringen virkede efter hensigten og 50Hz komponenten blev effektivt fjernet, men det blev besluttet ikke at anvende det designede filter af flere årsager: Filteret resulterede i at systemet begyndte at respondere langsomt på ændringer i signalet. Dette skyldtes at vi benyttede et lavpas filter med en lav cut-off frekvens på omkring 0.5 Hz og høj orden for at opnå en skarp hældning på filterresponset. Filtreringen medførte også en vis træghed i systemet grundet de ekstra beregninger der skulle udføres. Dette var en betydelig faktor idet det gav en tidslig forsinkelse og begrænsede programmets anvendelighed i reel tid. Den vigtigste grund var dog at CORA viste sig at være relativt upåvirket af støj grundet måden hvorpå baseline fastsættes og måden hvorpå ekstrapolationen foretages. Filtreringen introducerede altså en række komplikationer i programmet der ikke blev opvejet af de fordele den medførte, da CORA fungerede tilfredsstillende uden, hvorfor filteret blev fravalgt.

Baseline fastsættes som nævnt ud fra middelværdien af 5 sekunders data, hvilket med den normale samplingfrekvens på 100Hz eller derover giver minimum 5000 målinger. 50 Hz støjen har zero mean hvorfor middelværdien over 5000 målinger må antages at være meget tæt på den virkelige baseline. Ved ekstrapolationen betragtes den midterste tredjedel af linjestykket mellem 'max' og 'min', og MATLABs fit metode benyttes til at lave regression efter disse datapunkter. Fit metoden søger at minimere residualfejlen på alle målinger hvorfor at selve værdien af første og sidste på linjestykket vil betyde relativt lidt. Selv ved et meget højt CO vil der forventes at være minimum 3 sekunder mellem 'max' og 'min', og fitting metoden vil altså benytte minimum 1 sekunds data at lave regression efter. Antages det at det værste tilfælde forekommer hvor første og sidste datapunkt i punktmængden er influeret af et henholdsvist positivt og negativt peak fra 50 Hz støjen, vil disses bidrag stadig være ubetydeligt til den samlede regression. Igen vil zero mean egenskaben for 50 Hz støjen medvirke at fittingen vil være relativt upåvirket af støjen da det bedste fit på en eksponentialfunktion forurenet med zero mean støj: $y(n) = be^{-an} + w(n), \hspace{10pt} E\{w(n)\} = 0$ er den uforurenede eksponentialfunktion $y_{fit}(n) = be^{-an}$ forudsat at fitting foregår over nok n således at zero mean approksimeres.

Der er selvsagt andet støj end 50Hz, endda støj der kan lede til at et falsk ROI identificeres. Meget tid og arbejde blev brugt på at udvikle krav der udelukkede at falske ROI blev identificeret, men dette var frugtesløst. For at omgå dette problem, benytter CORA en meget pragmatisk algoritme. Hvis det fundne ROI ikke giver anledning til et realistisk CO forkastes det simpelthen. Der bliver udregnet CO på alle identificerede ROI, men ikke alle resultater bliver accepteret. Dette viste sig at være en meget effektiv metode til at forhindre at forkert CO blev udregnet på grund af et falskt ROI. Ved denne metode lykkedes det at bestemme ROI på 100% af testdata samt på 100% af målinger på modellen.

Den støj som CORA er mest påvirket af er støj i det kritiske område hvorpå fittingen baseres der ikke har zero mean. Dette ses bedst på figur 50 hvor ekstrapolationen åbenlyst er forkert. Dette vil have en stor indflydelse på CO da AUC her vil blive alt for stort. Hvorvidt dette er støj eller et reelt udsving i koncentration er dog ikke til at afgøre. Sådanne udsving i koncentrationen i dette kritiske område vil på alle måder være svære at korrigere for.

Reproducibilitetstest

Tabellen fra ANOVA testen er gengivet her.

SASJMP.png

Tabel over varianskomponenter fra CORA

Denne viser at der kun er en meget lille fejlkilde ved at have forskellige operatører af CORA, dette kan ses ved at varianskomponenten der fremkommer pga. skiftende operatører kun er 0.02. Til gengæld viste den at den interne varians (residual), det vil sige den der beskriver variansen af målingerne taget af samme operatør på samme måling, til at være lidt større med en estimeret varians på 0.74. Dette er en smule bedre end cosimple.m der via en ANOVA analyse viste sig at have en intern varians på 0.96.
De store varianser der kan ses ved effekten af patient og måling var allerede forventet, idet at der ikke eksisterer nogen sammenhæng mellem patienternes CO og målingerne er taget ved flere forskellige aktivitetsniveauer. Der ses ligeledes store konfidensintervaller for bidraget af variansen fra både patient og og måling, men det er for vores undersøgelse uvedkommende da vi kun er interesseret i intern varians samt operatørens bidrag. Både for residual og operatørens bidrag ses der meget små konfidensintervaller og det kan derfor konkluderes at begge estimater er ret præcise.
Med den fundne varians for de to metoder kan et konfidensinterval udregnes.
95 % konfidensinterval for CORA: $\pm 1.69 \frac{liter}{min}$
95 % konfidensinterval for cosimple.m: $\pm 1.92 \frac{liter}{min}$

Variationen er en anelse større end forventet. Dette skyldes muligvis at det ikke er muligt at simulere en reel tids måling fuldstændig med disse forudoptagede datasæt. Ved udregning af CO på disse sæt var det ikke muligt at kontrollere injektionstidspunktet af ICG, hvilket gjorde det problematisk for operatøren at vide hvornår baseline skulle fastsættes. Der forekom også tilfælde hvor voltkurven ikke opnåede en stabil værdi, før at ICG blev injiceret og ROI forekom. Dette har i nogle tilfælde resulteret i at baseline blev sat for sent, da stabilitet ikke var opnået inden ICG blev injiceret. Dette har også haft indvirkning på kvaliteten af målingerne på grund af et skift af grundlinjens værdi mens kurven optages. Dette problem kan sandsynligvis undgås til en vis grad ved anvendelse af CORA idet programmet giver mulighed for at følge voltkurven live, og derved kan injektionen af ICG afholdes indtil stabilitet er opnået.

Selvom der ligger en vis usikkerhed i målingerne og det kan diskuteres hvorvidt dette ligger inden for hvad der er klinisk anvendeligt, viser ANOVA testen alligevel at CORA er en forbedring i forhold til cosimple.m med hensyn til reproducibilitet, højst sandsynligt på grund af den måde baseline fastsættes på.

Sammenligning med cosimple.m

Det interval som blev bestemt ved Bland-Altman metoden på

(40)
\begin{align} CO_C_O_R_A-3.69 \frac{liter}{min}\leq CO_c_o_s_i_m_p_l_e\leq CO_C_O_R_A+4.00 \frac{liter}{min}\ \end{align}

Er ud over grænserne for hvad der ville være klinisk og forskningsmæssigt acceptabelt. Der er dog en række faktorer der sætter spørgsmålstegn ved om dette interval er korrekt. Bland-Altman metoden antager at forskellene i metoderne der sammenlignes er normalfordelt [16]. Ved at betragte forskellene mellem de to metoder i et normalplot, kan antagelsen evalueres.

normplot1.png

Normalplot af forskellen mellem de to metoder. Nedenunder et histogram, med en Gaussisk kurve (rød linje) lagt ind over.

Havde antagelsen været opfyldt, ville alle målepunkter med god tilnærmelse være fordelt langs en lige linje på plottet. Dette er umiddelbart ikke tilfældet. De "centrale" målepunkter har fin lineær sammenhæng og er derfor normalfordelt, men især 4 målepunkter har stor afvigelse fra denne linje. Den store afvigelse fra normalfordelingen giver mistanke om at der er ukendte faktorer der spiller ind i disse målinger. Derfor foretages der en nærmere undersøgelse af netop disse punkter.
Figuren herunder viser kurven med tilhørende ekstrapolation fra både CORA og cosimple.m.

fejl1.png

Fejlekstrapolation fra CORA. Artefakterne på den nederste del af downslope forårsager ringe ekstrapolation

Det ses at der er en klar forskel i arealet under kurven hvilket forklarer differensen i beregnet CO. Kontrolleres kurven der blev bestemt af CORA, ses det at den ekstrapolerede kurve ikke følger den originale

fejl1C.png

Støjartefakt i den kritiske tredjedel mellem max og min medfører forkert ekstrapolation og forhøjet AUC

Ekstrapolationen er fejlagtig på grund af et støjartefakt der optræder på downslope. Dette store artefakt optræder i et kritisk område idet programmet bruger datapunkter omkring dette stykke til at lave eksponentiel regression efter.
Denne type fejl er ikke begrænset til programmet CORA, men optræder også under anvendelse af cosimple.m, da de benytter en lignende algoritme til at identificere data at lave regression på. Dette illustreres ved et andet af de fire punkter der lå markant uden for normalfordelingen, skyldtes den store forskel mellem målingerne en fejlekstrapolation hos cosimple.m. En illustration af dette er vist på nedenstående figur.

fejl2F.png

Fejlekstrapolation af cosimple.m. Denne sker på grund af der optræder store artefakter i det område hvor der laves lineær regression efter.

I de 2 resterende målinger ses der ingen umiddelbar fejlekstrapolering hos nogen af programmerne, men den ene har et højt signal-støj-forhold, og skulle have været sorteret fra i den indledende udvælgelse af data.
Derfor negligeres de målinger hvor der var foretaget fejlekstrapolationer og den hvor der var uhensigtsmæssigt meget støj. Bland-Altman testen gentages. Dette gøres for ikke fejlagtigt at konkludere at CORA producerer fejlagtige resultater. I stedet nøjes der med at medtages målinger hvor begge programmer giver tilnærmelsesvis korrekte resultater. De fejlekstrapoleringer der blev opdaget skal selvfølgelig medtages i overvejelserne om CORA's anvendelighed, men til denne analyse vil resultaterne blive mere anvendelige hvis de negligeres.

Vælges der at ignorere de pågældende målinger fås der et nyt normalplot

normplot2.png

Normalplot med tilhørende histogram for data efter visse yderpunkter er fjernet. Det ses at der er større lineær sammenhæng på normalplottet, hvilket betyder at normalfordelingsantagelsen i højere grad er opfyldt.

Hvor det ses at forskellene i målingerne passer bedre sammen med normalfordelingen. Dette medfører også en ny bias og standardafvigelse på henholdsvis $\mu=0.21$ og $\sigma=1.33$, hvilket giver et 95 % konfidensinterval på

(41)
\begin{align} CO_C_O_R_A-2.69 \frac{liter}{min}\leq CO_{cosimple}\leq CO_C_O_R_A+3.11 \frac{liter}{min}\ \end{align}

Selvom dette er en væsentlig forbedring, kan det stadig diskuteres hvorvidt det er en acceptabel afvigelse. Selv efter beskæring af nogle af yderpunkterne er det svært at kalde det 95 % procent konfidensinterval der udregnes på $-2.69 \frac{liter}{min}$ til $3.11 \frac{liter}{min}$ tilfredsstillende. Ved målinger på sengeliggende patienter vil et CO på $5 \frac{liter}{min}$ være forventet, og en forskel på $2 \frac{liter}{min}$ kunne spille en afgørende rolle diagnostisk. Den fundne bias på $0.22 \frac{liter}{min}$ mellem cosimple.m og CORA er ikke af nogen afgørende betydning. Det kan nemt tænkes at variansen af forskellen mellem målingerne er afhængig af CO, men idet der kun foreligger få egnede datasæt fra forsøgspersonen ved lave målinger har det ikke været muligt at bekræfte denne hypotese. Derfor må man antage et "worst case scenario" hvor variansen af målingerne regnes med at være lige stor ved alle CO.

Resultatet af testen her skal dog tages med visse forbehold. Normalt vil man antage, eller det vil være bevist, at den ene af de to metoder producerer korrekte resultater, således at den anden kan sammenlignes hermed. Dette kan være svært at gøre i dette tilfælde, da der blev foretaget flere ændringer i cosimple.m under arbejdsprocessen for at optimere programmet. Derfor kan det virke misvisende at sammenligne de to programmer. Der vil her blive bragt en kort forklaring over hvilke ændringer der blev foretaget, og hvorfor det blev valgt at implementere dem.

cosimple.m fungerede ved at foretage lineær regression på downslope efter at datapunkterne var blevet logaritmisk transformeret. For at undgå at negative datapunkter optrådte, blev der lagt en konstant på 5 til alle datapunkter. Dette gav problemer når datapunkter skulle transformeres tilbage igen, og gav forkert ekstrapolation. Derfor blev programmet modificeret således minimumsværdien trækkes fra i stedet.

untitled.png

ekstrapoleret kurve før og efter rettelsen blev fortaget.

Samtidig blev der kun ekstrapoleret til enden af det udskårede datasæt, hvilket resulterede i at arealet under kurven i tilfælde fremstod mindre end hvad tilfældet var. Denne fejl blev rettet ved at enden af datasættet paddes med 30 sekunder. Disse ændringer betød at cosimple.m der blev brugt til sammenligning af CORA gav nogle andre resultater end det oprindelige, og at de to programmer lignede hinanden på mange måder, hvorfor det kan virke unødvendigt at sammenligne dem. At cosimple.m stadig blev medtaget til sammenligning var fordi ROI blev bestemt af en operatør. På denne måde kunne man undersøge effekten af at lade CORA finde ROI kontra at den blev defineret manuelt.

Forskelsintervallet for de to metoder er ikke ubetydeligt småt, hvilket indikerer at der er en forskel på det manuelt definerede ROI og CORA's ROI. Forskellen ligger i fastsættelsen af grundlinjen, baseline. I cosimple.m blev baseline defineret som det første punkt af den definerede ROI. En lille ændring af dette punkt ville derfor forårsage at en konstant vil blive lagt til alle punkter langs hele kurvens længde. På denne måde kunne selv små ændringer af første punkt, forårsaget af støj, have stor betydning. En anden faktor der er af indflydelse er manglende stabilitet af grundlinjen i nogle datasæt. Dette betyder at den rigtige baseline ikke umiddelbart kan bestemmes korrekt, hvilket giver variation af resultaterne. Grundet disse faktorer bliver variansen af de individuelle metoder høj, hvilket medfører høje grænser for forskelsintervallet som Blandt-Altman testen estimerer.

Det konkluderes at det er problematisk at sammenligne de to metoder. Begge metoder har en relativ høj intern varians hvilket bidrager til de høje grænser i forskelsintervallet som Bland-Altman metoden estimerer. Dette bør sammenholdes med resultatet af reproducibilitetstesten der fandt at den interne varians af CORAs resultater var mindre end dem produceret af cosimple.m. Dette giver information om at det i højere grad er cosimple.m der bidrager til de højere grænser. Ingen af de to metoder kan antages at give de korrekte resultater, og analysen giver primært et estimat af effekten ved at have et manuelt defineret ROI. Det vurderes at sandsynligheden for et have en korrekt baseline og dermed ROI er størst ved CORAs midlingsmetode. Hvis det også overvejes at CORA implementerer muligheden for at bestemme ROI manuelt med funktionen "Manual Overwrite", vurderes det at CORA præsterer en væsentlig forbedring i præcision af resultater over cosimple.m.

Flowmålingerne

Det er uden for denne rapports afgrænsninger at bevise indikatorfortyndingsmetoden. Metoden er blevet vist utallige gange før og fokus har været at forbedre selve dataopsamling og -behandling. Indikatorfortyndingsmetoden antages at gælde og evt. fejl og afvigelser fra denne undersøges derfor med henblik på at finde grunden til disse i hardware, opsætning eller CORA.

En generel tendens der desværre ikke fremgår så tydeligt som ønsket af målingerne var at der pludseligt og uforklarligt skete en markant ændring i hældning og offset. Dette ses bedst på sæt 1 af de ukalibrerede målinger. Som beskrevet blev målinger med de lige pumpeindstillinger, 1200, 1000 etc., foretaget først og derefter med de ulige indstillinger. Der ses tydeligt et skift i hældning og offset efter den sidste lige måling på 600ml/t blev foretaget. Mere specifikt sker der en ændring i hældning på 1.20 til 1.35, altså ca. 11%. Offset ændrede sig fra 39 ml/t til -453 ml/t, altså en ændring på 492 ml/t, hvilket er en ret stor ændring når målingerne ca. ligger i intervallet 500 ml/t til 1500 ml/t.

Denne ukendte effekt blev observeret intermitterende uden noget gennemskueligt mønster. Dette blev især et problem under de kalibrerede målinger.
De to målinger på pumpeindstillingen 1200 ml/t der gav ca. det samme blev foretaget først. Dette indikerer at den målte kalibrering passede indledningsvis. Den eksakte rækkefølge af de resterende målinger blev ikke noteret, men den sidste måling der blev foretaget var en med en pumpeindstilling på 1200 ml/t igen, men i dette tilfælde gav CORA et flow på kun 800 ml/t. Forholdet mellem lysabsorption og voltsignal fra densitometret må altså have ændret sig. Der kan dog bemærkes en lineær sammenhæng mellem den føromtalte sidste måling på 1200 ml/t og de lave målinger ved 600 ml/t, 800 ml/t og 1000 ml/t. Dette indikerer at forholdet mellem absorption og signal har været konstant her, men havde ændret sig fra begyndelsesforholdet.

At der fremkommer et offset i nogle målinger præsenterer en række problemer, idet at det ikke burde eksistere. Det er selvfølgelig forventet at mindre off-set fremkommer i ligningen for den lineære regression, men et stort negativt off-set indebærer at der skulle udregnes et negativt areal under koncentrationskurven ved lave pumpeindstillinger, hvilket ikke giver mening. Det store offset der fremkommer i sæt 1 undersæt 2 kan ikke kun tilskrives små afvigelser imellem målepunkterne. En forklaring på hvordan dette offset kunne fremkomme, var at densitometret blev enten mere eller mindre følsomt i mellem målingerne, dvs. dens volt-output som funktion af lysabsorbtionen ændrede sig. Betragtes sæt 1 undersæt 2, kunne man forestille sig at densitometret begyndte at have lavere følsomhed for lysabsorption imellem målingen fra $700 \frac{ml}{t}$ til den på $900 \frac{ml}{t}$, således at voltkurven fik en lavere højde og et mindre areal, hvilket til gengæld ville producere et højere CO, end det der ville have været set, havde densitometret haft samme følsomhed som ved målingen på $700 \frac{ml}{t}$. Denne form for ændring af følsomheden imellem målingerne ville give et offset, men kun mellem to punkter. Hvis samme mønster som der ses over målingerne på sæt 1 undersæt 2, hvor der er lineær sammenhæng mellem tre punkter, skulle fremkomme, ville det kræves at der skete samme forskydning af følsomhed mellem målingen på $900 \frac{ml}{t}$ og den på $1100 \frac{ml}{t}$.
Det er ikke kendt hvad der kunne give anledning til en sådan forskydning i densitometrets følsomhed, så der kan kun foretages gæt. Man kunne mistænke at der lå en tidsafhængig faktor bag, og det blev også observeret at densitometret udviste et svagt skift i grundlinje over en større tidsperiode, men intet der virkede så hurtigt at det kunne forklare resultaterne i sættet med det store offset. Et andet fænomen der kunne observeres på nogle af de udleverede testdata var at densitometrets signal faldt til under nulpunktet efter der havde passeret ICG igennem det. Dette kunne tyde på at densitometret blev mindre følsomt i perioden efter høj lysabsorption, men kunne også skyldes andre faktorer fra forsøget.

illusttration.png

Forklaringsmodel for offset. Sæt 1 undersæt 2 med tilføjede datapunkter i origo for at vise effekten af en ændring af kalibreringsfaktoren mellem målingerne.

Figuren viser sæt 1 undersæt 2 der havde et betydeligt offset. Figuren er fremstillet ved manuel indsættelse af røde, grønne og blå målepunkter i origo. Disse afspejler ikke virkelige data, men tjener blot en forklaringsmæssig funktion. Forestiller man sig at densitometret er blevet mindre følsomt for lysabsorption i mellem målingerne, hvilket ville give en større hældningskoefficient, vil en kurve som den der er blevet målt kunne fremkomme. Havde densitometret bibeholdt den følsomhed som der ses fra første måling, var de grønne målepunkter fremkommet, havde det kun haft den følsomhed der blev observeret ved anden måling, var de røde målepunkter fremkommet, og ligeledes med 3. måling og de blå punkter. Individuelt har alle sæt af røde, grønne eller blå ingen eller kun lille offset, og lineær sammenhæng, men ændres følsomheden målingerne imellem kan det ses at der fremkommer offset. Dette kunne potentielt forklare det observerede offset i sæt 1 undersæt 2.

Selvom der ikke ligger noget sikkert bevis for det syntes hældningen på grafen der fremkom fra målingerne at være meget følsom overfor ændringer foretaget på modellen. Specielt blandingskammerets volumen så ud til at have betydning, selvom der ikke er blevet fundet noget belæg i teorien for at denne parameter skulle have en indvirkning på CO. Ikke desto mindre lod det til at have stor indvirkning idet at målinger var svære at replicere efter at blandingskammeret var blevet tømt som forsøg på at fremskynde processen med at rense systemet for ICG.
En sidste væsentlig betragtning der kunne have haft indflydelse på målingerne der blev gjort var at slangen hvorpå cuvetten sad blev farvet mere og mere grøn jo flere målinger vi foretog, dette vil selvsagt hæve baseline for systemet men AUC burde være uændret, da det repræsenterer arealet under en koncentrationsændring relativ til baseline. Umiddelbart virker ingen af de givne teorier til at kunne forklare målingerne fuldstændigt.

Hvis offset er negligerbart som i det ukalibrerede sæt 2, åbnes der for en nemmere måde at anskue data på. Hvis P angiver pumpeniveauet er CO da givet ved

(42)
\begin{equation} Q = aP \end{equation}

Hvor a er den konstant der ses i den lineære regression.
Det rigtige forhold mellem P og Q er $Q=P$. Således kan der defineres en konstant der transformerer Q til det rigtige resultat:

(43)
\begin{align} cQ=caP=P \Leftrightarrow c=\frac{1}{a} \end{align}

Altså, hvis målingerne ikke viser noget offset kan de transformeres således at de giver det rigtige ved at gange en konstant på alle målingerne. At gange denne konstant c på kan opfattes som at ændre den benyttede kalibreringsfaktor. Dette resultat er vigtigt i de tilfælde hvor offset er negligerbart og kalibreringskoefficienten er arbitrær, som i sæt 2 og sæt 1 undersæt 1. Hvis sidstenævnte betragtes, er målingerne som sagt blevet taget med en tilfældig valgt kalibreringsfaktor på $65 \frac{VL}{g}$. Ved kalibrering blev en kalibreringsfaktor fundet på ca. 51. Hvis vi skal prøve at se på hvordan målingerne havde set ud med denne kalibreringsfaktor kan vi dividere med den gamle kalibreringsfaktor og gange med den nye.

(44)
\begin{align} Q_g = \frac{Ik_g}{AUC} \end{align}
(45)
\begin{align} Q_n = \frac{k_n}{k_g}Q_g = \frac{k_n}{k_g}\frac{Ik_g}{AUC} = \frac{Ik_n}{AUC} \end{align}

Her betegner $k_g$ den gamle kalibreringsfaktor og $k_n$ den nye. Her ganges altså med konstanten $c=\frac{k_n}{k_g}$. Dette giver

(46)
\begin{align} c=\frac{k_n}{k_g}=\frac{51.5 VL/g}{65.8 VL/g} = 0.78 \end{align}

Hvilket næsten giver det $c$ som teoretisk ville de give de korrekte resultater, nemlig:

(47)
\begin{align} c=\frac{1}{a}=\frac{1}{1.19} = 0.84 \end{align}

Dette betyder, at den kalibreringsfaktor der senere blev bestemt, har været tæt på den der skulle have været benyttet ved optagelsen af sæt 1 undersæt 1. Indsættes værdien for $k_n$ ses dette

recalib.png

Sæt 1, undersæt 1 efter rekalibrering.

Som det ses er målingerne i dette tilfælde betydeligt bedre. Der ses god linearitet, negligerbart offset og en hældning meget tæt på 1, hvilket betyder at det målte CO er meget tæt på pumpeniveauet, hvilket også kan ses direkte af figuren.

At den fundne kalibreringsfaktor passer godt på disse målinger kan muligvis forklares ved at målingerne var de første der blev taget på den pågældende dag, hvilket også gjaldt for kalibreringsfaktoren. Hvis det ukendte fænomen var tidsafhængigt, kunne det betyde at de umiddelbart første målinger der blev taget på en given dag, havde nogenlunde ens sammenhæng mellem lysabsorbtion og volt-output. Samme transformation vil kunne laves med sæt 2, ved at gange med $c=\frac{1}{0.73}$. Dette viser, at hvis ordentlig kalibrering havde været mulig, havde sæt 2 givet korrekte resultater.

De fremstillede teorier giver forklaring på resultaternes tilsyneladende utilstrækkelighed i forhold til det forventede, uden at inddrage CORA's som årsag hertil. Der er dog for store usikkerheder involveret til at der kan drages nogle endelige konklusioner vedrørende CORA's, hardwarens og opstillingens gyldighed eller mangler. Umiddelbart vurderes den mest sandsynlige årsag til de skæve målinger dog til at være til stede i densitometret eller modellen, og ikke i programmet CORA.

Klinisk anvendelighed

Introduktion

Den opstillede løsning er trebenet, forstået således at den kan opdeles i hardware, software og metode. På baggrund af den foreløbige diskussion vil de følgende afsnit vurdere i hvor stor udstrækning hardware, software og metode er klinisk anvendelig.

Hardware og opsætning

Hardwareløsningen er stort set uændret fra BBH intensivafdelings hidtillige opsætning. Ændringer består primært i et nyt AD-kort der fungerer med MATLAB, nødstrømsforsyning og rullebord.

Opsætningen er grundet rullebordet så mobilt som det kan være ved brug af de komponenter der var stillet til rådighed. Det vurderes at opsætningen er klinisk brugbar i den mildeste form af ordets betydning, hermed forstået at den kan bruges til formålet.

En ikke uvæsentlig faktor er udseendet på opsætningen og hvordan det vil tage sig ud i klinikken. Opsætningen giver ikke indtryk af at være professionel og sikker, hvilket muligvis kan afskrække visse patienter. Der er betydelige faktorer der ikke er tænkt ind i opsætningen, navnlig el-sikkerhed, hygiejne og de utallige myndighedskrav der er ved medicinsk udstyr. Hardware og opsætning er, ligesom software, rettet mod anvendelse af BBH intensivafdeling. Afdelingen kender udstyret og opsætningen og kan vurdere hvorvidt det er forsvarligt at bruge i en given situation. Givet de invasive procedurer de benytter i øjeblikket [18] til at foretage CO målinger vil denne opsætning, på trods af dens noget uprofessionelle udseende, sandsynligvis være at foretrække i mange tilfælde. En væsentlig forbedring med hensyn til opstillingens udseende vil nok kunne opnås med improviserede løsninger som eksempelvis at dække den nederste hylde på rullebordet af med et kirurgisk klæde.

CORA

CORAs vigtigste bidrag til den kliniske anvendelighed er dens evne til at udregne CO i reel tid. Dette er ikke bare et bidrag men en forudsætning for den kliniske anvendelighed. Lægerne har ikke tid til manuelt at skulle udføre store mængder databehandling og patienterne kan ikke være tjent med den forringede pleje som den øgede ventetid medfører.

Det er, som diskuteret, forsøgt at validere CORAs evne til at give de rigtige resultater.
Sammenligningen med cosimple.m er besværliggjort af at cosimple.m løbende blev rettet for diverse fejl og uhensigtsmæssigheder. Det var derfor svært at betragte cosimple.m som en gyldig standard efter fund af disse fejl. Vi mener på grund af dette at CORA gør det bedre end cosimple.m, der førhen er blevet benyttet i forskningssammenhænge. Noget endegyldigt bevis for CORAs evner findes altså ikke, men en forbedring af noget der allerede er accepteret er fundet.

Ved forsøg på modellen opstod der ligeledes problemer med at validere resultaterne CORA gav. Det vurderes dog at dette ikke har noget med CORA at gøre, men skal tilskrives modellen og evt. densitometeret. Det vigtigste resultat i retning af klinisk anvendelighed var her at CORA kunne benyttes i alle forsøgene til at foretage målingerne.

CORA er designet med så få valgmuligheder som muligt, således at operatøren på det nærmeste ledes gennem processen. CORA siger hvad operatøren bør gøre under hvert skridt, f.eks. skrives der når der skal injiceres ICG og når baseline skal sættes osv. Det vurderes derfor at det er svært selv for en relativt uøvet bruger at lave fejl.

Det vurderes således at CORA fuldt ud er klinisk anvendeligt i hænderne på personalet på BBH intensivafdeling, såfremt de har en grundliggende forståelse for indikatorfortyndingsmetoden og har modtaget en instruks i brug af CORA.

Metoden

Den største ændring i metoden til foretagelse af CO målinger som beskrevet af Robert Boushel [11], er at CO udregnes live. Dette betyder en del for den kliniske anvendelighed da CO kan findes på et par minutter i forhold til flere timer eller uger.

CORA kræver dog at kalibreringsfaktoren inputtes før målingen. Hidtil er kalibreringsfaktoren fundet til sidst efter målinger. Hvis den forkerte kalibreringsfaktor benyttes af den ene eller den anden årsag kan der dog omregnes til en ny kalibreringsfaktor som vist i diskussion af flowmålingerne. At systemet skal kalibreres er en begrænsende faktor for den kliniske anvendelighed. At tage kalibreringen kræver at udtrække 3 eller flere kendte volumener blod fra pt. og derefter blande det med en kendt mængde ICG. Bagefter skal der måles på disse og volt/koncentration sammenhængen skal findes ved lineær regression, f.eks. i excel. Dette tager lang tid og kræver større viden i forhold til at gennemføre selve CO målingen. Yderligere arbejde mht. kalibrering bør altså foretages for at nærme sig en løsning der ikke kræver kalibrering før hver pt. Det kan f.eks. forestilles at det eneste betydende for kalibreringsfaktoren fra pt. til pt. er forholdet mellem de formede elementer og plasma, således at et udtryk for kalibreringsfaktoren kan findes som funktion af dette forhold.

Metoden kræver venøs og arteriel adgang, og her er den arterielle adgang hæmmende for den kliniske anvendelighed. Dette er imidlertid ikke noget problem på BBH intensivafdeling hvor samtlige patienter har arteriel adgang.

ICG har, som beskrevet, mange fordele og er grundet disse valgt som indikator, men det har én relativt stor ulempe, nemlig dets korte holdbarhed i opblandet form. I pulverform har det nærmest ubegrænset holdbarhed, men i opblandet form skal det bruges inden 6 timer [17]. ICG sælges i pulverform i 25mg og 50mg beholdere (ICG-Pulsion, Medical Systems AG, München). ICG opløsningen produceres ved at opblande med sterilt vand således at en 5mg/ml opløsning nås. Ved de udleverede datasæt blev der anvendt mellem 0.5ml og 1.6ml, hvilket giver at en beholder indeholder mellem 3 (1.6ml og 25mg) og 20 målinger (0.5ml og 50mg). Det er uhensigtsmæssigt at ICG ikke kan opbevares i opblandet form da det medfører at hele mængden af ICG i en beholder bliver ubrugeligt, hvis blot en enkelt CO måling skal gennemføres. Således skal klinikeren altså forsøge at tage hensyn således at flere CO målinger kan tages samtidigt for bedst at udnytte ICG'en.

Det vurderes altså at metoden vil kunne benyttes til at foretage kliniske CO målinger på BBHs intensivafdeling, men den tidskrævende kalibrering før hvert pt. er en stor hæmmende faktor.

Perspektiver og fremtidig udvikling

Nærværende rapport har fokuseret på det ene ben af trekanten hardware og opsætning, metode og software, nemlig software. Mht. klinisk anvendelighed bør hovedvægten af fremtidigt arbejde lægges på de to andre ben. De to områder der kan ske størst fremskridt inden for er kalibrering og behovet for arteriel adgang.

Som beskrevet tager kalibreringen lang tid og kræver relativt stor viden om indikatorfortyndingsmetoden at udføre. Der bør foretages forskning i retning af at afskaffe behovet for denne pt. til pt. kalibrering. Som beskrevet kan det forestilles at kalibreringsfaktoren udelukkende er afhængig af forholdet mellem plasma og de formede elementer således at kalibreringsfaktoren kan findes som en funktion af dette forhold. Ideelt set ville kalibreringsfaktoren være konstant eller automatisk blive korrigeret, f.eks. ved et densitometer der gennemlyste blodet med en kendt lysstyrke og ud fra absorptionen kunne udregne en korrigerende faktor. Kalibreringen er den enkelt største hæmsko med henblik på umiddelbar klinisk anvendelse. Yderligere arbejde bør prioritere denne højest.

Behovet for arteriel adgang begrænser metodens kliniske anvendelighed til afdelinger hvor pt. allerede har fået lagt denne. Arteriel adgang kan selvfølgelig lægges hvis det vurderes at en måling af CO er tilstrækkelig nødvendig, men det er unægteligt en hæmmende faktor for anvendelsen. Hvis målingen af indikatoren kunne foretages transkutant ville metodens målgruppe øges dramatisk. Man kunne forestille sig at transkutane CO målinger ville blive ligeså anvendte og udbredte som de transkutane iltmætningsmålinger der foretages med pulsoximetre. Transkutane målinger, der kræver kalibrering som hidtil, vil dog fjerne en stor del af denne kliniske anvendelighed og tilgængelighed. DTU nanotek og BBHs intensiv afdeling arbejder i denne retning, med udvikling af en ICG-koncentrations transducer indlejret i et plaster til trådløse og transkutane målinger.

Hvis den nuværende metode med arterielle koncentrationsmålinger bibeholdes bør hardware og opsætning forbedres væsentligt. Densitometer og tilhørende computer bør bygges sammen i en enkelt enhed, der ikke fylder mere end hvad nemt kan bæres rundt. Det er bestemt muligt, men kræver at hardware produceres til formålet, noget som BBH sandsynligvis ikke har adgang til. Med nuværende hardware kan opsætning ikke forbedres væsentligt. Det er mere sandsynligt at løsningen ligger i form af de plastre der udvikles på.

Der bør foretages yderligere målinger på modellen for definitivt at fastslå hardware og opsætnings evne til at foretage korrekte CO målinger.

I teoriafsnittet blev et udtryk for volumen af det største blandingskammer udledt:

(48)
\begin{align} \frac{dln(y_{N}(5\tau_{ns}<t))}{dt} \approx -\frac{Q}{V_{max}} \end{align}
(49)
\begin{align} V_{max} \approx -\frac{Q}{\frac{dln(y_{N}(5\tau_{ns}<t))}{dt} } \end{align}

Hvis dette største blandingskammer er et anatomisk velafgrænset volumen f.eks. det pulmonære blodvolumen, vil denne parameter også kunne have anvendelse. Man vil således med én måling få både CO og det pulmonære blodvolumen, en parameter som BBHs intensiv afdeling har udtrykt interesse for. Der bør foretages yderligere forsøg på modellen hvor blandingskammerets volumen varieres. Hvis resultaterne understøtter teorien bør der foretages forsøg på forsøgspersoner hvor man sammenholder det udregnede maksimale blandingskammers volumen med det pulmonære blodvolumen målt med en anden metode. Hvis en sammenhæng findes således at det pulmonære blodvolumen kan findes ud fra den eksponentielle hældning af ICG udvaskning bør CORA ændres således at også denne parameter vises.

ICG benyttes også til målinger af leverfunktionen. Det bør undersøges om denne parameter også kan findes ud fra CO målingerne, f.eks. ved at sammenligne maksimum ICG koncentration for first-pass med maksimum ICG koncentration efter n passager af leveren. n passager af leveren svarer til n recirkulationsmaksimum på CO målingen hvorfor disse burde være nemme at aflæse. CORA bør ændres til også at vise denne parameter hvis det viser sig at være muligt.

CORA kan også forbedres. Det kunne være interessant at eksperimentere med at finde ROI og ekstrapolationen ved at modellere koncentrationskurven som en sum af et antal eksponentialfunktioner med forskellige tidskonstanter og forsøge at fitte sig frem til den bedste approksimation ved at søge i løsningsrummet efter den bedste fit, med f.eks. en genetisk algoritme. Man kunne også eksperimentere med at træne et neuralt netværk til at finde ROI. De forbedringer disse nye metoder vil kunne give er dog uvæsentlige i forhold til de mere presserende problemer metoden har, som f.eks. kalibrering, hvorfor de bør nedprioriteres.

Perspektiverne for CO målinger med indikatorfortyndingsmetoden er således yderst interessante. Hvis ovenstående forslag til forbedringer giver tilfredsstillende resultater vil en CO måling kunne foretages transkutant og trådløst og give oplysninger om det pulmonære blodvolumen samt leverfunktionen. CO målinger vil kunne blive lige så almindelige som måling af blodtryk og spille en stor rolle som diagnostisk parameter.

Konklusion

Det lykkedes at udvikle et program der i vid udstrækning opfylder specifikationerne stillet af BBH intensivafdeling. Programmet formår at udføre dataopsamling og -behandling i reel tid. Resultater fra udleveret testdata og målinger på forsøgsmodel, lægger desværre ikke op til nogle entydige konklusioner om hardware eller programmets brugbarhed. Dette til trods vurderes det at programmet repræsenterer en stor forbedring i retning af klinisk brugbarhed, og at de observerede uregelmæssigheder må have haft andre kilder. Hardwareløsningen kan på baggrund af de opnåede resultater ikke endeligt valideres.

Der er opstillet en række konkrete forslag til forbedringer og fremtidig udvikling, der vil gøre metoden yderligere klinisk anvendelig. Disse forslag kan umiddelbart følges og vil umiddelbart afhjælpe de største problemer der præger nuværende løsning. Som den enkelt vigtigste hindring, nævnes nødvendigheden af kalibrering før hver måling, og forskning med henblik på at kunne undvære denne bør prioriteres.

Med det udviklede software og hardware er det på nuværende tidspunkt muligt at foretage målinger på patienter. Implikationerne af det udførte arbejde er at BBH intensivafdeling med minimal yderligere udvikling, vil være i stand til at foretage CO målinger bedside med den udviklede løsning. Dette vil give lægerne en vigtig diagnostisk parameter og således øge deres muligheder for at give den korrekte behandling. Patientforløbet kan på bagrund af dette forhåbentlig forkortes og udfaldet kan forbedres.

Ydermere vil løsningen gøre sig gældende i forskningssammenhænge, hvor det vil lette arbejdsbyrden og åbne for muligheden af forsøg hvor kendskab til CO i reel tid er en nødvendighed. Den udviklede løsnings anvendelighed til dette formål illustreres bedst ved at det forventes benyttet i forsøg juni 2009.

Referencer

1. Lathi B.P.: Signal Processing & Linear Systems, 1st edition, Oxford University Press, 1998
2. Donovan F.M., Taylor, B. C.: cardiac output, Encyclopedia of Medical Devices and Instrumentation, Second Edition, John Wiley & Sons, Inc., 2006
3. Togawa T, Tamura T, Öberg P Å: Biomedical Transducers and Instruments, CRC Press
4. Kuebler WM, Sckell A, Habler O, Kleen M, Kuhnle GE, Welte M, Messmer K and Goetz AE: Noninvasive measurement of regional cerebral blood flow by near-infrared spectroscopy and indocyanine green. Journal of Cerebral Blood Flow and Metabolism, Volume 18, Issue 4, 1998
5. Boushel R, Langberg H, Olesen J, Nowak M, Simonsen L, Bulow J, Kjær M: Regional blood flow during exercise in humans measured by near-infrared spectroscopy and indocyanine green, Journal of Applied Physiology, Volume 89, Issue 5, 2000
6. Seeley, Stephens, Tate: Anatomy and Physiology, Seventh Edition, McGraw-Hill, 2006
7. Schroeder T, Schulze S, Hilsted J, Aldershvile J: Basisbog i Medicin & Kirugi, 3. udgave, Munksgaard Danmark, 2005
8. Vincent, Jean-Louis MD; Dhainaut, Jean-Francois MD; Perret, Claude MD; Suter, Peter MD: Is the pulmonary artery catheter misused? A European view, Critical Care Medicine, Volume 26, Issue 7, 1998
9. Christiansen C, Hostrup A, Tønnesen E, Haunstrup E: Kredsløbsmonitorering
med lithium dilution cardiac output- systemet, Ugeskrift for Læger, Volume 170, Issue 7, 2008
10. Open Source Initiative, CA, The MIT license. http://www.opensource.org/licenses/mit-license.php, 10-05-09
11. Boushel R, Calbet JA, Radegran G, Sondergaard H, Wagner PD, Saltin B: Parasympathetic neural activity accounts for the lowering of exercise heart rate at high altitude. Circulation, Volume 104, Issue 15, 2001
12. Fox I J: History and Developmental Aspects of the Indicator Dilution Technic, Circulation Research, Volume 10, 1962
13. Zierler K: Indicator dilution methods for measuring blood flow, volume, and other properties of biological systems: A brief history and memoir, Annals of Biomedial Engineering, Volume 28, Issue 8, 2000
14. D. N. Ku, G. W. Woodruff: Blood flow in arteries, Annual Review of Fluid Mechanics, Volume 29, 1997
15. Kuebler WM. How NIR is the future in blood flow monitoring? Journal of Applied Physiology, Volume 104, Issue 4, 2008.
16. Bland JM, Altman DG: Statistical methods for assessing agreement between two methods of clinical measurement, The Lancet, Volume 1, Issue 8476, 1986
17. EyeSupply USA, Inc, FL, http://www.eyesupplyusa.com/ICG-Pulsion.html, 22-05-09
18. L. J. Caruso, A. J. Layon, A. Gabrielli: What Is the Best Way To Measure Cardiac Output? CHEST, Volume 122, Issue 3, 2002
19. Cheetah Medical, Inc., OR, http://www.cheetah-medical.com/Y-CO/Y-CO.html, 28-05-2009
20. Lundberg H, Nær-Infrarød Spektroskopi til måling af hjertets minutvolumen og vævsgennemblødning, 2008


www.elektro.dtu.dk

Department of Electrical Engineering
Technical University of Denmark
Ørsteds Plads
Building 348
DK-2800 Kgs. Lyngby
Denmark
Tel: (+45) 45 25 38 00
Fax: (+45) 45 93 16 34
Email: info @ elektro.dtu.dk

Appendiks

Screenshots af ekstrapolation

1_1.png
1_10.png
1_14.png
1_2.png
1_3.png
1_4.png
1_5.png
1_6.png
1_9.png
2_1.png
2_10.png
2_16.png
2_17.png
2_18.png
2_19.png
2_2.png
2_3.png
2_4.png
2_5.png
2_6.png
2_7.png
2_8.png
2_9.png
3_1.png
3_2.png
3_3.png
3_4.png
3_6.png
3_7.png
4_1.png
4_2.png
4_3.png
4_4.png
4_5.png
4_6.png
4_7.png
4_8.png
4_9.png
5_1.png
5_2.png
5_3.png
5_4.png

CORA

UI.m

%{
Copyright (c) 2009 Rasmus Berg Palm rasmusbergpalm@gmail.com, Simon Ezban Grützmeier s062282@student.dtu.dk

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
%}
function varargout = UI(varargin)
% UI M-file for UI.fig
%      UI, by itself, creates a new UI or raises the existing
%      singleton*.
%
%      H = UI returns the handle to a new UI or the handle to
%      the existing singleton*.
%
%      UI('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in UI.M with the given input arguments.
%
%      UI('Property','Value',...) creates a new UI or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before UI_OpeningFunction gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to UI_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Copyright 2002-2003 The MathWorks, Inc.

% Edit the above text to modify the response to help UI

% Last Modified by GUIDE v2.5 06-May-2009 10:30:23

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @UI_OpeningFcn, ...
                   'gui_OutputFcn',  @UI_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT

% --- Executes just before UI is made visible.
function UI_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to UI (see VARARGIN)
clear global;
clc;

% Choose default command line output for UI
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes UI wait for user response (see UIRESUME)
% uiwait(handles.figure1);

% --- Outputs from this function are returned to the command line.
function varargout = UI_OutputFcn(hObject, eventdata, handles) 
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;

% --- Executes on button press in acquiredata.

function acquiredata_Callback(hObject, eventdata, handles)
if(get(hObject,'Value') == get(hObject,'Max')) %Start
    cla; clear global;
    global v;
    set(handles.setbaseline,'Enable','On');
    set(handles.savedata,'Enable','Off');
    set(handles.manualoverride,'Enable','Off');

    set(hObject,'String','Stop');
    set(handles.msg,'String',{'Draw blood','Press set baseline when stable.'});
    set(handles.COtextarea,'String','');

    v.baselineset = 0;
    v.iup = 0; iup = 0;
    v.imax = 0; imax = 0;
    v.imin = 0; imin = 0;
    v.CO = 0; 

    v.Injected = str2double(get(handles.injected,'String'));
    v.Calibration = str2double(get(handles.calibration,'String'));

    v.data = [];
    v.Fs = 8000; %Samples per second [Hz]
    v.RefreshRate = 10; % update calls per second [Hz]

%     create 'LineIn'    
%     v.ai = analoginput('winsound');
%     addchannel(v.ai,1);
    v.ai = analoginput('mwadlink',0);
    addchannel(v.ai,29);

    % config LineIn
    set(v.ai,'SampleRate' , v.Fs); %Sampling frequency.
    set(v.ai,'SamplesPerTrigger' , inf); %Keep sampling
    set(v.ai,'SamplesAcquiredFcnCount', v.Fs/v.RefreshRate); %Every v.Fs/v.refreshrate samples a function is called. Since v.Fs is sampled in 1 second, v.refreshrate determines how many times per second the function is called
    set(v.ai,'SamplesAcquiredFcn' , {@update, handles}); %Call update() everytime above number of samples are taken

    start(v.ai);
else %Stop
    global v;
    set(hObject,'String','Start');
    set(handles.setbaseline,'Enable','Off');
    set(handles.manualoverride,'Enable','On');
    set(handles.savedata,'Enable','On');
    stop(v.ai);
    delete(v.ai);
end

function update(a,b,handles)
global v;

[data(:,2), data(:,1)] = getdata(v.ai,v.Fs/v.RefreshRate);

if(isempty(v.data))
    v.data = data;
else
    v.data = [v.data;data];
end

if(v.baselineset == 0) %Plot last five seconds data
    if(length(v.data)<5*v.Fs)
        v.lastfive = v.data;
    else
        v.lastfive = v.data(end-5*v.Fs+1:end,:);
    end
    plot(handles.axes1,v.lastfive(:,1),v.lastfive(:,2));
    v.starti = length(v.data(:,1))-length(v.lastfive(:,1))+1;
end

if(v.baselineset == 1) %Plot data continously and look for curve
    data = v.data(v.starti:end,:); %Discard up to the start of lastfive
    data(:,2)=data(:,2)-v.baseline;     %Subtract baseline

    plot(handles.axes1,data(:,1),data(:,2)) 

    [iup, imax, imin] = findCurve(data, v.Fs);  %Look for curve
    v.new = 0;
    if(iup ~= v.iup && imax ~= v.imax && imin ~= v.imin && iup~=0 && imin~=0 && imax~=0) %If found 3 new points (aka. found a new curve)
       v.iup=iup; v.imax=imax; v.imin = imin; v.new=1;
    end

    if(v.new==1) %If new curve is found, calculate CO
        [v.CO, curveData] = findCO(v.iup, v.imax, v.imin, data, v.Fs, v.Injected, v.Calibration);
        if(v.CO~=0) %If CO is meaningfull. See findCO.m
            set(handles.COtextarea,'String',[num2str(v.CO,'%0.2f') ' L/min']);
            set(handles.msg,'String','CO found');
        end
    end

    hold(handles.axes1,'on') % Plot points if found. Gives user sense of CORA searching for ROI.
    if length(curveData)~=1
            plot(handles.axes1,curveData(:,1),curveData(:,2),'g')
    end
    if(iup~=0)
      plot(handles.axes1,data(iup,1),data(iup,2),'ko');
    end
    if(imax~=0)
        plot(handles.axes1,data(imax,1),data(imax,2),'go');
    end
    if(imin~=0)
        plot(handles.axes1,data(imin,1),data(imin,2),'ro');
    end
    hold(handles.axes1,'off')
end

% --- Executes on button press in setbaseline.
function setbaseline_Callback(hObject, eventdata, handles)
global v;
set(handles.setbaseline,'Enable','Off');
set(handles.msg,'String','Inject ICG');
v.baselineset = 1;
v.baseline = mean(v.lastfive(:,2));

% --- Executes on button press in manualoverride.
function manualoverride_Callback(hObject, eventdata, handles)
global v;
colors = ['ko';'go';'ro'];
messages = {'Set upturn', 'Set maximum', 'Set minimum'};
if(exist('v.baseline'))
    v.data(:,2) = v.data(:,2) + v.baseline; %Removes baseline.
end
cla; plot(handles.axes1,v.data(:,1),v.data(:,2));
hold on
for i = 1:3
    set(handles.msg,'String',messages{i});
    [x,y] = ginput(1);
    [l,x] = min(abs(v.data(:,1)-x));
    switch i
        case 1
            v.iup = x;
            v.baseline = v.data(x,2); %Defines new baseline at point of upturn.
            v.data(:,2) = v.data(:,2) - v.baseline; 
            cla; plot(handles.axes1,v.data(:,1),v.data(:,2));
        case 2
            v.imax = x;
        case 3
            v.imin = x;
    end
    plot(handles.axes1,v.data(x,1),v.data(x,2),colors(i,:));

end
hold off
v.CO = findCO(v.iup, v.imax, v.imin, v.data, v.Fs, v.Injected, v.Calibration);
if(v.CO~=0) %If CO is meaningfull. See findCO.m
    set(handles.COtextarea,'String',num2str(v.CO));
    set(handles.msg,'String','CO found');
else
    set(handles.msg,'String','CO unrealistic. Set new points.');
    set(handles.COtextarea,'String','');
end

% --- Executes on button press in savedata.
function savedata_Callback(hObject, eventdata, handles)
global v;
[FileName,PathName] = uiputfile('.xls','Save data',['saves/' datestr(now,'yyyy-mm-dd_HH.MM.SS')]);
exceldata = {'time [s]', 'voltage [V]','Injected amount ICG [g]', 'Calibration factor [VL/g]','Cardiac Output [L/min]', 'Baseline [V]', 'Sampling frequency [Hz]', 'iup', 'imax', 'imin'; ...
             [], [], v.Injected, v.Calibration, v.CO, v.baseline, v.Fs, v.iup, v.imax, v.imin};
xlswrite([PathName FileName '.xls'], exceldata, 'CORA');
xlswrite([PathName FileName '.xls'], v.data(:,1),'CORA', 'A2');
xlswrite([PathName FileName '.xls'], v.data(:,2),'CORA', 'B2');
save([PathName FileName '.mat'], 'v');
set(handles.msg,'String','Data saved');

function calibration_Callback(hObject, eventdata, handles)
global v;
% hObject    handle to calibration (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of calibration as text
%        str2double(get(hObject,'String')) returns contents of calibration as a double
v.Calibration = str2double(get(hObject,'String'));

% --- Executes during object creation, after setting all properties.
function calibration_CreateFcn(hObject, eventdata, handles)
% hObject    handle to calibration (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end
v.Calibration = str2double(get(hObject,'String'));

function injected_Callback(hObject, eventdata, handles)
global v;
% hObject    handle to injected (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of injected as text
%        str2double(get(hObject,'String')) returns contents of injected as a double
v.Injected = str2double(get(hObject,'String'));

% --- Executes during object creation, after setting all properties.
function injected_CreateFcn(hObject, eventdata, handles)
% hObject    handle to injected (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

findCurve.m

%{
Copyright (c) 2009 Rasmus Berg Palm rasmusbergpalm@gmail.com, Simon Ezban Grützmeier s062282@student.dtu.dk

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
%}
function [piup, pimax, pimin] = findCurve(data, Fs)
pimax = 0;
pimin = 0;
piup = 0;

[ymax,imax] = max(data(:,2));
if(imax < length(data)-Fs) %If imax not within the last Fs points (1s)
  pimax = imax;

  cur=data(1:imax,2);
  piup=find(cur < 0.01*ymax,1,'last');
  if(isempty(piup))
      piup = 0;
  end
  if(piup ~= 0)
    [ymin,imin] = min(data(imax:end,2));
    if(imin < length(data(imax:end,2))-Fs) %If imin not within the last Fs points (1s)
      pimin = imin+imax-1;
    end
  end
end

findCO.m

%{
Copyright (c) 2009 Rasmus Berg Palm rasmusbergpalm@gmail.com, Simon Ezban Grützmeier s062282@student.dtu.dk

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
%}
function [CO, curveData] = findCO(iup, imax, imin, data, Fs, I, K)
    CO = 0;
% Method (extrapolating between to points 1/3 distance in from imin and
% imax)

    istart = round(imax+1/3*(imin-imax));
    iend = round(imax+2/3*(imin-imax));

    startpoint = data(istart,:);
    extrapolateend = data(imin,:)+2*(data(imin,:)-data(imax,:));

    fitdata = data(istart:iend,:);
    [fit2,gof2,out2] = fit(fitdata(:,1),fitdata(:,2),'exp1','Normalize','on');
    prev = data(iup:istart,:);
    lala = [transpose(startpoint(1):1/Fs:extrapolateend), fit2(startpoint(1):1/Fs:extrapolateend)];
    lala(:,2)=lala(:,2)+(prev(end)-lala(1,2));
    curveData = cat(1,prev,lala);
    AUC = trapz(curveData(:,1),curveData(:,2));

    CO = (I*K)/AUC;
    Vmax = (CO/60)/(fit2.a);
    if(isempty(CO) || CO<0.1 || CO>40)
        CO=0;
        curveData = 0;
    end
end

CORA testversion

UI.m

%{
Copyright (c) 2009 Rasmus Berg Palm rasmusbergpalm@gmail.com, Simon Ezban Grützmeier s062282@student.dtu.dk

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
%}
function varargout = UI(varargin)
% UI M-file for UI.fig
%      UI, by itself, creates a new UI or raises the existing
%      singleton*.
%
%      H = UI returns the handle to a new UI or the handle to
%      the existing singleton*.
%
%      UI('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in UI.M with the given input arguments.
%
%      UI('Property','Value',...) creates a new UI or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before UI_OpeningFunction gets called.  An
%      unrecognized property name or in4valid value makes property application
%      stop.  All inputs are passed to UI_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Copyright 2002-2003 The MathWorks, Inc.

% Edit the above text to modify the response to help UI

% Last Modified by GUIDE v2.5 18-Mar-2009 13:50:23

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @UI_OpeningFcn, ...
                   'gui_OutputFcn',  @UI_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT

% --- Executes just before UI is made visible.
function UI_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to UI (see VARARGIN)

clear global;
clc;
% Choose default command line output for UI
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes UI wait for user response (see UIRESUME)
% uiwait(handles.figure1);

% --- Outputs from this function are returned to the command line.
function varargout = UI_OutputFcn(hObject, eventdata, handles) 
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;

% --- Executes on button press in acquiredata.

function acquiredata_Callback(hObject, eventdata, handles)

if(get(hObject,'Value') == get(hObject,'Max')) %Start
    cla; clear global;
    global v;
    [FileName,PathName] = uigetfile('*.mat','Select the datafile','../data');
    datafile = [PathName FileName];
    set(handles.figure1,'Name',FileName);

    set(handles.setbaseline,'Enable','On');
    set(handles.savedata,'Enable','Off');
    set(handles.manualoverride,'Enable','Off');

    set(hObject,'String','Stop');
    set(handles.msg,'String',{'Draw blood','Press set baseline when stable.'});
    set(handles.COtextarea,'String','');

    v.Injected = str2double(get(handles.injected,'String'));
    v.Calibration = str2double(get(handles.calibration,'String'));

    v.baselineset = 0;
    v.iup = 0; iup = 0;
    v.imax = 0; imax = 0;
    v.imin = 0; imin = 0;
    v.CO = 0; curveData=0;

else %Stop
    set(hObject,'String','Start');
    set(handles.setbaseline,'Enable','Off');
    set(handles.manualoverride,'Enable','On');
    set(handles.savedata,'Enable','On');
end

while(get(hObject,'Value') == get(hObject,'Max'))
    global v;
    pause(0.1)
    [v.data, v.Fs] = dataFeed(datafile);

    if(v.baselineset == 0) %Plot last five seconds data
        if(length(v.data)<5*v.Fs)
            v.lastfive = v.data;
        else
            v.lastfive = v.data(end-5*v.Fs+1:end,:);
        end
        plot(v.lastfive(:,1),v.lastfive(:,2));
        starti = length(v.data(:,1))-length(v.lastfive(:,1))+1;
    end

    if(v.baselineset == 1) %Plot data continously and look for curve
        v.data = v.data(starti:end,:);          %Discard up to the start of lastfive
        v.data(:,2)=v.data(:,2)-v.baseline;     %Subtract baseline
        plot(v.data(:,1),v.data(:,2))       

        [iup, imax, imin] = findCurve(v.data, v.Fs);  %Look for curve
        v.new = 0;
        if(iup ~= v.iup && imax ~= v.imax && imin ~= v.imin && iup~=0 && imin~=0 && imax~=0) %If found 3 new points (aka. found a new curve)
           v.iup=iup; v.imax=imax; v.imin = imin; v.new=1;
        end

        if(v.new==1) %If new curve is found, calculate CO
            [v.CO,curveData, Vmax] = findCO(v.iup, v.imax, v.imin, v.data, v.Fs);
            if(v.CO~=0) %If CO is meaningfull. See findCO.m
                set(handles.COtextarea,'String',[num2str(v.CO,'%0.2f') ' L/min']);
                set(handles.msg,'String','CO found');
            end
        end

        hold on
        if length(curveData)~=1
            plot(curveData(:,1),curveData(:,2),'g')
        end

        if(iup~=0)
          plot(v.data(iup,1),v.data(iup,2),'ko');
        end
        if(imax~=0)
            plot(v.data(imax,1),v.data(imax,2),'go');
        end
        if(imin~=0)
            plot(v.data(imin,1),v.data(imin,2),'ro');
        end
        hold off

    end

end

% --- Executes on button press in setbaseline.
function setbaseline_Callback(hObject, eventdata, handles)
global v;
set(handles.setbaseline,'Enable','Off');
set(handles.msg,'String','Inject ICG');
v.baselineset = 1;
v.baseline = mean(v.lastfive(:,2));

% --- Executes on button press in manualoverride.
function manualoverride_Callback(hObject, eventdata, handles)
global v;
colors = ['ko';'go';'ro'];
messages = {'Set upturn', 'Set maximum', 'Set minimum'};
if(exist('v.baseline'))
    v.data(:,2) = v.data(:,2) + v.baseline; %Removes baseline.
end
cla; plot(v.data(:,1),v.data(:,2));
hold on
for i = 1:3
    set(handles.msg,'String',messages{i});
    [x,y] = ginput(1);
    [l,x] = min(abs(v.data(:,1)-x));
    switch i
        case 1
            v.iup = x;
            v.data(:,2) = v.data(:,2) - v.data(x,2); %Defines new baseline at point of upturn.
            cla; plot(v.data(:,1),v.data(:,2));
        case 2
            v.imax = x;
        case 3
            v.imin = x;
    end
    plot(v.data(x,1),v.data(x,2),colors(i,:));

end

[v.CO, curveData] = findCO(v.iup, v.imax, v.imin, v.data, v.Fs);
if(v.CO~=0) %If CO is meaningfull. See findCO.m
    plot(curveData(:,1),curveData(:,2),'g');
    set(handles.COtextarea,'String',num2str(v.CO));
    set(handles.msg,'String','CO found');
else
    set(handles.msg,'String','CO unrealistic. Set new points.');
    set(handles.COtextarea,'String','');
end
hold off

% --- Executes on button press in savedata.
function savedata_Callback(hObject, eventdata, handles)
global v;
[FileName,PathName] = uiputfile('.xls','Save data',['saves/' datestr(now,'yyyy-mm-dd_HH.MM.SS')]);
exceldata = {'time [s]', 'voltage [V]','Injected amount ICG [g]', 'Calibration factor [VL/g]','Cardiac Output [L/min]', 'Baseline [V]', 'Sampling frequency [Hz]', 'iup', 'imax', 'imin'; ...
             [], [], v.Injected, v.Calibration, v.CO, v.baseline, v.Fs, v.iup, v.imax, v.imin};
xlswrite([PathName FileName '.xls'], exceldata, 'CORA');
xlswrite([PathName FileName '.xls'], v.data(:,1),'CORA', 'A2');
xlswrite([PathName FileName '.xls'], v.data(:,2),'CORA', 'B2');
save([PathName FileName '.mat'], 'v');
set(handles.msg,'String','Data saved');

function calibration_Callback(hObject, eventdata, handles)
global v;
% hObject    handle to calibration (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of calibration as text
%        str2double(get(hObject,'String')) returns contents of calibration as a double
v.Calibration = str2double(get(hObject,'String'));

% --- Executes during object creation, after setting all properties.
function calibration_CreateFcn(hObject, eventdata, handles)
% hObject    handle to calibration (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end
v.Calibration = str2double(get(hObject,'String'));

function injected_Callback(hObject, eventdata, handles)
global v;
% hObject    handle to injected (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of injected as text
%        str2double(get(hObject,'String')) returns contents of injected as a double
v.Injected = str2double(get(hObject,'String'));

% --- Executes during object creation, after setting all properties.
function injected_CreateFcn(hObject, eventdata, handles)
% hObject    handle to injected (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

findCurve.m

%{
Copyright (c) 2009 Rasmus Berg Palm rasmusbergpalm@gmail.com, Simon Ezban Grützmeier s062282@student.dtu.dk

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
%}
function [piup, pimax, pimin] = findCurve(data, Fs)

pimax = 0;
pimin = 0;
piup = 0;

[ymax,imax] = max(data(:,2));
if(imax < length(data)-Fs) %If imax not within the last Fs points (1s)
  pimax = imax;

  cur=data(1:imax,2);
  piup=find(cur < 0.01*ymax,1,'last');
  if(isempty(piup))
      piup = 0;
  end
  if(piup ~= 0)
    [ymin,imin] = min(data(imax:end,2));
    if(imin < length(data(imax:end,2))-Fs) %If imin not within the last Fs points (1s)
      pimin = imin+imax-1;
    end
  end
end

findCO.m

%{
Copyright (c) 2009 Rasmus Berg Palm rasmusbergpalm@gmail.com, Simon Ezban Grützmeier s062282@student.dtu.dk

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
%}
function [CO, curveData, Vmax] = findCO(iup, imax, imin, data, Fs)
    global I k
    CO = 0; 
    mICG = 5;   % mg/ml

% Method 1 (extrapolating between to points 1/3 distance in from imin and
% imax)

    istart = round(imax+1/3*(imin-imax));
    iend = round(imax+2/3*(imin-imax));

    startpoint = data(istart,:);
   % endpoint = data(iend,:);
    extrapolateend = data(imin,:)+2*(data(imin,:)-data(imax,:));

    fitdata = data(istart:iend,:);
    [fit2,gof2,out2] = fit(fitdata(:,1),fitdata(:,2),'exp1','Normalize','on');
    prev = data(iup:istart,:);
    lala = [transpose(startpoint(1):1/Fs:extrapolateend), fit2(startpoint(1):1/Fs:extrapolateend)];
    lala(:,2)=lala(:,2)+(prev(end)-lala(1,2));
    curveData = cat(1,prev,lala);
    AUC = trapz(curveData(:,1),curveData(:,2));

    CO = (mICG*I*60)/(AUC/k)/1000; %1000 for at omregne mL til L;
    Vmax = (CO/60)/(fit2.a);
    if(isempty(CO) || CO<0 || CO>50)
        CO=0;
        curveData = 0;
    end
end

dataFeed.m

%{
Copyright (c) 2009 Rasmus Berg Palm rasmusbergpalm@gmail.com, Simon Ezban Grützmeier s062282@student.dtu.dk

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
%}
function [dataarr, Fs] = dataFeed(datafile)
    global t1 I k;
    time = 0.1;

    if(isempty(t1))
    t1 = clock;
    end
    t2 = clock;
    Fs = 100;
    endtime = round(etime(t2,t1)*Fs);
    load(datafile);
    starttime=endtime-Fs*time;
    if(starttime<1)
    starttime = 1;
    end
    data = data(starttime:endtime,:);

  global dataarr;
  dataarr = [dataarr; data];

end

edit sections

Beskeder
Click me to edit !
Drag me !
todo
Here is a place for your title Click me to edit ! false
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License