From 4f776477b218388091fa9c9181c02d8c0e67b651 Mon Sep 17 00:00:00 2001 From: abragtim Date: Tue, 28 Mar 2023 22:54:53 +0200 Subject: [PATCH 01/24] Add algorithm scheme. --- ...double_antibodies_parsing_algorithm.drawio | 211 ++++++++++++++++++ .../double_antibodies_parsing_algorithm.pdf | Bin 0 -> 27910 bytes 2 files changed, 211 insertions(+) create mode 100644 documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.drawio create mode 100644 documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.pdf diff --git a/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.drawio b/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.drawio new file mode 100644 index 000000000..d47a8551b --- /dev/null +++ b/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.drawio @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.pdf b/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.pdf new file mode 100644 index 0000000000000000000000000000000000000000..469ce04fe8d652f548f2b7d8d629ad66fae919c5 GIT binary patch literal 27910 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 Date: Tue, 28 Mar 2023 23:04:31 +0200 Subject: [PATCH 02/24] Link to the diagram in README.md. --- documentation/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/documentation/README.md b/documentation/README.md index 781c740e2..88aa83c5c 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -244,7 +244,9 @@ the person being tested will react via pre-existing antibodies against human cel When we receive antibodies in format DP*[01:01;02:02] we are using a special algorithm to deduce whether there are antibodies against both alpha and beta alleles or just from one of them. -The algorithm description will be added soon in issue: https://github.com/mild-blue/txmatching/issues/1169 +Algorithm scheme is represented in this pdf +[file](double_antibodies_parsing/double_antibodies_parsing_algorithm.pdf). +TODO: text description ## Configuring cutoff The original cutoff can be sometimes configured. The usual reason is that there is a patient that really needs a kidney and is highly immunized. In this case, it might be worth it for the patient to get a kidney from a donor against whom the patient has antibodies. However, only antibodies with MFI only slightly over the original cutoff. This is possible in the app via an increase in the cutoff of the patient. Whether to increase the cutoff and how much is always up to the user to decide. From 5f56fde20bd3ebc4387306be9c2a0aa2eab02e7a Mon Sep 17 00:00:00 2001 From: abragtim Date: Wed, 29 Mar 2023 11:08:11 +0200 Subject: [PATCH 03/24] Describe algorithm in the README.md. --- documentation/README.md | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/documentation/README.md b/documentation/README.md index 88aa83c5c..f82c7f28c 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -244,9 +244,45 @@ the person being tested will react via pre-existing antibodies against human cel When we receive antibodies in format DP*[01:01;02:02] we are using a special algorithm to deduce whether there are antibodies against both alpha and beta alleles or just from one of them. +### Algorithm description +Antibodies enclosed in square brackets are called double antibodies. + +Let us first explain the terminology we used to describe the algorithm: + +* The alpha chain refers to the first code of a double antibody. +* The beta chain refers to the second code of a double antibody. +* Positive MFI is the MFI value above the cutoff. +* Negative MFI is the MFI value below the cutoff. + +At the beginning of the algorithm, we have three lists: +1. antibodies - a list of all antibodies to parse. +2. parsed - a list of parsed antibodies. +3. parsing_issues - a list of parsing issues that occur during the algorithm running. + +We parse each antibody in the list one by one using a for-loop. If an antibody is +already in the parsed list, we move on to the next antibody. +First, we check if the antibody has a positive MFI. + +#### Double antibody has a positive MFI: +If both antibody chains have only positive MFI representation among all the antibodies +in the list for parsing, we add each chain separately to the parsed list, +with the arithmetic mean of the MFI from all antibodies in the list.
+If one of the chains has at least one negative MFI representation among other antibodies +in the list, we add its chain to the parsed list with the arithmetic mean of the MFI +from all antibodies with negative MFI in the list, and add the other chain with the +arithmetic mean of all antibodies, as in the first case.
+If both chains have at least one negative MFI among other antibodies, we add them to +the parsed list as one theoretical double antibody with the arithmetic mean of the MFI +from all antibodies in the list. We also add a parsing issue about this to the parsing issue list. + +#### Double antibody has a negative MFI: +If a chain has only negative MFI representation among other antibodies in the list, +we add this chain to the parsed list with the arithmetic mean of the MFI from all +antibodies in the list. Otherwise, we skip this antibody and move on to the next one. + +### Algorithm scheme Algorithm scheme is represented in this pdf [file](double_antibodies_parsing/double_antibodies_parsing_algorithm.pdf). -TODO: text description ## Configuring cutoff The original cutoff can be sometimes configured. The usual reason is that there is a patient that really needs a kidney and is highly immunized. In this case, it might be worth it for the patient to get a kidney from a donor against whom the patient has antibodies. However, only antibodies with MFI only slightly over the original cutoff. This is possible in the app via an increase in the cutoff of the patient. Whether to increase the cutoff and how much is always up to the user to decide. From 9fc25a8c5b6842102b182946d4a47deb44eb042d Mon Sep 17 00:00:00 2001 From: abragtim Date: Wed, 29 Mar 2023 11:33:53 +0200 Subject: [PATCH 04/24] Update scheme. --- ...double_antibodies_parsing_algorithm.drawio | 73 +++++++++--------- .../double_antibodies_parsing_algorithm.pdf | Bin 27910 -> 28208 bytes 2 files changed, 37 insertions(+), 36 deletions(-) diff --git a/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.drawio b/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.drawio index d47a8551b..2bf04aca5 100644 --- a/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.drawio +++ b/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.drawio @@ -1,22 +1,22 @@ - + - + - + - + - + - + @@ -26,10 +26,10 @@ - + - + @@ -38,10 +38,10 @@ - + - + @@ -50,10 +50,10 @@ - + - + @@ -63,7 +63,7 @@ - + @@ -73,7 +73,7 @@ - + @@ -83,14 +83,15 @@ - + + - + @@ -100,7 +101,7 @@ - + @@ -109,20 +110,20 @@ - + - + - + - + @@ -130,10 +131,10 @@ - - + + - + @@ -143,7 +144,7 @@ - + @@ -151,18 +152,18 @@ - - + + - + - + - + @@ -172,7 +173,7 @@ - + @@ -182,7 +183,7 @@ - + @@ -191,18 +192,18 @@ - + - + - + - + diff --git a/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.pdf b/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.pdf index 469ce04fe8d652f548f2b7d8d629ad66fae919c5..ad77ea2801f9dd9056b55d7a5ba3f0ec0b2962e1 100644 GIT binary patch delta 27796 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 delta 27531 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 From a10962c5b48ed3a328d4b776aebab19dc762afe9 Mon Sep 17 00:00:00 2001 From: abragtim Date: Fri, 31 Mar 2023 14:24:13 +0200 Subject: [PATCH 05/24] Update README.md (some grammatical, logical and cosmetic changes) --- documentation/README.md | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/documentation/README.md b/documentation/README.md index f82c7f28c..74f161fa5 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -241,8 +241,8 @@ the person being tested will react via pre-existing antibodies against human cel ## Square bracket antibody parsing algorithm -When we receive antibodies in format DP*[01:01;02:02] we are using a special algorithm to deduce whether there are -antibodies against both alpha and beta alleles or just from one of them. +When we receive antibodies in notation DP*[01:01;02:02] we are using a special algorithm to deduce whether there are +antibodies against both alpha and beta alleles or just one of them. ### Algorithm description Antibodies enclosed in square brackets are called double antibodies. @@ -251,10 +251,10 @@ Let us first explain the terminology we used to describe the algorithm: * The alpha chain refers to the first code of a double antibody. * The beta chain refers to the second code of a double antibody. -* Positive MFI is the MFI value above the cutoff. +* Positive MFI is the MFI value is equal to or above the cutoff. * Negative MFI is the MFI value below the cutoff. -At the beginning of the algorithm, we have three lists: +At the beginning of the algorithm execution, we have three lists: 1. antibodies - a list of all antibodies to parse. 2. parsed - a list of parsed antibodies. 3. parsing_issues - a list of parsing issues that occur during the algorithm running. @@ -264,24 +264,28 @@ already in the parsed list, we move on to the next antibody. First, we check if the antibody has a positive MFI. #### Double antibody has a positive MFI: -If both antibody chains have only positive MFI representation among all the antibodies -in the list for parsing, we add each chain separately to the parsed list, +If **both antibody chains have only positive MFI representation** among all the antibodies +in the list for parsing, we add each chain **separately** to the parsed list, with the arithmetic mean of the MFI from all antibodies in the list.
-If one of the chains has at least one negative MFI representation among other antibodies +If **one of the chains has at least one negative MFI representation** and the **another one has +only positive MFI representation** among other antibodies in the list, we add its chain to the parsed list with the arithmetic mean of the MFI from all antibodies with negative MFI in the list, and add the other chain with the arithmetic mean of all antibodies, as in the first case.
-If both chains have at least one negative MFI among other antibodies, we add them to -the parsed list as one theoretical double antibody with the arithmetic mean of the MFI -from all antibodies in the list. We also add a parsing issue about this to the parsing issue list. +If **both chains have at least one negative MFI among other antibodies**, +we add them to the parsed list as one theoretical double antibody with the arithmetic +mean of the MFI from all antibodies in the list. +Then, we add each chain **separately** to the parsed list if they are not already present, +with the arithmetic mean of the MFI from all antibodies in the list. +We also add a parsing issue about this to the parsing issue list. #### Double antibody has a negative MFI: -If a chain has only negative MFI representation among other antibodies in the list, +If a chain has **only negative MFI representation** among other antibodies in the list, we add this chain to the parsed list with the arithmetic mean of the MFI from all antibodies in the list. Otherwise, we skip this antibody and move on to the next one. -### Algorithm scheme -Algorithm scheme is represented in this pdf +### The algorithm scheme +The algorithm scheme is represented in this pdf [file](double_antibodies_parsing/double_antibodies_parsing_algorithm.pdf). ## Configuring cutoff From 4237d6076dbde59f8093bd874e2c184215d6ed5c Mon Sep 17 00:00:00 2001 From: abragtim Date: Fri, 31 Mar 2023 15:04:51 +0200 Subject: [PATCH 06/24] Update README.md (some grammatical and cosmetic changes) vol 2. --- documentation/README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/documentation/README.md b/documentation/README.md index 74f161fa5..c751568d0 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -247,7 +247,7 @@ antibodies against both alpha and beta alleles or just one of them. ### Algorithm description Antibodies enclosed in square brackets are called double antibodies. -Let us first explain the terminology we used to describe the algorithm: +Let us firstly explain the terminology we used to describe the algorithm: * The alpha chain refers to the first code of a double antibody. * The beta chain refers to the second code of a double antibody. @@ -266,18 +266,18 @@ First, we check if the antibody has a positive MFI. #### Double antibody has a positive MFI: If **both antibody chains have only positive MFI representation** among all the antibodies in the list for parsing, we add each chain **separately** to the parsed list, -with the arithmetic mean of the MFI from all antibodies in the list.
+with the arithmetic mean of the MFI from all antibodies with this chain in the list.
If **one of the chains has at least one negative MFI representation** and the **another one has only positive MFI representation** among other antibodies in the list, we add its chain to the parsed list with the arithmetic mean of the MFI -from all antibodies with negative MFI in the list, and add the other chain with the -arithmetic mean of all antibodies, as in the first case.
+from all antibodies with negative MFI for this chain in the list, and add the other chain with the +arithmetic mean of the MFI from all antibodies with this chain, as in the first case.
If **both chains have at least one negative MFI among other antibodies**, we add them to the parsed list as one theoretical double antibody with the arithmetic -mean of the MFI from all antibodies in the list. -Then, we add each chain **separately** to the parsed list if they are not already present, -with the arithmetic mean of the MFI from all antibodies in the list. -We also add a parsing issue about this to the parsing issue list. +mean of the MFI from all antibodies with these chains in the list. +Also we add a parsing issue about this to the parsing issue list. +Then we add each chain **separately** to the parsed list if they are not already present, +with the arithmetic mean of the MFI from all antibodies with this chain in the list. #### Double antibody has a negative MFI: If a chain has **only negative MFI representation** among other antibodies in the list, From a56e54a203c99aeda8d289efcb9e71e6daf65e1a Mon Sep 17 00:00:00 2001 From: abragtim Date: Fri, 31 Mar 2023 15:05:35 +0200 Subject: [PATCH 07/24] Correct scheme. --- ...double_antibodies_parsing_algorithm.drawio | 44 ++++++++++++++++-- .../double_antibodies_parsing_algorithm.pdf | Bin 28208 -> 28835 bytes 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.drawio b/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.drawio index 2bf04aca5..9b74e96eb 100644 --- a/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.drawio +++ b/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.drawio @@ -1,6 +1,6 @@ - + - + @@ -50,7 +50,7 @@ - + @@ -73,7 +73,7 @@ - + @@ -155,9 +155,15 @@ - + + + + + + + @@ -206,6 +212,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.pdf b/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.pdf index ad77ea2801f9dd9056b55d7a5ba3f0ec0b2962e1..67d2878a30cfe8ac6dcb332392a9ec8da41f4879 100644 GIT binary patch delta 28402 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 iRQ@{#~3EDJcR%fSnP8zbBQQ!qx4>=xY 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

