Algorithm 2b. UWWTD: Treatment and Performance Compliance (more stringent treatment)#

Overview#

Wastewater treatment compliance based on the type of required treatment, presence of actual treatment, and performance metrics.

It assigns compliance results (C = Compliant, NC = Non Compliant), treatment and performance flags.

Simplified Logic#

1. Look up the “Required” treatment type#

  • From Algorithm 1 (result_required).

  • Could be things like:

    • “phosphorus”

    • “nitrogen”

    • “other”

    • “(aN+aP)”

    • “(aP+b)”

    • “(aP+b+c)”

2. Decision Tree per Required Case#

For each required case, it runs a branch of the decision tree:

  • Does the plant have the right infrastructure?

    • (e.g., nitrogen removal installed?)

  • Did the plant’s performance tests pass for the relevant pollutants?

3. Outputs#

  • result_treatment → whether the plant has the right equipment.

  • result_performance → whether the plant’s monitoring shows compliant performance.

  • result_compliance

    • “C” (compliant) or

    • “NC” (non-compliant)

Decision Tree#

        graph LR
ROOT["More stringent treatment (uwwOtherTreatment)"]

%% The 11 root branches
ROOT --> B1["More Stringent Nitrogen and Phosphorus (aN + aP) or (rcaParameterN+rcaParameterP)"]
ROOT --> B2["More Stringent Phosphorus (aP) or (rcaParameterP)"]
ROOT --> B3["More Stringent Nitrogen (aN) or (rcaParameterN)"]
ROOT --> B4["More Stringent Nitrogen (b)"]
ROOT --> B5["More Stringent Nitrogen and Phosphorus (aP + b)"]
ROOT --> BR1["More stringent Nitrogen and Phosphorus and Other (aP + b + c)"]
ROOT --> BR2["More stringent Nitrogen and Phosphorus and Other (aN + aP + c) or (rcaParameterN+rcaParameterP+rcaParameterOther)"]
ROOT --> BR3["More stringent Nitrogen and Other (aN + c) or (rcaParameterN+rcaParameterOther)"]
ROOT --> BR4["More Stringent Phosphorus and Other (aP + c) or (rcaParameterP+rcaParameterOther)"]
ROOT --> BR5["More Stringent Nitrogen and Other (b + c)"]
ROOT --> BR6["More stringent Other (c) or (rcaParameterOther)"]

%% Branch 1
B1 --- C1["If secondary treatment, N-removal and P-removal is in place"]
C1 --- N1((NO)) --- T1_NO["Treatment = Not met"]
C1 --- Y1((YES)) --- T1_YES["Treatment = Met"]

T1_NO --- P1_NO["If COD, BOD5, Nitrogen and Phosphorus performance pass"]
P1_NO --- N2((NO)) --- R04["Performance = Not met Compliance = NC"]
R04 -.- ID04(["02-B-04"])
P1_NO --- Y2((YES)) --- R03["Performance = Met Compliance = NC"]
R03 -.- ID03(["02-B-03"])

T1_YES --- P1_YES["If COD, BOD5, Nitrogen and Phosphorus performance pass"]
P1_YES --- N3((NO)) --- R02["Performance = Not met Compliance = NC"]
R02 -.- ID02(["02-B-02"])
P1_YES --- Y3((YES)) --- R01["Performance = Met Compliance = C"]
R01 -.- ID01(["02-B-01"])

%% Branch 2
B2 --- C2["If secondary treatment and P-removal is in place"]
C2 --- N4((NO)) --- T2_NO["Treatment = Not met"]
C2 --- Y4((YES)) --- T2_YES["Treatment = Met"]

T2_NO --- P2_NO["If COD, BOD5 and Phosphorus performance pass"]
P2_NO --- N5((NO)) --- R08["Performance = Not met Compliance = NC"]
R08 -.- ID08(["02-B-08"])
P2_NO --- Y5((YES)) --- R07["Performance = Met Compliance = NC"]
R07 -.- ID07(["02-B-07"])

