€•/Œdocutils.nodes”Œdocument”“”)}”’”}”(Œ attributes”}”(Œbackrefs”]”Œids”]”Œclasses”]”Œsource”Œ7D:\Mariano\misc\ecg-kit\help\sphinx\source\examples.rst”Œnames”]”Œdupnames”]”uŒids”}”(Œid2”hŒsection”“”)}”’”}”(Œexpect_referenced_by_name”}”Œargument_parsing”hŒtarget”“”)}”’”}”(h}”(h]”h ]”h ]”h]”h]”Œrefid”Œargument-parsing”uŒtagname”hŒsource”hhhŒ rawsource”Œ.. _Argument_parsing:”Œline”KNŒchildren”]”Œparent”h)}”’”}”(h}”Œfunction_prototype”h )}”’”}”(h}”(h]”h ]”h ]”h]”h]”h*Œfunction-prototype”uh,hh-hhhh.Œ.. _Function_prototype:”h0K:h1]”h3h)}”’”}”(h}”(h]”Œcontents”ah]”h ]”Œcontents”ah ]”h]”uh,hh-hhhh.Œ”h0K&h1]”(hŒtitle”“”)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hRh-hhhh.ŒContents”h0K&h1]”hŒText”“”ŒContents”…”}”’”}”(h.h]h3hUubah3hFubhŒ bullet_list”“”)}”’”}”(h}”(h]”h ]”h ]”h]”Œbullet”Œ-”h]”uh,hfh-hhhh.hPh0K)h1]”(hŒ list_item”“”)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.Œ.:ref:`Function prototype `”h0Nh1]”hŒ paragraph”“”)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.hh0K)h1]”Œsphinx.addnodes”Œ pending_xref”“”)}”’”}”(h}”(h]”Œrefwarn”ˆh ]”h ]”Œreftype”Œref”Œrefdoc”Œexamples”h]”Œ refexplicit”ˆh]”Œ refdomain”Œstd”Œ reftarget”Œfunction_prototype”uh,hŽh-hh.hh0K)h1]”hŒinline”“”)}”’”}”(h}”(h]”h]”h ]”h ]”(Œxref”h Œstd-ref”eh]”uh,h¤h.hh1]”h`ŒFunction prototype”…”}”’”}”(h.hPh3h§ubah3h‘ubah3h„ubah3hwubah3hiubhu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.Œ*:ref:`Argument parsing `”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.hÀh0K*h1]”h�)}”’”}”(h}”(h]”h•ˆh ]”h ]”Œreftype”Œref”hšh›h]”Œ refexplicit”ˆh]”Œ refdomain”Œstd”h¡Œargument_parsing”uh,hŽh-hh.hÀh0K*h1]”h¥)}”’”}”(h}”(h]”h]”h ]”h ]”(h®hÙŒstd-ref”eh]”uh,h¤h.hÀh1]”h`ŒArgument parsing”…”}”’”}”(h.hPh3hÝubah3hÍubah3hÃubah3h¸ubah3hiubhu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.Œ8:ref:`QRS automatic detection `”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.hõh0K+h1]”h�)}”’”}”(h}”(h]”h•ˆh ]”h ]”Œreftype”Œref”hšh›h]”Œ refexplicit”ˆh]”Œ refdomain”Œstd”h¡Œqrs_automatic_detection”uh,hŽh-hh.hõh0K+h1]”h¥)}”’”}”(h}”(h]”h]”h ]”h ]”(h®jŒstd-ref”eh]”uh,h¤h.hõh1]”h`ŒQRS automatic detection”…”}”’”}”(h.hPh3jubah3jubah3høubah3híubah3hiubhu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.ŒR:ref:`QRS visual inspection and correction `”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.ŒR:ref:`QRS visual inspection and correction `”h0K,h1]”h�)}”’”}”(h}”(h]”h•ˆh ]”h ]”Œreftype”Œref”hšh›h]”Œ refexplicit”ˆh]”Œ refdomain”Œstd”h¡Œ$qrs_visual_inspection_and_correction”uh,hŽh-hh.j5h0K,h1]”h¥)}”’”}”(h}”(h]”h]”h ]”h ]”(h®jDŒstd-ref”eh]”uh,h¤h.j5h1]”h`Œ$QRS visual inspection and correction”…”}”’”}”(h.hPh3jHubah3j8ubah3j-ubah3j"ubah3hiubhu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.Œ8:ref:`PPG/ABP pulse detection `”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.j`h0K.h1]”h�)}”’”}”(h}”(h]”h•ˆh ]”h ]”Œreftype”Œref”hšh›h]”Œ refexplicit”ˆh]”Œ refdomain”Œstd”h¡Œppg_abp_pulse_detection”uh,hŽh-hh.j`h0K.h1]”h¥)}”’”}”(h}”(h]”h]”h ]”h ]”(h®jyŒstd-ref”eh]”uh,h¤h.j`h1]”h`ŒPPG/ABP pulse detection”…”}”’”}”(h.hPh3j}ubah3jmubah3jcubah3jXubah3hiubhu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.Œf:ref:`PPG/ABP waves visual inspection and correction `”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.Œf:ref:`PPG/ABP waves visual inspection and correction `”h0K/h1]”h�)}”’”}”(h}”(h]”h•ˆh ]”h ]”Œreftype”Œref”hšh›h]”Œ refexplicit”ˆh]”Œ refdomain”Œstd”h¡Œ.ppg_abp_waves_visual_inspection_and_correction”uh,hŽh-hh.j h0K/h1]”h¥)}”’”}”(h}”(h]”h]”h ]”h ]”(h®j¯Œstd-ref”eh]”uh,h¤h.j h1]”h`Œ.PPG/ABP waves visual inspection and correction”…”}”’”}”(h.hPh3j³ubah3j£ubah3j˜ubah3j�ubah3hiubhu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.Œ<:ref:`ECG automatic delineation `”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.jËh0K1h1]”h�)}”’”}”(h}”(h]”h•ˆh ]”h ]”Œreftype”Œref”hšh›h]”Œ refexplicit”ˆh]”Œ refdomain”Œstd”h¡Œecg_automatic_delineation”uh,hŽh-hh.jËh0K1h1]”h¥)}”’”}”(h}”(h]”h]”h ]”h ]”(h®jäŒstd-ref”eh]”uh,h¤h.jËh1]”h`ŒECG automatic delineation”…”}”’”}”(h.hPh3jèubah3jØubah3jÎubah3jÃubah3hiubhu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.Œf:ref:`Visual inspection of the detection/delineation `”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.Œf:ref:`Visual inspection of the detection/delineation `”h0K2h1]”h�)}”’”}”(h}”(h]”h•ˆh ]”h ]”Œreftype”Œref”hšh›h]”Œ refexplicit”ˆh]”Œ refdomain”Œstd”h¡Œ.visual_inspection_of_the_detection_delineation”uh,hŽh-hh.j h0K2h1]”h¥)}”’”}”(h}”(h]”h]”h ]”h ]”(h®jŒstd-ref”eh]”uh,h¤h.j h1]”h`Œ.Visual inspection of the detection/delineation”…”}”’”}”(h.hPh3jubah3jubah3jubah3jøubah3hiubhu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.ŒN:ref:`Automatic Heartbeat classification `”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.ŒN:ref:`Automatic Heartbeat classification `”h0K4h1]”h�)}”’”}”(h}”(h]”h•ˆh ]”h ]”Œreftype”Œref”hšh›h]”Œ refexplicit”ˆh]”Œ refdomain”Œstd”h¡Œ"automatic_heartbeat_classification”uh,hŽh-hh.jAh0K4h1]”h¥)}”’”}”(h}”(h]”h]”h ]”h ]”(h®jPŒstd-ref”eh]”uh,h¤h.jAh1]”h`Œ"Automatic Heartbeat classification”…”}”’”}”(h.hPh3jTubah3jDubah3j9ubah3j.ubah3hiubhu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.ŒH:ref:`Visual inspection of the signal `”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.ŒH:ref:`Visual inspection of the signal `”h0K6h1]”h�)}”’”}”(h}”(h]”h•ˆh ]”h ]”Œreftype”Œref”hšh›h]”Œ refexplicit”ˆh]”Œ refdomain”Œstd”h¡Œvisual_inspection_of_the_signal”uh,hŽh-hh.jwh0K6h1]”h¥)}”’”}”(h}”(h]”h]”h ]”h ]”(h®j†Œstd-ref”eh]”uh,h¤h.jwh1]”h`ŒVisual inspection of the signal”…”}”’”}”(h.hPh3jŠubah3jzubah3joubah3jdubah3hiubhu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.Œ?:ref:`Other user-defined tasks ... ` ”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.Œ>:ref:`Other user-defined tasks ... `”h0K8h1]”h�)}”’”}”(h}”(h]”h•ˆh ]”h ]”Œreftype”Œref”hšh›h]”Œ refexplicit”ˆh]”Œ refdomain”Œstd”h¡Œother_user-defined_tasks”uh,hŽh-hh.j­h0K8h1]”h¥)}”’”}”(h}”(h]”h]”h ]”h ]”(h®j¼Œstd-ref”eh]”uh,h¤h.j­h1]”h`ŒOther user-defined tasks ...”…”}”’”}”(h.hPh3jÀubah3j°ubah3j¥ubah3jšubah3hiubeh3hFubh:eh3h)}”’”}”(h}”(h]”Œanother example”ah]”h ]”Œanother-example”ah ]”h]”uh,hh-hhhh.hPh0Kh1]”(hS)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hRh-hhhh.ŒAnother example”h0Kh1]”h`ŒAnother example”…”}”’”}”(h.jäh3jÜubah3jÐubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.ŒñThis script exemplifies the use of the ECGkit in a multimodal cardiovascular recording which includes arterial blood pressure (ABP), plethysmographic (PPG) and electrocardiogram signals. The following tasks will be performed in this example:”h0Kh1]”h`ŒñThis script exemplifies the use of the ECGkit in a multimodal cardiovascular recording which includes arterial blood pressure (ABP), plethysmographic (PPG) and electrocardiogram signals. The following tasks will be performed in this example:”…”}”’”}”(h.jôh3jìubah3jÐubhg)}”’”}”(h}”(h]”h ]”h ]”h]”hphqh]”uh,hfh-hhhh.hPh0K h1]”(hu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.Œ8:ref:`Heartbeat/QRS detection `”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.jh0K h1]”h�)}”’”}”(h}”(h]”h•ˆh ]”h ]”Œreftype”Œref”hšh›h]”Œ refexplicit”ˆh]”Œ refdomain”Œstd”h¡Œqrs_automatic_detection”uh,hŽh-hh.jh0K h1]”h¥)}”’”}”(h}”(h]”h]”h ]”h ]”(h®j'Œstd-ref”eh]”uh,h¤h.jh1]”h`ŒHeartbeat/QRS detection”…”}”’”}”(h.hPh3j+ubah3jubah3jubah3jubah3jüubhu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.Œ8:ref:`ABP/PPG pulse detection `”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.jCh0K h1]”h�)}”’”}”(h}”(h]”h•ˆh ]”h ]”Œreftype”Œref”hšh›h]”Œ refexplicit”ˆh]”Œ refdomain”Œstd”h¡Œppg_abp_pulse_detection”uh,hŽh-hh.jCh0K h1]”h¥)}”’”}”(h}”(h]”h]”h ]”h ]”(h®j\Œstd-ref”eh]”uh,h¤h.jCh1]”h`ŒABP/PPG pulse detection”…”}”’”}”(h.hPh3j`ubah3jPubah3jFubah3j;ubah3jüubhu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.Œ7:ref:`ECG wave delineation `”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.jxh0K h1]”h�)}”’”}”(h}”(h]”h•ˆh ]”h ]”Œreftype”Œref”hšh›h]”Œ refexplicit”ˆh]”Œ refdomain”Œstd”h¡Œecg_automatic_delineation”uh,hŽh-hh.jxh0K h1]”h¥)}”’”}”(h}”(h]”h]”h ]”h ]”(h®j‘Œstd-ref”eh]”uh,h¤h.jxh1]”h`ŒECG wave delineation”…”}”’”}”(h.hPh3j•ubah3j…ubah3j{ubah3jpubah3jüubhu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.ŒD:ref:`Heartbeat classification `”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.j­h0K h1]”h�)}”’”}”(h}”(h]”h•ˆh ]”h ]”Œreftype”Œref”hšh›h]”Œ refexplicit”ˆh]”Œ refdomain”Œstd”h¡Œ"automatic_heartbeat_classification”uh,hŽh-hh.j­h0K h1]”h¥)}”’”}”(h}”(h]”h]”h ]”h ]”(h®jÆŒstd-ref”eh]”uh,h¤h.j­h1]”h`ŒHeartbeat classification”…”}”’”}”(h.hPh3jÊubah3jºubah3j°ubah3j¥ubah3jüubhu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.Œ;:ref:`Report generation ` ”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.Œ::ref:`Report generation `”h0Kh1]”h�)}”’”}”(h}”(h]”h•ˆh ]”h ]”Œreftype”Œref”hšh›h]”Œ refexplicit”ˆh]”Œ refdomain”Œstd”h¡Œvisual_inspection_of_the_signal”uh,hŽh-hh.jíh0Kh1]”h¥)}”’”}”(h}”(h]”h]”h ]”h ]”(h®jüŒstd-ref”eh]”uh,h¤h.jíh1]”h`ŒReport generation”…”}”’”}”(h.hPh3jubah3jðubah3jåubah3jÚubah3jüubeh3jÐubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.XµEach automatic step is followed by a manual verification step in order to verify the algorithm's results. The script is prepared to run locally without arguments, as well as in a cluster environment by using "pid\_str" argument. The pid\_str argument is a char with format 'N/M', being N <= M with default value '1/1'. You can partition a big job into M pieces in cluster architecture, by starting M processes with N ranging from 1 to M.”h0Kh1]”h`X³Each automatic step is followed by a manual verification step in order to verify the algorithm's results. The script is prepared to run locally without arguments, as well as in a cluster environment by using "pid_str" argument. The pid_str argument is a char with format 'N/M', being N <= M with default value '1/1'. You can partition a big job into M pieces in cluster architecture, by starting M processes with N ranging from 1 to M.”…”}”’”}”(h.XµEach automatic step is followed by a manual verification step in order to verify the algorithm's results. The script is prepared to run locally without arguments, as well as in a cluster environment by using "pid\_str" argument. The pid\_str argument is a char with format 'N/M', being N <= M with default value '1/1'. You can partition a big job into M pieces in cluster architecture, by starting M processes with N ranging from 1 to M.”h3jubah3jÐubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.Œ¯You can watch a typical run of this script for small, local ECG recording on `YouTube `__.”h0Kh1]”(h`ŒMYou can watch a typical run of this script for small, local ECG recording on ”…”}”’”}”(h.ŒMYou can watch a typical run of this script for small, local ECG recording on ”h3j!ubhŒ reference”“”)}”’”}”(h}”(h]”h ]”h ]”Œrefuri”ŒShttps://www.youtube.com/watch?v=8lJtkGhrqFw&list=PLlD2eDv5CIe9sA2atmnb-DX48FIRG46z7”h]”h]”Œname”ŒYouTube”uh,j1h.Œa`YouTube `__”h1]”h`ŒYouTube”…”}”’”}”(h.hPh3j4ubah3j!ubh`Œ.”…”}”’”}”(h.Œ.”h3j!ubeh3jÐubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.Œ!Example of how to run this script”h0Kh1]”h`Œ!Example of how to run this script”…”}”’”}”(h.jVh3jNubah3jÐubhŒ literal_block”“”)}”’”}”(h}”(h]”h ]”h ]”Œcode”ah]”h]”Œ xml:space”Œpreserve”uh,j]h-hhhh.Œ˜examples() examples('1/1', 'C:\Your_preferred_local_path\', 'arbitrary_string') examples('1/10', '/Your_preferred_path_in_cluster/', 'arbitrary_string')”h0K$h1]”h`Œ˜examples() examples('1/1', 'C:\Your_preferred_local_path\', 'arbitrary_string') examples('1/10', '/Your_preferred_path_in_cluster/', 'arbitrary_string')”…”}”’”}”(h.Œ˜examples() examples('1/1', 'C:\Your_preferred_local_path\', 'arbitrary_string') examples('1/10', '/Your_preferred_path_in_cluster/', 'arbitrary_string')”h3j`ubah3jÐubhFh5hh)}”’”}”(h}”Œqrs_automatic_detection”h )}”’”}”(h}”(h]”h ]”h ]”h]”h]”h*Œqrs-automatic-detection”uh,hh-hhhh.Œ.. _QRS_automatic_detection:”h0K‡h1]”h3hubsh}”(h]”(Œqrs automatic detection”jweh]”h ]”(j�Œid3”eh ]”h]”uh,hŒexpect_referenced_by_id”}”j�jysh-hhhh.hPh0KŠh1]”(hS)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hRh-hhhh.ŒQRS automatic detection”h0KŠh1]”h`ŒQRS automatic detection”…”}”’”}”(h.j˜h3j�ubah3jtubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.Œ™In this example the first step is the location of each heartbeat, or QRS complexes detection. To achieve this, the kit includes the following algorithms:”h0KŒh1]”h`Œ™In this example the first step is the location of each heartbeat, or QRS complexes detection. To achieve this, the kit includes the following algorithms:”…”}”’”}”(h.j¨h3j ubah3jtubhg)}”’”}”(h}”(h]”h ]”h ]”h]”hphqh]”uh,hfh-hhhh.hPh0K�h1]”(hu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.ŒWavedet”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.jÂh0K�h1]”h`ŒWavedet”…”}”’”}”(h.jÂh3jÅubah3jºubah3j°ubhu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.ŒPan & Tompkins”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.jÜh0K‘h1]”h`ŒPan & Tompkins”…”}”’”}”(h.jÜh3jßubah3jÔubah3j°ubhu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.Œgqrs”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.jöh0K’h1]”h`Œgqrs”…”}”’”}”(h.jöh3jùubah3jîubah3j°ubhu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.Œsqrs”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.jh0K“h1]”h`Œsqrs”…”}”’”}”(h.jh3jubah3jubah3j°ubhu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.Œwqrs”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.j*h0K”h1]”h`Œwqrs”…”}”’”}”(h.j*h3j-ubah3j"ubah3j°ubhu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.Œ ecgpuwave ”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.Œ ecgpuwave”h0K•h1]”h`Œ ecgpuwave”…”}”’”}”(h.jOh3jGubah3j<ubah3j°ubeh3jtubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.X„The way of performing QRS detection (or almost any other task in this ECGkit) is through an :doc:`ECGwrapper ` object. The objective of this object is to abstract or separate any algorithm from the particular details of the ECG signal. This object is able to invoke any kind of algorithm through the interface provided of other object, called :doc:`ECGtask ` objects.”h0K—h1]”(h`Œ\The way of performing QRS detection (or almost any other task in this ECGkit) is through an ”…”}”’”}”(h.Œ\The way of performing QRS detection (or almost any other task in this ECGkit) is through an ”h3jWubh�)}”’”}”(h}”(h]”h•ˆh ]”h ]”Œreftype”Œdoc”hšh›h]”Œ refexplicit”ˆh]”Œ refdomain”hPh¡Œ ECGwrapper”uh,hŽh-hh.Œ:doc:`ECGwrapper `”h0K—h1]”hŒliteral”“”)}”’”}”(h}”(h]”h]”h ]”h ]”(h®joeh]”uh,jwh.juh1]”h`Œ ECGwrapper”…”}”’”}”(h.hPh3jzubah3jhubah3jWubh`Œé object. The objective of this object is to abstract or separate any algorithm from the particular details of the ECG signal. This object is able to invoke any kind of algorithm through the interface provided of other object, called ”…”}”’”}”(h.Œé object. The objective of this object is to abstract or separate any algorithm from the particular details of the ECG signal. This object is able to invoke any kind of algorithm through the interface provided of other object, called ”h3jWubh�)}”’”}”(h}”(h]”h•ˆh ]”h ]”Œreftype”Œdoc”hšh›h]”Œ refexplicit”ˆh]”Œ refdomain”hPh¡ŒECGtask”uh,hŽh-hh.Œ:doc:`ECGtask `”h0K—h1]”jx)}”’”}”(h}”(h]”h]”h ]”h ]”(h®j–eh]”uh,jwh.jœh1]”h`ŒECGtask”…”}”’”}”(h.hPh3jŸubah3j�ubah3jWubh`Œ objects.”…”}”’”}”(h.Œ objects.”h3jWubeh3jtubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.XÄThe :doc:`ECGtask ` objects actually perform specific task on the ECG signal, in this case, the QRS complex detection. Each task have general properties such as *user\_string*, *progress\_handle* (see :doc:`ECGtask ` class properties for more details) and other specific for a certain task, such as *detectors*, *only\_ECG\_leads*, *wavedet\_config*, *gqrs\_config\_filename* (see others in :doc:`QRS detection task `).”h0K�h1]”(h`ŒThe ”…”}”’”}”(h.ŒThe ”h3j´ubh�)}”’”}”(h}”(h]”h•ˆh ]”h ]”Œreftype”Œdoc”hšh›h]”Œ refexplicit”ˆh]”Œ refdomain”hPh¡ŒECGtask”uh,hŽh-hh.Œ:doc:`ECGtask `”h0K�h1]”jx)}”’”}”(h}”(h]”h]”h ]”h ]”(h®jÌeh]”uh,jwh.jÒh1]”h`ŒECGtask”…”}”’”}”(h.hPh3jÕubah3jÅubah3j´ubh`ŒŽ objects actually perform specific task on the ECG signal, in this case, the QRS complex detection. Each task have general properties such as ”…”}”’”}”(h.ŒŽ objects actually perform specific task on the ECG signal, in this case, the QRS complex detection. Each task have general properties such as ”h3j´ubhŒemphasis”“”)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,jéh.Œ*user\_string*”h1]”h`Œ user_string”…”}”’”}”(h.hPh3jìubah3j´ubh`Œ, ”…”}”’”}”(h.Œ, ”h3j´ubjê)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,jéh.Œ*progress\_handle*”h1]”h`Œprogress_handle”…”}”’”}”(h.hPh3jubah3j´ubh`Œ (see ”…”}”’”}”(h.Œ (see ”h3j´ubh�)}”’”}”(h}”(h]”h•ˆh ]”h ]”Œreftype”Œdoc”hšh›h]”Œ refexplicit”ˆh]”Œ refdomain”hPh¡ŒECGtask”uh,hŽh-hh.Œ:doc:`ECGtask `”h0K�h1]”jx)}”’”}”(h}”(h]”h]”h ]”h ]”(h®jeh]”uh,jwh.j%h1]”h`ŒECGtask”…”}”’”}”(h.hPh3j(ubah3jubah3j´ubh`ŒS class properties for more details) and other specific for a certain task, such as ”…”}”’”}”(h.ŒS class properties for more details) and other specific for a certain task, such as ”h3j´ubjê)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,jéh.Œ *detectors*”h1]”h`Œ detectors”…”}”’”}”(h.hPh3j=ubah3j´ubh`Œ, ”…”}”’”}”(h.Œ, ”h3j´ubjê)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,jéh.Œ*only\_ECG\_leads*”h1]”h`Œonly_ECG_leads”…”}”’”}”(h.hPh3jSubah3j´ubh`Œ, ”…”}”’”}”(h.Œ, ”h3j´ubjê)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,jéh.Œ*wavedet\_config*”h1]”h`Œwavedet_config”…”}”’”}”(h.hPh3jiubah3j´ubh`Œ, ”…”}”’”}”(h.Œ, ”h3j´ubjê)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,jéh.Œ*gqrs\_config\_filename*”h1]”h`Œgqrs_config_filename”…”}”’”}”(h.hPh3jubah3j´ubh`Œ (see others in ”…”}”’”}”(h.Œ (see others in ”h3j´ubh�)}”’”}”(h}”(h]”h•ˆh ]”h ]”Œreftype”Œdoc”hšh›h]”Œ refexplicit”ˆh]”Œ refdomain”hPh¡Œ QRS_detection”uh,hŽh-hh.Œ):doc:`QRS detection task `”h0K�h1]”jx)}”’”}”(h}”(h]”h]”h ]”h ]”(h®jœeh]”uh,jwh.j¢h1]”h`ŒQRS detection task”…”}”’”}”(h.hPh3j¥ubah3j•ubah3j´ubh`Œ).”…”}”’”}”(h.Œ).”h3j´ubeh3jtubj^)}”’”}”(h}”(h]”h ]”h ]”jfah]”h]”jijjuh,j]h-hhhh.X8     % go through all files     ECG_all_wrappers = [];     jj = 1;     for ii = 1:lrecnames         rec_filename = [examples_path recnames{ii}];         % task name, %         ECGt_QRSd = 'QRS_detection';         % or create an specific handle to have more control         ECGt_QRSd = ECGtask_QRS_detection(); %         % select an specific algorithm. Default: Run all detectors %         ECGt_QRSd.detectors = 'wavedet'; % Wavedet algorithm based on %         ECGt_QRSd.detectors = 'pantom';  % Pan-Tompkins alg. %         ECGt_QRSd.detectors = 'gqrs';    % WFDB gqrs algorithm. % % Example of how you can add your own QRS detector. %         ECGt_QRSd.detectors = 'user:example_worst_ever_QRS_detector'; %         ECGt_QRSd.detectors = 'user:your_QRS_detector_func_name';    % %         "your_QRS_detector_func_name" can be your own detector.         ECGt_QRSd.detectors = {'wavedet' 'gqrs' 'wqrs' 'user:example_worst_ever_QRS_detector'};         % you can individualize each run of the QRS detector with an         % external string         ECGt_QRSd.user_string = user_str;         % or group by the config used %         ECGt_QRSd.user_string = ECGt_QRSd.detectors; %         ECGt_QRSd.only_ECG_leads = false;    % consider all signals ECG         ECGt_QRSd.only_ECG_leads = true;    % Identify ECG signals based on their header description.         ECG_w = ECGwrapper( 'recording_name', rec_filename, ...                             'this_pid', pid_str, ...                             'tmp_path', tmp_path, ...                             'output_path', output_path, ...                             'ECGtaskHandle', ECGt_QRSd);         try             % process the task             ECG_w.Run;             % collect object if were recognized as ECG recordings.             if( jj == 1)                 ECG_all_wrappers = ECG_w;             else                 ECG_all_wrappers(jj) = ECG_w;             end             jj = jj + 1;         catch MException             if( strfind(MException.identifier, 'ECGwrapper:ArgCheck:InvalidFormat') )                 disp_string_framed('*Red', sprintf( 'Could not guess the format of %s', ECG_w.recording_name) );             else                 % report just in case                 report = getReport(MException);                 fprintf(2, '\n%s\n', report);             end         end     end     % recognized recordings     lrecnames = length(ECG_all_wrappers);     % at the end, report problems if happened.     for ii = 1:lrecnames         ECG_all_wrappers(ii).ReportErrors;     end”h0Kßh1]”h`X8     % go through all files     ECG_all_wrappers = [];     jj = 1;     for ii = 1:lrecnames         rec_filename = [examples_path recnames{ii}];         % task name, %         ECGt_QRSd = 'QRS_detection';         % or create an specific handle to have more control         ECGt_QRSd = ECGtask_QRS_detection(); %         % select an specific algorithm. Default: Run all detectors %         ECGt_QRSd.detectors = 'wavedet'; % Wavedet algorithm based on %         ECGt_QRSd.detectors = 'pantom';  % Pan-Tompkins alg. %         ECGt_QRSd.detectors = 'gqrs';    % WFDB gqrs algorithm. % % Example of how you can add your own QRS detector. %         ECGt_QRSd.detectors = 'user:example_worst_ever_QRS_detector'; %         ECGt_QRSd.detectors = 'user:your_QRS_detector_func_name';    % %         "your_QRS_detector_func_name" can be your own detector.         ECGt_QRSd.detectors = {'wavedet' 'gqrs' 'wqrs' 'user:example_worst_ever_QRS_detector'};         % you can individualize each run of the QRS detector with an         % external string         ECGt_QRSd.user_string = user_str;         % or group by the config used %         ECGt_QRSd.user_string = ECGt_QRSd.detectors; %         ECGt_QRSd.only_ECG_leads = false;    % consider all signals ECG         ECGt_QRSd.only_ECG_leads = true;    % Identify ECG signals based on their header description.         ECG_w = ECGwrapper( 'recording_name', rec_filename, ...                             'this_pid', pid_str, ...                             'tmp_path', tmp_path, ...                             'output_path', output_path, ...                             'ECGtaskHandle', ECGt_QRSd);         try             % process the task             ECG_w.Run;             % collect object if were recognized as ECG recordings.             if( jj == 1)                 ECG_all_wrappers = ECG_w;             else                 ECG_all_wrappers(jj) = ECG_w;             end             jj = jj + 1;         catch MException             if( strfind(MException.identifier, 'ECGwrapper:ArgCheck:InvalidFormat') )                 disp_string_framed('*Red', sprintf( 'Could not guess the format of %s', ECG_w.recording_name) );             else                 % report just in case                 report = getReport(MException);                 fprintf(2, '\n%s\n', report);             end         end     end     % recognized recordings     lrecnames = length(ECG_all_wrappers);     % at the end, report problems if happened.     for ii = 1:lrecnames         ECG_all_wrappers(ii).ReportErrors;     end”…”}”’”}”(h.X8     % go through all files     ECG_all_wrappers = [];     jj = 1;     for ii = 1:lrecnames         rec_filename = [examples_path recnames{ii}];         % task name, %         ECGt_QRSd = 'QRS_detection';         % or create an specific handle to have more control         ECGt_QRSd = ECGtask_QRS_detection(); %         % select an specific algorithm. Default: Run all detectors %         ECGt_QRSd.detectors = 'wavedet'; % Wavedet algorithm based on %         ECGt_QRSd.detectors = 'pantom';  % Pan-Tompkins alg. %         ECGt_QRSd.detectors = 'gqrs';    % WFDB gqrs algorithm. % % Example of how you can add your own QRS detector. %         ECGt_QRSd.detectors = 'user:example_worst_ever_QRS_detector'; %         ECGt_QRSd.detectors = 'user:your_QRS_detector_func_name';    % %         "your_QRS_detector_func_name" can be your own detector.         ECGt_QRSd.detectors = {'wavedet' 'gqrs' 'wqrs' 'user:example_worst_ever_QRS_detector'};         % you can individualize each run of the QRS detector with an         % external string         ECGt_QRSd.user_string = user_str;         % or group by the config used %         ECGt_QRSd.user_string = ECGt_QRSd.detectors; %         ECGt_QRSd.only_ECG_leads = false;    % consider all signals ECG         ECGt_QRSd.only_ECG_leads = true;    % Identify ECG signals based on their header description.         ECG_w = ECGwrapper( 'recording_name', rec_filename, ...                             'this_pid', pid_str, ...                             'tmp_path', tmp_path, ...                             'output_path', output_path, ...                             'ECGtaskHandle', ECGt_QRSd);         try             % process the task             ECG_w.Run;             % collect object if were recognized as ECG recordings.             if( jj == 1)                 ECG_all_wrappers = ECG_w;             else                 ECG_all_wrappers(jj) = ECG_w;             end             jj = jj + 1;         catch MException             if( strfind(MException.identifier, 'ECGwrapper:ArgCheck:InvalidFormat') )                 disp_string_framed('*Red', sprintf( 'Could not guess the format of %s', ECG_w.recording_name) );             else                 % report just in case                 report = getReport(MException);                 fprintf(2, '\n%s\n', report);             end         end     end     % recognized recordings     lrecnames = length(ECG_all_wrappers);     % at the end, report problems if happened.     for ii = 1:lrecnames         ECG_all_wrappers(ii).ReportErrors;     end”h3jºubah3jtubh )}”’”}”(h}”(h]”h ]”h ]”h]”h]”h*Œ$qrs-visual-inspection-and-correction”uh,hh-hhhh.Œ).. _QRS_visual_inspection_and_correction:”h0Kàh1]”h3jtubeh3jÐubh)}”’”}”(h}”Œ$qrs_visual_inspection_and_correction”jËsh}”(h]”(Œ$qrs visual inspection and correction”jÚeh]”h ]”(jÓŒid4”eh ]”h]”uh,hjŒ}”jÓjËsh-hhhh.hPh0Kãh1]”(hS)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hRh-hhhh.Œ$QRS visual inspection and correction”h0Kãh1]”h`Œ$QRS visual inspection and correction”…”}”’”}”(h.jîh3jæubah3j×ubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.ŒœThis part of the example uses a graphical user interface (GUI) to allow the user correcting mistakes that the previous automatic algorithm eventually makes.”h0Kåh1]”h`ŒœThis part of the example uses a graphical user interface (GUI) to allow the user correcting mistakes that the previous automatic algorithm eventually makes.”…”}”’”}”(h.jþh3jöubah3j×ubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.XTAs can be seen in the following code, the first step is checking that the previous QRS detection task finished without problems. Then if no errors, the corrector will use as starting point the result of this same task, in case the user would like to edit a previously edited result, or if not available the result of the QRS detection task.”h0Kéh1]”h`XTAs can be seen in the following code, the first step is checking that the previous QRS detection task finished without problems. Then if no errors, the corrector will use as starting point the result of this same task, in case the user would like to edit a previously edited result, or if not available the result of the QRS detection task.”…”}”’”}”(h.jh3jubah3j×ubj^)}”’”}”(h}”(h]”h ]”h ]”jfah]”h]”jijjuh,j]h-hhhh.X if( bUseDesktop )     % other task can be performed on the same objects     for ii = 1:lrecnames         % last worker is the responsible of the visual correction.         if( ECG_all_wrappers(ii).this_pid == ECG_all_wrappers(ii).cant_pids)             % if there are not any previous error.             if( ECG_all_wrappers(ii).Processed && ~ECG_all_wrappers(ii).Error )                 % this is to use previous saved results as starting point,                 % if any available                 cached_filenames = ECG_all_wrappers(ii).GetCahchedFileName({'QRS_corrector' 'QRS_detection'});                 % if no previous correction work, try the automatic                 % detection task                 % if any, do the correction                 if( ~isempty(cached_filenames) )                     % this is to use previous saved results as starting point,                     % if any available                     ECG_all_wrappers(ii).ECGtaskHandle = 'QRS_corrector';                     % This task is supposed to be supervised, so only one pid is enough.                     ECG_all_wrappers(ii).this_pid = '1/1';                     % user provided name to individualize each run                     ECG_all_wrappers(ii).ECGtaskHandle.user_string = user_str;                     % to avoid loading cached results and exit, this flag                     % allows the re-editing of the current state of the                     % detections.                     ECG_all_wrappers(ii).cacheResults = false;                     % maybe in your application you should run this for                     % all files.                     ECG_all_wrappers(ii).ECGtaskHandle.payload = load(cached_filenames{1});                     % process the task                     ECG_all_wrappers(ii).Run;                     % restore the original pids configuration                     ECG_all_wrappers(ii).this_pid = pid_str;                     % As we changed for "QRS correction" task, we have to enable this                     % value again in order to avoid performing the following tasks every time.                     % If you want to recalculate any task, change it to false                     ECG_all_wrappers(ii).cacheResults = true;                 end             end         end     end     % at the end, report problems if happened.     for ii = 1:lrecnames         ECG_all_wrappers(ii).ReportErrors;     end end”h0Mh1]”h`X if( bUseDesktop )     % other task can be performed on the same objects     for ii = 1:lrecnames         % last worker is the responsible of the visual correction.         if( ECG_all_wrappers(ii).this_pid == ECG_all_wrappers(ii).cant_pids)             % if there are not any previous error.             if( ECG_all_wrappers(ii).Processed && ~ECG_all_wrappers(ii).Error )                 % this is to use previous saved results as starting point,                 % if any available                 cached_filenames = ECG_all_wrappers(ii).GetCahchedFileName({'QRS_corrector' 'QRS_detection'});                 % if no previous correction work, try the automatic                 % detection task                 % if any, do the correction                 if( ~isempty(cached_filenames) )                     % this is to use previous saved results as starting point,                     % if any available                     ECG_all_wrappers(ii).ECGtaskHandle = 'QRS_corrector';                     % This task is supposed to be supervised, so only one pid is enough.                     ECG_all_wrappers(ii).this_pid = '1/1';                     % user provided name to individualize each run                     ECG_all_wrappers(ii).ECGtaskHandle.user_string = user_str;                     % to avoid loading cached results and exit, this flag                     % allows the re-editing of the current state of the                     % detections.                     ECG_all_wrappers(ii).cacheResults = false;                     % maybe in your application you should run this for                     % all files.                     ECG_all_wrappers(ii).ECGtaskHandle.payload = load(cached_filenames{1});                     % process the task                     ECG_all_wrappers(ii).Run;                     % restore the original pids configuration                     ECG_all_wrappers(ii).this_pid = pid_str;                     % As we changed for "QRS correction" task, we have to enable this                     % value again in order to avoid performing the following tasks every time.                     % If you want to recalculate any task, change it to false                     ECG_all_wrappers(ii).cacheResults = true;                 end             end         end     end     % at the end, report problems if happened.     for ii = 1:lrecnames         ECG_all_wrappers(ii).ReportErrors;     end end”…”}”’”}”(h.X if( bUseDesktop )     % other task can be performed on the same objects     for ii = 1:lrecnames         % last worker is the responsible of the visual correction.         if( ECG_all_wrappers(ii).this_pid == ECG_all_wrappers(ii).cant_pids)             % if there are not any previous error.             if( ECG_all_wrappers(ii).Processed && ~ECG_all_wrappers(ii).Error )                 % this is to use previous saved results as starting point,                 % if any available                 cached_filenames = ECG_all_wrappers(ii).GetCahchedFileName({'QRS_corrector' 'QRS_detection'});                 % if no previous correction work, try the automatic                 % detection task                 % if any, do the correction                 if( ~isempty(cached_filenames) )                     % this is to use previous saved results as starting point,                     % if any available                     ECG_all_wrappers(ii).ECGtaskHandle = 'QRS_corrector';                     % This task is supposed to be supervised, so only one pid is enough.                     ECG_all_wrappers(ii).this_pid = '1/1';                     % user provided name to individualize each run                     ECG_all_wrappers(ii).ECGtaskHandle.user_string = user_str;                     % to avoid loading cached results and exit, this flag                     % allows the re-editing of the current state of the                     % detections.                     ECG_all_wrappers(ii).cacheResults = false;                     % maybe in your application you should run this for                     % all files.                     ECG_all_wrappers(ii).ECGtaskHandle.payload = load(cached_filenames{1});                     % process the task                     ECG_all_wrappers(ii).Run;                     % restore the original pids configuration                     ECG_all_wrappers(ii).this_pid = pid_str;                     % As we changed for "QRS correction" task, we have to enable this                     % value again in order to avoid performing the following tasks every time.                     % If you want to recalculate any task, change it to false                     ECG_all_wrappers(ii).cacheResults = true;                 end             end         end     end     % at the end, report problems if happened.     for ii = 1:lrecnames         ECG_all_wrappers(ii).ReportErrors;     end end”h3jubah3j×ubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.ŒÞThen the task invoked by the wrapper object is changed to `QRS corrector task <../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:edit('ECGtask_QRS_corrector.m')>`__ and the GUI is presented to the user.”h0M h1]”(h`Œ:Then the task invoked by the wrapper object is changed to ”…”}”’”}”(h.Œ:Then the task invoked by the wrapper object is changed to ”h3j'ubj2)}”’”}”(h}”(h]”h ]”h ]”j:Œe../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:edit('ECGtask_QRS_corrector.m')”h]”h]”Œname”ŒQRS corrector task”uh,j1h.Œ~`QRS corrector task <../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:edit('ECGtask_QRS_corrector.m')>`__”h1]”h`ŒQRS corrector task”…”}”’”}”(h.hPh3j8ubah3j'ubh`Œ& and the GUI is presented to the user.”…”}”’”}”(h.Œ& and the GUI is presented to the user.”h3j'ubeh3j×ubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.Œ|image4|”h0M$h1]”hŒimage”“”)}”’”}”(h}”(h]”h ]”h ]”Œuri”ŒQRS_corrector.PNG”Œ candidates”}”Œ*”jesh]”h]”Œalt”Œimage4”uh,j[h-Nhhh.Œimage:: QRS_corrector.PNG”h0Nh1]”h3jQubah3j×ubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.XIn this example, the GUI have four plots to represent the RR interval series, the two in the top-left show the RR interval versus time at different time windows. The bigger in the top-right, shows a *Poincaré* plot, that is the current RR interval versus the following in the serie. The plot in the bottom shows the selected signal/s versus time. Then the user can interact with the plots according to the `QRS corrector documentation <../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('ECGtask_QRS_corrector')>`__”h0M&h1]”(h`ŒÇIn this example, the GUI have four plots to represent the RR interval series, the two in the top-left show the RR interval versus time at different time windows. The bigger in the top-right, shows a ”…”}”’”}”(h.ŒÇIn this example, the GUI have four plots to represent the RR interval series, the two in the top-left show the RR interval versus time at different time windows. The bigger in the top-right, shows a ”h3jpubjê)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,jéh.Œ *Poincaré*”h1]”h`Œ Poincaré”…”}”’”}”(h.hPh3j�ubah3jpubh`ŒÅ plot, that is the current RR interval versus the following in the serie. The plot in the bottom shows the selected signal/s versus time. Then the user can interact with the plots according to the ”…”}”’”}”(h.ŒÅ plot, that is the current RR interval versus the following in the serie. The plot in the bottom shows the selected signal/s versus time. Then the user can interact with the plots according to the ”h3jpubj2)}”’”}”(h}”(h]”h ]”h ]”j:Œb../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('ECGtask_QRS_corrector')”h]”h]”Œname”ŒQRS corrector documentation”uh,j1h.Œ„`QRS corrector documentation <../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('ECGtask_QRS_corrector')>`__”h1]”h`ŒQRS corrector documentation”…”}”’”}”(h.hPh3j—ubah3jpubeh3j×ubh )}”’”}”(h}”(h]”h ]”h ]”h]”h]”h*Œppg-abp-pulse-detection”uh,hh-hhhh.Œ.. _PPG_ABP_pulse_detection:”h0M.h1]”h3j×ubeh3jÐubh)}”’”}”(h}”Œppg_abp_pulse_detection”jªsh}”(h]”(Œppg/abp pulse detection”j¹eh]”h ]”(j²Œid5”eh ]”h]”uh,hjŒ}”j²jªsh-hhhh.hPh0M1h1]”(hS)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hRh-hhhh.ŒPPG/ABP pulse detection”h0M1h1]”h`ŒPPG/ABP pulse detection”…”}”’”}”(h.jÍh3jÅubah3j¶ubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.XùIn case the recording includes pulsatile signals, such as plethysmographic (PPG) or arterial blood pressure (ABP), this kit includes the `PPG/ABP automatic detector task <../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('ECGtask_PPG_ABP_detector')>`__ which allows the use of two algorithms to perform peak detection, `WavePPG <../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('PPG_pulses_detector')>`__ and `Physionet's wabp `__.”h0M3h1]”(h`Œ‰In case the recording includes pulsatile signals, such as plethysmographic (PPG) or arterial blood pressure (ABP), this kit includes the ”…”}”’”}”(h.Œ‰In case the recording includes pulsatile signals, such as plethysmographic (PPG) or arterial blood pressure (ABP), this kit includes the ”h3jÕubj2)}”’”}”(h}”(h]”h ]”h ]”j:Œe../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('ECGtask_PPG_ABP_detector')”h]”h]”Œname”ŒPPG/ABP automatic detector task”uh,j1h.Œ‹`PPG/ABP automatic detector task <../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('ECGtask_PPG_ABP_detector')>`__”h1]”h`ŒPPG/ABP automatic detector task”…”}”’”}”(h.hPh3jæubah3jÕubh`ŒC which allows the use of two algorithms to perform peak detection, ”…”}”’”}”(h.ŒC which allows the use of two algorithms to perform peak detection, ”h3jÕubj2)}”’”}”(h}”(h]”h ]”h ]”j:Œ`../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('PPG_pulses_detector')”h]”h]”Œname”ŒWavePPG”uh,j1h.Œn`WavePPG <../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('PPG_pulses_detector')>`__”h1]”h`ŒWavePPG”…”}”’”}”(h.hPh3jÿubah3jÕubh`Œ and ”…”}”’”}”(h.Œ and ”h3jÕubj2)}”’”}”(h}”(h]”h ]”h ]”j:Œwabp-1.htm','-browser')”h]”h]”Œname”ŒPhysionet's wabp”uh,j1h.Œ.`Physionet's wabp `__”h1]”h`ŒPhysionet's wabp”…”}”’”}”(h.hPh3jubah3jÕubh`Œ.”…”}”’”}”(h.jLh3jÕubeh3j¶ubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.Œ/other task can be performed on the same objects”h0M;h1]”h`Œ/other task can be performed on the same objects”…”}”’”}”(h.j8h3j0ubah3j¶ubj^)}”’”}”(h}”(h]”h ]”h ]”jfah]”h]”jijjuh,j]h-hhhh.Xµfor ii = 1:lrecnames     % set the delineator task name and run again.     ECG_all_wrappers(ii).ECGtaskHandle = 'PPG_ABP_detector';     % user provided name to individualize each run     ECG_all_wrappers(ii).ECGtaskHandle.user_string = user_str;     % process the task     ECG_all_wrappers(ii).Run; end % at the end, report problems if happened. for ii = 1:lrecnames     ECG_all_wrappers(ii).ReportErrors; end”h0MLh1]”h`Xµfor ii = 1:lrecnames     % set the delineator task name and run again.     ECG_all_wrappers(ii).ECGtaskHandle = 'PPG_ABP_detector';     % user provided name to individualize each run     ECG_all_wrappers(ii).ECGtaskHandle.user_string = user_str;     % process the task     ECG_all_wrappers(ii).Run; end % at the end, report problems if happened. for ii = 1:lrecnames     ECG_all_wrappers(ii).ReportErrors; end”…”}”’”}”(h.Xµfor ii = 1:lrecnames     % set the delineator task name and run again.     ECG_all_wrappers(ii).ECGtaskHandle = 'PPG_ABP_detector';     % user provided name to individualize each run     ECG_all_wrappers(ii).ECGtaskHandle.user_string = user_str;     % process the task     ECG_all_wrappers(ii).Run; end % at the end, report problems if happened. for ii = 1:lrecnames     ECG_all_wrappers(ii).ReportErrors; end”h3j@ubah3j¶ubh )}”’”}”(h}”(h]”h ]”h ]”h]”h]”h*Œ.ppg-abp-waves-visual-inspection-and-correction”uh,hh-hhhh.Œ3.. _PPG_ABP_waves_visual_inspection_and_correction:”h0MMh1]”h3j¶ubeh3jÐubh)}”’”}”(h}”Œ.ppg_abp_waves_visual_inspection_and_correction”jQsh}”(h]”(Œ.ppg/abp waves visual inspection and correction”j`eh]”h ]”(jYŒid6”eh ]”h]”uh,hjŒ}”jYjQsh-hhhh.hPh0MPh1]”(hS)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hRh-hhhh.Œ.PPG/ABP waves visual inspection and correction”h0MPh1]”h`Œ.PPG/ABP waves visual inspection and correction”…”}”’”}”(h.jth3jlubah3j]ubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.XdThe same manual verification made for automatic QRS detection algorithms can be performed with pulsatile signals. The `PPG/ABP corrector task <../../../../../../jsD:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('ECGtask_PPG_ABP_corrector')>`__ was designed to allow users the verification and correction of automatic detections through the same GUI.”h0MRh1]”(h`ŒvThe same manual verification made for automatic QRS detection algorithms can be performed with pulsatile signals. The ”…”}”’”}”(h.ŒvThe same manual verification made for automatic QRS detection algorithms can be performed with pulsatile signals. The ”h3j|ubj2)}”’”}”(h}”(h]”h ]”h ]”j:Œg../../../../../../jsD:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('ECGtask_PPG_ABP_corrector')”h]”h]”Œname”ŒPPG/ABP corrector task”uh,j1h.Œ„`PPG/ABP corrector task <../../../../../../jsD:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('ECGtask_PPG_ABP_corrector')>`__”h1]”h`ŒPPG/ABP corrector task”…”}”’”}”(h.hPh3j�ubah3j|ubh`Œj was designed to allow users the verification and correction of automatic detections through the same GUI.”…”}”’”}”(h.Œj was designed to allow users the verification and correction of automatic detections through the same GUI.”h3j|ubeh3j]ubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.Œ|image5|”h0MXh1]”j\)}”’”}”(h}”(h]”h ]”h ]”Œuri”ŒPPG-ABP_corrector.PNG”jf}”jhj¸sh]”h]”Œalt”Œimage5”uh,j[h-Nhhh.Œimage:: PPG-ABP_corrector.PNG”h0Nh1]”h3j¦ubah3j]ubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.Œ‚The following code shows how to use this task. As you can note, the interface is almost the same used for the QRS correction task.”h0MZh1]”h`Œ‚The following code shows how to use this task. As you can note, the interface is almost the same used for the QRS correction task.”…”}”’”}”(h.jÉh3jÁubah3j]ubj^)}”’”}”(h}”(h]”h ]”h ]”jfah]”h]”jijjuh,j]h-hhhh.X if( bUseDesktop )     % other task can be performed on the same objects     for ii = 1:lrecnames         % last worker is the responsible of the visual correction.         if( ECG_all_wrappers(ii).this_pid == ECG_all_wrappers(ii).cant_pids)             % if there are not any previous error.             if( ECG_all_wrappers(ii).Processed && ~ECG_all_wrappers(ii).Error )                 % this is to use previous saved results as starting point,                 % if any available                 cached_filenames = ECG_all_wrappers(ii).GetCahchedFileName({'PPG_ABP_corrector' 'PPG_ABP_detector'});                 % if no previous correction work, try the automatic                 % detection task                 % if any, do the correction                 if( ~isempty(cached_filenames) )                     % this is to use previous saved results as starting point,                     % if any available                     ECG_all_wrappers(ii).ECGtaskHandle = 'PPG_ABP_corrector';                     % This task is supposed to be supervised, so only one pid is enough.                     ECG_all_wrappers(ii).this_pid = '1/1';                     % user provided name to individualize each run                     ECG_all_wrappers(ii).ECGtaskHandle.user_string = user_str;                     % to avoid loading cached results and exit, this flag                     % allows the re-editing of the current state of the                     % detections.                     ECG_all_wrappers(ii).cacheResults = false;                     % maybe in your application you should run this for                     % all files.                     ECG_all_wrappers(ii).ECGtaskHandle.payload = load(cached_filenames{1});                     % process the task                     ECG_all_wrappers(ii).Run;                     % restore the original pids configuration                     ECG_all_wrappers(ii).this_pid = pid_str;                     % As we changed for "QRS correction" task, we have to enable this                     % value again in order to avoid performing the following tasks every time.                     % If you want to recalculate any task, change it to false                     ECG_all_wrappers(ii).cacheResults = true;                 end             end         end     end     % at the end, report problems if happened.     for ii = 1:lrecnames         ECG_all_wrappers(ii).ReportErrors;     end end”h0M�h1]”h`X if( bUseDesktop )     % other task can be performed on the same objects     for ii = 1:lrecnames         % last worker is the responsible of the visual correction.         if( ECG_all_wrappers(ii).this_pid == ECG_all_wrappers(ii).cant_pids)             % if there are not any previous error.             if( ECG_all_wrappers(ii).Processed && ~ECG_all_wrappers(ii).Error )                 % this is to use previous saved results as starting point,                 % if any available                 cached_filenames = ECG_all_wrappers(ii).GetCahchedFileName({'PPG_ABP_corrector' 'PPG_ABP_detector'});                 % if no previous correction work, try the automatic                 % detection task                 % if any, do the correction                 if( ~isempty(cached_filenames) )                     % this is to use previous saved results as starting point,                     % if any available                     ECG_all_wrappers(ii).ECGtaskHandle = 'PPG_ABP_corrector';                     % This task is supposed to be supervised, so only one pid is enough.                     ECG_all_wrappers(ii).this_pid = '1/1';                     % user provided name to individualize each run                     ECG_all_wrappers(ii).ECGtaskHandle.user_string = user_str;                     % to avoid loading cached results and exit, this flag                     % allows the re-editing of the current state of the                     % detections.                     ECG_all_wrappers(ii).cacheResults = false;                     % maybe in your application you should run this for                     % all files.                     ECG_all_wrappers(ii).ECGtaskHandle.payload = load(cached_filenames{1});                     % process the task                     ECG_all_wrappers(ii).Run;                     % restore the original pids configuration                     ECG_all_wrappers(ii).this_pid = pid_str;                     % As we changed for "QRS correction" task, we have to enable this                     % value again in order to avoid performing the following tasks every time.                     % If you want to recalculate any task, change it to false                     ECG_all_wrappers(ii).cacheResults = true;                 end             end         end     end     % at the end, report problems if happened.     for ii = 1:lrecnames         ECG_all_wrappers(ii).ReportErrors;     end end”…”}”’”}”(h.X if( bUseDesktop )     % other task can be performed on the same objects     for ii = 1:lrecnames         % last worker is the responsible of the visual correction.         if( ECG_all_wrappers(ii).this_pid == ECG_all_wrappers(ii).cant_pids)             % if there are not any previous error.             if( ECG_all_wrappers(ii).Processed && ~ECG_all_wrappers(ii).Error )                 % this is to use previous saved results as starting point,                 % if any available                 cached_filenames = ECG_all_wrappers(ii).GetCahchedFileName({'PPG_ABP_corrector' 'PPG_ABP_detector'});                 % if no previous correction work, try the automatic                 % detection task                 % if any, do the correction                 if( ~isempty(cached_filenames) )                     % this is to use previous saved results as starting point,                     % if any available                     ECG_all_wrappers(ii).ECGtaskHandle = 'PPG_ABP_corrector';                     % This task is supposed to be supervised, so only one pid is enough.                     ECG_all_wrappers(ii).this_pid = '1/1';                     % user provided name to individualize each run                     ECG_all_wrappers(ii).ECGtaskHandle.user_string = user_str;                     % to avoid loading cached results and exit, this flag                     % allows the re-editing of the current state of the                     % detections.                     ECG_all_wrappers(ii).cacheResults = false;                     % maybe in your application you should run this for                     % all files.                     ECG_all_wrappers(ii).ECGtaskHandle.payload = load(cached_filenames{1});                     % process the task                     ECG_all_wrappers(ii).Run;                     % restore the original pids configuration                     ECG_all_wrappers(ii).this_pid = pid_str;                     % As we changed for "QRS correction" task, we have to enable this                     % value again in order to avoid performing the following tasks every time.                     % If you want to recalculate any task, change it to false                     ECG_all_wrappers(ii).cacheResults = true;                 end             end         end     end     % at the end, report problems if happened.     for ii = 1:lrecnames         ECG_all_wrappers(ii).ReportErrors;     end end”h3jÑubah3j]ubh )}”’”}”(h}”(h]”h ]”h ]”h]”h]”h*Œecg-automatic-delineation”uh,hh-hhhh.Œ.. _ECG_automatic_delineation:”h0MŽh1]”h3j]ubeh3jÐubh)}”’”}”(h}”Œecg_automatic_delineation”jâsh}”(h]”(Œecg automatic delineation”jñeh]”h ]”(jêŒid7”eh ]”h]”uh,hjŒ}”jêjâsh-hhhh.hPh0M‘h1]”(hS)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hRh-hhhh.ŒECG automatic delineation”h0M‘h1]”h`ŒECG automatic delineation”…”}”’”}”(h.j h3jýubah3jîubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.XmOnce the QRS complexes were detected, each heartbeat can be segmented or delineated into P-QRS-T waves. To achieve this the kit includes an `ECG delineation task <../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('ECGtask_ECG_delineation')>`__ to interface with the `wavedet `__ and others user-defined algorithms, as described in the `task help <../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('ECGtask_ECG_delineation')>`__. The interface follows the same guidelines described before, as is shown in the following code.”h0M“h1]”(h`ŒŒOnce the QRS complexes were detected, each heartbeat can be segmented or delineated into P-QRS-T waves. To achieve this the kit includes an ”…”}”’”}”(h.ŒŒOnce the QRS complexes were detected, each heartbeat can be segmented or delineated into P-QRS-T waves. To achieve this the kit includes an ”h3j ubj2)}”’”}”(h}”(h]”h ]”h ]”j:Œd../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('ECGtask_ECG_delineation')”h]”h]”Œname”ŒECG delineation task”uh,j1h.Œ`ECG delineation task <../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('ECGtask_ECG_delineation')>`__”h1]”h`ŒECG delineation task”…”}”’”}”(h.hPh3j ubah3j ubh`Œ to interface with the ”…”}”’”}”(h.Œ to interface with the ”h3j ubj2)}”’”}”(h}”(h]”h ]”h ]”j:Œ0articleDetails.jsp?arnumber=1275572','-browser')”h]”h]”Œname”Œwavedet”uh,j1h.Œ>`wavedet `__”h1]”h`Œwavedet”…”}”’”}”(h.hPh3j7 ubah3j ubh`Œ9 and others user-defined algorithms, as described in the ”…”}”’”}”(h.Œ9 and others user-defined algorithms, as described in the ”h3j ubj2)}”’”}”(h}”(h]”h ]”h ]”j:Œd../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('ECGtask_ECG_delineation')”h]”h]”Œname”Œ task help”uh,j1h.Œt`task help <../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('ECGtask_ECG_delineation')>`__”h1]”h`Œ task help”…”}”’”}”(h.hPh3jP ubah3j ubh`Œ`. The interface follows the same guidelines described before, as is shown in the following code.”…”}”’”}”(h.Œ`. The interface follows the same guidelines described before, as is shown in the following code.”h3j ubeh3jîubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.Œ/other task can be performed on the same objects”h0Mžh1]”h`Œ/other task can be performed on the same objects”…”}”’”}”(h.jq h3ji ubah3jîubj^)}”’”}”(h}”(h]”h ]”h ]”jfah]”h]”jijjuh,j]h-hhhh.X    for ii = 1:lrecnames         % this is to use previous cached results as starting point         cached_filenames = ECG_all_wrappers(ii).GetCahchedFileName('QRS_corrector');         % if corrected QRS detections are not available, wavedet         % performs automatic QRS detection.         if( ~isempty(cached_filenames) )             % this is to use previous result from the automatic QRS             % detection             ECG_all_wrappers(ii).ECGtaskHandle.payload = load(cached_filenames{1});         end         % set the delineator task name and run again.         ECG_all_wrappers(ii).ECGtaskHandle = 'ECG_delineation';         % user provided name to individualize each run         ECG_all_wrappers(ii).ECGtaskHandle.user_string = user_str;         % Identify ECG signals based on their header description and         % perform delineation in those leads.         ECG_all_wrappers(ii).ECGtaskHandle.only_ECG_leads = true; %         ECGt_QRSd.detectors = 'wavedet'; % Wavedet algorithm based on %         ECGt_QRSd.detectors = 'user:example_worst_ever_ECG_delineator'; %         % Example of how you can add your own ECG delineator. %         ECGt_QRSd.detectors = 'user:your_ECG_delineator_func_name'; %         "your_ECG_delineator_func_name" can be your own delineator.         ECG_all_wrappers(ii).ECGtaskHandle.delineators = {'wavedet' 'user:example_worst_ever_ECG_delineator'};         % process the task         ECG_all_wrappers(ii).Run;     end     % at the end, report problems if happened.     for ii = 1:lrecnames         ECG_all_wrappers(ii).ReportErrors;     end”h0MÀh1]”h`X    for ii = 1:lrecnames         % this is to use previous cached results as starting point         cached_filenames = ECG_all_wrappers(ii).GetCahchedFileName('QRS_corrector');         % if corrected QRS detections are not available, wavedet         % performs automatic QRS detection.         if( ~isempty(cached_filenames) )             % this is to use previous result from the automatic QRS             % detection             ECG_all_wrappers(ii).ECGtaskHandle.payload = load(cached_filenames{1});         end         % set the delineator task name and run again.         ECG_all_wrappers(ii).ECGtaskHandle = 'ECG_delineation';         % user provided name to individualize each run         ECG_all_wrappers(ii).ECGtaskHandle.user_string = user_str;         % Identify ECG signals based on their header description and         % perform delineation in those leads.         ECG_all_wrappers(ii).ECGtaskHandle.only_ECG_leads = true; %         ECGt_QRSd.detectors = 'wavedet'; % Wavedet algorithm based on %         ECGt_QRSd.detectors = 'user:example_worst_ever_ECG_delineator'; %         % Example of how you can add your own ECG delineator. %         ECGt_QRSd.detectors = 'user:your_ECG_delineator_func_name'; %         "your_ECG_delineator_func_name" can be your own delineator.         ECG_all_wrappers(ii).ECGtaskHandle.delineators = {'wavedet' 'user:example_worst_ever_ECG_delineator'};         % process the task         ECG_all_wrappers(ii).Run;     end     % at the end, report problems if happened.     for ii = 1:lrecnames         ECG_all_wrappers(ii).ReportErrors;     end”…”•¶È}”’”}”(h.X    for ii = 1:lrecnames         % this is to use previous cached results as starting point         cached_filenames = ECG_all_wrappers(ii).GetCahchedFileName('QRS_corrector');         % if corrected QRS detections are not available, wavedet         % performs automatic QRS detection.         if( ~isempty(cached_filenames) )             % this is to use previous result from the automatic QRS             % detection             ECG_all_wrappers(ii).ECGtaskHandle.payload = load(cached_filenames{1});         end         % set the delineator task name and run again.         ECG_all_wrappers(ii).ECGtaskHandle = 'ECG_delineation';         % user provided name to individualize each run         ECG_all_wrappers(ii).ECGtaskHandle.user_string = user_str;         % Identify ECG signals based on their header description and         % perform delineation in those leads.         ECG_all_wrappers(ii).ECGtaskHandle.only_ECG_leads = true; %         ECGt_QRSd.detectors = 'wavedet'; % Wavedet algorithm based on %         ECGt_QRSd.detectors = 'user:example_worst_ever_ECG_delineator'; %         % Example of how you can add your own ECG delineator. %         ECGt_QRSd.detectors = 'user:your_ECG_delineator_func_name'; %         "your_ECG_delineator_func_name" can be your own delineator.         ECG_all_wrappers(ii).ECGtaskHandle.delineators = {'wavedet' 'user:example_worst_ever_ECG_delineator'};         % process the task         ECG_all_wrappers(ii).Run;     end     % at the end, report problems if happened.     for ii = 1:lrecnames         ECG_all_wrappers(ii).ReportErrors;     end”h3jy ubah3jîubh )}”’”}”(h}”(h]”h ]”h ]”h]”h]”h*Œ.visual-inspection-of-the-detection-delineation”uh,hh-hhhh.Œ3.. _Visual_inspection_of_the_detection_delineation:”h0MÁh1]”h3jîubeh3jÐubh)}”’”}”(h}”Œ.visual_inspection_of_the_detection_delineation”jŠ sh}”(h]”(Œ.visual inspection of the detection/delineation”j™ eh]”h ]”(j’ Œid8”eh ]”h]”uh,hjŒ}”j’ jŠ sh-hhhh.hPh0MÄh1]”(hS)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hRh-hhhh.Œ.Visual inspection of the detection/delineation”h0MÄh1]”h`Œ.Visual inspection of the detection/delineation”…”}”’”}”(h.j­ h3j¥ ubah3j– ubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.XRThe same manual verification made for all the previous automatic tasks is repeated for ECG delineation. The `ECG delineation corrector task <../../../../../../jsD:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('ECGtask_ECG_delineation_corrector')>`__ was designed to allow users the verification and correction of automatic delineation through the same GUI. The only difference with respect to the behaviour of the QRS or PPG/ABP correction GUI, is that addition of new events to the P-QRS-T series is not allowed, in order to keep the assosiation of a wave fiducial point to a heartbeat.”h0MÆh1]”(h`ŒlThe same manual verification made for all the previous automatic tasks is repeated for ECG delineation. The ”…”}”’”}”(h.ŒlThe same manual verification made for all the previous automatic tasks is repeated for ECG delineation. The ”h3jµ ubj2)}”’”}”(h}”(h]”h ]”h ]”j:Œo../../../../../../jsD:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('ECGtask_ECG_delineation_corrector')”h]”h]”Œname”ŒECG delineation corrector task”uh,j1h.Œ”`ECG delineation corrector task <../../../../../../jsD:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('ECGtask_ECG_delineation_corrector')>`__”h1]”h`ŒECG delineation corrector task”…”}”’”}”(h.hPh3jÆ ubah3jµ ubh`XR was designed to allow users the verification and correction of automatic delineation through the same GUI. The only difference with respect to the behaviour of the QRS or PPG/ABP correction GUI, is that addition of new events to the P-QRS-T series is not allowed, in order to keep the assosiation of a wave fiducial point to a heartbeat.”…”}”’”}”(h.XR was designed to allow users the verification and correction of automatic delineation through the same GUI. The only difference with respect to the behaviour of the QRS or PPG/ABP correction GUI, is that addition of new events to the P-QRS-T series is not allowed, in order to keep the assosiation of a wave fiducial point to a heartbeat.”h3jµ ubeh3j– ubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.Œ|image6|”h0MÏh1]”j\)}”’”}”(h}”(h]”h ]”h ]”Œuri”ŒECG_delineator_corrector.png”jf}”jhjñ sh]”h]”Œalt”Œimage6”uh,j[h-Nhhh.Œ$image:: ECG_delineator_corrector.png”h0Nh1]”h3jß ubah3j– ubj^)}”’”}”(h}”(h]”h ]”h ]”jfah]”h]”jijjuh,j]h-hhhh.X( if( bUseDesktop )     % other task can be performed on the same objects     for ii = 1:lrecnames         % last worker is the responsible of the visual correction.         if( ECG_all_wrappers(ii).this_pid == ECG_all_wrappers(ii).cant_pids)             % if there are not any previous error.             if( ECG_all_wrappers(ii).Processed && ~ECG_all_wrappers(ii).Error )                 % this is to use previous saved results as starting point,                 % if any available                 cached_filenames = ECG_all_wrappers(ii).GetCahchedFileName( {'ECG_delineation_corrector' 'ECG_delineation'} );                 % if no previous correction work, try the automatic                 % detection task                 % if any, do the correction                 if( ~isempty(cached_filenames) )                     % this is to use previous saved results as starting point,                     % if any available                     ECG_all_wrappers(ii).ECGtaskHandle = 'ECG_delineation_corrector';                     % This task is supposed to be supervised, so only one pid is enough.                     ECG_all_wrappers(ii).this_pid = '1/1';                     % user provided name to individualize each run                     ECG_all_wrappers(ii).ECGtaskHandle.user_string = user_str;                     % to avoid loading cached results and exit, this flag                     % allows the re-editing of the current state of the                     % detections.                     ECG_all_wrappers(ii).cacheResults = false;                     % maybe in your application you should run this for                     % all files.                     ECG_all_wrappers(ii).ECGtaskHandle.payload = load(cached_filenames{1});                     % process the task                     ECG_all_wrappers(ii).Run;                     % restore the original pids configuration                     ECG_all_wrappers(ii).this_pid = pid_str;                     % As we changed for "QRS correction" task, we have to enable this                     % value again in order to avoid performing the following tasks every time.                     % If you want to recalculate any task, change it to false                     ECG_all_wrappers(ii).cacheResults = true;                 end             end         end     end     % at the end, report problems if happened.     for ii = 1:lrecnames         ECG_all_wrappers(ii).ReportErrors;     end end”h0Mh1]”h`X( if( bUseDesktop )     % other task can be performed on the same objects     for ii = 1:lrecnames         % last worker is the responsible of the visual correction.         if( ECG_all_wrappers(ii).this_pid == ECG_all_wrappers(ii).cant_pids)             % if there are not any previous error.             if( ECG_all_wrappers(ii).Processed && ~ECG_all_wrappers(ii).Error )                 % this is to use previous saved results as starting point,                 % if any available                 cached_filenames = ECG_all_wrappers(ii).GetCahchedFileName( {'ECG_delineation_corrector' 'ECG_delineation'} );                 % if no previous correction work, try the automatic                 % detection task                 % if any, do the correction                 if( ~isempty(cached_filenames) )                     % this is to use previous saved results as starting point,                     % if any available                     ECG_all_wrappers(ii).ECGtaskHandle = 'ECG_delineation_corrector';                     % This task is supposed to be supervised, so only one pid is enough.                     ECG_all_wrappers(ii).this_pid = '1/1';                     % user provided name to individualize each run                     ECG_all_wrappers(ii).ECGtaskHandle.user_string = user_str;                     % to avoid loading cached results and exit, this flag                     % allows the re-editing of the current state of the                     % detections.                     ECG_all_wrappers(ii).cacheResults = false;                     % maybe in your application you should run this for                     % all files.                     ECG_all_wrappers(ii).ECGtaskHandle.payload = load(cached_filenames{1});                     % process the task                     ECG_all_wrappers(ii).Run;                     % restore the original pids configuration                     ECG_all_wrappers(ii).this_pid = pid_str;                     % As we changed for "QRS correction" task, we have to enable this                     % value again in order to avoid performing the following tasks every time.                     % If you want to recalculate any task, change it to false                     ECG_all_wrappers(ii).cacheResults = true;                 end             end         end     end     % at the end, report problems if happened.     for ii = 1:lrecnames         ECG_all_wrappers(ii).ReportErrors;     end end”…”}”’”}”(h.X( if( bUseDesktop )     % other task can be performed on the same objects     for ii = 1:lrecnames         % last worker is the responsible of the visual correction.         if( ECG_all_wrappers(ii).this_pid == ECG_all_wrappers(ii).cant_pids)             % if there are not any previous error.             if( ECG_all_wrappers(ii).Processed && ~ECG_all_wrappers(ii).Error )                 % this is to use previous saved results as starting point,                 % if any available                 cached_filenames = ECG_all_wrappers(ii).GetCahchedFileName( {'ECG_delineation_corrector' 'ECG_delineation'} );                 % if no previous correction work, try the automatic                 % detection task                 % if any, do the correction                 if( ~isempty(cached_filenames) )                     % this is to use previous saved results as starting point,                     % if any available                     ECG_all_wrappers(ii).ECGtaskHandle = 'ECG_delineation_corrector';                     % This task is supposed to be supervised, so only one pid is enough.                     ECG_all_wrappers(ii).this_pid = '1/1';                     % user provided name to individualize each run                     ECG_all_wrappers(ii).ECGtaskHandle.user_string = user_str;                     % to avoid loading cached results and exit, this flag                     % allows the re-editing of the current state of the                     % detections.                     ECG_all_wrappers(ii).cacheResults = false;                     % maybe in your application you should run this for                     % all files.                     ECG_all_wrappers(ii).ECGtaskHandle.payload = load(cached_filenames{1});                     % process the task                     ECG_all_wrappers(ii).Run;                     % restore the original pids configuration                     ECG_all_wrappers(ii).this_pid = pid_str;                     % As we changed for "QRS correction" task, we have to enable this                     % value again in order to avoid performing the following tasks every time.                     % If you want to recalculate any task, change it to false                     ECG_all_wrappers(ii).cacheResults = true;                 end             end         end     end     % at the end, report problems if happened.     for ii = 1:lrecnames         ECG_all_wrappers(ii).ReportErrors;     end end”h3jú ubah3j– ubh )}”’”}”(h}”(h]”h ]”h ]”h]”h]”h*Œ"automatic-heartbeat-classification”uh,hh-hhhh.Œ'.. _Automatic_Heartbeat_classification:”h0Mh1]”h3j– ubeh3jÐubh)}”’”}”(h}”Œ"automatic_heartbeat_classification”j sh}”(h]”(Œ"automatic heartbeat classification”j eh]”h ]”(j Œid9”eh ]”h]”uh,hjŒ}”j j sh-hhhh.hPh0Mh1]”(hS)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hRh-hhhh.Œ"Automatic Heartbeat classification”h0Mh1]”h`Œ"Automatic Heartbeat classification”…”}”’”}”(h.j. h3j& ubah3j ubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.XMThe last task described in this example is the classification of heartbeats according to the `EC-57 AAMI recommendation `__. To achieve this task, the kit includes a `Heartbeat classification task <../../../../../../jsD:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('ECGtask_heartbeat_classifier')>`__ that interfaces with the `Argentino-Aragonés heartbeat classifier (a2hbc) <','-browser')>`__ project in order to classify heartbeats into the following classes:”h0Mh1]”(h`Œ]The last task described in this example is the classification of heartbeats according to the ”…”}”’”}”(h.Œ]The last task described in this example is the classification of heartbeats according to the ”h3j6 ubj2)}”’”}”(h}”(h]”h ]”h ]”j:Œumatlab:web('http://marketplace.aami.org/eseries/scriptcontent/docs/Preview%20Files/EC57_1212_preview.pdf','-browser')”h]”h]”Œname”ŒEC-57 AAMI recommendation”uh,j1h.Œ•`EC-57 AAMI recommendation `__”h1]”h`ŒEC-57 AAMI recommendation”…”}”’”}”(h.hPh3jG ubah3j6 ubh`Œ+. To achieve this task, the kit includes a ”…”}”’”}”(h.Œ+. To achieve this task, the kit includes a ”h3j6 ubj2)}”’”}”(h}”(h]”h ]”h ]”j:Œj../../../../../../jsD:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('ECGtask_heartbeat_classifier')”h]”h]”Œname”ŒHeartbeat classification task”uh,j1h.ŒŽ`Heartbeat classification task <../../../../../../jsD:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('ECGtask_heartbeat_classifier')>`__”h1]”h`ŒHeartbeat classification task”…”}”’”}”(h.hPh3j` ubah3j6 ubh`Œ that interfaces with the ”…”}”’”}”(h.Œ that interfaces with the ”h3j6 ubj2)}”’”}”(h}”(h]”h ]”h ]”j:Œ ','-browser')”h]”h]”Œname”Œ0Argentino-Aragonés heartbeat classifier (a2hbc)”uh,j1h.ŒD`Argentino-Aragonés heartbeat classifier (a2hbc) <','-browser')>`__”h1]”h`Œ0Argentino-Aragonés heartbeat classifier (a2hbc)”…”}”’”}”(h.hPh3jy ubah3j6 ubh`ŒD project in order to classify heartbeats into the following classes:”…”}”’”}”(h.ŒD project in order to classify heartbeats into the following classes:”h3j6 ubeh3j ubhg)}”’”}”(h}”(h]”h ]”h ]”h]”hphqh]”uh,hfh-hhhh.hPh0Mh1]”(hu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.Œ **N** normal”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.j¤ h0Mh1]”(hŒstrong”“”)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,j° h.Œ**N**”h1]”h`ŒN”…”}”’”}”(h.hPh3j³ ubah3j§ ubh`Œ normal”…”}”’”}”(h.Œ normal”h3j§ ubeh3jœ ubah3j’ ubhu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.Œ**S** supraventricular”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.jÑ h0Mh1]”(j± )}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,j° h.Œ**S**”h1]”h`ŒS”…”}”’”}”(h.hPh3jÞ ubah3jÔ ubh`Œ supraventricular”…”}”’”}”(h.Œ supraventricular”h3jÔ ubeh3jÉ ubah3j’ ubhu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.Œ**V** ventricular”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.jü h0Mh1]”(j± )}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,j° h.Œ**V**”h1]”h`ŒV”…”}”’”}”(h.hPh3j ubah3jÿ ubh`Œ ventricular”…”}”’”}”(h.Œ ventricular”h3jÿ ubeh3jô ubah3j’ ubhu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.Œ'**F** fusion of normal and ventricular ”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.Œ&**F** fusion of normal and ventricular”h0Mh1]”(j± )}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,j° h.Œ**F**”h1]”h`ŒF”…”}”’”}”(h.hPh3j5 ubah3j* ubh`Œ! fusion of normal and ventricular”…”}”’”}”(h.Œ! fusion of normal and ventricular”h3j* ubeh3j ubah3j’ ubeh3j ubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.ŒÒThe *a2hbc* algorithm can opperate automatically or assisted by the user, for more details check the `a2hbc documentation <../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('a2hbc')>`__.”h0Mh1]”(h`ŒThe ”…”}”’”}”(h.ŒThe ”h3jK ubjê)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,jéh.Œ*a2hbc*”h1]”h`Œa2hbc”…”}”’”}”(h.hPh3j\ ubah3jK ubh`ŒZ algorithm can opperate automatically or assisted by the user, for more details check the ”…”}”’”}”(h.ŒZ algorithm can opperate automatically or assisted by the user, for more details check the ”h3jK ubj2)}”’”}”(h}”(h]”h ]”h ]”j:ŒR../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('a2hbc')”h]”h]”Œname”Œa2hbc documentation”uh,j1h.Œl`a2hbc documentation <../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('a2hbc')>`__”h1]”h`Œa2hbc documentation”…”}”’”}”(h.hPh3jr ubah3jK ubh`Œ.”…”}”’”}”(h.jLh3jK ubeh3j ubj^)}”’”}”(h}”(h]”h ]”h ]”jfah]”h]”jijjuh,j]h-hhhh.Xã    for ii = 1:lrecnames         % this is to use previous cached results as starting point         cached_filenames = ECG_all_wrappers(ii).GetCahchedFileName({'QRS_corrector' 'QRS_detection'});         % if corrected QRS detections are not available, wavedet         % performs automatic QRS detection.         if( ~isempty(cached_filenames) )             ECG_all_wrappers(ii).ECGtaskHandle = 'ECG_heartbeat_classifier';             % the heartbeat classifier uses the QRS detection performed             % before, if available the task will use the corrected             % detections.             ECG_all_wrappers(ii).ECGtaskHandle.payload = load(cached_filenames{1});             % modes of operation of the a2hbc algorithm             ECG_all_wrappers(ii).ECGtaskHandle.mode = 'auto'; %             ECG_all_wrappers(ii).ECGtaskHandle.mode = 'slightly-assisted'; %             ECG_all_wrappers(ii).ECGtaskHandle.mode = 'assisted';             % user provided name to individualize each run             ECG_all_wrappers(ii).ECGtaskHandle.user_string = user_str;             % process the task             ECG_all_wrappers(ii).Run;         end     end     % at the end, report problems if happened.     for ii = 1:lrecnames         ECG_all_wrappers(ii).ReportErrors;     end”h0M3h1]”h`Xã    for ii = 1:lrecnames         % this is to use previous cached results as starting point         cached_filenames = ECG_all_wrappers(ii).GetCahchedFileName({'QRS_corrector' 'QRS_detection'});         % if corrected QRS detections are not available, wavedet         % performs automatic QRS detection.         if( ~isempty(cached_filenames) )             ECG_all_wrappers(ii).ECGtaskHandle = 'ECG_heartbeat_classifier';             % the heartbeat classifier uses the QRS detection performed             % before, if available the task will use the corrected             % detections.             ECG_all_wrappers(ii).ECGtaskHandle.payload = load(cached_filenames{1});             % modes of operation of the a2hbc algorithm             ECG_all_wrappers(ii).ECGtaskHandle.mode = 'auto'; %             ECG_all_wrappers(ii).ECGtaskHandle.mode = 'slightly-assisted'; %             ECG_all_wrappers(ii).ECGtaskHandle.mode = 'assisted';             % user provided name to individualize each run             ECG_all_wrappers(ii).ECGtaskHandle.user_string = user_str;             % process the task             ECG_all_wrappers(ii).Run;         end     end     % at the end, report problems if happened.     for ii = 1:lrecnames         ECG_all_wrappers(ii).ReportErrors;     end”…”}”’”}”(h.Xã    for ii = 1:lrecnames         % this is to use previous cached results as starting point         cached_filenames = ECG_all_wrappers(ii).GetCahchedFileName({'QRS_corrector' 'QRS_detection'});         % if corrected QRS detections are not available, wavedet         % performs automatic QRS detection.         if( ~isempty(cached_filenames) )             ECG_all_wrappers(ii).ECGtaskHandle = 'ECG_heartbeat_classifier';             % the heartbeat classifier uses the QRS detection performed             % before, if available the task will use the corrected             % detections.             ECG_all_wrappers(ii).ECGtaskHandle.payload = load(cached_filenames{1});             % modes of operation of the a2hbc algorithm             ECG_all_wrappers(ii).ECGtaskHandle.mode = 'auto'; %             ECG_all_wrappers(ii).ECGtaskHandle.mode = 'slightly-assisted'; %             ECG_all_wrappers(ii).ECGtaskHandle.mode = 'assisted';             % user provided name to individualize each run             ECG_all_wrappers(ii).ECGtaskHandle.user_string = user_str;             % process the task             ECG_all_wrappers(ii).Run;         end     end     % at the end, report problems if happened.     for ii = 1:lrecnames         ECG_all_wrappers(ii).ReportErrors;     end”h3jŠ ubah3j ubh )}”’”}”(h}”(h]”h ]”h ]”h]”h]”h*Œvisual-inspection-of-the-signal”uh,hh-hhhh.Œ$.. _Visual_inspection_of_the_signal:”h0M4h1]”h3j ubeh3jÐubh)}”’”}”(h}”Œvisual_inspection_of_the_signal”j› sh}”(h]”(Œvisual inspection of the signal”jª eh]”h ]”(j£ Œid10”eh ]”h]”uh,hjŒ}”j£ j› sh-hhhh.hPh0M7h1]”(hS)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hRh-hhhh.ŒVisual inspection of the signal”h0M7h1]”h`ŒVisual inspection of the signal”…”}”’”}”(h.j¾ h3j¶ ubah3j§ ubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.XaFinaly a report is generated with the results of the previous tasks, either in a pdf document or several images. The report generated can be customized with the interface described in the `documentation <../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('reportECG')>`__. The following are just three examples of a longer report:”h0M9h1]”(h`Œ¼Finaly a report is generated with the results of the previous tasks, either in a pdf document or several images. The report generated can be customized with the interface described in the ”…”}”’”}”(h.Œ¼Finaly a report is generated with the results of the previous tasks, either in a pdf document or several images. The report generated can be customized with the interface described in the ”h3jÆ ubj2)}”’”}”(h}”(h]”h ]”h ]”j:ŒV../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('reportECG')”h]”h]”Œname”Œ documentation”uh,j1h.Œj`documentation <../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('reportECG')>`__”h1]”h`Œ documentation”…”}”’”}”(h.hPh3j× ubah3jÆ ubh`Œ;. The following are just three examples of a longer report:”…”}”’”}”(h.Œ;. The following are just three examples of a longer report:”h3jÆ ubeh3j§ ubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.Œ|image7|”h0M?h1]”j\)}”’”}”(h}”(h]”h ]”h ]”Œuri”Œ*ex_ABP_PPG_Registro_01M_full_Pagina_01.png”jf}”jhj sh]”h]”Œalt”Œimage7”uh,j[h-Nhhh.Œ2image:: ex_ABP_PPG_Registro_01M_full_Pagina_01.png”h0Nh1]”h3jð ubah3j§ ubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.ŒA snapshot of the center”h0MAh1]”h`ŒA snapshot of the center”…”}”’”}”(h.j h3j ubah3j§ ubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.Œ|image8|”h0MCh1]”j\)}”’”}”(h}”(h]”h ]”h ]”Œuri”Œ*ex_ABP_PPG_Registro_01M_full_Pagina_05.png”jf}”jhj- sh]”h]”Œalt”Œimage8”uh,j[h-Nhhh.Œ2image:: ex_ABP_PPG_Registro_01M_full_Pagina_05.png”h0Nh1]”h3j ubah3j§ ubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.Œ8And finaly a snapshot of the last part of the recording.”h0MEh1]”h`Œ8And finaly a snapshot of the last part of the recording.”…”}”’”}”(h.j> h3j6 ubah3j§ ubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.Œ|image9|”h0MGh1]”j\)}”’”}”(h}”(h]”h ]”h ]”Œuri”Œ*ex_ABP_PPG_Registro_01M_full_Pagina_10.png”jf}”jhjX sh]”h]”Œalt”Œimage9”uh,j[h-Nhhh.Œ2image:: ex_ABP_PPG_Registro_01M_full_Pagina_10.png”h0Nh1]”h3jF ubah3j§ ubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.Œ-This is the code used to create a PDF report.”h0MIh1]”h`Œ-This is the code used to create a PDF report.”…”}”’”}”(h.ji h3ja ubah3j§ ubj^)}”’”}”(h}”(h]”h ]”h ]”jfah]”h]”jijjuh,j]h-hhhh.Xi    filename = []; % default setting. Let the report function decide. %     filename = 'container_filename'; % to put everything in one big file.     % other winlengths can be added to the array in order to further     % explore the recordings, and the algorithm results. %     winlengths = []; % default setting     winlengths = [ 7 ]; %seconds     % go through all files     for ii = 1:lrecnames         if( ECG_all_wrappers(ii).this_pid == ECG_all_wrappers(ii).cant_pids)             % last worker is the responsible of the reporting.             if( ECG_all_wrappers(ii).this_pid == ECG_all_wrappers(ii).cant_pids)                 try                     reportECG(ECG_all_wrappers(ii), 'LowDetail', 'full', winlengths, 'pdf', filename );                 catch MException                     report = getReport(MException);                     fprintf(2, '\n%s\n', report);                 end             end         end     end”h0Mah1]”h`Xi    filename = []; % default setting. Let the report function decide. %     filename = 'container_filename'; % to put everything in one big file.     % other winlengths can be added to the array in order to further     % explore the recordings, and the algorithm results. %     winlengths = []; % default setting     winlengths = [ 7 ]; %seconds     % go through all files     for ii = 1:lrecnames         if( ECG_all_wrappers(ii).this_pid == ECG_all_wrappers(ii).cant_pids)             % last worker is the responsible of the reporting.             if( ECG_all_wrappers(ii).this_pid == ECG_all_wrappers(ii).cant_pids)                 try                     reportECG(ECG_all_wrappers(ii), 'LowDetail', 'full', winlengths, 'pdf', filename );                 catch MException                     report = getReport(MException);                     fprintf(2, '\n%s\n', report);                 end             end         end     end”…”}”’”}”(h.Xi    filename = []; % default setting. Let the report function decide. %     filename = 'container_filename'; % to put everything in one big file.     % other winlengths can be added to the array in order to further     % explore the recordings, and the algorithm results. %     winlengths = []; % default setting     winlengths = [ 7 ]; %seconds     % go through all files     for ii = 1:lrecnames         if( ECG_all_wrappers(ii).this_pid == ECG_all_wrappers(ii).cant_pids)             % last worker is the responsible of the reporting.             if( ECG_all_wrappers(ii).this_pid == ECG_all_wrappers(ii).cant_pids)                 try                     reportECG(ECG_all_wrappers(ii), 'LowDetail', 'full', winlengths, 'pdf', filename );                 catch MException                     report = getReport(MException);                     fprintf(2, '\n%s\n', report);                 end             end         end     end”h3jq ubah3j§ ubh )}”’”}”(h}”(h]”h ]”h ]”h]”h]”h*Œother-user-defined-tasks”uh,hh-hhhh.Œ.. _Other_user-defined_tasks:”h0Mbh1]”h3j§ ubeh3jÐubh)}”’”}”(h}”Œother_user-defined_tasks”j‚ sh}”(h]”(Œother user-defined tasks ...”j‘ eh]”h ]”(jŠ Œid11”eh ]”h]”uh,hjŒ}”jŠ j‚ sh-hhhh.hPh0Meh1]”(hS)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hRh-hhhh.ŒOther user-defined tasks ...”h0Meh1]”h`ŒOther user-defined tasks ...”…”}”’”}”(h.j¥ h3j� ubah3jŽ ubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.XQMaybe the most important and useful aspect of the kit, is that you can add your own algorithms. This can be done by following the interface documented through the several examples included above. The `QRS detection <../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('ECGtask_QRS_detection')>`__ and `ECG delineation <../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('ECGtask_ECG_delineation')>`__ tasks already include a way to interface your own algorithms through the **user:function\_name** method. Check the above sections for more details.”h0Mgh1]”(h`ŒÈMaybe the most important and useful aspect of the kit, is that you can add your own algorithms. This can be done by following the interface documented through the several examples included above. The ”…”}”’”}”(h.ŒÈMaybe the most important and useful aspect of the kit, is that you can add your own algorithms. This can be done by following the interface documented through the several examples included above. The ”h3j­ ubj2)}”’”}”(h}”(h]”h ]”h ]”j:Œb../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('ECGtask_QRS_detection')”h]”h]”Œname”Œ QRS detection”uh,j1h.Œv`QRS detection <../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('ECGtask_QRS_detection')>`__”h1]”h`Œ QRS detection”…”}”’”}”(h.hPh3j¾ ubah3j­ ubh`Œ and ”…”}”’”}”(h.Œ and ”h3j­ ubj2)}”’”}”(h}”(h]”h ]”h ]”j:Œd../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('ECGtask_ECG_delineation')”h]”h]”Œname”ŒECG delineation”uh,j1h.Œz`ECG delineation <../../../../../../:D:/Mariano/misc/ECGkit/help/robohelp/ECGkit/matlab:doc('ECGtask_ECG_delineation')>`__”h1]”h`ŒECG delineation”…”}”’”}”(h.hPh3j× ubah3j­ ubh`ŒJ tasks already include a way to interface your own algorithms through the ”…”}”’”}”(h.ŒJ tasks already include a way to interface your own algorithms through the ”h3j­ ubj± )}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,j° h.Œ**user:function\_name**”h1]”h`Œuser:function_name”…”}”’”}”(h.hPh3jð ubah3j­ ubh`Œ3 method. Check the above sections for more details.”…”}”’”}”(h.Œ3 method. Check the above sections for more details.”h3j­ ubeh3jŽ ubj^)}”’”}”(h}”(h]”h ]”h ]”jfah]”h]”jijjuh,j]h-hhhh.Œ1if( ~bUseDesktop )     UnInstallECGkit(); end”h0Mwh1]”h`Œ1if( ~bUseDesktop )     UnInstallECGkit(); end”…”}”’”}”(h.Œ1if( ~bUseDesktop )     UnInstallECGkit(); end”h3j ubah3jŽ ubhŒsubstitution_definition”“”)}”’”}”(h}”(h]”jlah]”h ]”h ]”h]”uh,j h-hhhh.Œ%.. |image4| image:: QRS_corrector.PNG”h0Mxh1]”j\)}”’”}”(h}”(h]”h ]”h ]”Œuri”jejf}”jhjesh]”h]”Œalt”jluh,j[h.jmh1]”h3j ubah3jŽ ubj )}”’”}”(h}”(h]”j½ah]”h ]”h ]”h]”uh,j h-hhhh.Œ).. |image5| image:: PPG-ABP_corrector.PNG”h0Myh1]”j\)}”’”}”(h}”(h]”h ]”h ]”Œuri”j¸jf}”jhj¸sh]”h]”Œalt”j½uh,j[h.j¾h1]”h3j1 ubah3jŽ ubj )}”’”}”(h}”(h]”jö ah]”h ]”h ]”h]”uh,j h-hhhh.Œ0.. |image6| image:: ECG_delineator_corrector.png”h0Mzh1]”j\)}”’”}”(h}”(h]”h ]”h ]”Œuri”jñ jf}”jhjñ sh]”h]”Œalt”jö uh,j[h.j÷ h1]”h3jI ubah3jŽ ubj )}”’”}”(h}”(h]”j ah]”h ]”h ]”h]”uh,j h-hhhh.Œ>.. |image7| image:: ex_ABP_PPG_Registro_01M_full_Pagina_01.png”h0M{h1]”j\)}”’”}”(h}”(h]”h ]”h ]”Œuri”j jf}”jhj sh]”h]”Œalt”j uh,j[h.j h1]”h3ja ubah3jŽ ubj )}”’”}”(h}”(h]”j2 ah]”h ]”h ]”h]”uh,j h-hhhh.Œ>.. |image8| image:: ex_ABP_PPG_Registro_01M_full_Pagina_05.png”h0M|h1]”j\)}”’”}”(h}”(h]”h ]”h ]”Œuri”j- jf}”jhj- sh]”h]”Œalt”j2 uh,j[h.j3 h1]”h3jy ubah3jŽ ubj )}”’”}”(h}”(h]”j] ah]”h ]”h ]”h]”uh,j h-hhhh.Œ>.. |image9| image:: ex_ABP_PPG_Registro_01M_full_Pagina_10.png”h0M}h1]”j\)}”’”}”(h}”(h]”h ]”h ]”Œuri”jX jf}”jhjX sh]”h]”Œalt”j] uh,j[h.j^ h1]”h3j‘ ubah3jŽ ubeh3jÐubeh3hubububsh}”(h]”(Œfunction prototype”h8eh]”h ]”(hBŒid1”eh ]”h]”uh,hjŒ}”hBh:sh-hhhh.hPh0K=h1]”(hS)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hRh-hhhh.ŒFunction prototype”h0K=h1]”h`ŒFunction prototype”…”}”’”}”(h.j» h3j³ ubah3h5ubj^)}”’”}”(h}”(h]”h ]”h ]”jfah]”h]”jijjuh,j]h-hhhh.Œ3function examples(pid_str, examples_path, user_str)”h0KCh1]”h`Œ3function examples(pid_str, examples_path, user_str)”…”}”’”}”(h.jË h3jà ubah3h5ubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.Œ.*examples* accepts three *optional* arguments:”h0KDh1]”(jê)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,jéh.Œ *examples*”h1]”h`Œexamples”…”}”’”}”(h.hPh3jÞ ubah3jÓ ubh`Œ accepts three ”…”}”’”}”(h.Œ accepts three ”h3jÓ ubjê)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,jéh.Œ *optional*”h1]”h`Œoptional”…”}”’”}”(h.hPh3jô ubah3jÓ ubh`Œ arguments:”…”}”’”}”(h.Œ arguments:”h3jÓ ubeh3h5ubhg)}”’”}”(h}”(h]”h ]”h ]”h]”hphqh]”uh,hfh-hhhh.hPh0KFh1]”(hu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.X **pid\_str** (optional) string identifier for this work instance in a cluster computing or multitask environment. The identifier follows the form 'N/M', being N a number which identifies this execution instance and M the total amount of instances. ``'1/1' (default)``”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.X **pid\_str** (optional) string identifier for this work instance in a cluster computing or multitask environment. The identifier follows the form 'N/M', being N a number which identifies this execution instance and M the total amount of instances. ``'1/1' (default)``”h0KFh1]”(j± )}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,j° h.Œ **pid\_str**”h1]”h`Œpid_str”…”}”’”}”(h.hPh3j*ubah3jubh`Œì (optional) string identifier for this work instance in a cluster computing or multitask environment. The identifier follows the form 'N/M', being N a number which identifies this execution instance and M the total amount of instances. ”…”}”’”}”(h.Œì (optional) string identifier for this work instance in a cluster computing or multitask environment. The identifier follows the form 'N/M', being N a number which identifies this execution instance and M the total amount of instances. ”h3jubjx)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,jwh.Œ``'1/1' (default)``”h1]”h`Œ'1/1' (default)”…”}”’”}”(h.hPh3j@ubah3jubeh3jubah3j ubhu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.Œ€**examples\_path** (optional) string of the path with ECG recordings. ``['.' filesep 'example_recordings' filesep ] (default)``;”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.Œ€**examples\_path** (optional) string of the path with ECG recordings. ``['.' filesep 'example_recordings' filesep ] (default)``;”h0KJh1]”(j± )}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,j° h.Œ**examples\_path**”h1]”h`Œ examples_path”…”}”’”}”(h.hPh3jfubah3j[ubh`Œ4 (optional) string of the path with ECG recordings. ”…”}”’”}”(h.Œ4 (optional) string of the path with ECG recordings. ”h3j[ubjx)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,jwh.Œ9``['.' filesep 'example_recordings' filesep ] (default)``”h1]”h`Œ5['.' filesep 'example_recordings' filesep ] (default)”…”}”’”}”(h.hPh3j|ubah3j[ubh`Œ;”…”}”’”}”(h.Œ;”h3j[ubeh3jPubah3j ubhu)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hth-hhhh.ŒD**user\_str** (optional) string to identify this run or experiment. ”h0Nh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hh.ŒC**user\_str** (optional) string to identify this run or experiment.”h0KLh1]”(j± )}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,j° h.Œ **user\_str**”h1]”h`Œuser_str”…”}”’”}”(h.hPh3j¨ubah3j�ubh`Œ6 (optional) string to identify this run or experiment.”…”}”’”}”(h.Œ6 (optional) string to identify this run or experiment.”h3j�ubeh3j’ubah3j ubeh3h5ubh"eh3jÐububsh}”(h]”(Œargument parsing”heh]”h ]”(h+heh ]”h]”uh,hjŒ}”h+h"sh-hhhh.hPh0KQh1]”(hS)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,hRh-hhhh.ŒArgument parsing”h0KQh1]”h`ŒArgument parsing”…”}”’”}”(h.jÏh3jÇubah3hubh‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h-hhhh.ŒSimple and straight forward.”h0KSh1]”h`ŒSimple and straight forward.”…”}”’”}”(h.jßh3j×ubah3hubj^)}”’”}”(h}”(h]”h ]”h ]”jfah]”h]”jijjuh,j]h-hhhh.X0    if( nargin < 1 || ~ischar(pid_str) )         % single PID run         pid_str = '1/1';     end     if( nargin < 2 || ~exist(examples_path, 'dir') )         % inspect ECG files in rootpath\example_recordings\ folder         root_path = fileparts(mfilename('fullpath'));         % default folder to look at         examples_path = [root_path filesep 'example_recordings' filesep ];         if(~exist(examples_path, 'dir'))             disp_string_framed(2, 'Please provide a valid path with ECG recordings');             return         end     else         if( examples_path(end) ~= filesep )             examples_path = [examples_path filesep];         end     end     if( nargin < 3  )         user_str = '';     end % Explore the *examples_path* for ECG recordings.     filenames = dir(examples_path);     recnames = {filenames(:).name}; % In this case I hardcoded only one recording     recnames = {'ex_ABP_PPG_Registro_01M'}; % But you can use this to iterate for all of them. %     [~,recnames] = cellfun(@(a)(fileparts(a)), recnames, 'UniformOutput', false); %     recnames = unique(recnames); %     recnames = setdiff(recnames, {'' '.' '..' 'results' 'condor' }); %     recnames = recnames(1)     lrecnames = length(recnames);     % In case of running in a user-assisted fashion.     bUseDesktop = usejava('desktop');     if( bUseDesktop )         tmp_path = tempdir;         output_path = [ examples_path 'results' filesep ];     else         % For cluster or distributed environment processing.         InstallECGkit();         % this is a local path, usually faster to reach than output_path         tmp_path = '/scratch/';         % distributed or cluster-wide accesible path         output_path = [ examples_path 'results' filesep ];     end % just for debugging, keep it commented. %     bUseDesktop = false”h0K†h1]”h`X0    if( nargin < 1 || ~ischar(pid_str) )         % single PID run         pid_str = '1/1';     end     if( nargin < 2 || ~exist(examples_path, 'dir') )         % inspect ECG files in rootpath\example_recordings\ folder         root_path = fileparts(mfilename('fullpath'));         % default folder to look at         examples_path = [root_path filesep 'example_recordings' filesep ];         if(~exist(examples_path, 'dir'))             disp_string_framed(2, 'Please provide a valid path with ECG recordings');             return         end     else         if( examples_path(end) ~= filesep )             examples_path = [examples_path filesep];         end     end     if( nargin < 3  )         user_str = '';     end % Explore the *examples_path* for ECG recordings.     filenames = dir(examples_path);     recnames = {filenames(:).name}; % In this case I hardcoded only one recording     recnames = {'ex_ABP_PPG_Registro_01M'}; % But you can use this to iterate for all of them. %     [~,recnames] = cellfun(@(a)(fileparts(a)), recnames, 'UniformOutput', false); %     recnames = unique(recnames); %     recnames = setdiff(recnames, {'' '.' '..' 'results' 'condor' }); %     recnames = recnames(1)     lrecnames = length(recnames);     % In case of running in a user-assisted fashion.     bUseDesktop = usejava('desktop');     if( bUseDesktop )         tmp_path = tempdir;         output_path = [ examples_path 'results' filesep ];     else         % For cluster or distributed environment processing.         InstallECGkit();         % this is a local path, usually faster to reach than output_path         tmp_path = '/scratch/';         % distributed or cluster-wide accesible path         output_path = [ examples_path 'results' filesep ];     end % just for debugging, keep it commented. %     bUseDesktop = false”…”}”’”}”(h.X0    if( nargin < 1 || ~ischar(pid_str) )         % single PID run         pid_str = '1/1';     end     if( nargin < 2 || ~exist(examples_path, 'dir') )         % inspect ECG files in rootpath\example_recordings\ folder         root_path = fileparts(mfilename('fullpath'));         % default folder to look at         examples_path = [root_path filesep 'example_recordings' filesep ];         if(~exist(examples_path, 'dir'))             disp_string_framed(2, 'Please provide a valid path with ECG recordings');             return         end     else         if( examples_path(end) ~= filesep )             examples_path = [examples_path filesep];         end     end     if( nargin < 3  )         user_str = '';     end % Explore the *examples_path* for ECG recordings.     filenames = dir(examples_path);     recnames = {filenames(:).name}; % In this case I hardcoded only one recording     recnames = {'ex_ABP_PPG_Registro_01M'}; % But you can use this to iterate for all of them. %     [~,recnames] = cellfun(@(a)(fileparts(a)), recnames, 'UniformOutput', false); %     recnames = unique(recnames); %     recnames = setdiff(recnames, {'' '.' '..' 'results' 'condor' }); %     recnames = recnames(1)     lrecnames = length(recnames);     % In case of running in a user-assisted fashion.     bUseDesktop = usejava('desktop');     if( bUseDesktop )         tmp_path = tempdir;         output_path = [ examples_path 'results' filesep ];     else         % For cluster or distributed environment processing.         InstallECGkit();         % this is a local path, usually faster to reach than output_path         tmp_path = '/scratch/';         % distributed or cluster-wide accesible path         output_path = [ examples_path 'results' filesep ];     end % just for debugging, keep it commented. %     bUseDesktop = false”h3jçubah3hubjyeh3jÐubj£ j§ j j j° j§ jŸ j– hMhFhBh5j²j¶jàj×j‰jth+hj j j÷jîjŠ jŽ jêjîjYj]j’ j– j¿j¶j— jŽ j×jÐjfj]j­ h5jÓj×j�jtuŒautofootnote_refs”]”Œcurrent_source”NŒrefnames”}”Œid_start”K Œtransform_messages”]”(hŒsystem_message”“”)}”’”}”(h}”(h]”Œlevel”Kh ]”h ]”Œsource”hh]”Œline”K:h]”Œtype”ŒINFO”uh,jÿh.hPh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h.hPh1]”h`Œ8Hyperlink target "function-prototype" is not referenced.”…”}”’”}”(h.hPh3jubah3jubaubj)}”’”}”(h}”(h]”Œlevel”Kh ]”h ]”Œsource”hh]”Œline”KNh]”Œtype”juh,jÿh.hPh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h.hPh1]”h`Œ6Hyperlink target "argument-parsing" is not referenced.”…”}”’”}”(h.hPh3j.ubah3j ubaubj)}”’”}”(h}”(h]”Œlevel”Kh ]”h ]”Œsource”hh]”Œline”K‡h]”Œtype”juh,jÿh.hPh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h.hPh1]”h`Œ=Hyperlink target "qrs-automatic-detection" is not referenced.”…”}”’”}”(h.hPh3jKubah3j=ubaubj)}”’”}”(h}”(h]”Œlevel”Kh ]”h ]”Œsource”hh]”Œline”Kàh]”Œtype”juh,jÿh.hPh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h.hPh1]”h`ŒJHyperlink target "qrs-visual-inspection-and-correction" is not referenced.”…”}”’”}”(h.hPh3jhubah3jZubaubj)}”’”}”(h}”(h]”Œlevel”Kh ]”h ]”Œsource”hh]”Œline”M.h]”Œtype”juh,jÿh.hPh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h.hPh1]”h`Œ=Hyperlink target "ppg-abp-pulse-detection" is not referenced.”…”}”’”}”(h.hPh3j…ubah3jwubaubj)}”’”}”(h}”(h]”Œlevel”Kh ]”h ]”Œsource”hh]”Œline”MMh]”Œtype”juh,jÿh.hPh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h.hPh1]”h`ŒTHyperlink target "ppg-abp-waves-visual-inspection-and-correction" is not referenced.”…”}”’”}”(h.hPh3j¢ubah3j”ubaubj)}”’”}”(h}”(h]”Œlevel”Kh ]”h ]”Œsource”hh]”Œline”MŽh]”Œtype”juh,jÿh.hPh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h.hPh1]”h`Œ?Hyperlink target "ecg-automatic-delineation" is not referenced.”…”}”’”}”(h.hPh3j¿ubah3j±ubaubj)}”’”}”(h}”(h]”Œlevel”Kh ]”h ]”Œsource”hh]”Œline”MÁh]”Œtype”juh,jÿh.hPh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h.hPh1]”h`ŒTHyperlink target "visual-inspection-of-the-detection-delineation" is not referenced.”…”}”’”}”(h.hPh3jÜubah3jÎubaubj)}”’”}”(h}”(h]”Œlevel”Kh ]”h ]”Œsource”hh]”Œline”Mh]”Œtype”juh,jÿh.hPh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h.hPh1]”h`ŒHHyperlink target "automatic-heartbeat-classification" is not referenced.”…”}”’”}”(h.hPh3jùubah3jëubaubj)}”’”}”(h}”(h]”Œlevel”Kh ]”h ]”Œsource”hh]”Œline”M4h]”Œtype”juh,jÿh.hPh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h.hPh1]”h`ŒEHyperlink target "visual-inspection-of-the-signal" is not referenced.”…”}”’”}”(h.hPh3jubah3jubaubj)}”’”}”(h}”(h]”Œlevel”Kh ]”h ]”Œsource”hh]”Œline”Mbh]”Œtype”juh,jÿh.hPh1]”h‚)}”’”}”(h}”(h]”h]”h ]”h ]”h]”uh,h�h.hPh1]”h`Œ>Hyperlink target "other-user-defined-tasks" is not referenced.”…”}”’”}”(h.hPh3j3ubah3j%ubaubeŒsettings”Œdocutils.frontend”ŒValues”“”)}”’”}”(Œ pep_base_url”Œ https://www.python.org/dev/peps/”Œembed_stylesheet”‰Œexpose_internals”NŒinput_encoding_error_handler”Œstrict”Œdebug”NŒstrip_comments”NŒ_disable_config”NŒpep_references”NŒ source_link”NŒfootnote_backlinks”KŒrfc_references”NŒsyntax_highlight”Œlong”Œstrict_visitor”NŒfile_insertion_enabled”ˆŒ _config_files”]”Œinput_encoding”Œ utf-8-sig”Œ language_code”Œen”Œdump_internals”NŒ_source”hŒwarning_stream”NŒoutput_encoding_error_handler”jMŒ strip_classes”NŒ datestamp”NŒ raw_enabled”KŒ generator”NŒrecord_dependencies”NŒ sectnum_xform”KŒgettext_compact”ˆŒcloak_email_addresses”ˆŒ smart_quotes”‰Œ rfc_base_url”Œhttps://tools.ietf.org/html/”Œ docinfo_xform”KŒerror_encoding_error_handler”Œbackslashreplace”Œpep_file_url_template”Œpep-%04d”Œerror_encoding”Œcp850”Œconfig”NŒ halt_level”KŒ dump_settings”NŒdump_transforms”NŒ _destination”NŒauto_id_prefix”Œid”Œ toc_backlinks”Œentry”Œsectsubtitle_xform”‰Œ id_prefix”hPŒoutput_encoding”Œutf-8”Œ tab_width”KŒtrim_footnote_reference_space”‰Œexit_status_level”KŒstrip_elements_with_classes”NŒ source_url”NhRNŒ traceback”ˆŒdump_pseudo_xml”NŒ report_level”KŒdoctitle_xform”‰Œenv”NubŒ footnote_refs”}”Œsubstitution_names”}”(Œimage4”jlŒimage7”j Œimage9”j] Œimage6”jö Œimage5”j½Œimage8”j2 uŒ nametypes”}”(j Nj`ˆj” Nj ˆhJNjÚˆjcNh8ˆj¹ˆj­ Njœ Njñˆj¼Njª NjÔNjÝNj¿NjôNjwˆj‘ ˆj†Njª ˆj™ ˆhˆuŒsymbol_footnote_refs”]”Œ current_line”NŒindirect_targets”]”hhŒsubstitution_defs”}”(jlj j ja j] j‘ jö jI j½j1 j2 jy uŒnameids”}”(j j j`jYj” j— j j hJhMjÚjÓjcjfh8hBj¹j²j­ j° jœ jŸ jñjêj¼j¿jª j­ jÔj×jÝjàj¿hjôj÷jwj�j‘ jŠ j†j‰jª j£ j™ j’ hh+uŒsymbol_footnotes”]”h,hŒparse_messages”]”Œrefids”}”(jŠ ]”j‚ ajê]”jâaj£ ]”j› ajY]”jQah+]”h"aj ]”j ahB]”h:aj’ ]”jŠ aj²]”jªajÓ]”jËaj�]”jyauŒreporter”Nh.hPŒsymbol_footnote_start”KŒ transformer”NŒ footnotes”]”Œ citation_refs”}”Œ citations”]”Œ autofootnotes”]”Œautofootnote_start”KŒ decoration”Nh1]”jÐaub.