>Rd4ncemVJF;g3eb3 zC>vjo(wDDGHk$>v;O3+A4pUIpQOTir?6eCbvr-I5g#y8`#N~`7^l`lS%AK2cz$4K0 zQyWpqBJ@5qcV6i7Fuj;EZD47=ZnkKN?Yf;=zaFr;8IqPd%dURVQqUo2(ieICiE>NGEX5xf2k6N0%qU<&Ui$=kNHw1Ky4E~sH` zLf!|EwEQ_a=ITjde=;QsC=JbrN{rR-3*Q5s?UhGHD|i%ubCo=&RtB@{&#crdGw{gr zj_Z*4%%BE=LCRB!t2|z~uk5eDBQ7(Eod!#}{o(nku@e;*6MuM1mSzRPhn;QMw~Z7C zfuzGnw*fupxcJBJ8+ogM{9QR+Gb88xn2i*0|2d(XbY*``hjAbAF>PX;=)x`Ii&9U{5rDO)^Y-R!VC|!~78$uQ&#b7jQ5H}jUW7@Ozy*YdM{uHAiPfmSE z*5kkQdWJs@+e#R6cG8aud7QUZ&pUoGp-`TaVf0{|>KC2MH_x28h1?t!^EYb%DI&xD7&E2HF-9;<^+}_;(kRu<4T%{~P}vYK zGmc|E3_V?83{Kq>ibA`mq+>s5M&nHjs=#fO6-}JTnD9?UzZ&IF8q>~20+%DHzb4c zAPSAg^MlHBV1zgd8gs0I)vD$pCDSxrj&ncvZI%^+8Hl((@W<;9Si$Y^x9GRn8C&7!qOL8B=d4z@6}@L zz^yBXPif!`kfZiaWm46JGVB4IiOW$X)RJ@XoA15fPF`Z@XeSU^TPORbKNBl!RsN&cA`Cm7eSpNn`@tM^i70Um;~sADu|YG=RKfd4`nklJ6;bkoCO3T z4uQ+FkUM%0R4-6^5H6NnK)hrKDOCu&a!hzo!qbLp@+xNZed~0U8EgPR*T^s}g2&uB z8)WMkFhs2^iFVy zue-Kya~FKj6Agg-!l2O-6Tf_Z&M09(WXK7U<9a%w6@l1eE6}%kNV? zyBs#?vrA$p*SL2^uW!mG$F` zxejIc94Id^vwY7fK{6-R> zOUSj2YL>CathR(a2RAQ@K#V3-O_&xagCBVQX$Q3)DuAR$Q$FZM({MK0U_Jk?+h9B0 zU>jqoE0ifAfN-Fh1Oif7TWn;!hVku1KlCHBv=SiO+>X`wrhN@N64a_y-K$?b_Yo8a z6AZN#Ltri|uuE=0`0K|0ju9DZodpkjYZx_vM9rT;wx0pTz;<6=%zR+u#xaxo=R;re zj^mrdpQEVsH~V;t6WArw!u3yF9Q3_COzM<(yW_aZ%ZEk^o5tg}BDyS-xjZ#S*#6Zu zI5z;L#mR?&07!>pUrFH@c0l&ewl7OJmz?9e#VJCSP9gx{^ypEd6BiR?#+qehLD+Fd zuZwem%KeGz%z2ifIQ8hmsX5AT(#bK!k^ANC1$RHL3`aoTnq|M72>k~SL23W0)OLpR zd$04G>FTv;P6pNi^D5jSEFA5V``0!h3nE~H`Bs4j6!l;dZA#=HbX@fB%V?q$3A z*S00(UP`y1!H)~Np9(y~VEFyPG$s)k3qQ+8N-V1duQpP2)VKXyd-p$Q1)n4Vgg zovMmQlKR@e8Ocd^o0Rskvpte5InjqXX1U67dse+Vcb zH-jTax(kDKZduaA0IuV)KeC(1Kf|usN^Gcfw!AjEoVd z;V)ZKMo|uMZQV4!BYuw05NDF66WVC;}5N4IOLLP!Ns^$U(E?}uWsXj#8; z0_4K|csRw7JzE!^%5uTgBg)Ru6aY_PKo;=l2}oM#}r7NPU58Behlg>7aP-xAawb~P{{!ZwaWA#fu zjvmU>#~0`LGo=1(;SGq~^C%l_KI+FXcpr0dYkmsjW+vTNQeu>gxqi@IZ|xw(2x~B_ z0B*(3&n@%fm5rjvfWj6l0ZaRqB6aQP(GEB2f(|8mBEzG<%3xy~T#CAFFfS@vU2<=X z$(^8*?ZL>PPoT6R6H%H#Y6N{|$Q5BMAS__$g2`uDM5f`^yme9gx0GwXnfbr0Fm3U! z4zRVnh=^})1Bg(PiQ@!8IaO@wc9R{YA9VYu4B`>O8rFz^Wt!=j%Gqlr*z@nd(r-YP z*G|2zhQgx$W{<04bL~-SX?0or_yFAvsU=D}Rp$e6urdFK0(VnaCvLM1-d~`nfBNTH z_yRr@=&vN$w|c==?0kXzOM9gWw3DZAFfzAB*D0ov2*9c55mb3IP z*+~B{P7l5FiHFwXd4N2xF>584C0_x%KSH?s+a+OH&zI2~$7X;_bf0J$Dj?~P1fJnu zUXO2v^M0#=fGC)Eupyi*zoq%}_^HKPyD!lUSk3m0V7gqiCFn}GluCM$iqYA( z%zS%Sn`{h)H5^^g7;4sJ@;9@dUD^8N;ibX6PFFoOi~K8tOZBB0C?SD@!xt~m@BOGO zOu+9~q{lVCuP-O?Ro3D6JYb*UVel8D_k}H6JZG<5+;my1v{nt;q?ndWPwZNtKT!Eb ziE79s@AR2CPAjiYtJvmGlg5b}5FsPh3rok+M!*!OTf>j?dD-HIkMNE!B8{$VJMC5Q ztH!Q7_sU1pbHS_3op$;|*T2(i?HLwdfJM)R^jg|w-iNO%i{RVs4e&5Oa5}%A5xrxE zZKY<~^ysByHtf35T2Ot?cdc$ZXtMlh__=v|=)vJGC*YG|_?%nYH63F^e0%M7k`2It zJ=AZlw$SN}_tHOE4U|6}#q(*szfXCKmpm&dlLlpunSlXHU> z8!&+Mf9bsd^5J2pK6nqCZrZs#$J$dGS?bmtmS$wrChjw1yzUi;KChPx&XWqn=p0$i zc**%k6H{T8N7b~HFCK}(8jpw~D$!@cuH5NsyBjHMMM%YqO%v%QiEBT)=3EQdW+-l5 z#}eqt+j;X6vu7v@Vp=IqV@a7>d4Ma^XJ0i~zgkrQof(>z%6!4-hLIlcDE5K%BOFpT z=k6r%P(E!!I%U^c;)?;)^jBabT3FaTp~p}>&9lFVi&nfv;<6v{?;63kT=8jQ?A3d@85%?Rslou%G7on#Gs76=WQSo&xWMvtTGWw(U={Tvp zae9%C3_Up{stKH{S?qm8;qj|%b*Ij#8>CdrKP#pLqrThVN3Y3H^x3fV9>T4FMC}X6 zOdfaKh-hxrZ43CDM6JOumq}Ss4``A0eG+ScdJY)+TG%Nug}?@x3IRQjHkft2ttjGF zd;Cf0idO_D8LhoRCmzig{Xl0&dx#q(Z(2-di6Foc$&@K~=Fh!1NsPw0O>+(AfL8NP zi0w~a9xvEDjR-r;V6R%~u}v&aK7bXimjM;b#Cs$a$3LQ3k6B^iHPckwItSgl$ABEb zk?0ppqEx|L)+Dr$VvC_g(u7o%wS33RHC@ee*}o&N=-V=PaiJ+ypO4CmO6*CKqZ`Kl zo3yk}3%_iz1%_?cuxiF3(Aq?xVNL&_80CXcGsk8;^#pGAZnRubVSkmagJxg{}NtHuT15BU$FJPQ$+=T&P>GE7R zt9b0HInv4@(`~Cl+C$_HB=nbKQ}+~C2>t`jkCN)L5X)N!s7Ybu7H*9|a2px(?H>?aBCfSpvcp8iS(zD0D@d61bO!3lhwm zt>Z(ghPx-s_OY=_Pz~YR)zanwOz_d#O3hn>q}6mWwG#X~j10T&T1MqX;BiXV!T>wu zfPSZ35GyxFo-<1@17%x_(##>kY6XYjyX1m6Y}<2Fkum;XSBX&#PJgiSOWBTu$Q*mS zdCmFsuePC0Lm+~-Hl@}~^kVdE$=-w`y&3ABNB9ScHY_R{^Gm?+LdqjRr_!54$R7}Y zBFw!FTGAYffa`J%TJm}aTE3PEqKF&CYyI(~{9iXLP1xs3AuS=64ONk{89k>RF7_{e zlS<<@M^fol6aKF-@r#B>X4y2q77<(ee)eCw$+ux(3O)NSk}D(^H{z^F+C)zsKt z+VW`o#guRTa#~R$d}@Hn%r3!Vk8Hhv1w*j@$+re}yOf!Nb!)ElGWJAOkM ze%okmN}}nCdS{idZZ|EB&ol^rr1|fw4$rgZYuxTG7i0^$)e1=qgs% zd*fXOlX5OU9uEKkRwEd2n7M7}!os*582uuWl>5rN+~5;A7gF&5N(NdjPY1{y!d`15 z%I--?JJJ+-S4;{NsTv7h@?MHf=uMV0D_g>LMgO_ahs8C;B60Gh8&s=mA7DG>99`~t zn9e(u=Q#6URX6uW^_i?bFoW}%oG?kt>`vSEmwT>0bppI6AexZLX_OotIV?TEGJfz` z0v#bXU7li_x4wzA3GvYkNd2Gsk z5-9_X_FT4aaQnW) zWt7$RJ-~)Tk~oucZy;OL-sSU{oeougK+DqAdr8am5e+!}f$8z7a1@}P2c{3j;h2Rn zsx?npr~mnQ{8xNc^bPmR8n_8#JO$c{zNAy zhgaQ5C1F&V`~@~CN?5QqW`s$>J3#OIoMd(|AFBD*M(qa=KK#PKGd~yS!=`i+A=7( zopN2vz`fxqP2L(U<;b$K{(>dQNbFOXXH3vX%M*e*F!5kPw4wD|U;vzpQ4EA2g@>n+BRE^;yhn&L9Q z`kVAm%w;&L>tOm#_C$7Fo|3!?>~-kS`FKV|&Rj6$y-#AMBf@q-y*&cy6H5K(s~vKV zPdwT0|5`A6%6P3abJGooPjBV=@qX_c{4LS|{}lhNalyr%0d6b3mRZ`YdMkwK83Klb zsf4uaxuL-?$G1P8-Sg^u2IsF2$c_E_;LfBz$pj}h<7d^k>5~xh#~{5Hq|tK7 znXmw+T;BveZsJ@DAB5NStn0sF5YB(2SSAHN>^n%WFMaOMANQQyc{>sCj23JzCJS~I zg(NpH8E1$kY(omKq299r2tS;DiB2<0_zKSiL|0s^0HP@+SVaTW5uNEN^YW4C!Q2~_ zr}MnKIG}Q4y%dUdy<>#C!DaY9nJl_SM&Ske3Gm-_^OMZGMaIBqmmeh&&-M?De}@(K`~ZIj^-P3C)9~qUqnI!e`c6wA;|C(& zd-)E<1Ay_67mzLvzbtB$%VwduW~q-iX=N;T$UjgA->!f=QK zHT6Y$6M*7eyTVOiuPRwkh82`-dS1#9fIdL8?b3-Vo6~kMu4u7~qlB2aU zLt0$eI9X#8X-dMmg@u;MSN*}VM{)~cdz*J)6Stx053M!y&EVH;Ho9<*t0ev_H9p*y zj?88;A8eQ_t2UDk)JW()N1V!d5VVlTnky)Mv_A99?;#+_(7P*n)tp46ZK<%C9ouQK z#k;e#rMeQ3ueS$c%L+5Pg>_cEnK&QXF>t^2wWYfxgL)XkQoPL(+jF%7)1c{?4Byk$RerN6yi3?Fr}ox(!pf2 zzeIY$e3LXzi#fmB^UI1pG7~ncnfjK&bMm@{JbQ`QLX_}g2nOI1Zw6;@_9EPF==Fl> zvr6jZFxQpGTb9Vn-^$HWvMg}iR$1Qz@#53HN*qC3z*)6Z@#)T8z^f{UPG?j@qc&Fw zb*lkjAu>mM-(xS}@D%B9yXJqU3e8C|h~O5FFiz_!k(}BJ&3rb0M3;qZmPiZFFuM9! zoUAVHGi=JMs#a~o*XLx1Ia%(EW5`_llJsZ&D2O*Df+K@~95jiF!2%ylGz5cz&8OJ> zJr_`A$6XCaYhhuimJJSDwI#sr`e<+TuQvhsEELVz+(|~;)--lv)gbz64W=(`760WF zq?*ftpZQxKze|eyLYLq??hpoBR-YKCQ&O*FWoB(*)9W+hY^H^Sn4+7v1)HZ#DS2-1 zX;f*k8)mXB7Mxuk0zM4lvPUcCaZTEISXL`hUwH{| z-$$O}+RSVm0kZO~%O;6ORv#t(5p8a=7c>XKnmu-mctzaf>8~;LqQV#^L1su5W7eh{ zUvS>sL9U5>vva6;&s^Kod+uEH`zfd3E-~Tr{9`;xpJzi40q7&JaF+aO*Uz+moqu}d ze}o{{EG+EqeKQPsBftFeKhzeTKTA8OW93SD2psvXA?E+FX$%ZyQIx8dbGbIIv4M|j z)~nLoCgxT;I90N4--=JgT@!Hf%Qo_q!L{5;CLyorUvfXjrqno zIZc=_m_iNQt53a?pHU!!?FTxRnED8h9anA5?@DXzJ*SI}Emr8Xvk&8&!$r4vvHum{ z4R~sz9wN(x<=I%{+vMKByN&^@{R^NWR2xt8ZyzIUs(2hknp&EC?Cp)=d3iHr8v>4P zj^8W%B$s8W(vpzMBAZ!-6D+A!%BJJTSUuss(7b&YdowITW~STpOV(cd2@p z(Qfk{qRc9j z!A5cd7ex!AFWi_Kb)r=28fFc%V(~AflVGCDxfIj7_M1bWlAnS5n4s04b`ogmCxne| zy1D4LXG>#p8=3lx-(IUz{tChf3UBXNdu!wFA3C^ox#3xR783e=uY|I$Ewo8ERyqI{ zuK&QA95pS6bxtJz<+}6{v?$3gDmqZG?&J;~k6>=Q01SUc+FF|4RJaU?L_iMq5%7YMd-{)a}mB+Ycw5iUw;h&;2dRY*|WQt!`opIzg(Qt z`J(33$-hpfbFUuuk|F?2V6Ao7IKk7F`AL@^FDpG2I@j;-9jc+&Iic}*Js68H%PA?6 zbYCRjT|P#r?djAynS;OaZ@Rc`EXr2L;{C>|M?`|Z7~lv9|J@WQ7&&7TAl%C7G9p(e z`zebpF8??S$n|I~cz-ST@Jk{VEgD5B^iTs%yYu;RlY4i*yTib3J7hkCDWy6H{hYOi z>*jA4KsmlByVDb`nj>95o#l`rDO~x*!@U-0x$*IZvn ze7YILUduJ*!rVv0m`s+mDk(Gl$&Pj zq=zf%_2B$QMxw?$)r-tz$+)Y^YQ%|6EDu|I-#rlWJ|YH!Gij23_EI73PcC z@u`-7EVVIMF=VGXo|SavkYNhjL@k{#j;l_(;<@aGZD0i4wbCd&rWQLe&DeEpQrk`n zT*B!*wBxX2uPjJfFXN}Mry|fe`fvx45)AzIOco7bue6&k@lZu*vwf_s$FTd*Q|C|> zr^_sL?Vps15_*CIL4J_YK_(?Z*%QEUvNJNm KkdcWgi2o1MhIQBg delta 27732 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 Z2!k)wzrR_W31PW-xY%GRC?u35{|Db>8Ug?S From df4a1fdce43d373383f7071341fa2050a0b10ae1 Mon Sep 17 00:00:00 2001 From: Kristina Galikova Date: Mon, 3 Apr 2023 16:28:48 +0100 Subject: [PATCH 08/24] fix: documentation algorithm logic --- documentation/README.md | 44 +++--- ...double_antibodies_parsing_algorithm.drawio | 128 ++++++++++-------- .../double_antibodies_parsing_algorithm.pdf | Bin 28835 -> 46777 bytes 3 files changed, 90 insertions(+), 82 deletions(-) diff --git a/documentation/README.md b/documentation/README.md index c751568d0..289676b09 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -241,51 +241,43 @@ the person being tested will react via pre-existing antibodies against human cel ## Square bracket antibody parsing algorithm -When we receive antibodies in notation DP*[01:01;02:02] we are using a special algorithm to deduce whether there are -antibodies against both alpha and beta alleles or just one of them. +When we receive antibodies in the notation DP*[01:01;02:02], we use a special algorithm to determine whether there are antibodies against both alpha and beta alleles or just one of them. ### Algorithm description -Antibodies enclosed in square brackets are called double antibodies. -Let us firstly explain the terminology we used to describe the algorithm: +Let us first explain the terminology we used to describe the algorithm: +* Double antibody refers to an antibody enclosed in square brackets. * The alpha chain refers to the first code of a double antibody. * The beta chain refers to the second code of a double antibody. -* Positive MFI is the MFI value is equal to or above the cutoff. +* Positive MFI is the MFI value that is equal to or above the cutoff. * Negative MFI is the MFI value below the cutoff. At the beginning of the algorithm execution, we have three lists: -1. antibodies - a list of all antibodies to parse. -2. parsed - a list of parsed antibodies. -3. parsing_issues - a list of parsing issues that occur during the algorithm running. +1. `antibodies` - a list of all antibodies to parse. +2. `parsed` - a list of parsed antibodies. +3. `parsing_issues` - a list of parsing issues that occur during the algorithm execution. -We parse each antibody in the list one by one using a for-loop. If an antibody is -already in the parsed list, we move on to the next antibody. +We parse each antibody in the list of `antibodies` one by one using a for-loop. If both chains of the antibody are +already in the `parsed` list, we move on to the next antibody. + +If at least one of the chains is not in the `parsed` list yet, we examine the antibody with the following logic: +
First, we check if the antibody has a positive MFI. #### Double antibody has a positive MFI: If **both antibody chains have only positive MFI representation** among all the antibodies -in the list for parsing, we add each chain **separately** to the parsed list, -with the arithmetic mean of the MFI from all antibodies with this chain in the list.
-If **one of the chains has at least one negative MFI representation** and the **another one has -only positive MFI representation** among other antibodies -in the list, we add its chain to the parsed list with the arithmetic mean of the MFI -from all antibodies with negative MFI for this chain in the list, and add the other chain with the -arithmetic mean of the MFI from all antibodies with this chain, as in the first case.
+in the list for parsing, we add each chain **separately** to the `parsed` list with the arithmetic mean of the MFI from all antibodies with this chain in the list.

+If **one of the chains has at least one negative MFI representation** and the **other chain has only positive MFI representation** among other antibodies in the list, we add the **chain with only positive MFI representation** to the `parsed` list with the arithmetic mean of the MFI from all antibodies with this chain. For the **chain with mixed MFI representation**, if this is the only positive occurrence of this chain, we add it to the `parsed` list with the arithmetic mean of the MFI from all antibodies with negative MFI for this chain in the list. However, if there is another positive occurrence for this chain, we skip it for now.

If **both chains have at least one negative MFI among other antibodies**, -we add them to the parsed list as one theoretical double antibody with the arithmetic -mean of the MFI from all antibodies with these chains in the list. -Also we add a parsing issue about this to the parsing issue list. -Then we add each chain **separately** to the parsed list if they are not already present, -with the arithmetic mean of the MFI from all antibodies with this chain in the list. +we add them to the `parsed` list as one double antibody with the provided MFI. Moreover, we add each chain **separately** to the `parsed` list, and we denote their type as "theoretical", with the arithmetic mean of the MFI from all antibodies with this chain in the list. +Finally, we add a parsing issue about this to the `parsing_issue` list. #### Double antibody has a negative MFI: -If a chain has **only negative MFI representation** among other antibodies in the list, -we add this chain to the parsed list with the arithmetic mean of the MFI from all -antibodies in the list. Otherwise, we skip this antibody and move on to the next one. +We check each chain of the antibody separately, and if that chain has **only negative MFI representation** among other antibodies in the list, we add this chain to the `parsed` list with the arithmetic mean of the MFI from all antibodies in the list. Otherwise, we skip this chain. ### The algorithm scheme -The algorithm scheme is represented in this pdf +The algorithm scheme is represented in this PDF [file](double_antibodies_parsing/double_antibodies_parsing_algorithm.pdf). ## Configuring cutoff diff --git a/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.drawio b/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.drawio index 9b74e96eb..26a5ce640 100644 --- a/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.drawio +++ b/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.drawio @@ -1,6 +1,6 @@ - + - + @@ -26,7 +26,7 @@ - + @@ -56,7 +56,7 @@ - + @@ -75,7 +75,7 @@ - + @@ -91,10 +91,10 @@ - + - - + + @@ -110,28 +110,19 @@ - + - - - - - - - - - - + - + @@ -144,30 +135,31 @@ - + - + - + + + - - + + - + - + + + + + - - - - - - - + + @@ -191,10 +183,11 @@ - - + + - + + @@ -203,43 +196,66 @@ - + + + + + - + - - - + + + + + + + - - - + + + + + + + - + - - - + + + + + + + + + + - - - + + + + + + + + + + - + - - - diff --git a/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.pdf b/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.pdf index 67d2878a30cfe8ac6dcb332392a9ec8da41f4879..d1999fa3be9ac6d444c601a5b7ec656e56386254 100644 GIT binary patch literal 46777 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 literal 28835 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�a+f^)d>zLsX8!A=H-;E~WJhDv; z4WGaAB7_10K|~pYpvaMW;Yc(E!D+$`!I001g1|%p%t0=UKWiXRb|#U4y3ta8g7%Nf oL Date: Mon, 3 Apr 2023 16:31:35 +0100 Subject: [PATCH 09/24] docs: fix some grammar issues --- documentation/README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/documentation/README.md b/documentation/README.md index 289676b09..5981924f9 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -247,11 +247,11 @@ When we receive antibodies in the notation DP*[01:01;02:02], we use a special al Let us first explain the terminology we used to describe the algorithm: -* Double antibody refers to an antibody enclosed in square brackets. -* The alpha chain refers to the first code of a double antibody. -* The beta chain refers to the second code of a double antibody. -* Positive MFI is the MFI value that is equal to or above the cutoff. -* Negative MFI is the MFI value below the cutoff. +* "double antibody" refers to an antibody enclosed in square brackets. +* "alpha chain" refers to the first code of a double antibody. +* "beta chain" refers to the second code of a double antibody. +* "positive MFI" is the MFI value that is equal to or above the cutoff. +* "negative MFI" is the MFI value below the cutoff. At the beginning of the algorithm execution, we have three lists: 1. `antibodies` - a list of all antibodies to parse. @@ -268,7 +268,7 @@ First, we check if the antibody has a positive MFI. #### Double antibody has a positive MFI: If **both antibody chains have only positive MFI representation** among all the antibodies in the list for parsing, we add each chain **separately** to the `parsed` list with the arithmetic mean of the MFI from all antibodies with this chain in the list.

-If **one of the chains has at least one negative MFI representation** and the **other chain has only positive MFI representation** among other antibodies in the list, we add the **chain with only positive MFI representation** to the `parsed` list with the arithmetic mean of the MFI from all antibodies with this chain. For the **chain with mixed MFI representation**, if this is the only positive occurrence of this chain, we add it to the `parsed` list with the arithmetic mean of the MFI from all antibodies with negative MFI for this chain in the list. However, if there is another positive occurrence for this chain, we skip it for now.

+If **one of the chains has at least one negative MFI representation** and the **other chain has only positive MFI representation** among other antibodies in the list, we add the **chain with only positive MFI representation** to the `parsed` list with the arithmetic mean of the MFI from all antibodies with this chain. For the **chain with mixed MFI representation**, if this is the only positive occurrence of this chain, we add it to the `parsed` list with the arithmetic mean of the MFI from all antibodies with negative MFI for this chain in the list. However, if there is another positive occurrence for this chain, we skip it.

If **both chains have at least one negative MFI among other antibodies**, we add them to the `parsed` list as one double antibody with the provided MFI. Moreover, we add each chain **separately** to the `parsed` list, and we denote their type as "theoretical", with the arithmetic mean of the MFI from all antibodies with this chain in the list. Finally, we add a parsing issue about this to the `parsing_issue` list. From 5646f46321482690847188a3fbc8abb1a0c08748 Mon Sep 17 00:00:00 2001 From: Kristina Galikova Date: Mon, 3 Apr 2023 16:40:24 +0100 Subject: [PATCH 10/24] docs: drawio -> xml --- ...rawio => double_antibodies_parsing_algorithm.drawio.xml} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename documentation/double_antibodies_parsing/{double_antibodies_parsing_algorithm.drawio => double_antibodies_parsing_algorithm.drawio.xml} (96%) diff --git a/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.drawio b/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.drawio.xml similarity index 96% rename from documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.drawio rename to documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.drawio.xml index 26a5ce640..46de343a0 100644 --- a/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.drawio +++ b/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.drawio.xml @@ -1,6 +1,6 @@ - + - + @@ -135,7 +135,7 @@ - + From 7f7a0f72075ff530c398347d1209ac7b63945684 Mon Sep 17 00:00:00 2001 From: abragtim Date: Thu, 27 Apr 2023 14:06:02 +0200 Subject: [PATCH 11/24] Describe algorithm in non technical README vol. 1. --- documentation/README_NON_TECH.md | 95 ++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 documentation/README_NON_TECH.md diff --git a/documentation/README_NON_TECH.md b/documentation/README_NON_TECH.md new file mode 100644 index 000000000..f70f949e8 --- /dev/null +++ b/documentation/README_NON_TECH.md @@ -0,0 +1,95 @@ +## Square bracket antibody parsing algorithm + +When we receive antibodies in the notation DP*[01:01;02:02], we use a special +algorithm to determine whether there are antibodies against both alpha and +beta alleles or just one of them. + +### Algorithm description + +Let us first explain the terminology we used to describe the algorithm: + +* "double antibody" refers to an antibody enclosed in square brackets. +* "alpha chain" refers to the first code of a double antibody. +* "beta chain" refers to the second code of a double antibody. +* "positive MFI" is the MFI value that is equal to or above the cutoff. +* "negative MFI" is the MFI value below the cutoff. + +We parse each antibody one by one and detect several situations: + +## 1. Antibody chain is negative +```text +Example: +DP*[01:01;02:02] MFI 100, cutoff 2000 +DP*[01:01;03:03] MFI 200, cutoff 2000 +DP*[03:03, 02:02] MFI 3000, cutoff 2000 +``` +In this case the chain `DPA1*01:01` is negative, because there is no +representation of this chain with MFI above cutoff among all antibodies. +As a result we parse this chain as +```text +DPA1*01:01 MFI 150 (average MFI), cutoff 2000 +``` + +Pay attention, that the chain `DPB1*02:02` isn't negative, because +it has positive representation in the antibody +`DP*[03:03, 02:02] MFI 3000, cutoff 20000`, so this chain is mixed. + +The chain `DPB1*03:03` is also negative and parsed in the same way as `DPA1*01:01`. + +## 2. Both chains are only positive +```text +Example: +DP*[03:03, 02:02] MFI 3000, cutoff 2000 +DP*[01:01;03:03] MFI 200, cutoff 2000 +DP*[03:03, 01:01] MFI 2100, cutoff 2000 +DP*[04:01, 03:03] MFI 3000, cutoff 2000 +``` +In this case the antibody `DP*[03:03, 02:02]` have both chains positive, +because either `DPA1*03:03` or `DPB1*02:02` have only positive MFIs among all antibodies. +As a result we parse this antibody as two separate chains +```text +DPA1*03:03 MFI 2550 (average MFI), cutoff 2000 +DPB1*02:02 MFI 3000 (average MFI), cutoff 2000 +``` + +The antibody `DP*[03:03, 01:01]` is also only positive, but +`DP*[04:01, 03:03]` is not, because it has negative representation of the chain +`DPB1*03:03` in the antibody `DP*[01:01, 03:03]`. + +## 3. One chain is only positive, another one is mixed: +```text +Example: +DP*[03:03, 02:02] MFI 3000, cutoff 2000 +DP*[01:01;02:02] MFI 100, cutoff 2000 +DP*[04:01, 01:05] MFI 3000, cutoff 2000 +DP*[03:01, 01:05] MFI 2500, cutoff 2000 +DP*[01:01, 01:05] MFI 200, cutoff 2000 +``` +In this case the antibody `DP*[01:03;02:02]` has only positive +chain `DPA1*03:03` and mixed chain `DPB1*02:02`, because `DPB1*02:02` has a negative +MFI representation in the antibody `DP*[01:01;02:02]` with MFI 100 (below cutoff 2000) +and `DPA1*03:03` hasn't. +As a result we parse positive chain `DPA1*03:03` just with average MFI among all antibodies with this chain, so: +```text +DPA1*03:03 MFI 3000 (average MFI), cutoff 2000 +``` +This mixed chain `DPB1*02:02`, which has positive +representation just in this antibody `DP*[01:03;02:02]` (there aren't any other +antibodies, where this chain has positive MFI), is parsed as +```text +DPB1*02:02 MFI 100 (average negative MFI), cutoff 2000 +``` + +Pay attention, that similar mixed chain `DPB1*01:05`, but for the antibody +`DP*[04:01, 01:05]`, is not parsed at all, because it has another positive representation +in the antibody `DP*[03:01, 01:05]`. + +## 4. Both chains are mixed +```text +Example: +DP*[03:03, 02:02] MFI 3000, cutoff 2000 +DP*[01:01;02:02] MFI 100, cutoff 2000 +DP*[03:03, 04:01] MFI 200, cutoff 2000 +DP*[03:03, 05:02] MFI 2200, cutoff 2000 +``` +# TODO: From 1984e854e190a5e4bc99af5bc5d145619b1f7e6f Mon Sep 17 00:00:00 2001 From: abragtim Date: Thu, 27 Apr 2023 16:11:32 +0200 Subject: [PATCH 12/24] Add technical README. --- documentation/README_TECH.md | 40 ++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 documentation/README_TECH.md diff --git a/documentation/README_TECH.md b/documentation/README_TECH.md new file mode 100644 index 000000000..4f28cc3f2 --- /dev/null +++ b/documentation/README_TECH.md @@ -0,0 +1,40 @@ +## Square bracket antibody parsing algorithm + +When we receive antibodies in the notation DP*[01:01;02:02], we use a special algorithm to determine whether there are antibodies against both alpha and beta alleles or just one of them. + +### Algorithm description + +Let us first explain the terminology we used to describe the algorithm: + +* "double antibody" refers to an antibody enclosed in square brackets. +* "alpha chain" refers to the first code of a double antibody. +* "beta chain" refers to the second code of a double antibody. +* "positive MFI" is the MFI value that is equal to or above the cutoff. +* "negative MFI" is the MFI value below the cutoff. + +At the beginning of the algorithm execution, we have three lists: +1. `antibodies` - a list of all antibodies to parse. +2. `parsed` - a list of parsed antibodies. +3. `parsing_issues` - a list of parsing issues that occur during the algorithm execution. + +We parse each antibody in the list of `antibodies` one by one using a for-loop. If both chains of the antibody are +already in the `parsed` list, we move on to the next antibody. + +If at least one of the chains is not in the `parsed` list yet, we examine the antibody with the following logic: +
+First, we check if the antibody has a positive MFI. + +#### Double antibody has a positive MFI: +If **both antibody chains have only positive MFI representation** among all the antibodies +in the list for parsing, we add each chain **separately** to the `parsed` list with the arithmetic mean of the MFI from all antibodies with this chain in the list.