T2_YES --- P2_YES["If COD, BOD5 and Phosphorus performance pass"]
P2_YES --- N6((NO)) --- R06["Performance = Not met Compliance = NC"]
R06 -.- ID06(["02-B-06"])
P2_YES --- Y6((YES)) --- R05["Performance = Met Compliance = C"]
R05 -.- ID05(["02-B-05"])

%% Branch 3
B3 --- C3["If secondary treatment and N-removal is in place"]
C3 --- N7((NO)) --- T3_NO["Treatment = Not met"]
C3 --- Y7((YES)) --- T3_YES["Treatment = Met"]

T3_NO --- P3_NO["If COD, BOD5 and Nitrogen performance pass"]
P3_NO --- N8((NO)) --- R12["Performance = Not met Compliance = NC"]
R12 -.- ID12(["02-B-12"])
P3_NO --- Y8((YES)) --- R11["Performance = Met Compliance = NC"]
R11 -.- ID11(["02-B-11"])

T3_YES --- P3_YES["If COD, BOD5 and Nitrogen performance pass"]
P3_YES --- N9((NO)) --- R10["Performance = Not met Compliance = NC"]
R10 -.- ID10(["02-B-10"])
P3_YES --- Y9((YES)) --- R09["Performance = Met Compliance = C"]
R09 -.- ID09(["02-B-09"])

%% Branch 4
B4 --- C4["If secondary treatment and N-removal is in place"]
C4 --- N10((NO)) --- T4_NO["Treatment = Not met"]
C4 --- Y10((YES)) --- T4_YES["Treatment = Met"]

T4_NO --- R15["Performance = Not met Compliance = NC"]
R15 -.- ID15(["02-B-15"])

T4_YES --- P4_YES["If COD and BOD5 performance pass"]
P4_YES --- N11((NO)) --- R14["Performance = Not met Compliance = NC"]
R14 -.- ID14(["02-B-14"])
P4_YES --- Y11((YES)) --- R13["Performance = Met Compliance = C"]
R13 -.- ID13(["02-B-13"])

%% Branch 5
B5 --- C5["If secondary treatment and N-removal and P removal is in place"]
C5 --- N12((NO)) --- T5_NO["Treatment = Not met"]
C5 --- Y12((YES)) --- T5_YES["Treatment = Met"]

T5_NO --- R18["Performance = Not met Compliance = NC"]
R18 -.- ID18(["02-B-18"])

T5_YES --- P5_YES["If COD, BOD5 and Phosphorus performance pass"]
P5_YES --- N13((NO)) --- R17["Performance = Not met Compliance = NC"]
R17 -.- ID17(["02-B-17"])
P5_YES --- Y13((YES)) --- R16["Performance = Met Compliance = C"]
R16 -.- ID16(["02-B-16"])

%% Branch 6
BR1 --- C6["If secondary treatment and N-removal and P-removal and one or more of UV, Chlorination, Ozonation, Sand filtration, Micro filtration or Other type of more stringent treatment is in place"]
C6 --- N14((NO)) --- T6_NO["Treatment = Not met Performance = Not met Compliance = NC"]
T6_NO -.- ID21(["02-B-21"])
C6 --- Y14((YES)) --- T6_YES["Treatment = Met"]

T6_YES --- P6_YES["If COD, BOD5 and Phosphorus performance pass"]
P6_YES --- N15((NO)) --- R20["Performance = Not met Compliance = NC"]
R20 -.- ID20(["02-B-20"])
P6_YES --- Y15((YES)) --- R19["Performance = Met Compliance = C"]
R19 -.- ID19(["02-B-19"])

%% Branch 7
BR2 --- C7["If secondary treatment and N-removal and P-removal and one or more of UV, Chlorination, Ozonation, Sand filtration, Micro filtration or Other type of more stringent treatment is in place"]
C7 --- N16((NO)) --- T7_NO["Treatment = Not met"]
C7 --- Y16((YES)) --- T7_YES["Treatment = Met"]

