ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE Fakulta biomedicínského inženýrství Katedra biomedicínské techniky
TÝMOVÝ PROJEKT
2011
Martin Čepa
ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE Fakulta biomedicínského inženýrství Katedra biomedicínské techniky
Sledování oxygenace mozkové tkáně novorozenců metodou NIRS Týmový projekt
Vedoucí projektu:
Ing. Petr Kudrna
Student:
Martin Čepa
prosinec 2011
Anotace Tato práce se zabývá metodami měření saturace krve kyslíkem, zejména pak metodou near-infrared spectroscopy (NIRS), neonatálních pacientů. První část je věnována problematice krevní saturace v neonatologii a obecně metodě NIRS. Druhá část je zaměřena na praktickou stránku věci, a to přípravu a realizací softwaru pro automatizaci zpracování dat z přístrojů měřících regionální a arteriální krevní saturací, a výpočtem saturačních indexů používaných v klinické praxi.
Annotation
The thesis deals with the methods of measuring blood oxygen saturation, especially then with the method of near-infrared spectroscopy (NIRS), of neonatal patients. The first part is aimed to the problematic of oxygen saturation and NIRS in general. The second, practical, part is dedicated to the preparation and realization of the programme for automatical processing of data sets acquired from two different oximeters and calculation of saturation indexes needed for medical practice.
Fakulta biomedicínského inženýrství, ČVUT
Prohlášení
Prohlašuji, že jsem týmový projekt s názvem Technická podpora klinických měření v neonatologii vypracoval samostatně a použil k tomu úplný výčet citací použitých pramenů, které uvádím v seznamu přiloženém k práci. Nemám závažný důvod proti užití tohoto školního díla ve smyslu §60 Zákona č.121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů (autorský zákon).
V Kladně dne ……………….…………………….
……………………………….. podpis
Obsah
1
Úvod .................................................................................................................................... 2
2
Near-infrared spectrocopy................................................................................................... 3
3
2.1
Princip činnosti ............................................................................................................ 3
2.2
Fyzikální princip .......................................................................................................... 4
Návrh a realizace softwaru pro zpracování a vyhodnocování dat z cerebrálního oxymetru
a centrálního monitorovacího systému ....................................................................................... 6 3.1
Úvod do problematiky ................................................................................................. 6
3.2
Schéma softwaru.......................................................................................................... 7
3.3
Princip činnosti SW ..................................................................................................... 8
4
Závěr ................................................................................................................................... 9
5
Příloha ............................................................................................................................... 10 5.1
6
Zdrojový kód programu ............................................................................................. 10
Použitá literatura ............................................................................................................... 22
1
Úvod
Tento týmové projekt se věnuje zpracování klinických dat získaných z měření krevní saturace a oxygenace tkání metodou near-infrared spectroscopy (spektroskopie v blízkém infračervené spektru) v neonatologii. Tato metoda je v současné době hojně využívaná hned z několika důvodů. V první řadě je neinvazivní, ani nepoužívá zdrojů ionizujícího záření. Díky své bezpečnosti tak může být používána i u neonatálních pacientů i při několikahodinových měřeních. Dalším důvodem je snadné použití měřících přístrojů a relativně nízká cena přístrojů. Jelikož v praxi se používají přístroje různých výrobců, nastává problém se zpracováním dat získaných z měření. Ta totiž nejsou v navzájem kompatibilních formátech a pro validní vyhodnocení dat je třeba je náležitě upravit do jednotné formy. Projekt je vytvořen ve spolupráci s MUDr. Evou Settelmajerovou z Gynekologicko-porodnické kliniky 1. lékařské fakulty Univerzity Karlovy a Všeobecné fakultní nemocnice v Praze, kde jsou využívány přístroje od firem Somanetics a Dräger. Zpracování jejich výstupů v současné době probíhá ručně, což je velmi časově náročné a zvyšuje riziko chyby. Řešením tohoto problému by mohlo být vytvoření softwaru, který by dokázal získaná data automaticky zpracovat do použitelné formy. Zároveň by měl být schopen vypočítat různé saturační indexy používané v klinické praxi, a spolu se zpracovanými daty je uložit do přehledné tabulky ve formátu .xls. Vzhledem k tomu, že jde čistě o práci s maticemi čísel, bylo pro vytvoření programu zvoleno programové prostředí Matlab. Cílem projektu je tedy seznámit se s využitím a principy metody near-infrared spectroscopy v neonatologii a vytvořit software, který by splňoval výše uvedené požadavky.
2
2
Near-infrared spectrocopy
2.1 Princip činnosti Metoda near-infrared spectrocopy, dále jen NIRS, je v neonatologii používaná zejména pro monitoraci oxygenace mozkové tkáně pacientů. Měření je realizováno na základě skutečnosti, že krev s různou úrovní saturace kyslíkem má různé odstíny červené – krev hodně nasycená je jasně červená, málo nasycená je tmavě červená. Prochází-li jí záření, je různě absorbováno v závislosti na jejím odstínu. Pro měření cerebrální oxygenace je senzor umístěn na čele pacienta v oblasti mezi přední a střední mozkovou tepnou. Senzor se skládá z jednoho zářiče, vysílajícího záření na dvou vlnových délkách, a dvou detektorů. První detektor, mělký, snímá záření procházející tkáněmi, které se nachází nad mozkem (jako je kůže, lebka apod.). Druhý, hloubkový, detektor snímá záření, které prošlo hlouběji až do mozkové tkáně. Pokud se signál z mělkého detektoru odečte od signálu z detektoru hloubkového, výsledkem je střední hodnota cerebrální oxygenace. [1,2,3]
Obrázek 2-1: Umístění senzorů na hlavě pacienta [3]
3
2.2 Fyzikální princip Metoda NIRS je založena na principu rozdílné absorpce záření o dvou vlnových délkách procházejících vyšetřovanou tkání. Pro tyto účely se používá elektromagnetická záření o vlnových délkách 650 až 900 nanometrů, které může být detekováno po průchodu tkání až do vzdálenosti 8 cm. Dostane se tak i k hlouběji uloženým strukturám, jako je mozková kůra. V mozku jsou přítomny tři chromofory, které mají proměnnou koncentraci a přímý vliv na absorpci záření: oxyhemoglobin (HbO2), deoxyhemoglobin (Hb) a cytochrom oxidáza (CytOx). Při průchodu záření tkání dochází k útlumu a rozptylu, což způsobuje, že část záření není detektorem vůbec zachycena. Celková hodnota útlumu záření po průchodu tkání je tedy neznámá. Lze ale předpokládat, že během krátkého vyšetření se geometrie tkáně nezmění, změny absorpce jsou tedy způsobeny změnami koncentrací výše uvedených chromoforů. K určení těchto změn lze využít upravený Lambert-Beerův vztah I0 A log c d B G I
(2.1) kde je: I0 = intenzita původního záření vysílaného do tkáně I = intenzita snímaného záření po průchodu tkání α = excitační koeficient absorpční látky na určité vlnové délce
[µmol-1·cm-1]
c = koncentrace chromoforu ve vzorku (tj. absorbéru)
[µmol]
d = vzdálenost míst, ve kterých záření vstupuje a vystupuje ze tkáně
[cm]
B = rozdílová délka dráhy G = rozptylové ztráty Jelikož záření neprochází tkání přímou cestou ze zářiče do detektoru, musí být jejich geometrická vzdálenost vynásobena faktorem B, čímž získáme skutečnou optickou dráhu, kterou musí záření překonat. Hodnota B je konstantní a závisí na věku pacienta, pro neonatální pacienty je B=4,99 pro záření o vlnové délce 807 nm. Může se však měnit i v krátkých časových intervalech, např. v závislosti na objemu vody ve tkáni. Moderní přístroje už ale hodnotu B dokáží změřit. Opomenuta nemůže být ani změna intenzity záření,
4
způsobená rozptylem ve tkáních, která je vyjádřená hodnotou G. Ta zůstává neznámá, absolutní hodnoty změny intenzity tak nemohou být měřeny. Změny v absorpci způsobené změnou koncentrace chromoformu pak můžeme spočítat podle rovnice: A2 A1 (c2 c1) d B
(2.2) Jelikož je excitační koeficient α rozdílný pro každý z chromoforů HbO2, Hb a CytOx, pro různá měření je třeba použít záření o různých vlnových délkách.
[2,3,4,5]
5
3
Návrh a realizace softwaru pro zpracování a vyhodnocování dat z cerebrálního oxymetru a centrálního monitorovacího systému
3.1 Úvod do problematiky Cílem projektu je zpracovat data ze dvou přístrojů monitorujících okysličení krve do podoby použitelné v klinické praxi. V současné době jsou výstupy z měření těchto přístrojů (viz níže) navzájem nekompatibilní a veškeré jejich třídění do použitelné podoby probíhá zdlouhavě ručně. Naprogramovaný software umí tato data vytřídit automaticky, spočítat z nich další hodnoty používané v praxi a vše uložit do tabulky v jediném dokumentu Microsoft Excel (.xls). Vzhledem k charakteru úlohy jsem program vytvářel v programovém prostředí Matlab. Prvním přístrojem je Invos® System 5100C firmy Somanetics, který měří regionální saturaci na hlavě (SpO2 C) a na břichu (SpO2 S) pacienta. Četnost měření je nastavitelná, zpravidla se provede deset měření za jednu minutu. Výstupem z toho přístroje je ASCII textový soubor (soubor.txt) se záznamem času, hodnotami saturace, mezemi alarmu a vypočítanými plochami pod křivkou. Jednotlivé hodnoty jsou odděleny mezerami. Druhým přístrojem je systém Infinity® CentralStation s monitory Delta, Delta Xl a Gamma od firmy Dräger. Slouží jako centrální monitorovací systém a poskytuje data o arteriální krevní saturaci (SaO2). Měření se provádí vždy jen jednou za minutu. Jeho výstupem je textový soubor s hodnotami oddělenými čárkami (soubor.csv), se záznamem času, tepové frekvence, saturace a respirace. Pro praktické využití je třeba tato data upravit, aby byla výstupem jediná tabulka, s hodnotami SpO2 C, SpO2 S, SaO2, které jsou spárovány podle času měření s přesností na minutu (plynoucí z frekvence měření přístrojem firmy Dräger). Ze spárovaných hodnot je dále třeba vypočítat saturační indexy FcTOE, FsTOE a CSOR.
6
3.2 Schéma softwaru
Obrázek 3-1: Blokový diagram vytvořeného SW
7
3.3 Princip činnosti SW V této kapitole popíši funkci a význam jednotlivých bloků dle diagramu (obr 3-1). Na vstupu programu jsou data z přístrojů, která si uživatel sám vybere pomocí dialogového okna po jeho spuštění. Jelikož jde o rozdílné, navíc textové, formáty, musí se první řadě převést do matice čísel. Vstupní soubory obsahují i data, která jsou pro další zpracování nepotřebná – ty jsou v tomto kroku také odfiltrovány. V dalším kroku je třeba odstranit „hluchá“ místa měření. Jde o hodnoty, při kterých přístroje neměřily – na výstupu je v těchto časových okamžicích saturace rovna nule (Invos), nebo je nahrazena prázdným místem, popř. třemi hvězdičkami *** (Dräger). Protože přístroje Dräger provádí měření v minutových intervalech a Invos ve stejném časovém rozmezí provede až deset měření, musí se data z Invosu zprůměrovat pro každou minutu měření. Jelikož počet vzorků v minutě není vždy roven deseti, jsou hodnoty převedeny do buněk (cell array) obsahujících vždy hodnoty z jedné minuty. Po zprůměrování jsou buňky opět převedeny do matice. V následující části jsou odstraněny hodnoty z obou přístrojů navzájem tak, aby ve výsledku zůstala pouze měření, která se uskutečnila v daném čase na obou z nich. V praxi to znamená, že jsou postupně kontrolovány časové údaje z obou přístrojů (dny, hodiny, minuty) a porovnávány navzájem mezi sebou. Zde je opět třeba data postupně převádět do buněk (po hodinách a minutách), aby se vždy porovnávaly pouze sobě odpovídající časové intervaly. Ke konci programu se z hodnot saturací vypočítají indexy FcTOE, FsTOE a CSOR. Spárované hodnoty z měření se, spolu s vypočítanými indexy, uloží jako .xls soubor.
8
4
Závěr
V rámci týmového projektu jsem udělal rešerši v oblasti principu činnosti a využití metody spektroskopie v blízkém infračerveném spektru. Získané informace a poklady budou tvořit kostru teoretické části navazující bakalářské práce. V rámci praktické části jsem vytvořil program, který dokáže zpracovat data získaná z přístrojů Invos® System 5100C firmy Somanetics a Infinity® CentralStation s monitory Delta, Delta Xl a Gamma od firmy Dräger. Výstupem je soubor ve formátu .xls s přehledně uspořádanými daty a vypočítanými saturačními indexy. Tato automatizace představuje výrazné zrychlení při zpracovávání výsledků klinických měření. V současnosti probíhá testování programu na Gynekologicko-porodnické klinice 1. lékařské fakulty Univerzity Karlovy a Všeobecné fakultní nemocnice v Praze MUDr. Evou Settelmajerovou. V navazující bakalářské práci bude program ještě dále upraven, aby zpracovaná data mohla být prezentována i grafickou formou.
9
5
Příloha
5.1 Zdrojový kód programu v prostředí Matlab
clear all; clc;
%open Invos file and load Invos data into cell arrays [FileName_invos, invos_filepath] = uigetfile ('*.*','Vyberte soubor s daty z přístroje INVOS'); [fid_invos, message_invos]=fopen (FileName_invos); data_invos=textscan(fid_invos,'%s %s %s %c %d %d %d %d %d %d %d %d %f32 %f32 %c %d %d %d %d %d %d %d %d %f32 %f32 %s %d %d %d %d %d %d %d %d %d %d %s %d %d %d %d %d %d %d %d %d %d %s %s %d %d'); % Read data from INVOS, d=integer, c=character, s=string, f32=float number fclose (fid_invos);
%open Drager file and load Drager data into cell arrays [FileName_drager, drager_filepath] = uigetfile ('*.*','Vyberte soubor s daty z přístroje DRAGER'); [fid_drager, message_drager]=fopen (FileName_drager); data_drager=textscan(fid_drager,'%s %s %d %d %d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d', 'delimiter', ',', 'treatAsEmpty', {'***','+++','---','///','...'}, 'HeaderLines', 3, 'EmptyValue', 0); % Read data from DRAGER fclose (fid_drager);
% create rows of vectors from Invos data with columns: date (YYYY MM DD), time (HH MM SS), SpO2 C, SpO2 S date_invos=strcat (data_invos{1,2}, data_invos{1,3}); date_invos_vectorized=datevec(date_invos, 'dd.mm.yyHH:MM:SS'); date_invos_vectorized(:,6)=[];
%delete column with seconds
data_invos_vector=[date_invos_vectorized, data_invos{1,5}]; % data_invos{1,5} == SpO2 C data_invos_vector=[data_invos_vector, data_invos{1,16}]; % data_invos{1,16} == SpO2 S 10
% create rows of vectors from drager data with columns: date (YYYY MM DD), time (HH MM SS), SaO2 date_drager=strcat (data_drager{1,1}, data_drager{1,2}); date_drager_vectorized=datevec(date_drager, 'mm/dd/yyHH:MM'); data_drager_vector=[date_drager_vectorized, data_drager{1,4}]; data_drager_vector(:,6)=[];
%delete column with seconds
% delete rows with empty values of SpO2 S and SpO2 C (Invos) and SaO2 (Drager) data_invos_vector(data_invos_vector(:,6)==0,:)=[]; data_invos_vector(data_invos_vector(:,7)==0,:)=[]; data_drager_vector(data_drager_vector(:,6)==0,:)=[]; data_drager_matrix=data_drager_vector;
% just rename
% matrix with average minute values of Invos SpO2 time_step=find(diff([-1 data_invos_vector(:,5)' -1])~=0); step_length=diff(time_step);
%step_length = the number of the values in each minute
data_invos_cell=mat2cell(data_invos_vector, step_length); [x,y]=cellfun(@size,data_invos_cell); double_row=[];
for m=1:length(x)
%because cellfun@mean calculates wrong values for cells
with just one row, these have to doubled if size(data_invos_cell{m},1)==1 double_row(1,:)=data_invos_cell{m}(1,:); double_row(2,:)=data_invos_cell{m}(1,:); data_invos_cell{m}=double_row; end end
11
data_invos_cell_avg=cellfun(@mean,data_invos_cell,'UniformOutput', false); data_invos_cell_avg=cellfun(@int32, data_invos_cell_avg,'UniformOutput', false); data_invos_matrix=cell2mat(data_invos_cell_avg);
% pair invos and drager data according to the time - now starts the funny part :-)
%remove surplus days invos_days=find(diff([-1 data_invos_matrix(:,3)' -1])~=0); drager_days=find(diff([-1 data_drager_matrix(:,3)' -1])~=0);
%remove surplus days from both invos and drager if size(data_invos_matrix (invos_days(1,1:end-1),3),1)>size(data_drager_matrix (drager_days(1,1:end-1),3),1) %if invos matrix contains measurements from more days than drager delete_day=sum(data_invos_matrix (invos_days(1,1:end-1),3))-sum(data_drager_matrix (drager_days(1,1:end-1),3)); data_invos_matrix(data_invos_matrix(:,3)==delete_day,:)=[]; else delete_day=sum(data_drager_matrix (drager_days(1,1:end-1),3))-sum(data_invos_matrix (invos_days(1,1:end-1),3)); data_drager_matrix(data_drager_matrix(:,3)==delete_day,:)=[]; end
%remove surplus hours %remove surplus hours invos days_position_drager=find(diff([-1 data_drager_matrix(:,3)' -1])~=0); drager_days_length=diff(days_position_drager); days_cell_drager=mat2cell(data_drager_matrix,drager_days_length); 12
days_position_invos=find(diff([-1 data_invos_matrix(:,3)' -1])~=0); invos_days_length=diff(days_position_invos); days_cell_invos=mat2cell(data_invos_matrix,invos_days_length);
%remove surplus hours from begining, middle and end of the INVOS matrix [x,y]=cellfun(@size,days_cell_invos,'UniformOutput', false); for id=1:length(x) missing_hours_drager=find(diff(days_cell_drager{id}(:,4))>1); missing_hours_drager=[missing_hours_drager'; missing_hours_drager'+1]; % still just positions! not minutes!
missing_hours_drager=reshape(days_cell_drager{id}(missing_hours_drager,4),2,size(missing _hours_drager,2)); %now missing_minutes are minutes, not positions missing_hours_drager=[missing_hours_drager(1,:)+1; missing_hours_drager(2,:)-1]; %remove extreme minutes - these are present in the measurement missing_hours_drager_cell=cell(1,size(missing_hours_drager,2)); for mis_id=1:size(missing_hours_drager,2) missing_hours_drager_cell{mis_id}=missing_hours_drager(1,mis_id): missing_hours_drager(2,mis_id); end missing_hours_drager=cell2mat(missing_hours_drager_cell); %now, missing_minutes_drager==minutes, that are missing in drager in id-hour >> these have to be removed from id-hour invos for del_id=1:size(missing_hours_drager,2) d=find(days_cell_invos{id}(:,4)==missing_hours_drager(del_id)==1); if d~=0 days_cell_invos{id}(d,4)=100; else days_cell_invos; end end min_hour_drager=days_cell_drager{id}(1,4); switch min_hour_drager~=0 13
case 1 q=find(days_cell_invos{id}(:,4)<min_hour_drager==1); if q~=0 days_cell_invos{id}(q,4)=100; else days_cell_invos; end case 0 days_cell_invos; end
max_hour_drager=days_cell_drager{id}(end,4); switch max_hour_drager~=23 case 1 q=find(days_cell_invos{id}(:,4)>max_hour_drager==1); if q~=0 days_cell_invos{id}(q,4)=100; else days_cell_invos; end case 0 days_cell_invos; end
%switch
end data_invos_matrix=cell2mat(days_cell_invos); data_invos_matrix(data_invos_matrix(:,4)==100,:)=[];
%remove surplus hours from Drager days_position_drager=find(diff([-1 data_drager_matrix(:,3)' -1])~=0); drager_days_length=diff(days_position_drager); days_cell_drager=mat2cell(data_drager_matrix,drager_days_length);
days_position_invos=find(diff([-1 data_invos_matrix(:,3)' -1])~=0); 14
invos_days_length=diff(days_position_invos); days_cell_invos=mat2cell(data_invos_matrix,invos_days_length);
%remove surplus hours from begining, middle and end of the DRAGER matrix [x,y]=cellfun(@size,days_cell_drager,'UniformOutput', false); for id=1:length(x) missing_hours_invos=find(diff(days_cell_invos{id}(:,4))>1); missing_hours_invos=[missing_hours_invos'; missing_hours_invos'+1]; % still just positions! not hours!
missing_hours_invos=reshape(days_cell_invos{id}(missing_hours_invos,4),2,size(missing_h ours_invos,2)); %now missing_hours are hours, not positions missing_hours_invos=[missing_hours_invos(1,:)+1; missing_hours_invos(2,:)-1]; %remove extreme hours - these are present in the measurement missing_hours_invos_cell=cell(1,size(missing_hours_invos,2)); for mis_id=1:size(missing_hours_invos,2) missing_hours_invos_cell{mis_id}=missing_hours_invos(1,mis_id): missing_hours_invos(2,mis_id); end missing_hours_invos=cell2mat(missing_hours_invos_cell); %now, missing_hours_invos==hours, that are missing in invos in id-hour >> these have to be removed from id-hour invos for del_id=1:size(missing_hours_invos,2) d=find(days_cell_drager{id}(:,4)==missing_hours_invos(del_id)==1); if d~=0 days_cell_drager{id}(d,4)=100; else days_cell_drager; end end min_hour_invos=days_cell_invos{id}(1,4); switch min_hour_invos~=0 case 1 q=find(days_cell_drager{id}(:,4)<min_hour_invos==1); 15
if q~=0 days_cell_drager{id}(q,4)=100; else days_cell_drager; end case 0 days_cell_drager; end
max_hour_invos=days_cell_invos{id}(end,4); switch max_hour_invos~=23 case 1 q=find(days_cell_drager{id}(:,4)>max_hour_invos==1); if q~=0 days_cell_drager{id}(q,4)=100; else days_cell_drager; end case 0 days_cell_drager; end
%switch
end data_drager_matrix=cell2mat(days_cell_drager); data_drager_matrix(data_drager_matrix(:,4)==100,:)=[];
%remove surplus minutes %remove surplus minutes from Invos hours_position_drager=find(diff([-1 data_drager_matrix(:,4)' -1])~=0); drager_hours_length=diff(hours_position_drager); hours_cell_drager=mat2cell(data_drager_matrix,drager_hours_length);
hours_position_invos=find(diff([-1 data_invos_matrix(:,4)' -1])~=0); 16
invos_hours_length=diff(hours_position_invos); hours_cell_invos=mat2cell(data_invos_matrix,invos_hours_length); %remove surplus minutes from begining, middle and end of the INVOS matrix [x,y]=cellfun(@size,hours_cell_drager,'UniformOutput', false); for id=1:length(x) if size(hours_cell_drager{id},1)==60; hours_cell_invos{id}; else missing_minutes_drager=find(diff(hours_cell_drager{id}(:,5))>1); missing_minutes_drager=[missing_minutes_drager'; missing_minutes_drager'+1]; % still just positions! not minutes!
missing_minutes_drager=reshape(hours_cell_drager{id}(missing_minutes_drager,5),2,size(m issing_minutes_drager,2)); %now missing_minutes are minutes, not positions missing_minutes_drager=[missing_minutes_drager(1,:)+1; missing_minutes_drager(2,:)1]; %remove extreme minutes - these are present in the measurement missing_minutes_drager_cell=cell(1,size(missing_minutes_drager,2)); for mis_id=1:size(missing_minutes_drager,2) missing_minutes_drager_cell{mis_id}=missing_minutes_drager(1,mis_id): missing_minutes_drager(2,mis_id); end missing_minutes_drager=cell2mat(missing_minutes_drager_cell); %now, missing_minutes_drager==minutes, that are missing in drager in id-hour >> these have to be removed from id-hour invos for del_id=1:size(missing_minutes_drager,2) d=find(hours_cell_invos{id}(:,5)==missing_minutes_drager(del_id)==1); if d~=0 hours_cell_invos{id}(d,5)=100; else hours_cell_invos; end end
min_minute_drager=hours_cell_drager{id}(1,5); 17
switch min_minute_drager~=0 case 1 q=find(hours_cell_invos{id}(:,5)<min_minute_drager==1); if q~=0 hours_cell_invos{id}(q,5)=100; else hours_cell_invos; end case 0 hours_cell_invos; end
max_minute_drager=hours_cell_drager{id}(end,5); switch max_minute_drager~=59 case 1 q=find(hours_cell_invos{id}(:,5)>max_minute_drager==1); if q~=0 hours_cell_invos{id}(q,5)=100; else hours_cell_invos; end case 0 hours_cell_invos; end end end
%switch %if %for
data_invos_matrix=cell2mat(hours_cell_invos); data_invos_matrix(data_invos_matrix(:,5)==100,:)=[];
%remove surplus minutes from Drager hours_position_drager=find(diff([-1 data_drager_matrix(:,4)' -1])~=0); drager_hours_length=diff(hours_position_drager); 18
hours_cell_drager=mat2cell(data_drager_matrix,drager_hours_length);
hours_position_invos=find(diff([-1 data_invos_matrix(:,4)' -1])~=0); invos_hours_length=diff(hours_position_invos); hours_cell_invos=mat2cell(data_invos_matrix,invos_hours_length);
%remove surplus minutes from begining, middle and end of the DRAGER matrix [x,y]=cellfun(@size,hours_cell_invos,'UniformOutput', false); for id=1:length(x) if size(hours_cell_invos{id},1)==60; hours_cell_drager{id}; else missing_minutes_invos=find(diff(hours_cell_invos{id}(:,5))>1); missing_minutes_invos=[missing_minutes_invos'; missing_minutes_invos'+1]; % still just positions! not minutes!
missing_minutes_invos=reshape(hours_cell_invos{id}(missing_minutes_invos,5),2,size(miss ing_minutes_invos,2)); %now missing_minutes are minutes, not positions missing_minutes_invos=[missing_minutes_invos(1,:)+1; missing_minutes_invos(2,:)-1]; %remove extreme minutes - these are present in the measurement missing_minutes_invos_cell=cell(1,size(missing_minutes_invos,2)); for mis_id=1:size(missing_minutes_invos,2) missing_minutes_invos_cell{mis_id}=missing_minutes_invos(1,mis_id): missing_minutes_invos(2,mis_id); end missing_minutes_invos=cell2mat(missing_minutes_invos_cell); %now, missing_minutes_drager==minutes, that are missing in drager in id-hour >> these have to be removed from id-hour invos for del_id=1:size(missing_minutes_invos,2) d=find(hours_cell_drager{id}(:,5)==missing_minutes_invos(del_id)==1); if d~=0 hours_cell_drager{id}(d,5)=100; else hours_cell_drager; 19
end end
min_minute_invos=hours_cell_invos{id}(1,5); switch min_minute_invos~=0 case 1 q=find(hours_cell_drager{id}(:,5)<min_minute_invos==1); if q~=0 hours_cell_drager{id}(q,5)=100; else hours_cell_drager; end case 0 hours_cell_drager; end
max_minute_invos=hours_cell_invos{id}(end,5); switch max_minute_invos~=59 case 1 q=find(hours_cell_drager{id}(:,5)>max_minute_invos==1); if q~=0 hours_cell_drager{id}(q,5)=100; else hours_cell_drager; end case 0 hours_cell_drager; end end end
%switch %if %for
data_drager_matrix=cell2mat(hours_cell_drager); data_drager_matrix(data_drager_matrix(:,5)==100,:)=[];
20
drager_final=data_drager_matrix; invos_final=data_invos_matrix;
% calculate indexes FS_TOE, FC_TOE, CSOR fc_toe=100*(double(drager_final(:,6)) - double(invos_final(:,6)))./double(drager_final(:,6)); fs_toe=100*(double(drager_final(:,6)) - double(invos_final(:,7)))./double(drager_final(:,6)); csor=double(invos_final(:,7))./double(invos_final(:,6)); index_matrix=[fc_toe fs_toe csor];
% headers={'Year', 'Month', 'Day', 'Hour', 'Minute', 'SpO2 C', 'SpO2 S'}; % headers2={'Year', 'Month', 'Day', 'Hour', 'Minute', 'SaO2'}; % name=strtok(FileName_invos,'.'); % xlswrite(name, headers, 1, 'A1'); % xlswrite(name, headers2, 1, 'J1'); % xlswrite (name, data_invos_matrix, 1, 'A2'); % xlswrite (name, data_drager_matrix, 1, 'J2');
headers={'Year', 'Month', 'Day', 'Hour', 'Minute', 'SpO2 C', 'SpO2 S', 'SaO2', 'FcTOE%', 'FsTOE%', 'CSOR'}; name=strtok(FileName_invos,'.'); xlswrite(name, headers, 1, 'A1'); xlswrite (name, invos_final, 1, 'A2'); xlswrite (name, drager_final(:,6), 1, 'H2'); xlswrite (name, index_matrix, 1, 'I2');
21
6
Použitá literatura
[1] BOZKURT, Alpert - ROSEN Arye - ROSEN Harel - ONARAL Banu. A portable near infrared spectroscopy system for bedside monitoring of newborn brain. BioMedical Engineering OnLine [online]. 29 April 2005, Volume 4, Article number 29, 11p. [cit. 201112-17]. Dostupné z < http://www.biomedical-engineering-online.com/content/4/1/29>. ISSN: 1475925X [2] OWEN-REECE, H. – SMITH, M. – ELWELL, C. E. – GOLDSTONE, J. C. Near infrared spectroscopy. British Journal of Anesthesia [online]. March 1999, Volume 82, Issue 3, Pages 418-426. [cit. 2011-12-17]. Dostupné z
. ISSN: 00070912
[3] PAQUET, C. - DESCHAMPS, A. - DENAULT, A.Y. - COUTURE, P. - CARRIER, M. BABIN, D. - LEVESQUE, S. - PIQUETTE, D. - LAMBERT, J. - TARDIF, J.-C. Baseline Regional Cerebral Oxygen Saturation Correlates With Left Ventricular Systolic and Diastolic Function. Journal of Cardiothoracic and Vascular Anesthesia [online]. December 2008, Volume 22, Issue 6, Pages 840-846. [cit. 2011-12-17]. ISSN: 10530770 [4] SIESLER, Heinz W. – OZAKI, Yukihiro – KAWATA, Satoshi – HEISE, Michael H. Near-Infrared Spectroscopy: Principles, Instruments, Applications. Weinheim, Germany: WILEY-VCH, 2002. 348 s. ISBN 3-527-30149-6
[5] NAULAERS, G. - CAICEDO Dorado, A. - VAN HUFFEL, S. Use of near-infrared spectroscopy in the neonatal intensive care unit. Vydáno v: CHEN W. - OETOMO S. - FEIJS L. Neonatal monitoring technologies : design for integrated solutions (pp. 1-25). Hershey, Pennsylvania, USA: IGI Global, 2012. 389 s. ISBN 978-1466609754. Dostupné z
22