+If **one of the chains has at least one negative MFI representation** and the **other chain has only positive MFI representation** among other antibodies in the list, we add the **chain with only positive MFI representation** to the `parsed` list with the arithmetic mean of the MFI from all antibodies with this chain. For the **chain with mixed MFI representation**, if this is the only positive occurrence of this chain, we add it to the `parsed` list with the arithmetic mean of the MFI from all antibodies with negative MFI for this chain in the list. However, if there is another positive occurrence for this chain, we skip it.

+If **both chains have at least one negative MFI among other antibodies**, +we add them to the `parsed` list as one double antibody with the provided MFI. Moreover, we add each chain **separately** to the `parsed` list, and we denote their type as "theoretical", with the arithmetic mean of the MFI from all antibodies with this chain in the list. +Finally, we add a parsing issue about this to the `parsing_issue` list. + +#### Double antibody has a negative MFI: +We check each chain of the antibody separately, and if that chain has **only negative MFI representation** among other antibodies in the list, we add this chain to the `parsed` list with the arithmetic mean of the MFI from all antibodies in the list. Otherwise, we skip this chain. + +### The algorithm scheme +The algorithm scheme is represented in this PDF +[file](double_antibodies_parsing/double_antibodies_parsing_algorithm.pdf). \ No newline at end of file From 512e1d61e59d5d6c3f7d6bd7e9317a273c6fc3c5 Mon Sep 17 00:00:00 2001 From: abragtim Date: Fri, 28 Apr 2023 00:36:10 +0200 Subject: [PATCH 13/24] Describe algorithm in non tech README vol. 2 + grammar fixes. --- documentation/README_NON_TECH.md | 67 ++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/documentation/README_NON_TECH.md b/documentation/README_NON_TECH.md index f70f949e8..ef400d537 100644 --- a/documentation/README_NON_TECH.md +++ b/documentation/README_NON_TECH.md @@ -23,18 +23,18 @@ DP*[01:01;02:02] MFI 100, cutoff 2000 DP*[01:01;03:03] MFI 200, cutoff 2000 DP*[03:03, 02:02] MFI 3000, cutoff 2000 ``` -In this case the chain `DPA1*01:01` is negative, because there is no -representation of this chain with MFI above cutoff among all antibodies. -As a result we parse this chain as +In this case, the chain `DPA1*01:01` is negative because there is no representation +of this chain with MFI above the cutoff among all antibodies. +As a result, we parse this chain as: ```text DPA1*01:01 MFI 150 (average MFI), cutoff 2000 ``` -Pay attention, that the chain `DPB1*02:02` isn't negative, because -it has positive representation in the antibody -`DP*[03:03, 02:02] MFI 3000, cutoff 20000`, so this chain is mixed. +Please note that the chain `DPB1*02:02` is not negative because it has a positive +representation in the antibody `DP*[03:03, 02:02] MFI 3000, cutoff 20000`. +Therefore, this chain is mixed. -The chain `DPB1*03:03` is also negative and parsed in the same way as `DPA1*01:01`. +Similarly, the chain `DPB1*03:03` is negative and parsed in the same way as `DPA1*01:01`. ## 2. Both chains are only positive ```text @@ -44,18 +44,18 @@ DP*[01:01;03:03] MFI 200, cutoff 2000 DP*[03:03, 01:01] MFI 2100, cutoff 2000 DP*[04:01, 03:03] MFI 3000, cutoff 2000 ``` -In this case the antibody `DP*[03:03, 02:02]` have both chains positive, -because either `DPA1*03:03` or `DPB1*02:02` have only positive MFIs among all antibodies. -As a result we parse this antibody as two separate chains +In this case, the antibody `DP*[03:03, 02:02]` has both chains positive because +either `DPA1*03:03` or `DPB1*02:02` have only positive MFIs among all antibodies. +As a result, we parse this antibody as two separate chains: ```text DPA1*03:03 MFI 2550 (average MFI), cutoff 2000 DPB1*02:02 MFI 3000 (average MFI), cutoff 2000 ``` -The antibody `DP*[03:03, 01:01]` is also only positive, but -`DP*[04:01, 03:03]` is not, because it has negative representation of the chain -`DPB1*03:03` in the antibody `DP*[01:01, 03:03]`. - +The antibody `DP*[03:03, 01:01]` is also only positive. However, `DP*[04:01, 03:03]` +is not positive because it has negative representation of the +chain `DPB1*03:03` in the antibody `DP*[01:01, 03:03]`. +# TODO!!!! DOWN ## 3. One chain is only positive, another one is mixed: ```text Example: @@ -64,25 +64,31 @@ DP*[01:01;02:02] MFI 100, cutoff 2000 DP*[04:01, 01:05] MFI 3000, cutoff 2000 DP*[03:01, 01:05] MFI 2500, cutoff 2000 DP*[01:01, 01:05] MFI 200, cutoff 2000 +DP*[03:01, 06:02] MFI 100, cutoff 2000 ``` -In this case the antibody `DP*[01:03;02:02]` has only positive -chain `DPA1*03:03` and mixed chain `DPB1*02:02`, because `DPB1*02:02` has a negative -MFI representation in the antibody `DP*[01:01;02:02]` with MFI 100 (below cutoff 2000) -and `DPA1*03:03` hasn't. -As a result we parse positive chain `DPA1*03:03` just with average MFI among all antibodies with this chain, so: +In this case, the antibody `DP*[01:03;02:02]` has only a positive chain, +`DPA1*03:03`, and a mixed chain, `DPB1*02:02`, because `DPB1*02:02` has a negative +MFI representation in the antibody `DP*[01:01;02:02]` with an +MFI of 100 (below the cutoff of 2000), while `DPA1*03:03` does not. +As a result, we only consider the positive chain `DPA1*03:03`, +and calculate its average MFI among all antibodies with this chain, +which results in: ```text DPA1*03:03 MFI 3000 (average MFI), cutoff 2000 ``` + This mixed chain `DPB1*02:02`, which has positive representation just in this antibody `DP*[01:03;02:02]` (there aren't any other -antibodies, where this chain has positive MFI), is parsed as +antibodies where this chain has positive MFI), is parsed as ```text DPB1*02:02 MFI 100 (average negative MFI), cutoff 2000 ``` -Pay attention, that similar mixed chain `DPB1*01:05`, but for the antibody -`DP*[04:01, 01:05]`, is not parsed at all, because it has another positive representation -in the antibody `DP*[03:01, 01:05]`. +Pay attention that a similar mixed chain, `DPB1*01:05`, +but for the antibody `DP*[04:01, 01:05]`, is not parsed through this antibody but +through the `DP*[03:01, 01:05]` antibody, as explained in the next section. +In summary, if there are several positive representations in this positive + mixed case, +we expect to parse this chain through other antibodies. ## 4. Both chains are mixed ```text @@ -92,4 +98,17 @@ DP*[01:01;02:02] MFI 100, cutoff 2000 DP*[03:03, 04:01] MFI 200, cutoff 2000 DP*[03:03, 05:02] MFI 2200, cutoff 2000 ``` -# TODO: +In this case, the antibody `DP*[03:03, 02:02]` has both chains as mixed because its chains, +`DPA1*03:03` and `DPB1*02:02`, have negative representation in the antibodies +`DP*[03:03, 04:01]` and `DP*[01:01;02:02]`, respectively. +As a result, we parse this double antibody in its entirety as follows: +```text +DP*[03:03, 02:02] MFI 3000, cutoff 2000 +``` + +We also parse the two theoretical chains separately as follows: +```text +DPA1*03:03 MFI 2600 (average positive MFI), cutoff 2000 +DPB1*02:02 MFI 3000 (average positive MFI), cutoff 2000 +``` +We always notify the user if theoretical antibodies are presented. From 6ac439200ac5938b3b6cf7488e5de05b8b821f30 Mon Sep 17 00:00:00 2001 From: abragtim Date: Fri, 28 Apr 2023 00:39:00 +0200 Subject: [PATCH 14/24] Use non tech README as default in documentation. --- documentation/README.md | 124 +++++++++++++++++++++++++------ documentation/README_NON_TECH.md | 114 ---------------------------- 2 files changed, 101 insertions(+), 137 deletions(-) delete mode 100644 documentation/README_NON_TECH.md diff --git a/documentation/README.md b/documentation/README.md index 5981924f9..cd7a60537 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -241,7 +241,9 @@ the person being tested will react via pre-existing antibodies against human cel ## Square bracket antibody parsing algorithm -When we receive antibodies in the notation DP*[01:01;02:02], we use a special algorithm to determine whether there are antibodies against both alpha and beta alleles or just one of them. +When we receive antibodies in the notation DP*[01:01;02:02], we use a special +algorithm to determine whether there are antibodies against both alpha and +beta alleles or just one of them. ### Algorithm description @@ -253,28 +255,104 @@ Let us first explain the terminology we used to describe the algorithm: * "positive MFI" is the MFI value that is equal to or above the cutoff. * "negative MFI" is the MFI value below the cutoff. -At the beginning of the algorithm execution, we have three lists: -1. `antibodies` - a list of all antibodies to parse. -2. `parsed` - a list of parsed antibodies. -3. `parsing_issues` - a list of parsing issues that occur during the algorithm execution. - -We parse each antibody in the list of `antibodies` one by one using a for-loop. If both chains of the antibody are -already in the `parsed` list, we move on to the next antibody. - -If at least one of the chains is not in the `parsed` list yet, we examine the antibody with the following logic: -
-First, we check if the antibody has a positive MFI. - -#### Double antibody has a positive MFI: -If **both antibody chains have only positive MFI representation** among all the antibodies -in the list for parsing, we add each chain **separately** to the `parsed` list with the arithmetic mean of the MFI from all antibodies with this chain in the list.