T7_NO --- P7_NO["If COD, BOD5, Nitrogen and Phosphorus performance pass"]
P7_NO --- N17((NO)) --- R25["Performance = Not met Compliance = NC"]
R25 -.- ID25(["02-B-25"])
P7_NO --- Y17((YES)) --- R24["Performance = Met Compliance = NC"]
R24 -.- ID24(["02-B-24"])

T7_YES --- P7_YES["If COD, BOD5, Nitrogen and Phosphorus performance pass"]
P7_YES --- N18((NO)) --- R23["Performance = Not met Compliance = NC"]
R23 -.- ID23(["02-B-23"])
P7_YES --- Y18((YES)) --- R22["Performance = Met Compliance = C"]
R22 -.- ID22(["02-B-22"])

%% Branch 8
BR3 --- C8["If secondary treatment and N-removal and one or more of UV, Chlorination, Ozonation, Sand filtration, Micro filtration or Other type of more stringent treatment is in place"]
C8 --- N19((NO)) --- T8_NO["Treatment = Not met"]
C8 --- Y19((YES)) --- T8_YES["Treatment = Met"]

T8_NO --- P8_NO["If COD, BOD5 and Nitrogen performance pass"]
P8_NO --- N20((NO)) --- R29["Performance = Not met Compliance = NC"]
R29 -.- ID29(["02-B-29"])
P8_NO --- Y20((YES)) --- R28["Performance = Met Compliance = NC"]
R28 -.- ID28(["02-B-28"])

T8_YES --- P8_YES["If COD, BOD5 and Nitrogen performance pass"]
P8_YES --- N21((NO)) --- R27["Performance = Not met Compliance = NC"]
R27 -.- ID27(["02-B-27"])
P8_YES --- Y21((YES)) --- R26["Performance = Met Compliance = C"]
R26 -.- ID26(["02-B-26"])

%% Branch 9
BR4 --- C9["If secondary treatment and P-removal and one or more of UV, Chlorination, Ozonation, Sand filtration, Micro filtration or Other type of more stringent treatment is in place"]
C9 --- N22((NO)) --- T9_NO["Treatment = Not met"]
C9 --- Y22((YES)) --- T9_YES["Treatment = Met"]

T9_NO --- P9_NO["If COD, BOD5 and Phosphorus performance pass"]
P9_NO --- N23((NO)) --- R33["Performance = Not met Compliance = NC"]
R33 -.- ID33(["02-B-33"])
P9_NO --- Y23((YES)) --- R32["Performance = Met Compliance = NC"]
R32 -.- ID32(["02-B-32"])

T9_YES --- P9_YES["If COD, BOD5 and Phosphorus performance pass"]
P9_YES --- N24((NO)) --- R31["Performance = Not met Compliance = NC"]
R31 -.- ID31(["02-B-31"])
P9_YES --- Y24((YES)) --- R30["Performance = Met Compliance = C"]
R30 -.- ID30(["02-B-30"])

%% Branch 10
BR5 --- C10["If secondary treatment and N-removal and one or more of UV, Chlorination, Ozonation, Sand filtration, Micro filtration or Other type of more stringent treatment is in place"]
C10 --- N25((NO)) --- T10_NO["Treatment = Not met"]
C10 --- Y25((YES)) --- T10_YES["Treatment = Met"]

T10_NO --- R36["Performance = Not met Compliance = NC"]
R36 -.- ID36(["02-B-36"])

T10_YES --- P10_YES["If COD and BOD5 performance pass"]
P10_YES --- N26((NO)) --- R35["Performance = Not met Compliance = NC"]
R35 -.- ID35(["02-B-35"])
P10_YES --- Y26((YES)) --- R34["Performance = Met Compliance = C"]
R34 -.- ID34(["02-B-34"])