-If **one of the chains has at least one negative MFI representation** and the **other chain has only positive MFI representation** among other antibodies in the list, we add the **chain with only positive MFI representation** to the `parsed` list with the arithmetic mean of the MFI from all antibodies with this chain. For the **chain with mixed MFI representation**, if this is the only positive occurrence of this chain, we add it to the `parsed` list with the arithmetic mean of the MFI from all antibodies with negative MFI for this chain in the list. However, if there is another positive occurrence for this chain, we skip it.

-If **both chains have at least one negative MFI among other antibodies**, -we add them to the `parsed` list as one double antibody with the provided MFI. Moreover, we add each chain **separately** to the `parsed` list, and we denote their type as "theoretical", with the arithmetic mean of the MFI from all antibodies with this chain in the list. -Finally, we add a parsing issue about this to the `parsing_issue` list. - -#### Double antibody has a negative MFI: -We check each chain of the antibody separately, and if that chain has **only negative MFI representation** among other antibodies in the list, we add this chain to the `parsed` list with the arithmetic mean of the MFI from all antibodies in the list. Otherwise, we skip this chain. +We parse each antibody one by one and detect several situations: + +#### 1. Antibody chain is negative +```text +Example: +DP*[01:01;02:02] MFI 100, cutoff 2000 +DP*[01:01;03:03] MFI 200, cutoff 2000 +DP*[03:03, 02:02] MFI 3000, cutoff 2000 +``` +In this case, the chain `DPA1*01:01` is negative because there is no representation +of this chain with MFI above the cutoff among all antibodies. +As a result, we parse this chain as: +```text +DPA1*01:01 MFI 150 (average MFI), cutoff 2000 +``` + +Please note that the chain `DPB1*02:02` is not negative because it has a positive +representation in the antibody `DP*[03:03, 02:02] MFI 3000, cutoff 20000`. +Therefore, this chain is mixed. + +Similarly, the chain `DPB1*03:03` is negative and parsed in the same way as `DPA1*01:01`. + +#### 2. Both chains are only positive +```text +Example: +DP*[03:03, 02:02] MFI 3000, cutoff 2000 +DP*[01:01;03:03] MFI 200, cutoff 2000 +DP*[03:03, 01:01] MFI 2100, cutoff 2000 +DP*[04:01, 03:03] MFI 3000, cutoff 2000 +``` +In this case, the antibody `DP*[03:03, 02:02]` has both chains positive because +either `DPA1*03:03` or `DPB1*02:02` have only positive MFIs among all antibodies. +As a result, we parse this antibody as two separate chains: +```text +DPA1*03:03 MFI 2550 (average MFI), cutoff 2000 +DPB1*02:02 MFI 3000 (average MFI), cutoff 2000 +``` + +The antibody `DP*[03:03, 01:01]` is also only positive. However, `DP*[04:01, 03:03]` +is not positive because it has negative representation of the +chain `DPB1*03:03` in the antibody `DP*[01:01, 03:03]`. + +#### 3. One chain is only positive, another one is mixed: +```text +Example: +DP*[03:03, 02:02] MFI 3000, cutoff 2000 +DP*[01:01;02:02] MFI 100, cutoff 2000 +DP*[04:01, 01:05] MFI 3000, cutoff 2000 +DP*[03:01, 01:05] MFI 2500, cutoff 2000 +DP*[01:01, 01:05] MFI 200, cutoff 2000 +DP*[03:01, 06:02] MFI 100, cutoff 2000 +``` +In this case, the antibody `DP*[01:03;02:02]` has only a positive chain, +`DPA1*03:03`, and a mixed chain, `DPB1*02:02`, because `DPB1*02:02` has a negative +MFI representation in the antibody `DP*[01:01;02:02]` with an +MFI of 100 (below the cutoff of 2000), while `DPA1*03:03` does not. +As a result, we only consider the positive chain `DPA1*03:03`, +and calculate its average MFI among all antibodies with this chain, +which results in: +```text +DPA1*03:03 MFI 3000 (average MFI), cutoff 2000 +``` + +This mixed chain `DPB1*02:02`, which has positive +representation just in this antibody `DP*[01:03;02:02]` (there aren't any other +antibodies where this chain has positive MFI), is parsed as +```text +DPB1*02:02 MFI 100 (average negative MFI), cutoff 2000 +``` + +Pay attention that a similar mixed chain, `DPB1*01:05`, +but for the antibody `DP*[04:01, 01:05]`, is not parsed through this antibody but +through the `DP*[03:01, 01:05]` antibody, as explained in the next section. +In summary, if there are several positive representations in this positive + mixed case, +we expect to parse this chain through other antibodies. + +#### 4. Both chains are mixed +```text +Example: +DP*[03:03, 02:02] MFI 3000, cutoff 2000 +DP*[01:01;02:02] MFI 100, cutoff 2000 +DP*[03:03, 04:01] MFI 200, cutoff 2000 +DP*[03:03, 05:02] MFI 2200, cutoff 2000 +``` +In this case, the antibody `DP*[03:03, 02:02]` has both chains as mixed because its chains, +`DPA1*03:03` and `DPB1*02:02`, have negative representation in the antibodies +`DP*[03:03, 04:01]` and `DP*[01:01;02:02]`, respectively. +As a result, we parse this double antibody in its entirety as follows: +```text +DP*[03:03, 02:02] MFI 3000, cutoff 2000 +``` + +We also parse the two theoretical chains separately as follows: +```text +DPA1*03:03 MFI 2600 (average positive MFI), cutoff 2000 +DPB1*02:02 MFI 3000 (average positive MFI), cutoff 2000 +``` +We always notify the user if theoretical antibodies are presented. ### The algorithm scheme The algorithm scheme is represented in this PDF diff --git a/documentation/README_NON_TECH.md b/documentation/README_NON_TECH.md deleted file mode 100644 index ef400d537..000000000 --- a/documentation/README_NON_TECH.md +++ /dev/null @@ -1,114 +0,0 @@ -## Square bracket antibody parsing algorithm - -When we receive antibodies in the notation DP*[01:01;02:02], we use a special -algorithm to determine whether there are antibodies against both alpha and -beta alleles or just one of them. - -### Algorithm description - -Let us first explain the terminology we used to describe the algorithm: - -* "double antibody" refers to an antibody enclosed in square brackets. -* "alpha chain" refers to the first code of a double antibody. -* "beta chain" refers to the second code of a double antibody. -* "positive MFI" is the MFI value that is equal to or above the cutoff. -* "negative MFI" is the MFI value below the cutoff. - -We parse each antibody one by one and detect several situations: - -## 1. Antibody chain is negative -```text -Example: -DP*[01:01;02:02] MFI 100, cutoff 2000 -DP*[01:01;03:03] MFI 200, cutoff 2000 -DP*[03:03, 02:02] MFI 3000, cutoff 2000 -``` -In this case, the chain `DPA1*01:01` is negative because there is no representation -of this chain with MFI above the cutoff among all antibodies. -As a result, we parse this chain as: -```text -DPA1*01:01 MFI 150 (average MFI), cutoff 2000 -``` - -Please note that the chain `DPB1*02:02` is not negative because it has a positive -representation in the antibody `DP*[03:03, 02:02] MFI 3000, cutoff 20000`. -Therefore, this chain is mixed. - -Similarly, the chain `DPB1*03:03` is negative and parsed in the same way as `DPA1*01:01`. - -## 2. Both chains are only positive -```text -Example: -DP*[03:03, 02:02] MFI 3000, cutoff 2000 -DP*[01:01;03:03] MFI 200, cutoff 2000 -DP*[03:03, 01:01] MFI 2100, cutoff 2000 -DP*[04:01, 03:03] MFI 3000, cutoff 2000 -``` -In this case, the antibody `DP*[03:03, 02:02]` has both chains positive because -either `DPA1*03:03` or `DPB1*02:02` have only positive MFIs among all antibodies. -As a result, we parse this antibody as two separate chains: -```text -DPA1*03:03 MFI 2550 (average MFI), cutoff 2000 -DPB1*02:02 MFI 3000 (average MFI), cutoff 2000 -``` - -The antibody `DP*[03:03, 01:01]` is also only positive. However, `DP*[04:01, 03:03]` -is not positive because it has negative representation of the -chain `DPB1*03:03` in the antibody `DP*[01:01, 03:03]`. -# TODO!!!! DOWN -## 3. One chain is only positive, another one is mixed: -```text -Example: -DP*[03:03, 02:02] MFI 3000, cutoff 2000 -DP*[01:01;02:02] MFI 100, cutoff 2000 -DP*[04:01, 01:05] MFI 3000, cutoff 2000 -DP*[03:01, 01:05] MFI 2500, cutoff 2000 -DP*[01:01, 01:05] MFI 200, cutoff 2000 -DP*[03:01, 06:02] MFI 100, cutoff 2000 -``` -In this case, the antibody `DP*[01:03;02:02]` has only a positive chain, -`DPA1*03:03`, and a mixed chain, `DPB1*02:02`, because `DPB1*02:02` has a negative -MFI representation in the antibody `DP*[01:01;02:02]` with an -MFI of 100 (below the cutoff of 2000), while `DPA1*03:03` does not. -As a result, we only consider the positive chain `DPA1*03:03`, -and calculate its average MFI among all antibodies with this chain, -which results in: -```text -DPA1*03:03 MFI 3000 (average MFI), cutoff 2000 -``` - -This mixed chain `DPB1*02:02`, which has positive -representation just in this antibody `DP*[01:03;02:02]` (there aren't any other -antibodies where this chain has positive MFI), is parsed as -```text -DPB1*02:02 MFI 100 (average negative MFI), cutoff 2000 -``` - -Pay attention that a similar mixed chain, `DPB1*01:05`, -but for the antibody `DP*[04:01, 01:05]`, is not parsed through this antibody but -through the `DP*[03:01, 01:05]` antibody, as explained in the next section. -In summary, if there are several positive representations in this positive + mixed case, -we expect to parse this chain through other antibodies. - -## 4. Both chains are mixed -```text -Example: -DP*[03:03, 02:02] MFI 3000, cutoff 2000 -DP*[01:01;02:02] MFI 100, cutoff 2000 -DP*[03:03, 04:01] MFI 200, cutoff 2000 -DP*[03:03, 05:02] MFI 2200, cutoff 2000 -``` -In this case, the antibody `DP*[03:03, 02:02]` has both chains as mixed because its chains, -`DPA1*03:03` and `DPB1*02:02`, have negative representation in the antibodies -`DP*[03:03, 04:01]` and `DP*[01:01;02:02]`, respectively. -As a result, we parse this double antibody in its entirety as follows: -```text -DP*[03:03, 02:02] MFI 3000, cutoff 2000 -``` - -We also parse the two theoretical chains separately as follows: -```text -DPA1*03:03 MFI 2600 (average positive MFI), cutoff 2000 -DPB1*02:02 MFI 3000 (average positive MFI), cutoff 2000 -``` -We always notify the user if theoretical antibodies are presented. From 57c9ffe4a55c345b06408938d89d05b9883cbfff Mon Sep 17 00:00:00 2001 From: abragtim Date: Fri, 28 Apr 2023 00:54:50 +0200 Subject: [PATCH 15/24] Fix grammar + some formatting issues. --- documentation/README.md | 51 ++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/documentation/README.md b/documentation/README.md index cd7a60537..009af7f05 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -262,7 +262,7 @@ We parse each antibody one by one and detect several situations: Example: DP*[01:01;02:02] MFI 100, cutoff 2000 DP*[01:01;03:03] MFI 200, cutoff 2000 -DP*[03:03, 02:02] MFI 3000, cutoff 2000 +DP*[03:03;02:02] MFI 3000, cutoff 2000 ``` In this case, the chain `DPA1*01:01` is negative because there is no representation of this chain with MFI above the cutoff among all antibodies. @@ -272,7 +272,7 @@ DPA1*01:01 MFI 150 (average MFI), cutoff 2000 ``` Please note that the chain `DPB1*02:02` is not negative because it has a positive -representation in the antibody `DP*[03:03, 02:02] MFI 3000, cutoff 20000`. +representation in the antibody `DP*[03:03;02:02] MFI 3000, cutoff 20000`. Therefore, this chain is mixed. Similarly, the chain `DPB1*03:03` is negative and parsed in the same way as `DPA1*01:01`. @@ -280,12 +280,12 @@ Similarly, the chain `DPB1*03:03` is negative and parsed in the same way as `DPA #### 2. Both chains are only positive ```text Example: -DP*[03:03, 02:02] MFI 3000, cutoff 2000 +DP*[03:03;02:02] MFI 3000, cutoff 2000 DP*[01:01;03:03] MFI 200, cutoff 2000 -DP*[03:03, 01:01] MFI 2100, cutoff 2000 -DP*[04:01, 03:03] MFI 3000, cutoff 2000 +DP*[03:03;01:01] MFI 2100, cutoff 2000 +DP*[04:01;03:03] MFI 3000, cutoff 2000 ``` -In this case, the antibody `DP*[03:03, 02:02]` has both chains positive because +In this case, the antibody `DP*[03:03;02:02]` has both chains positive because either `DPA1*03:03` or `DPB1*02:02` have only positive MFIs among all antibodies. As a result, we parse this antibody as two separate chains: ```text @@ -293,27 +293,26 @@ DPA1*03:03 MFI 2550 (average MFI), cutoff 2000 DPB1*02:02 MFI 3000 (average MFI), cutoff 2000 ``` -The antibody `DP*[03:03, 01:01]` is also only positive. However, `DP*[04:01, 03:03]` +The antibody `DP*[03:03;01:01]` is also only positive. However, `DP*[04:01;03:03]` is not positive because it has negative representation of the -chain `DPB1*03:03` in the antibody `DP*[01:01, 03:03]`. +chain `DPB1*03:03` in the antibody `DP*[01:01;03:03]`. #### 3. One chain is only positive, another one is mixed: ```text Example: -DP*[03:03, 02:02] MFI 3000, cutoff 2000 +DP*[03:03;02:02] MFI 3000, cutoff 2000 DP*[01:01;02:02] MFI 100, cutoff 2000 -DP*[04:01, 01:05] MFI 3000, cutoff 2000 -DP*[03:01, 01:05] MFI 2500, cutoff 2000 -DP*[01:01, 01:05] MFI 200, cutoff 2000 -DP*[03:01, 06:02] MFI 100, cutoff 2000 +DP*[04:01;01:05] MFI 3000, cutoff 2000 +DP*[03:01;01:05] MFI 2500, cutoff 2000 +DP*[01:01;01:05] MFI 200, cutoff 2000 +DP*[03:01;06:02] MFI 100, cutoff 2000 ``` In this case, the antibody `DP*[01:03;02:02]` has only a positive chain, `DPA1*03:03`, and a mixed chain, `DPB1*02:02`, because `DPB1*02:02` has a negative MFI representation in the antibody `DP*[01:01;02:02]` with an MFI of 100 (below the cutoff of 2000), while `DPA1*03:03` does not. -As a result, we only consider the positive chain `DPA1*03:03`, -and calculate its average MFI among all antibodies with this chain, -which results in: +As a result, we parse the positive chain `DPA1*03:03` with its average MFI among +all antibodies with this chain: ```text DPA1*03:03 MFI 3000 (average MFI), cutoff 2000 ``` @@ -326,28 +325,28 @@ DPB1*02:02 MFI 100 (average negative MFI), cutoff 2000 ``` Pay attention that a similar mixed chain, `DPB1*01:05`, -but for the antibody `DP*[04:01, 01:05]`, is not parsed through this antibody but -through the `DP*[03:01, 01:05]` antibody, as explained in the next section. +but for the antibody `DP*[04:01;01:05]`, is not parsed through this antibody but +through the `DP*[03:01;01:05]` antibody, as explained in the next section. In summary, if there are several positive representations in this positive + mixed case, -we expect to parse this chain through other antibodies. +we expect to parse this mixed chain through other antibodies. #### 4. Both chains are mixed ```text Example: -DP*[03:03, 02:02] MFI 3000, cutoff 2000 +DP*[03:03;02:02] MFI 3000, cutoff 2000 DP*[01:01;02:02] MFI 100, cutoff 2000 -DP*[03:03, 04:01] MFI 200, cutoff 2000 -DP*[03:03, 05:02] MFI 2200, cutoff 2000 +DP*[03:03;04:01] MFI 200, cutoff 2000 +DP*[03:03;05:02] MFI 2200, cutoff 2000 ``` -In this case, the antibody `DP*[03:03, 02:02]` has both chains as mixed because its chains, +In this case, the antibody `DP*[03:03;02:02]` has both chains as mixed because its chains, `DPA1*03:03` and `DPB1*02:02`, have negative representation in the antibodies -`DP*[03:03, 04:01]` and `DP*[01:01;02:02]`, respectively. +`DP*[03:03;04:01]` and `DP*[01:01;02:02]`, respectively. As a result, we parse this double antibody in its entirety as follows: ```text -DP*[03:03, 02:02] MFI 3000, cutoff 2000 +DP*[03:03;02:02] MFI 3000, cutoff 2000 ``` -We also parse the two theoretical chains separately as follows: +We also parse its two theoretical chains separately as follows: ```text DPA1*03:03 MFI 2600 (average positive MFI), cutoff 2000 DPB1*02:02 MFI 3000 (average positive MFI), cutoff 2000 From 9bdbef93275f6c2cf628d347528e6c502e195033 Mon Sep 17 00:00:00 2001 From: abragtim Date: Fri, 28 Apr 2023 01:11:43 +0200 Subject: [PATCH 16/24] Update info about MFI computation for theoretical. --- documentation/README_TECH.md | 22 +- ...le_antibodies_parsing_algorithm.drawio.xml | 263 +----------------- .../double_antibodies_parsing_algorithm.pdf | Bin 46777 -> 30421 bytes 3 files changed, 18 insertions(+), 267 deletions(-) diff --git a/documentation/README_TECH.md b/documentation/README_TECH.md index 4f28cc3f2..ec9dfe235 100644 --- a/documentation/README_TECH.md +++ b/documentation/README_TECH.md @@ -1,6 +1,7 @@ ## Square bracket antibody parsing algorithm -When we receive antibodies in the notation DP*[01:01;02:02], we use a special algorithm to determine whether there are antibodies against both alpha and beta alleles or just one of them. +When we receive antibodies in the notation DP*[01:01;02:02], we use a special algorithm +to determine whether there are antibodies against both alpha and beta alleles or just one of them. ### Algorithm description @@ -27,14 +28,25 @@ First, we check if the antibody has a positive MFI. #### Double antibody has a positive MFI: If **both antibody chains have only positive MFI representation** among all the antibodies in the list for parsing, we add each chain **separately** to the `parsed` list with the arithmetic mean of the MFI from all antibodies with this chain in the list.