%% Branch 11
BR6 --- C11["If secondary treatment and one or more of UV, Chlorination, Ozonation, Sand filtration, Micro filtration or Other type of more stringent treatment is in place"]
C11 --- N27((NO)) --- T11_NO["Treatment = Not met"]
C11 --- Y27((YES)) --- T11_YES["Treatment = Met"]

T11_NO --- P11_NO["If COD and BOD5 performance pass"]
P11_NO --- N28((NO)) --- R40["Performance = Not met Compliance = NC"]
R40 -.- ID40(["02-B-40"])
P11_NO --- Y28((YES)) --- R39["Performance = Met Compliance = NC"]
R39 -.- ID39(["02-B-39"])

T11_YES --- P11_YES["If COD and BOD5 performance pass"]
P11_YES --- N29((NO)) --- R38["Performance = Not met Compliance = NC"]
R38 -.- ID38(["02-B-38"])
P11_YES --- Y29((YES)) --- R37["Performance = Met Compliance = C"]
R37 -.- ID37(["02-B-37"])

%% Styles
classDef reference stroke:#00a2ff,color:#00a2ff;
classDef yesBox fill:#4CAF50,color:white,stroke:#2E7D32;
classDef noBox fill:#F44336,color:white,stroke:#C62828;

%% Class Assignments
class ID01,ID02,ID03,ID04,ID05,ID06,ID07,ID08,ID09,ID10,ID11,ID12,ID13,ID14,ID15,ID16,ID17,ID18,ID19,ID20,ID21,ID22,ID23,ID24,ID25,ID26,ID27,ID28,ID29,ID30,ID31,ID32,ID33,ID34,ID35,ID36,ID37,ID38,ID39,ID40 reference;
class Y1,Y2,Y3,Y4,Y5,Y6,Y7,Y8,Y9,Y10,Y11,Y12,Y13,Y14,Y15,Y16,Y17,Y18,Y19,Y20,Y21,Y22,Y23,Y24,Y25,Y26,Y27,Y28,Y29 yesBox;
class N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11,N12,N13,N14,N15,N16,N17,N18,N19,N20,N21,N22,N23,N24,N25,N26,N27,N28,N29 noBox;

    

Pseudocode#

Show python code
# ------------------------------------------------------------------- 
# CASE 1: Nitrogen + Phosphorus ( (aN+aP) or (nitrogen+phosphorus) ) 
# ------------------------------------------------------------------- 

if result_required in ["(aN+aP)", "(nitrogen+phosphorus)"]: 
    add_note(f"Required = {result_required}. Need Secondary + N-removal + P-removal.") 
 
    if secondary_treatment and n_removal and p_removal: 
        add_note("Secondary, N-removal, P-removal present.") 
 
        if ( 
            uwwCODPerf == "P" 
            and uwwBOD5Perf == "P" 
            and uwwNTotPerf == "P" 
            and uwwPTotPerf == "P" 
        ): 
            add_note("COD, BOD5, N, P all pass → Compliant.") 
            result_treatment = "True" 
            result_performance = "True" 
            result_compliance = "C" 
            alg2_exit_leaf = "02-B-01" 
        else: 
            add_note("Performance failed → Non-compliant.") 
            result_treatment = "True" 
            result_performance = "False" 
            result_compliance = "NC" 
            alg2_exit_leaf = "02-B-02" 
 
    else: 
        add_note("Missing Secondary or N/P removal.") 
 
        if ( 
            uwwCODPerf == "P" 
            and uwwBOD5Perf == "P" 
            and uwwNTotPerf == "P" 
            and uwwPTotPerf == "P" 
        ): 
            add_note("Performance ok but treatment missing → NC.") 
            result_treatment = "False" 
            result_performance = "True" 
            result_compliance = "NC" 
            alg2_exit_leaf = "02-B-03" 
        else: 
            add_note("Performance + treatment missing → NC.") 
            result_treatment = "False" 
            result_performance = "False" 
            result_compliance = "NC" 
            alg2_exit_leaf = "02-B-04"