-If **one of the chains has at least one negative MFI representation** and the **other chain has only positive MFI representation** among other antibodies in the list, we add the **chain with only positive MFI representation** to the `parsed` list with the arithmetic mean of the MFI from all antibodies with this chain. For the **chain with mixed MFI representation**, if this is the only positive occurrence of this chain, we add it to the `parsed` list with the arithmetic mean of the MFI from all antibodies with negative MFI for this chain in the list. However, if there is another positive occurrence for this chain, we skip it.

+If **one of the chains has at least one negative MFI representation** and the **other chain has only positive MFI representation** +among other antibodies in the list, we add the **chain with only positive MFI representation** to the `parsed` +list with the arithmetic mean of the MFI from all antibodies with this chain. For the **chain with mixed MFI representation**, +if this is the only positive occurrence of this chain, we add it to the `parsed` list with the arithmetic mean +of the MFI from all antibodies with negative MFI for this chain in the list. +However, if there is another positive occurrence for this chain, we skip it.

If **both chains have at least one negative MFI among other antibodies**, -we add them to the `parsed` list as one double antibody with the provided MFI. Moreover, we add each chain **separately** to the `parsed` list, and we denote their type as "theoretical", with the arithmetic mean of the MFI from all antibodies with this chain in the list. +we add them to the `parsed` list as one double antibody with the provided MFI. +Moreover, we add each chain **separately** to the `parsed` list, and we denote their type as "theoretical", +with the arithmetic mean of the positive MFI from all antibodies with this chain in the list. Finally, we add a parsing issue about this to the `parsing_issue` list. #### Double antibody has a negative MFI: -We check each chain of the antibody separately, and if that chain has **only negative MFI representation** among other antibodies in the list, we add this chain to the `parsed` list with the arithmetic mean of the MFI from all antibodies in the list. Otherwise, we skip this chain. +We check each chain of the antibody separately, and if that chain has **only negative MFI representation** +among other antibodies in the list, we add this chain to the `parsed` list with the arithmetic mean of +the MFI from all antibodies in the list. Otherwise, we skip this chain. ### The algorithm scheme The algorithm scheme is represented in this PDF -[file](double_antibodies_parsing/double_antibodies_parsing_algorithm.pdf). \ No newline at end of file +[file](double_antibodies_parsing/double_antibodies_parsing_algorithm.pdf). + +**P.S.** The last time this algorithm was in the `_add_double_hla_antibodies` function. \ No newline at end of file diff --git a/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.drawio.xml b/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.drawio.xml index 46de343a0..cd0d496a8 100644 --- a/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.drawio.xml +++ b/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.drawio.xml @@ -1,262 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.pdf b/documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.pdf index d1999fa3be9ac6d444c601a5b7ec656e56386254..73323cb6a971d5662eaac88cac7feafafc36e3ca 100644 GIT binary patch literal 30421 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