# ------------------------------------------------------------------- 
# CASE 2: Phosphorus only ( (aP) or (phosphorus) ) 
# ------------------------------------------------------------------- 

elif result_required in ["(aP)", "(phosphorus)"]: 
    add_note(f"Required = {result_required}. Need Secondary + P-removal.")

    if secondary_treatment and p_removal: 
        add_note("Secondary + P-removal present.") 

        if uwwCODPerf == "P" and uwwBOD5Perf == "P" and uwwPTotPerf == "P": 
            add_note("COD, BOD5, P pass → Compliant.") 
            result_treatment = "True" 
            result_performance = "True" 
            result_compliance = "C" 
            alg2_exit_leaf = "02-B-05" 
        else: 
            add_note("Performance failed → Non-compliant.") 
            result_treatment = "True" 
            result_performance = "False" 
            result_compliance = "NC" 
            alg2_exit_leaf = "02-B-06" 

    else: 
        add_note("Missing Secondary or P-removal.") 
 
        if uwwCODPerf == "P" and uwwBOD5Perf == "P" and uwwPTotPerf == "P": 
            add_note("Performance ok but treatment missing → NC.") 
            result_treatment = "False" 
            result_performance = "True" 
            result_compliance = "NC" 
            alg2_exit_leaf = "02-B-07" 
        else: 
            add_note("Performance + treatment missing → NC.") 
            result_treatment = "False" 
            result_performance = "False" 
            result_compliance = "NC" 
            alg2_exit_leaf = "02-B-08"

# ------------------------------------------------------------------- 
# CASE 3: Nitrogen only ( (aN) or (nitrogen) ) 
# ------------------------------------------------------------------- 

elif result_required in ["(aN)", "(nitrogen)"]: 
    add_note(f"Required = {result_required}. Need Secondary + N-removal.") 
 
    if secondary_treatment and n_removal: 
        add_note("Secondary + N-removal present.") 
 
        if uwwCODPerf == "P" and uwwBOD5Perf == "P" and uwwNTotPerf == "P": 
            add_note("COD, BOD5, N pass → Compliant.") 
            result_treatment = "True" 
            result_performance = "True" 
            result_compliance = "C" 
            alg2_exit_leaf = "02-B-09" 
        else: 
            add_note("Performance failed → Non-compliant.") 
            result_treatment = "True" 
            result_performance = "False" 
            result_compliance = "NC" 
            alg2_exit_leaf = "02-B-10" 
 
    else: 
        add_note("Missing Secondary or N-removal.") 
 
        if uwwCODPerf == "P" and uwwBOD5Perf == "P" and uwwNTotPerf == "P":
            add_note("Performance ok but treatment missing → NC.") 
            result_treatment = "False" 
            result_performance = "True" 
            result_compliance = "NC" 
            alg2_exit_leaf = "02-B-11" 
        else: 
            add_note("Performance + treatment missing → NC.") 
            result_treatment = "False" 
            result_performance = "False" 
            result_compliance = "NC" 
            alg2_exit_leaf = "02-B-12" 

# ------------------------------------------------------------------- 
# CASE 4: Other treatment ( (c) or (other) ) 
# ------------------------------------------------------------------- 

elif result_required in ["(c)", "(other)"]: 
    add_note(f"Required = {result_required}. Need Secondary + Other treatment flag.") 
 
    if secondary_treatment and other_stringent_treatment: 
        add_note("Secondary + Other treatment present.") 
 
        if uwwCODPerf == "P" and uwwBOD5Perf == "P": 
            add_note("COD, BOD5 pass → Compliant.") 
            result_treatment = "True" 
            result_performance = "True" 
            result_compliance = "C" 
            alg2_exit_leaf = "02-B-13" 
        else: 
            add_note("Performance failed → Non-compliant.") 
            result_treatment = "True" 
            result_performance = "False" 
            result_compliance = "NC" 
            alg2_exit_leaf = "02-B-14" 
 
    else: 
        add_note("Missing Secondary or Other treatment.") 
 
        if uwwCODPerf == "P" and uwwBOD5Perf == "P": 
            add_note("Performance ok but treatment missing → NC.") 
            result_treatment = "False" 
            result_performance = "True" 
            result_compliance = "NC" 
            alg2_exit_leaf = "02-B-15" 
        else: 
            add_note("Performance + treatment missing → NC.") 
            result_treatment = "False" 
            result_performance = "False" 
            result_compliance = "NC" 
            alg2_exit_leaf = "02-B-16" 
 