Oz{I(q_dGm*OlnKh^p@^n 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 L3^}>DqQw6KZ=3Ex literal 46777 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 From e55b7e642da8c019c71b8356432702c75b864c18 Mon Sep 17 00:00:00 2001 From: abragtim Date: Tue, 9 May 2023 08:27:03 +0200 Subject: [PATCH 17/24] Add test for positive + mixed case with multiple pos. representations. --- tests/utils/hla_system/test_code_parser.py | 43 ++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/tests/utils/hla_system/test_code_parser.py b/tests/utils/hla_system/test_code_parser.py index 3d37dd675..e50181365 100644 --- a/tests/utils/hla_system/test_code_parser.py +++ b/tests/utils/hla_system/test_code_parser.py @@ -307,6 +307,49 @@ def test_double_antibodies(self): ] self.assertCountEqual(expected_antibodies_in_group, antibodies.hla_antibodies_per_groups[4].hla_antibody_list) + # case: only positive + mixed for DPB1*01:05 with several positive representations + antibodies_raw = [ + create_antibody('DP[04:01,01:05]', 3000, 2000), + create_antibody('DP[03:01,01:05]', 2500, 2000), + create_antibody('DP[01:01,01:05]', 200, 2000) + ] + issues, antibodies = parse_hla_antibodies_raw_and_return_parsing_issue_list(antibodies_raw) + + expected_antibodies_in_group = [ + create_antibody_parsed('DPA1*04:01', 3000, 2000), + create_antibody_parsed('DPA1*03:01', 2500, 2000), + create_antibody_parsed('DPA1*01:01', 200, 2000), + # DPB1*01:05 always occurs in the positive + mixed antibody, so it won't be parsed + ] + self.assertCountEqual(expected_antibodies_in_group, + antibodies.hla_antibodies_per_groups[4].hla_antibody_list) + + # case: mixed with several positive representations for DPB1*01:05 + # (but not just in positive+mixed antibody) + antibodies_raw = [ + create_antibody('DP[04:01,01:05]', 3000, 2000), + create_antibody('DP[03:01,01:05]', 2500, 2000), + create_antibody('DP[01:01,01:05]', 200, 2000), + create_antibody('DP[03:01,01:04]', 200, 2000) + ] + issues, antibodies = parse_hla_antibodies_raw_and_return_parsing_issue_list(antibodies_raw) + self.maxDiff = None + expected_antibodies_in_group = [ + create_antibody_parsed('DPA1*04:01', 3000, 2000), + create_antibody_parsed('DPA1*03:01', 2500, 2000, antibody_type=HLAAntibodyType.THEORETICAL), + create_antibody_parsed('DPA1*01:01', 200, 2000), + # compared to the previous case, the chain DPB1*01:05 will be parsed despite the fact, + # that we still skipped parsing for positive + mixed cases, + # but this chain will be parsed in the mixed + mixed antibody DP[03:01,01:05]. + # Usually in positive + mixed cases with multiple positive representations, + # we expect it to be parsed in the mixed + mixed case. + create_antibody_parsed('DPB1*01:05', 2750, 2000, antibody_type=HLAAntibodyType.THEORETICAL), + create_antibody_parsed('DPA1*03:01', 2500, 2000, 'DPB1*01:05'), + create_antibody_parsed('DPB1*01:04', 200, 2000) + ] + self.assertCountEqual(expected_antibodies_in_group, + antibodies.hla_antibodies_per_groups[4].hla_antibody_list) + # process via the old way antibodies_raw = [ create_antibody('DPA1*01:03', 1900, 2000), From d79d3c7f21fddd2fd60485269fd7fc46393ea028 Mon Sep 17 00:00:00 2001 From: abragtim Date: Tue, 9 May 2023 08:56:06 +0200 Subject: [PATCH 18/24] Reformat + small naming fix. --- documentation/README.md | 401 ++++++++++++++++++++++++----------- documentation/README_TECH.md | 71 ++++--- 2 files changed, 323 insertions(+), 149 deletions(-) diff --git a/documentation/README.md b/documentation/README.md index 009af7f05..509fddad4 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -4,245 +4,365 @@ ## What is HLA? -HLA is a set of proteins on the surface of every person’s cells. HLA stands for Human Leukocyte Antigen. Leukocyte means +HLA is a set of proteins on the surface of every person’s cells. HLA stands for +Human Leukocyte Antigen. Leukocyte means white blood cell and antigen is something the immune system reacts to. -Antigens on cell surfaces can act as flags that the immune system looks at to determine if something is an invader. +Antigens on cell surfaces can act as flags that the immune system looks at to +determine if something is an invader. -HLA is composed of many genes of different classes. We differentiate between Class I (A, B, C), Class II (DR, DQ, DP), +HLA is composed of many genes of different classes. We differentiate between +Class I (A, B, C), Class II (DR, DQ, DP), and Class III. -*Groups everyone is tested for are A, B and DR. They are the oldest known, so all labs are able to detect them. Each -person has 2 antigens within each of these groups. One is inherited from the mother, the other one from the father. It is important -to know that HLA is inherited as a "set" of the three HLA groups, A, B and DR. This set is known as a "haplotype".* +*Groups everyone is tested for are A, B and DR. They are the oldest known, so +all labs are able to detect them. Each +person has 2 antigens within each of these groups. One is inherited from the +mother, the other one from the father. It is important +to know that HLA is inherited as a "set" of the three HLA groups, A, B and DR. +This set is known as a "haplotype".* ## Gene groups -We are currently considering 6 groups of HLA antigens: A, B, C, DR, DP, and DQ. All of the other groups are not relevant to +We are currently considering 6 groups of HLA antigens: A, B, C, DR, DP, and DQ. +All of the other groups are not relevant to the immune system. The most important groups are A, B, and DR. -For every antigen from groups A, B, and C, the patient has exactly 2 HLA codes (one from the mother and one from the father), -and if only one is present, it is duplicated. This is the same for serological notation as for high resolution. +For every antigen from groups A, B, and C, the patient has exactly 2 HLA codes ( +one from the mother and one from the father), +and if only one is present, it is duplicated. This is the same for serological +notation as for high resolution. -Antigens from groups DP, DQ, and DR are a little more complex, because they are composed of more genes. +Antigens from groups DP, DQ, and DR are a little more complex, because they are +composed of more genes. ### DQ -These genes are composed of two chains: A and B. That means, that for their high resolution, we need 4 sequences specified -(two for A and two for B). The square brackets can be used for this, e.g.: DQ[01:03,06:02], where the first part +These genes are composed of two chains: A and B. That means, that for their high +resolution, we need 4 sequences specified +(two for A and two for B). The square brackets can be used for this, e.g.: +DQ[01:03,06:02], where the first part describes A, and the second describes B. -For conversion of DQ genes to serological notation, it is needed to use the table from https://en.wikipedia.org/wiki/HLA-DQ, +For conversion of DQ genes to serological notation, it is needed to use the +table from https://en.wikipedia.org/wiki/HLA-DQ, where a certain combination of DQA and DQB gives a specific DQ HLA code. ### DP -In the case of DP genes, during conversion, we only take "DP" and the first number of the DPB gene, but this conversion -isn't a standardized one, and we should consider primarily DP genes in high resolution. +In the case of DP genes, during conversion, we only take "DP" and the first +number of the DPB gene, but this conversion +isn't a standardized one, and we should consider primarily DP genes in high +resolution. ### DR + This is the most complex group of antigens. It is composed of 5 types of genes: **DRB1** - this type contains most of the variants, DR1-DR18. -**DRB3, DRB4, DRB5** - each of these genes is either present or not, but at most 2 out of these 3 can be present (meaning -also 0 or 1 can be present). In the serological notation, they are listed as DR52, DR53, and DR51 if present. +**DRB3, DRB4, DRB5** - each of these genes is either present or not, but at most +2 out of these 3 can be present (meaning +also 0 or 1 can be present). In the serological notation, they are listed as +DR52, DR53, and DR51 if present. **DRA1** - this gene is not changing, and it is not considered at all. -In conclusion, from this group, we can have 2 HLA codes from DR1-DR18 (or one code duplicated) and 0-2 codes from +In conclusion, from this group, we can have 2 HLA codes from DR1-DR18 (or one +code duplicated) and 0-2 codes from DR51-DR53. ## Broad, split, high resolution (Nomenclature) -There are several “levels” on which the HLA antigen can be specified. For example: +There are several “levels” on which the HLA antigen can be specified. For +example: HLA-A9 consists of 3 closely related specificities, A23, A24, A2403. -First is the broad specificity, which is kind of a supertype. In this example, it is A9. +First is the broad specificity, which is kind of a supertype. In this example, +it is A9. -Next is split specificity. Splits or “subtypes” are the finer specificities that comprise the supertype. In this +Next is split specificity. Splits or “subtypes” are the finer specificities that +comprise the supertype. In this example, it's for instance A23. -*Here is the table of Broad-Splits associations used in this app: http://hla.alleles.org/antigens/broads_splits.html* +*Here is the table of Broad-Splits associations used in this +app: http://hla.alleles.org/antigens/broads_splits.html* Last resolution type is high resolution. It defines specific HLA protein, etc. E.g.: A\*24:19 -|Nomenclature | Indicates| -|--- | ---| -|HLA | the HLA region and prefix for an HLA gene| -|HLA-DRB1 | a particular HLA locus i.e. DRB1| -|HLA-DRB1\*13 | a group of alleles that encode the DR13 antigen or sequence homology to other DRB1\*13 alleles| -|HLA-DRB1\*13:01 | a specific HLA allele| -|HLA-DRB1\*13:01:02 | an allele that differs by a synonymous mutation from DRB1\*13:01:01| -|HLA-DRB1\*13:01:01:02 | an allele which contains a mutation outside the coding region from DRB1\*13:01:01:01| -|HLA-A\*24:09N | a 'Null' allele - an allele that is not expressed| -|HLA-A\*30:14L | an allele encoding a protein with significantly reduced or 'Low' cell surface expression| -|HLA-A\*24:02:01:02L | an allele encoding a protein with significantly reduced or 'Low' cell surface expression, where the mutation is found outside the coding region| -|HLA-B\*44:02:01:02S | an allele encoding a protein which is expressed as a 'Secreted' molecule only| -|HLA-A\*32:11Q | an allele that has a mutation that has previously been shown to have a significant effect on cell surface expression, but where this has not been confirmed and its expression remains 'Questionable'| +| Nomenclature | Indicates | +|-----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| HLA | the HLA region and prefix for an HLA gene | +| HLA-DRB1 | a particular HLA locus i.e. DRB1 | +| HLA-DRB1\*13 | a group of alleles that encode the DR13 antigen or sequence homology to other DRB1\*13 alleles | +| HLA-DRB1\*13:01 | a specific HLA allele | +| HLA-DRB1\*13:01:02 | an allele that differs by a synonymous mutation from DRB1\*13:01:01 | +| HLA-DRB1\*13:01:01:02 | an allele which contains a mutation outside the coding region from DRB1\*13:01:01:01 | +| HLA-A\*24:09N | a 'Null' allele - an allele that is not expressed | +| HLA-A\*30:14L | an allele encoding a protein with significantly reduced or 'Low' cell surface expression | +| HLA-A\*24:02:01:02L | an allele encoding a protein with significantly reduced or 'Low' cell surface expression, where the mutation is found outside the coding region | +| HLA-B\*44:02:01:02S | an allele encoding a protein which is expressed as a 'Secreted' molecule only | +| HLA-A\*32:11Q | an allele that has a mutation that has previously been shown to have a significant effect on cell surface expression, but where this has not been confirmed and its expression remains 'Questionable' | ## HLA Typing Process -When a patient goes through the pre-transplant workup, one of the tests performed is HLA typing to determine the +When a patient goes through the pre-transplant workup, one of the tests +performed is HLA typing to determine the patient’s HLA antigens. -When a patient is put on the transplant list, the HLA antigens are listed into a special computer system (for instance +When a patient is put on the transplant list, the HLA antigens are listed into a +special computer system (for instance TXM), along with several other pieces of information. -A lot of factors play a role in determining which patient receives the donor’s organ. Special consideration may be given -to people on the waiting list whose HLA type closely matches the donor’s HLA type, or their age differences, and so on. +A lot of factors play a role in determining which patient receives the donor’s +organ. Special consideration may be given +to people on the waiting list whose HLA type closely matches the donor’s HLA +type, or their age differences, and so on. ## Antibodies -There are two arms of the immune system, cell-based and antibody-based. Till now, we’ve only talked about cell-based. +There are two arms of the immune system, cell-based and antibody-based. Till +now, we’ve only talked about cell-based. Let’s talk about antibodies. -*An antibody is a Y-shaped molecule made by B-cells. B-cells are part of the immune system and develop from stem cells +*An antibody is a Y-shaped molecule made by B-cells. B-cells are part of the +immune system and develop from stem cells in the bone marrow.* -Basically, antibodies bind to antigens. Normally, antibodies are very important in protecting us. +Basically, antibodies bind to antigens. Normally, antibodies are very important +in protecting us. -*Antibodies are among the defenses that the body uses to repel foreign invaders.* +*Antibodies are among the defenses that the body uses to repel foreign +invaders.* -*Vaccines cause the immune system to make antibodies that protect us from infectious diseases, and antibodies prevent +*Vaccines cause the immune system to make antibodies that protect us from +infectious diseases, and antibodies prevent us from getting most diseases a second time.* -*Allergies are caused by antibodies that are attacking a fairly harmless thing like plant pollen.* +*Allergies are caused by antibodies that are attacking a fairly harmless thing +like plant pollen.* -However, sometimes antibodies can be bad, for instance in situations like organ transplantation, because they can attack -an organ after it is transplanted, and cause the immune system to destroy it. Most of the time these antibodies are +However, sometimes antibodies can be bad, for instance in situations like organ +transplantation, because they can attack +an organ after it is transplanted, and cause the immune system to destroy it. +Most of the time these antibodies are directed against HLA. -The patient's antibodies are found by a special lab test. This test does not find the antibodies directly but tests which antigens (from a limited set) the patient has the antibodies against. The lab test can differ from lab to lab, each can use a bit different set of antigens in the test. +The patient's antibodies are found by a special lab test. This test does not +find the antibodies directly but tests which antigens (from a limited set) the +patient has the antibodies against. The lab test can differ from lab to lab, +each can use a bit different set of antigens in the test. -For each antigen, the test reports an MFI value, higher MFI values indicate the stronger immunological response. The lab then uses some cutoff value to distinguish which antibodies of the patient are strong enough and which are not. This cutoff can differ between labs and in some special cases it can be set differently for patients from the same lab (in the case the patient really needs a kidney and the transplant is worth it even with a small immunological response). +For each antigen, the test reports an MFI value, higher MFI values indicate the +stronger immunological response. The lab then uses some cutoff value to +distinguish which antibodies of the patient are strong enough and which are not. +This cutoff can differ between labs and in some special cases it can be set +differently for patients from the same lab (in the case the patient really needs +a kidney and the transplant is worth it even with a small immunological +response). Further we will be using terms: -- Positive antibody of a patient: antibody of the patient was in a lab test higher or equal to cutoff (we use also "over cutoff"). -- Negative antibody of a patient: antibody of the patient was in a lab test strictly lower than the cutoff (we use also "below"). + +- Positive antibody of a patient: antibody of the patient was in a lab test + higher or equal to cutoff (we use also "over cutoff"). +- Negative antibody of a patient: antibody of the patient was in a lab test + strictly lower than the cutoff (we use also "below"). - All tested antibodies of a patient: all antibodies the patient was tested for. -The parsing is done in two modes, type A and type B. Both of them are described below. (The name is purely our, it has no connection with any term used in immunology). The decision which parsing mode is selected is simple, if requirements for type A are fulfilled, type A processing runs, otherwise we fall back to type B. +The parsing is done in two modes, type A and type B. Both of them are described +below. (The name is purely our, it has no connection with any term used in +immunology). The decision which parsing mode is selected is simple, if +requirements for type A are fulfilled, type A processing runs, otherwise we fall +back to type B. + +Type A requires that all antibodies are in high resolution and having all tested +antibodies of a patient. We assume that if the criteria below are fulfilled this +holds. -Type A requires that all antibodies are in high resolution and having all tested antibodies of a patient. We assume that if the criteria below are fulfilled this holds. - All antibodies we receive are in high resolution. - There are at least 20 antibodies provided. - There is at least 1 antibody below the cutoff. ### Processing logic of type A -In this case, we assume we have received all tested antibodies in high resolution with MFI values and the required cutoff (The cutoff is configurable. In some cases the user can decide to change it for some patients, for more details see section Configuring Cutoff). -This case can handle also an antibody in the form of DP*[01:01;02:02]. It uses an algorithm that parses the specific antibodies against alpha and beta chains. In case there is some unclear case it raises a warning and requires an immunologist to check the correctness of the algorithm result. +In this case, we assume we have received all tested antibodies in high +resolution with MFI values and the required cutoff (The cutoff is configurable. +In some cases the user can decide to change it for some patients, for more +details see section Configuring Cutoff). + +This case can handle also an antibody in the form of DP*[01:01;02:02]. It uses +an algorithm that parses the specific antibodies against alpha and beta chains. +In case there is some unclear case it raises a warning and requires an +immunologist to check the correctness of the algorithm result. -There are three reasons why we ask for all tested antibodies of a patient and not only the positive ones: -- It is required for the algorithm that is parsing antibodies of type DP*[01:01;02:02], see the detailed description of the algorithm below. -- In case the user wants to alter MFI, the antibodies that were negative can become positive. -- When estimating crossmatch, sometimes it is crucial to have the full picture. (See below HIGH_RES and HIGH_RES_WITH_SPLIT crossmatch types where type A is required.) +There are three reasons why we ask for all tested antibodies of a patient and +not only the positive ones: + +- It is required for the algorithm that is parsing antibodies of type + DP*[01:01;02:02], see the detailed description of the algorithm below. +- In case the user wants to alter MFI, the antibodies that were negative can + become positive. +- When estimating crossmatch, sometimes it is crucial to have the full + picture. (See below HIGH_RES and HIGH_RES_WITH_SPLIT crossmatch types where + type A is required.) ### Processing logic of type B -In this case, we do not get all the antibodies the test was done for, we get the antibodies in split or mixed resolution. In this case, the results are limited: + +In this case, we do not get all the antibodies the test was done for, we get the +antibodies in split or mixed resolution. In this case, the results are limited: + - Processing of antibodies such as DP*[01:01;02:02] is not allowed. - MFI modification can be done but lead to omitting some antibodies. -- Some crossmatches might not be found. (See below HIGH_RES and HIGH_RES_WITH_SPLIT crossmatch types where type A is required.). This is more important in the case the antibodies are in high resolution. Because in split it can be usually quite safely assumed that all split antibodies were tested. +- Some crossmatches might not be found. (See below HIGH_RES and + HIGH_RES_WITH_SPLIT crossmatch types where type A is required.). This is more + important in the case the antibodies are in high resolution. Because in split + it can be usually quite safely assumed that all split antibodies were tested. ## Crossmatch -The ultimate test to determine if a donor is compatible with a patient is called a crossmatch. The crossmatch determines +The ultimate test to determine if a donor is compatible with a patient is called +a crossmatch. The crossmatch determines if a patient has antibodies to a particular donor. You can either test for a crossmatch in the lab, or virtually. -When you test it in the lab, the crossmatch is performed by mixing the patient’s serum (the part of the blood where -antibodies are) with the donor's cells. If the patient has antibodies, the crossmatch is positive. +When you test it in the lab, the crossmatch is performed by mixing the patient’s +serum (the part of the blood where +antibodies are) with the donor's cells. If the patient has antibodies, the +crossmatch is positive. -When you perform the test virtually, you do it like we do in TXM and check whether the recipient has antibodies against +When you perform the test virtually, you do it like we do in TXM and check +whether the recipient has antibodies against any HLAs the donor has been typed for programmatically. ### Virtual crossmatch in TXM -In the case of a lab crossmatch there either is a crossmatch or there is not. But in the case of virtual crossmatch, it is always only an approximation of reality and estimation of a likelihood of a crossmatch. Therefore, in cooperation with immunologists, we have concluded that it makes sense to have several levels of virtual crossmatch. +In the case of a lab crossmatch there either is a crossmatch or there is not. +But in the case of virtual crossmatch, it is always only an approximation of +reality and estimation of a likelihood of a crossmatch. Therefore, in +cooperation with immunologists, we have concluded that it makes sense to have +several levels of virtual crossmatch. -Some crossmatch levels or ways to find a crossmatch are meaningful only in the case of processing logic of type A, because with type B we have less information. +Some crossmatch levels or ways to find a crossmatch are meaningful only in the +case of processing logic of type A, because with type B we have less +information. -Below we describe all the different crossmatch levels. For each level, we describe a crossmatch for one specific antigen of the donor. +Below we describe all the different crossmatch levels. For each level, we +describe a crossmatch for one specific antigen of the donor. #### HIGH RES -1. donor antigen is in high resolution and the recipient has an antibody against the exact antigen. -2. donor antigen is in high resolution and the recipient is type A parsed and was not tested for donor's antigen. But all tested antibodies that match the donor's antigen in split resolution are positive (and there is at least one such antibody). -3. donor antigen is in split/broad resolution and the recipient is type A parsed and all tested antibodies that match donor's antigen in split/broad resolution are positive (and there is at least one such antibody). +1. donor antigen is in high resolution and the recipient has an antibody against + the exact antigen. +2. donor antigen is in high resolution and the recipient is type A parsed and + was not tested for donor's antigen. But all tested antibodies that match the + donor's antigen in split resolution are positive (and there is at least one + such antibody). +3. donor antigen is in split/broad resolution and the recipient is type A parsed + and all tested antibodies that match donor's antigen in split/broad + resolution are positive (and there is at least one such antibody). -Example for case 1: donor has antigen DRB1\*08:18, and the recipient has antibody DRB1\*08:18. +Example for case 1: donor has antigen DRB1\*08:18, and the recipient has +antibody DRB1\*08:18. -Example for case 3: donor has antigen DR8, and the recipient has antibodies DRB1\*08:01, DRB1\*08:02, ... DRB1\*08:18 and all are positive. +Example for case 3: donor has antigen DR8, and the recipient has antibodies +DRB1\*08:01, DRB1\*08:02, ... DRB1\*08:18 and all are positive. #### SPLIT -1. Donor antigen is in split resolution and the recipient has a matching antibody in split or high resolution (after conversion) -2. Donor antigen is in high resolution and the recipient is type B and the recipient has a matching antibody in split resolution -Example for case 1: donor has antigen DQ8 and the recipient has antibody DRB1\*08:01 or donor has antigen DQ8 and the recipient has antibody DQ8 +1. Donor antigen is in split resolution and the recipient has a matching + antibody in split or high resolution (after conversion) +2. Donor antigen is in high resolution and the recipient is type B and the + recipient has a matching antibody in split resolution +Example for case 1: donor has antigen DQ8 and the recipient has antibody +DRB1\*08:01 or donor has antigen DQ8 and the recipient has antibody DQ8 #### HIGH_RES_WITH_SPLIT -1. Donor antigen is in split resolution and the recipient is type A parsed. Some antibodies that match donors' antigens in split resolution are positive and some are negative. -2. This criterion is more complex. Here we list the requirements in a list: - 1. Donor antigen is in high resolution. - 2. The recipient is type A parsed. - 3. Donor's antigen is not in the set of all tested antibodies. - 4. Some antibodies that match donor's antigens in split resolution are positive and some are negative. -Example for case 1: donor has antigen DR8, and the recipient has antibodies DRB1\*08:01 and DRB1\*08:18 and only one is over +1. Donor antigen is in split resolution and the recipient is type A parsed. Some + antibodies that match donors' antigens in split resolution are positive and + some are negative. +2. This criterion is more complex. Here we list the requirements in a list: + 1. Donor antigen is in high resolution. + 2. The recipient is type A parsed. + 3. Donor's antigen is not in the set of all tested antibodies. + 4. Some antibodies that match donor's antigens in split resolution are + positive and some are negative. + +Example for case 1: donor has antigen DR8, and the recipient has antibodies +DRB1\*08:01 and DRB1\*08:18 and only one is over the cutoff. Example for case 3: + - Donor has antigen DRB1\*08:01 - Cutoff is 2000 - and we received the following antibodies for the recipient: - - DRB1\*08:02 with MFI 2500 - - DRB1\*08:03 with MFI 1800 + - DRB1\*08:02 with MFI 2500 + - DRB1\*08:03 with MFI 1800 #### BROAD -1. Donor antigen is in broad resolution and the recipient has a matching antibody in split/broad/high resolution -2. Donor antigen is in high/split/broad resolution and the recipient is type B and the recipient has a matching antibody in broad resolution -Example for both cases: donor has antigen DQ3 and the recipient has antibody DQ3. +1. Donor antigen is in broad resolution and the recipient has a matching + antibody in split/broad/high resolution +2. Donor antigen is in high/split/broad resolution and the recipient is type B + and the recipient has a matching antibody in broad resolution + +Example for both cases: donor has antigen DQ3 and the recipient has antibody +DQ3. #### HIGH_RES_WITH_BROAD -Donor antigen is in broad resolution and the recipient is type A parsed. Some antibodies that match donors' antigen in broad resolution are positive and some are negative. -Example: Donor has antigen A9 and the recipient has antibodies A\*23:01, A\*24:02 and A\*23:04 and at least one +Donor antigen is in broad resolution and the recipient is type A parsed. Some +antibodies that match donors' antigen in broad resolution are positive and some +are negative. + +Example: Donor has antigen A9 and the recipient has antibodies A\*23:01, A\*24: +02 and A\*23:04 and at least one is over the cutoff, and at least one is below the cutoff. #### UNDECIDABLE -The recipient has antibodies (of any specificity) against antigens that the donor has not been typed for. -Example: the donor has not been typed for DP and DQ antigens, but the recipient has an antibody DQB1*03:10. +The recipient has antibodies (of any specificity) against antigens that the +donor has not been typed for. + +Example: the donor has not been typed for DP and DQ antigens, but the recipient +has an antibody DQB1*03:10. ## What is MFI and cutoff? -MFI stands for Mean Fluorescence Intensity. The MFI is supposed to measure the shift in fluorescence intensity of a -population of cells. Basically it is saying how strong an antibody is, and whether to perceive it as a threat. That’s -why we define “cutoffs”. They are thresholds that indicate which antibodies are dangerous for the transplantation. +MFI stands for Mean Fluorescence Intensity. The MFI is supposed to measure the +shift in fluorescence intensity of a +population of cells. Basically it is saying how strong an antibody is, and +whether to perceive it as a threat. That’s +why we define “cutoffs”. They are thresholds that indicate which antibodies are +dangerous for the transplantation. ## What is PRA? -A panel-reactive antibody (PRA) is a group of antibodies in a test serum that are reactive against any of several known +A panel-reactive antibody (PRA) is a group of antibodies in a test serum that +are reactive against any of several known specific antigens. -It is an immunologic test routinely performed by clinical laboratories on the blood of people awaiting organ -transplantation. In this test recipient cells are exposed to random cells of donor population and estimation risk of +It is an immunologic test routinely performed by clinical laboratories on the +blood of people awaiting organ +transplantation. In this test recipient cells are exposed to random cells of +donor population and estimation risk of acute rejection. -The PRA score is expressed as a percentage between 0% and 100%. It represents the proportion of the population to which -the person being tested will react via pre-existing antibodies against human cell surface antigens. +The PRA score is expressed as a percentage between 0% and 100%. It represents +the proportion of the population to which +the person being tested will react via pre-existing antibodies against human +cell surface antigens. ## Square bracket antibody parsing algorithm -When we receive antibodies in the notation DP*[01:01;02:02], we use a special -algorithm to determine whether there are antibodies against both alpha and +When we receive antibodies in the notation DP*[01:01;02:02], we use a special +algorithm to determine whether there are antibodies against both alpha and beta alleles or just one of them. ### Algorithm description @@ -258,26 +378,33 @@ Let us first explain the terminology we used to describe the algorithm: We parse each antibody one by one and detect several situations: #### 1. Antibody chain is negative + ```text Example: DP*[01:01;02:02] MFI 100, cutoff 2000 DP*[01:01;03:03] MFI 200, cutoff 2000 DP*[03:03;02:02] MFI 3000, cutoff 2000 ``` -In this case, the chain `DPA1*01:01` is negative because there is no representation -of this chain with MFI above the cutoff among all antibodies. + +In this case, the chain `DPA1*01:01` is negative because there is no +representation +of this chain with MFI above the cutoff among all antibodies. As a result, we parse this chain as: + ```text DPA1*01:01 MFI 150 (average MFI), cutoff 2000 ``` -Please note that the chain `DPB1*02:02` is not negative because it has a positive -representation in the antibody `DP*[03:03;02:02] MFI 3000, cutoff 20000`. +Please note that the chain `DPB1*02:02` is not negative because it has a +positive +representation in the antibody `DP*[03:03;02:02] MFI 3000, cutoff 20000`. Therefore, this chain is mixed. -Similarly, the chain `DPB1*03:03` is negative and parsed in the same way as `DPA1*01:01`. +Similarly, the chain `DPB1*03:03` is negative and parsed in the same way +as `DPA1*01:01`. #### 2. Both chains are only positive + ```text Example: DP*[03:03;02:02] MFI 3000, cutoff 2000 @@ -285,19 +412,24 @@ DP*[01:01;03:03] MFI 200, cutoff 2000 DP*[03:03;01:01] MFI 2100, cutoff 2000 DP*[04:01;03:03] MFI 3000, cutoff 2000 ``` -In this case, the antibody `DP*[03:03;02:02]` has both chains positive because -either `DPA1*03:03` or `DPB1*02:02` have only positive MFIs among all antibodies. + +In this case, the antibody `DP*[03:03;02:02]` has both chains positive because +either `DPA1*03:03` or `DPB1*02:02` have only positive MFIs among all +antibodies. As a result, we parse this antibody as two separate chains: + ```text DPA1*03:03 MFI 2550 (average MFI), cutoff 2000 DPB1*02:02 MFI 3000 (average MFI), cutoff 2000 ``` -The antibody `DP*[03:03;01:01]` is also only positive. However, `DP*[04:01;03:03]` -is not positive because it has negative representation of the +The antibody `DP*[03:03;01:01]` is also only positive. +However, `DP*[04:01;03:03]` +is not positive because it has negative representation of the chain `DPB1*03:03` in the antibody `DP*[01:01;03:03]`. #### 3. One chain is only positive, another one is mixed: + ```text Example: DP*[03:03;02:02] MFI 3000, cutoff 2000 @@ -307,30 +439,36 @@ DP*[03:01;01:05] MFI 2500, cutoff 2000 DP*[01:01;01:05] MFI 200, cutoff 2000 DP*[03:01;06:02] MFI 100, cutoff 2000 ``` -In this case, the antibody `DP*[01:03;02:02]` has only a positive chain, -`DPA1*03:03`, and a mixed chain, `DPB1*02:02`, because `DPB1*02:02` has a negative -MFI representation in the antibody `DP*[01:01;02:02]` with an + +In this case, the antibody `DP*[01:03;02:02]` has only a positive chain, +`DPA1*03:03`, and a mixed chain, `DPB1*02:02`, because `DPB1*02:02` has a +negative +MFI representation in the antibody `DP*[01:01;02:02]` with an MFI of 100 (below the cutoff of 2000), while `DPA1*03:03` does not. -As a result, we parse the positive chain `DPA1*03:03` with its average MFI among +As a result, we parse the positive chain `DPA1*03:03` with its average MFI among all antibodies with this chain: + ```text DPA1*03:03 MFI 3000 (average MFI), cutoff 2000 ``` This mixed chain `DPB1*02:02`, which has positive representation just in this antibody `DP*[01:03;02:02]` (there aren't any other -antibodies where this chain has positive MFI), is parsed as +antibodies where this chain has positive MFI), is parsed as + ```text DPB1*02:02 MFI 100 (average negative MFI), cutoff 2000 ``` -Pay attention that a similar mixed chain, `DPB1*01:05`, -but for the antibody `DP*[04:01;01:05]`, is not parsed through this antibody but -through the `DP*[03:01;01:05]` antibody, as explained in the next section. -In summary, if there are several positive representations in this positive + mixed case, +Pay attention that a similar mixed chain, `DPB1*01:05`, +but for the antibody `DP*[04:01;01:05]`, is not parsed through this antibody but +through the `DP*[03:01;01:05]` antibody, as explained in the next section. +In summary, if there are several positive representations in this positive + +mixed case, we expect to parse this mixed chain through other antibodies. #### 4. Both chains are mixed + ```text Example: DP*[03:03;02:02] MFI 3000, cutoff 2000 @@ -338,24 +476,37 @@ DP*[01:01;02:02] MFI 100, cutoff 2000 DP*[03:03;04:01] MFI 200, cutoff 2000 DP*[03:03;05:02] MFI 2200, cutoff 2000 ``` -In this case, the antibody `DP*[03:03;02:02]` has both chains as mixed because its chains, -`DPA1*03:03` and `DPB1*02:02`, have negative representation in the antibodies -`DP*[03:03;04:01]` and `DP*[01:01;02:02]`, respectively. + +In this case, the antibody `DP*[03:03;02:02]` has both chains as mixed because +its chains, +`DPA1*03:03` and `DPB1*02:02`, have negative representation in the antibodies +`DP*[03:03;04:01]` and `DP*[01:01;02:02]`, respectively. As a result, we parse this double antibody in its entirety as follows: + ```text DP*[03:03;02:02] MFI 3000, cutoff 2000 ``` We also parse its two theoretical chains separately as follows: + ```text DPA1*03:03 MFI 2600 (average positive MFI), cutoff 2000 DPB1*02:02 MFI 3000 (average positive MFI), cutoff 2000 ``` + We always notify the user if theoretical antibodies are presented. ### The algorithm scheme -The algorithm scheme is represented in this PDF + +The algorithm scheme is represented in this PDF [file](double_antibodies_parsing/double_antibodies_parsing_algorithm.pdf). ## Configuring cutoff -The original cutoff can be sometimes configured. The usual reason is that there is a patient that really needs a kidney and is highly immunized. In this case, it might be worth it for the patient to get a kidney from a donor against whom the patient has antibodies. However, only antibodies with MFI only slightly over the original cutoff. This is possible in the app via an increase in the cutoff of the patient. Whether to increase the cutoff and how much is always up to the user to decide. + +The original cutoff can be sometimes configured. The usual reason is that there +is a patient that really needs a kidney and is highly immunized. In this case, +it might be worth it for the patient to get a kidney from a donor against whom +the patient has antibodies. However, only antibodies with MFI only slightly over +the original cutoff. This is possible in the app via an increase in the cutoff +of the patient. Whether to increase the cutoff and how much is always up to the +user to decide. diff --git a/documentation/README_TECH.md b/documentation/README_TECH.md index ec9dfe235..995592187 100644 --- a/documentation/README_TECH.md +++ b/documentation/README_TECH.md @@ -1,7 +1,9 @@ ## Square bracket antibody parsing algorithm -When we receive antibodies in the notation DP*[01:01;02:02], we use a special algorithm -to determine whether there are antibodies against both alpha and beta alleles or just one of them. +When we receive antibodies in the notation DP*[01:01;02:02], we use a special +algorithm +to determine whether there are antibodies against both alpha and beta alleles or +just one of them. ### Algorithm description @@ -14,39 +16,60 @@ Let us first explain the terminology we used to describe the algorithm: * "negative MFI" is the MFI value below the cutoff. At the beginning of the algorithm execution, we have three lists: -1. `antibodies` - a list of all antibodies to parse. -2. `parsed` - a list of parsed antibodies. -3. `parsing_issues` - a list of parsing issues that occur during the algorithm execution. -We parse each antibody in the list of `antibodies` one by one using a for-loop. If both chains of the antibody are -already in the `parsed` list, we move on to the next antibody. +1. `antibodies` - a list of all double antibodies to parse. +2. `parsed` - a list of parsed antibodies (at the beginning includes all parsed + single antibodies). +3. `parsing_issues` - a list of parsing issues that occur during the algorithm + execution. -If at least one of the chains is not in the `parsed` list yet, we examine the antibody with the following logic: +We parse each antibody in the list of `antibodies` one by one using a for-loop. +If both chains of the antibody are +already in the `parsed` list, we move on to the next antibody. + +If at least one of the chains is not in the `parsed` list yet, we examine the +antibody with the following logic:
First, we check if the antibody has a positive MFI. #### Double antibody has a positive MFI: -If **both antibody chains have only positive MFI representation** among all the antibodies -in the list for parsing, we add each chain **separately** to the `parsed` list with the arithmetic mean of the MFI from all antibodies with this chain in the list.