# ------------------------------------------------------------------- 
# CASE 5: More Stringent Nitrogen and Phosphorus (aP + b) 
# ------------------------------------------------------------------- 

elif result_required == "(aP+b)": 
    add_note(f"Required = {result_required}. Need Secondary + N-removal + P-removal.") 
 
    if secondary_treatment and n_removal and p_removal: 
         add_note("Secondary, N-removal, P-removal present.") 
 
        if uwwCODPerf == "P" and uwwBOD5Perf == "P" and uwwPTotPerf == "P": 
            add_note("COD, BOD5, P pass → Compliant.") 
            result_treatment = "True" 
            result_performance = "True" 
            result_compliance = "C" 
            alg2_exit_leaf = "02-B-17" 
        else: 
            add_note("Performance failed → Non-compliant.") 
            result_treatment = "True" 
            result_performance = "False" 
            result_compliance = "NC" 
            alg2_exit_leaf = "02-B-18" 
 
    else: 
        add_note("Missing Secondary or N/P removal.") 
        result_treatment = "False" 
        result_performance = "True" 
        result_compliance = "NC" 
        alg2_exit_leaf = "02-B-19" 
 
# ------------------------------------------------------------------- 
# CASE 6: Nitrogen + Phosphorus + Other ( (aN+aP+c) or (nitrogen+phosphorus+other)  
# ------------------------------------------------------------------- 

elif result_required in ["(aN+aP+c)", "(nitrogen+phosphorus+other)"]: 
    add_note(f"Required = {result_required}. Need Secondary + N-removal + P-removal + (any advanced).") 
 
    if secondary_treatment and n_removal and p_removal and advanced_any: 
        add_note("All required treatments present.") 
 
        if ( 
            uwwCODPerf == "P" 
            and uwwBOD5Perf == "P" 
            and uwwNTotPerf == "P" 
            and uwwPTotPerf == "P" 
        ): 
            add_note("COD, BOD5, N, P pass → Compliant.") 
            result_treatment = "True" 
            result_performance = "True" 
            result_compliance = "C" 
            alg2_exit_leaf = "02-B-20" 
        else: 
            add_note("Performance failed → Non-compliant.") 
            result_treatment = "True" 
            result_performance = "False" 
            result_compliance = "NC" 
            alg2_exit_leaf = "02-B-21" 
 
    else: 
        add_note("Missing treatment(s).") 
 
        if ( 
            uwwCODPerf == "P" 
            and uwwBOD5Perf == "P"
            and uwwNTotPerf == "P" 
            and uwwPTotPerf == "P" 
        ): 
            add_note("Performance ok but treatment missing → NC.") 
            result_treatment = "False" 
            result_performance = "True" 
            result_compliance = "NC" 
            alg2_exit_leaf = "02-B-22" 
        else: 
            add_note("Performance + treatment missing → NC.") 
            result_treatment = "False" 
            result_performance = "False" 
            result_compliance = "NC" 
            alg2_exit_leaf = "02-B-23" 
 
# ------------------------------------------------------------------- 
# CASE 7: Nitrogen + Other ( (aN+c) or (nitrogen+other) ) 
# ------------------------------------------------------------------- 
elif result_required in ["(aN+c)", "(nitrogen+other)"]: 
    add_note(f"Required = {result_required}. Need Secondary + N-removal + (any advanced).") 
 
    if secondary_treatment and n_removal and advanced_any: 
        add_note("Secondary + N-removal + advanced present.") 
 
        if uwwCODPerf == "P" and uwwBOD5Perf == "P" and uwwNTotPerf == "P": 
            add_note("COD, BOD5, N pass → Compliant.") 
            result_treatment = "True" 
            result_performance = "True" 
            result_compliance = "C" 
            alg2_exit_leaf = "02-B-24" 
        else: 
            add_note("Performance failed → Non-compliant.") 
            result_treatment = "True" 
            result_performance = "False" 
            result_compliance = "NC" 
            alg2_exit_leaf = "02-B-25" 
 
    else: 
        add_note("Missing treatment(s).") 
 
        if uwwCODPerf == "P" and uwwBOD5Perf == "P" and uwwNTotPerf == "P": 
            add_note("Performance ok but treatment missing → NC.") 
            result_treatment = "False" 
            result_performance = "True" 
            result_compliance = "NC" 
            alg2_exit_leaf = "02-B-26" 
        else: 
            add_note("Performance + treatment missing → NC.") 
            result_treatment = "False" 
            result_performance = "False" 
            result_compliance = "NC" 
            alg2_exit_leaf = "02-B-27" 
 
# ------------------------------------------------------------------- 
# CASE 8: Phosphorus + Other ( (aP+c) or (phosphorus+other) ) 
# ------------------------------------------------------------------- 

elif result_required in ["(aP+c)", "(phosphorus+other)"]: 
    add_note(f"Required = {result_required}. Need Secondary + P-removal + (any advanced).") 
 
    if secondary_treatment and p_removal and advanced_any: 
        add_note("Secondary + P-removal + advanced present.") 
 
        if uwwCODPerf == "P" and uwwBOD5Perf == "P" and uwwPTotPerf == "P": 
            add_note("COD, BOD5, P pass → Compliant.") 
            result_treatment = "True" 
            result_performance = "True" 
            result_compliance = "C" 
            alg2_exit_leaf = "02-B-28" 
        else: 
            add_note("Performance failed → Non-compliant.") 
            result_treatment = "True" 
            result_performance = "False" 
            result_compliance = "NC" 
            alg2_exit_leaf = "02-B-29" 
 
    else: 
        add_note("Missing treatment(s).") 
 
        if uwwCODPerf == "P" and uwwBOD5Perf == "P" and uwwPTotPerf == "P": 
            add_note("Performance ok but treatment missing → NC.") 
            result_treatment = "False" 
            result_performance = "True" 
            result_compliance = "NC" 
            alg2_exit_leaf = "02-B-30" 
        else: 
            add_note("Performance + treatment missing → NC.") 
            result_treatment = "False" 
            result_performance = "False" 
            result_compliance = "NC" 
            alg2_exit_leaf = "02-B-31" 
 
# ------------------------------------------------------------------- 
# CASE 9: N-removal + Advanced ( (b+c) ) 
# ------------------------------------------------------------------- 

elif result_required == "(b+c)": 
    add_note(f"Required = {result_required}. Need Secondary + N-removal + (any advanced)." ) 
 
    if secondary_treatment and n_removal and advanced_any: 
        add_note("Secondary + N-removal + advanced present.") 
 
        if uwwCODPerf == "P" and uwwBOD5Perf == "P": 
            add_note("COD, BOD5 pass → Compliant.") 
            result_treatment = "True" 
            result_performance = "True" 
            result_compliance = "C" 
            alg2_exit_leaf = "02-B-32" 
        else: 
            add_note("Performance failed → Non-compliant.") 
            result_treatment = "True"
             result_performance = "False" 
            result_compliance = "NC" 
            alg2_exit_leaf = "02-B-33" 
 
    else: 
        add_note("Missing treatment(s).") 
        result_treatment = "False" 
        result_performance = "False" 
        result_compliance = "NC" 
        alg2_exit_leaf = "02-B-34"