-If **one of the chains has at least one negative MFI representation** and the **other chain has only positive MFI representation** -among other antibodies in the list, we add the **chain with only positive MFI representation** to the `parsed` -list with the arithmetic mean of the MFI from all antibodies with this chain. For the **chain with mixed MFI representation**, -if this is the only positive occurrence of this chain, we add it to the `parsed` list with the arithmetic mean -of the MFI from all antibodies with negative MFI for this chain in the list. -However, if there is another positive occurrence for this chain, we skip it.

-If **both chains have at least one negative MFI among other antibodies**, -we add them to the `parsed` list as one double antibody with the provided MFI. -Moreover, we add each chain **separately** to the `parsed` list, and we denote their type as "theoretical", -with the arithmetic mean of the positive MFI from all antibodies with this chain in the list. + +If **both antibody chains have only positive MFI representation** among all the +antibodies +in the list for parsing, we add each chain **separately** to the `parsed` list +with the arithmetic mean of the MFI from all antibodies with this chain in the +list.

+If **one of the chains has at least one negative MFI representation** and the * +*other chain has only positive MFI representation** +among other antibodies in the list, we add the **chain with only positive MFI +representation** to the `parsed` +list with the arithmetic mean of the MFI from all antibodies with this chain. +For the **chain with mixed MFI representation**, +if this is the only positive occurrence of this chain, we add it to the `parsed` +list with the arithmetic mean +of the MFI from all antibodies with negative MFI for this chain in the list. +However, if there is another positive occurrence for this chain, we skip +it.

+If **both chains have at least one negative MFI among other antibodies**, +we add them to the `parsed` list as one double antibody with the provided MFI. +Moreover, we add each chain **separately** to the `parsed` list, and we denote +their type as "theoretical", +with the arithmetic mean of the positive MFI from all antibodies with this chain +in the list. Finally, we add a parsing issue about this to the `parsing_issue` list. #### Double antibody has a negative MFI: -We check each chain of the antibody separately, and if that chain has **only negative MFI representation** -among other antibodies in the list, we add this chain to the `parsed` list with the arithmetic mean of + +We check each chain of the antibody separately, and if that chain has **only +negative MFI representation** +among other antibodies in the list, we add this chain to the `parsed` list with +the arithmetic mean of the MFI from all antibodies in the list. Otherwise, we skip this chain. ### The algorithm scheme -The algorithm scheme is represented in this PDF + +The algorithm scheme is represented in this PDF [file](double_antibodies_parsing/double_antibodies_parsing_algorithm.pdf). -**P.S.** The last time this algorithm was in the `_add_double_hla_antibodies` function. \ No newline at end of file +**P.S.** The last time this algorithm was in the `_add_double_hla_antibodies` +function. \ No newline at end of file From f979f0e1f85d4d610c4faccbd9e2018717a1fdd8 Mon Sep 17 00:00:00 2001 From: abragtim Date: Tue, 9 May 2023 09:01:09 +0200 Subject: [PATCH 19/24] Add small fixes in formulations. --- documentation/README.md | 6 +++--- documentation/README_TECH.md | 10 ++++++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/documentation/README.md b/documentation/README.md index 509fddad4..677bd6dd3 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -440,7 +440,7 @@ DP*[01:01;01:05] MFI 200, cutoff 2000 DP*[03:01;06:02] MFI 100, cutoff 2000 ``` -In this case, the antibody `DP*[01:03;02:02]` has only a positive chain, +In this case, the antibody `DP*[03:03;02:02]` has only a positive chain, `DPA1*03:03`, and a mixed chain, `DPB1*02:02`, because `DPB1*02:02` has a negative MFI representation in the antibody `DP*[01:01;02:02]` with an @@ -463,8 +463,8 @@ DPB1*02:02 MFI 100 (average negative MFI), cutoff 2000 Pay attention that a similar mixed chain, `DPB1*01:05`, but for the antibody `DP*[04:01;01:05]`, is not parsed through this antibody but through the `DP*[03:01;01:05]` antibody, as explained in the next section. -In summary, if there are several positive representations in this positive + -mixed case, +In summary, if we detect the mixed chain, which has several positive +representations among all the antibodies, in the positive + mixed double antibody, we expect to parse this mixed chain through other antibodies. #### 4. Both chains are mixed diff --git a/documentation/README_TECH.md b/documentation/README_TECH.md index 995592187..8b8a7bba4 100644 --- a/documentation/README_TECH.md +++ b/documentation/README_TECH.md @@ -71,5 +71,11 @@ the MFI from all antibodies in the list. Otherwise, we skip this chain. The algorithm scheme is represented in this PDF [file](double_antibodies_parsing/double_antibodies_parsing_algorithm.pdf). -**P.S.** The last time this algorithm was in the `_add_double_hla_antibodies` -function. \ No newline at end of file +### Where is this algorithm implemented + +Antibodies in generall are parsed +in `parse_hla_antibodies_raw_and_return_parsing_issue_list` function. The +antibodies raw codes are preprocessed, and single and double antibodies are +parsed separately afterwards. Double antibodies are parsed +in `_add_double_hla_antibodies` function which uses the algorithm described +above. From 2834d1a81c6e3ecdb03403f330011f319b5a2b67 Mon Sep 17 00:00:00 2001 From: abragtim Date: Tue, 9 May 2023 23:37:03 +0200 Subject: [PATCH 20/24] Add small english formulation fix. --- documentation/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/documentation/README.md b/documentation/README.md index 677bd6dd3..dfbba1bb5 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -463,9 +463,9 @@ DPB1*02:02 MFI 100 (average negative MFI), cutoff 2000 Pay attention that a similar mixed chain, `DPB1*01:05`, but for the antibody `DP*[04:01;01:05]`, is not parsed through this antibody but through the `DP*[03:01;01:05]` antibody, as explained in the next section. -In summary, if we detect the mixed chain, which has several positive -representations among all the antibodies, in the positive + mixed double antibody, -we expect to parse this mixed chain through other antibodies. +In summary, if we encounter this positive and mixed chain case where the mixed +chain has several positive representations among all the antibodies, +we expect to parse the mixed chain through other antibodies. #### 4. Both chains are mixed From 1370aad208e69bddcef2a4b85de29805a8f04fbb Mon Sep 17 00:00:00 2001 From: Timur Abragimovich Date: Wed, 10 May 2023 10:42:13 +0200 Subject: [PATCH 21/24] Fix small typos. Co-authored-by: Jakub Monhart Fix small typos. Co-authored-by: Jakub Monhart Fix small typos. Co-authored-by: Jakub Monhart Fix small typos. Co-authored-by: Jakub Monhart --- documentation/README.md | 6 +++--- documentation/README_TECH.md | 5 ++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/documentation/README.md b/documentation/README.md index dfbba1bb5..5fb3447cd 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -414,7 +414,7 @@ DP*[04:01;03:03] MFI 3000, cutoff 2000 ``` In this case, the antibody `DP*[03:03;02:02]` has both chains positive because -either `DPA1*03:03` or `DPB1*02:02` have only positive MFIs among all +both `DPA1*03:03` and `DPB1*02:02` have only positive MFIs among all antibodies. As a result, we parse this antibody as two separate chains: @@ -440,7 +440,7 @@ DP*[01:01;01:05] MFI 200, cutoff 2000 DP*[03:01;06:02] MFI 100, cutoff 2000 ``` -In this case, the antibody `DP*[03:03;02:02]` has only a positive chain, +In this case, the antibody `DP*[03:03;02:02]` has an only positive chain, `DPA1*03:03`, and a mixed chain, `DPB1*02:02`, because `DPB1*02:02` has a negative MFI representation in the antibody `DP*[01:01;02:02]` with an @@ -480,7 +480,7 @@ DP*[03:03;05:02] MFI 2200, cutoff 2000 In this case, the antibody `DP*[03:03;02:02]` has both chains as mixed because its chains, `DPA1*03:03` and `DPB1*02:02`, have negative representation in the antibodies -`DP*[03:03;04:01]` and `DP*[01:01;02:02]`, respectively. +`DP*[03:03;04:01]` and `DP*[01:01;02:02]` respectively. As a result, we parse this double antibody in its entirety as follows: ```text diff --git a/documentation/README_TECH.md b/documentation/README_TECH.md index 8b8a7bba4..0a60d3891 100644 --- a/documentation/README_TECH.md +++ b/documentation/README_TECH.md @@ -73,9 +73,8 @@ The algorithm scheme is represented in this PDF ### Where is this algorithm implemented -Antibodies in generall are parsed -in `parse_hla_antibodies_raw_and_return_parsing_issue_list` function. The -antibodies raw codes are preprocessed, and single and double antibodies are +Antibodies in general are parsed +in `parse_hla_antibodies_raw_and_return_parsing_issue_list` function. The antibodies' raw codes are preprocessed, and single and double antibodies are parsed separately afterwards. Double antibodies are parsed in `_add_double_hla_antibodies` function which uses the algorithm described above. From 69b1da452b7653701f4f645a17b45c4b19342ddd Mon Sep 17 00:00:00 2001 From: abragtim Date: Wed, 10 May 2023 10:53:44 +0200 Subject: [PATCH 22/24] Add small description for positive + mixed case. --- documentation/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/documentation/README.md b/documentation/README.md index 5fb3447cd..e2362b68c 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -459,6 +459,8 @@ antibodies where this chain has positive MFI), is parsed as ```text DPB1*02:02 MFI 100 (average negative MFI), cutoff 2000 ``` +We suppose that the positive MFI is caused by the second chain, +so we do not consider this positive value for the mixed `DPB1*02:02` chain. Pay attention that a similar mixed chain, `DPB1*01:05`, but for the antibody `DP*[04:01;01:05]`, is not parsed through this antibody but From 6f0d5ad7adde17ead58003b611d80fdc190a9212 Mon Sep 17 00:00:00 2001 From: abragtim Date: Thu, 11 May 2023 08:36:33 +0200 Subject: [PATCH 23/24] Add crossmatch description for double antibodies. --- documentation/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/documentation/README.md b/documentation/README.md index e2362b68c..9cc3bf333 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -196,6 +196,9 @@ details see section Configuring Cutoff). This case can handle also an antibody in the form of DP*[01:01;02:02]. It uses an algorithm that parses the specific antibodies against alpha and beta chains. +After parsing, most double antibodies are decomposed into separate chains and +analyzed as normal single antibodies. The remaining double antibodies for a positive +crossmatch must have a positive crossmatch for each of their chains. In case there is some unclear case it raises a warning and requires an immunologist to check the correctness of the algorithm result. From 7f4e79afd0f0355ff30104257c4095c068360eea Mon Sep 17 00:00:00 2001 From: abragtim Date: Mon, 22 May 2023 16:05:36 +0200 Subject: [PATCH 24/24] Use only non-tech version (tech version violates the DRY concept). --- documentation/README_TECH.md | 80 ---------------------------- txmatching/patients/hla_functions.py | 2 + 2 files changed, 2 insertions(+), 80 deletions(-) delete mode 100644 documentation/README_TECH.md diff --git a/documentation/README_TECH.md b/documentation/README_TECH.md deleted file mode 100644 index 0a60d3891..000000000 --- a/documentation/README_TECH.md +++ /dev/null @@ -1,80 +0,0 @@ -## Square bracket antibody parsing algorithm - -When we receive antibodies in the notation DP*[01:01;02:02], we use a special -algorithm -to determine whether there are antibodies against both alpha and beta alleles or -just one of them. - -### Algorithm description - -Let us first explain the terminology we used to describe the algorithm: - -* "double antibody" refers to an antibody enclosed in square brackets. -* "alpha chain" refers to the first code of a double antibody. -* "beta chain" refers to the second code of a double antibody. -* "positive MFI" is the MFI value that is equal to or above the cutoff. -* "negative MFI" is the MFI value below the cutoff. - -At the beginning of the algorithm execution, we have three lists: - -1. `antibodies` - a list of all double antibodies to parse. -2. `parsed` - a list of parsed antibodies (at the beginning includes all parsed - single antibodies). -3. `parsing_issues` - a list of parsing issues that occur during the algorithm - execution. - -We parse each antibody in the list of `antibodies` one by one using a for-loop. -If both chains of the antibody are -already in the `parsed` list, we move on to the next antibody. - -If at least one of the chains is not in the `parsed` list yet, we examine the -antibody with the following logic: -
-First, we check if the antibody has a positive MFI. - -#### Double antibody has a positive MFI: - -If **both antibody chains have only positive MFI representation** among all the -antibodies -in the list for parsing, we add each chain **separately** to the `parsed` list -with the arithmetic mean of the MFI from all antibodies with this chain in the -list.

-If **one of the chains has at least one negative MFI representation** and the * -*other chain has only positive MFI representation** -among other antibodies in the list, we add the **chain with only positive MFI -representation** to the `parsed` -list with the arithmetic mean of the MFI from all antibodies with this chain. -For the **chain with mixed MFI representation**, -if this is the only positive occurrence of this chain, we add it to the `parsed` -list with the arithmetic mean -of the MFI from all antibodies with negative MFI for this chain in the list. -However, if there is another positive occurrence for this chain, we skip -it.

-If **both chains have at least one negative MFI among other antibodies**, -we add them to the `parsed` list as one double antibody with the provided MFI. -Moreover, we add each chain **separately** to the `parsed` list, and we denote -their type as "theoretical", -with the arithmetic mean of the positive MFI from all antibodies with this chain -in the list. -Finally, we add a parsing issue about this to the `parsing_issue` list. - -#### Double antibody has a negative MFI: - -We check each chain of the antibody separately, and if that chain has **only -negative MFI representation** -among other antibodies in the list, we add this chain to the `parsed` list with -the arithmetic mean of -the MFI from all antibodies in the list. Otherwise, we skip this chain. - -### The algorithm scheme - -The algorithm scheme is represented in this PDF -[file](double_antibodies_parsing/double_antibodies_parsing_algorithm.pdf). - -### Where is this algorithm implemented - -Antibodies in general are parsed -in `parse_hla_antibodies_raw_and_return_parsing_issue_list` function. The antibodies' raw codes are preprocessed, and single and double antibodies are -parsed separately afterwards. Double antibodies are parsed -in `_add_double_hla_antibodies` function which uses the algorithm described -above. diff --git a/txmatching/patients/hla_functions.py b/txmatching/patients/hla_functions.py index d2230dd3b..b9e1b5742 100644 --- a/txmatching/patients/hla_functions.py +++ b/txmatching/patients/hla_functions.py @@ -144,6 +144,8 @@ def _group_key(hla_antibody: HLAAntibody) -> str: # pylint: disable=too-many-branches # pylint: disable=too-many-nested-blocks +# The algorithm scheme is represented in this PDF +# documentation/double_antibodies_parsing/double_antibodies_parsing_algorithm.pdf. def _add_double_hla_antibodies(antibody_list_double_code: List[HLAAntibody], single_antibodies_joined: List[HLAAntibody]) -> \ Tuple[List[ParsingIssueBase], List[HLAAntibody]]: