Drinking water chlorination efficiency: Difference between revisions

From Opasnet
Jump to navigation Jump to search
 
(21 intermediate revisions by 3 users not shown)
Line 7: Line 7:


== Answer ==
== Answer ==
{{argument|relat1=attack|id=arg2071|type=truth|content=Sapovirus missing|sign=--[[User:Päivi Meriläinen|Päivi Meriläinen]] ([[User talk:Päivi Meriläinen|talk]]) 14:14, 23 March 2020 (UTC)}}


{| {{prettytable}}
{| {{prettytable}}
Line 15: Line 17:
| 8.837981871
| 8.837981871
|----
|----
| E.coli O157:H7
| ''E.coli'' O157:H7
| 7.182699561
| 7.182699561
|----
|----
Line 44: Line 46:
The rows tell which pathogen the ct-values on that row are for.
The rows tell which pathogen the ct-values on that row are for.


The columns tell the ct-value required to decrease the amount of each pathogen in the drinking water to a certain level on the log-scale. Column 1 means pathogen concentration will drop to 10<sup>-1</sup> of the original, column 2 means the concentration will drop to 10<sup>-2</sup> and so on.
The columns tell the ct-value required to decrease the amount of each pathogen in the drinking water to a certain level on the log-scale. Column 1 means pathogen concentration will drop to 10<sup>-1</sup> of the original, column 2 means the concentration will drop to 10<sup>-2</sup> and so on.  


<t2b index="Pathogen,Logdecrease" Locations="0,1,2,3,4,5" unit="(mg/l)*min">
<t2b index="Pathogen,Logdecrease" Locations="0,1,2,3,4,5,6" unit="(mg/l)*min">
Campylobacter|0| 0.152| 0.294| 0.436| 0| 0
campylobacter|0| 0.154| 0.294| 0.436| NA| NA| NA
E.coli O157:H7|0| 0.17| 0.34| 0.52| 1.06| 0
E.coli O157:H7|0| 0.17| 0.34| 0.52| 1.06| 2.06| NA
Rotavirus|0| 0.12| 0.16| 0.2| 0.3| 0
rotavirus|0| 0.12| 0.16| 0.2| 0.3| NA| NA
Norovirus|0| 0.09| 0.18| 0.245| 0.314| 0
norovirus|0| 0.09| 0.18| 0.245| 0.314| NA| NA
Cryptosporidium|0| 0| 0| 0| 0| 0
sapovirus|0| 0.09| 0.18| 0.245| 0.314| NA| NA
Giardia|0| 75| 150| 216| 0| 0
cryptosporidium|0| NA| NA| NA| NA| NA| NA
giardia|0| 75| 150| 216| NA| NA| NA
</t2b>
</t2b>


Line 60: Line 63:
|----
|----
| Campylobacter
| Campylobacter
| <ref>Blaser, M. J., Smith, P. F., Wang, W.‐L. L. and Hoff, J. C. (1986). "Inactivation of Campylobacter jejuni by Chlorine and Monochloramine." Applied and Environmental Microbiology 51(2): 307‐311.</ref>; <ref>Lund, V. (1996). "Evaluation of E. coli as an indicator for the presence of Campylobacter jejuni and Yersinia enterocolitica in chlorinated and untreated oligotrophic lake water." Water Research 30(6): 1528‐ 1534.</ref>
| <ref name="blaser">Blaser, M. J., Smith, P. F., Wang, W.‐L. L. and Hoff, J. C. (1986). "Inactivation of Campylobacter jejuni by Chlorine and Monochloramine." Applied and Environmental Microbiology 51(2): 307‐311.</ref>; <ref>Lund, V. (1996). "Evaluation of ''E. coli'' as an indicator for the presence of Campylobacter jejuni and Yersinia enterocolitica in chlorinated and untreated oligotrophic lake water." Water Research 30(6): 1528‐ 1534.</ref>
|----
|----
| E.coli O157:H7
| ''E.coli'' O157:H7
| <ref>Blaser, M. J., Smith, P. F., Wang, W.‐L. L. and Hoff, J. C. (1986). "Inactivation of Campylobacter jejuni by Chlorine and Monochloramine." Applied and Environmental Microbiology 51(2): 307‐311.</ref>; <ref>Lund, V. (1996). "Evaluation of E. coli as an indicator for the presence of Campylobacter jejuni and Yersinia enterocolitica in chlorinated and untreated oligotrophic lake water." Water Research 30(6): 1528‐ 1534.</ref>
| <ref name="blaser"/>, <ref name="petterson"> S. R. Petterson & T. A. Stenström 2015. Quantification of pathogen inactivation efficacy by free chlorine disinfection of drinking water for QMRA. J Water Health (2015) 13 (3): 625-644. [https://doi.org/10.2166/wh.2015.193]
</ref>
|----
|----
| Rotavirus
| Rotavirus
| <ref>Rice, E. W., Hoff, J. C. and III, F. W. S. (1982). "Inactivation of Giardia cysts by chlorine." Applied and Environmental Microbiology 43(1): 250‐251</ref>
| <ref name="rice">Rice, E. W., Hoff, J. C. and III, F. W. S. (1982). "Inactivation of Giardia cysts by chlorine." Applied and Environmental Microbiology 43(1): 250‐251</ref>
|----
|----
| Norovirus
| Norovirus
| <ref>Keswick, B. H., Satterwhite, T. K., Johnson, P. C., DuPont, H. L., Secor, S. L., Bitsura, J. A., Gary, G. W. and Hoff, J. C. (1985). Inactivation of norwalk virus in drinking water by chlorine. Applied and Environmental  Microbiology 50(2): 261-264.</ref>
|----
| Sapovirus
| <ref>Keswick, B. H., Satterwhite, T. K., Johnson, P. C., DuPont, H. L., Secor, S. L., Bitsura, J. A., Gary, G. W. and Hoff, J. C. (1985). Inactivation of norwalk virus in drinking water by chlorine. Applied and Environmental  Microbiology 50(2): 261-264.</ref>
| <ref>Keswick, B. H., Satterwhite, T. K., Johnson, P. C., DuPont, H. L., Secor, S. L., Bitsura, J. A., Gary, G. W. and Hoff, J. C. (1985). Inactivation of norwalk virus in drinking water by chlorine. Applied and Environmental  Microbiology 50(2): 261-264.</ref>
|----
|----
Line 75: Line 82:
|----
|----
| Giardia
| Giardia
| <ref>Rice, E. W., Hoff, J. C. and III, F. W. S. (1982). "Inactivation of Giardia cysts by chlorine." Applied and Environmental Microbiology 43(1): 250‐251</ref>
| <ref name="rice"/>
|----
|----
|}
|}
Line 98: Line 105:
   library(OpasnetUtils)
   library(OpasnetUtils)


ChlorineDose = data.frame(ChlorineDoseResult = 1.5)
ChlorineDose = data.frame(ChlorineDoseResult = 0.5)
 
ChlorineDose = Ovariable("ChlorineDose", data = ChlorineDose)


ChlorineDose = Ovariable("ChlorineDose", data = ChlorineDose, save = TRUE)
objects.store(ChlorineDose)


cat("Ovariable ChlorineDose saved.\n")
cat("Ovariable ChlorineDose saved.\n")
Line 115: Line 124:


ClSensitivity <- Ovariable("ClSensitivity", ddata = "Op_en7956", save=TRUE)
ClSensitivity <- Ovariable("ClSensitivity", ddata = "Op_en7956", save=TRUE)
objects.store(ClSensitivity)


cat("Ovariable ClSensitivity saved.\n")
cat("Ovariable ClSensitivity saved.\n")
Line 121: Line 132:
</rcode>
</rcode>


<rcode
name="constants"
label="Initialize cstr, mrt and k"
>
  #This is code "Op_en7956/constants" on page [[Drinking water chlorination efficiency]]
  library(OpasnetUtils)
Ncstr <- 6 # the number of continuously stirred tank reactors
mrt <- 2 # mean residence time, the time water on average spends in each cstr
k <- Ovariable("k", data = data.frame(kResult = 0.13)) # the rate at which chlorine concentration decreases
objects.store(Ncstr, mrt, k)
cat("Constants Ncstr, mrt and ovariable k saved.\n")
</rcode>


<rcode
<rcode
name="efficiency"
name="CT"
label="Initialize chlorination efficiency"
label="Initialize CT"
>
>
# This is code "Op_en7956/efficiency" on page [[Drinking water chlorination efficiency]]
# This is code "Op_en7956/CT" on page [[Drinking water chlorination efficiency]]
library(OpasnetUtils)
library(OpasnetUtils)
library(reshape2)
library(reshape2)


riippuvuudet = data.frame(
CT <- Ovariable(
Name = c("ChlorineDose", "CLsensitivity", "ChlorineEfficiencyF"),
  "CT",
Ident = c("Op_en7956/dose", "Op_en7956/sensitivity)
  dependencies = data.frame(
)
    Name = c("ChlorineDose", "mrt", "Ncstr", "k"),
    Ident = c("Op_en7956/dose", "Op_en7956/constants", "Op_en7956/constants", "Op_en7956/constants")),
  formula = function(...){


ChlorineEfficiencyF <- function(ChlorineDose, Ctvalues, logDecreases) {
# Produces a distribution of total time water spends in the contactor
  if(sum(Ctvalues) == 0) {return(0) # if all the ct:s are 0, return 0
# from an exponential probability distribution with lambda = 1/mrt
    } else {
# 1000 iterations
      # this next bit calculates the ct, given Chlorine dose. I don't know what it does.
Times <- data.frame(Iter= 1:openv$N, Result = 0)
  Mrt <- 12
for(i in 1:(Ncstr)) {
  Ncstr <- 6
   Times$Result <- Times$Result + rexp(n=openv$N, rate= 1/mrt)
  Ttimes <- c(0.001,0.01,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,1.1,1.2,1.3,1.4,1.5,1.6,2,2.5,4)
  Times <- Ttimes * Mrt
  Times.inc <- Times - c(0,Times[1:20])
  Probability <- (Times^(Ncstr - 1) * exp(-Ncstr * Times / Mrt))/(factorial(Ncstr - 1) * (Mrt / Ncstr) ^ Ncstr) # If we calculate for each CSTR separately, we could integrate analytically and get rid of Times and Times.inc altogether.
   ChlorineDose  <- ChlorineDose * exp(-0.13 * Times) # Instead of this, we could integrate analytically because it is easy with exponential functions.
# Where does 0.13 come from? Can it vary in different situations, so should it be an ovariable as well?
  ChlorineDose  <- ChlorineDose  * Times.inc
  ChlorineDoseCumsum <- cumsum(ChlorineDose)
  ClConcDistr <- sum(ChlorineDoseCumsum * Probability) / length(Probability)
  # given the ct:s known to be required for different log-decreases of concentration, what's the log-decrease with the ct calculated above
  # simple linear interpolation. Rule: if CTConc exceeds data, use the highest logDecrease
  logD <- approx(x=Ctvalues, y=logDecreases, xout=ClConcDistr, rule=1:2)$y # The line must start from point (0,0). Add that to data
  return(logD) # return the log-decrease
    }
}
}


ChlorineEfficiency <- Ovariable("ChlorineEfficiency", dependencies = riippuvuudet, formula = function(...){
Times <- Ovariable(name="Times", output=Times)
  ChlorineDose <- ChlorineDose$ChlorineDoseResult[1] # Take the chlorine dose value out of the df and save as a value
 
  temp <- data.frame(Pathogen=(unique(CLsensitivity$Pathogen))) # make a df with  the names of pathogens in one column
# Integral of concentration along Times:
  for (j in 1:nrow(temp)) { # for each pathogen
# Int(ChlorineDose*exp(-k*Times)) = ChlorineDose*(-1/k)*exp(-k*Times)
# This for loop is problematic because all inputs are ovariables and that meant that a) they may be probabilistic and have e.g. 1000 rows of iterations (numbered in Iter column), and b) they may have other, unknown index columns.
# Definite integral from 0 to Times = ChlorineDose*(-1/k)*exp(-k*Times) - ChlorineDose(-1/k) = ChlorineDose/k (1-exp(-k*Times))
# So, the code must reflect situations where the sizes and widths of the output dataframes of ovariables are not know.
 
# One way to do this is to merge the ovariables
CT <- ChlorineDose/k * (1-exp(-1 * k * Times))
# tmp <- ChlorineDose + CLsensitivity
 
# and then use their
return(CT)
    temp$Result[j] <- ChlorineEfficiencyF( #run Chlorine efficiency, and put the resulting log decrease in temp$Result for that pathogen
 
      ChlorineDose,
      CLsensitivity$CLsensitivityResult[CLsensitivity$Pathogen == unique(CLsensitivity$Pathogen)[j]],
      # the ct:s for different log decreases for the pathogen in question
      CLsensitivity$`Log decrease`[CLsensitivity$Pathogen == unique(CLsensitivity$Pathogen)[j]]
      # the log decreases resulting from those ct:s for the pathogen in question
    )
  }
  temp$TreatmentMethod <- "Chlorination"
  # By returning as ovariable marginals can be manually defined
  temp <- Ovariable(output = temp, marginal = colnames(temp) %in% c("TreatmentMethod", "Pathogen", "ChlorineDoseSource"))
 
  return(temp)
}
}
)
)


objects.store(ChlorineEfficiency, ChlorineEfficiencyF)
objects.store(CT)


oprint(ChlorineEfficiency)
cat("Ovariable CT saved.\n")


###############################################
</rcode>
# A new ovariable-compliant version of approx (and most other code as well)
 
 
<rcode
name="efficiency"
label="Initialize chlorination efficiency"
>
# This is code "Op_en7956/efficiency" on page [[Drinking water chlorination efficiency]]
library(OpasnetUtils)
library(reshape2)


ClSensitivity <- Ovariable("ClSensitivity", ddata="Op_en7956")
ChlorineEfficiency <- Ovariable("ChlorineEfficiency", dependencies = data.frame(
ClConcDistr <-  Ovariable("ClConcDistr",data=data.frame(B=11:18,Result=c(-1,0,0.01,0.1,0.2,0.3,1,10)))
  Name = c("CT", "ClSensitivity"),
  Ident = c("Op_en7956/CT", "Op_en7956/sensitivity")),
  formula = function(...){
 
  ClSensitivity <- EvalOutput(ClSensitivity)


testi <- function(ClSensitivity, ClConcDistr) {
  # make CT into an Ovariable, if it's not already
   if(!"ovariable" %in% class(ClSensitivity)) ClSensitivity <- Ovariable(name=ClSensitivity, output=data.frame(Result=ClSensitivity)) # make ClSensitivity an Ovariable, if it isn't already
   if(!"ovariable" %in% class(CT)) CT <- Ovariable(name="CT", output=data.frame(Result=CT))
   if(!"ovariable" %in% class(ClConcDistr)) ClConcDistr <- Ovariable(output=data.frame(Result=ClConcDistr)) # make ClConcDistr an Ovariable, if it isn't already
   CT <- EvalOutput(CT)
   sensname <- paste0(ClSensitivity@name,"Result") # put "ClSensitivityResult" into sensname
   sensname <- paste0(ClSensitivity@name,"Result") # put "ClSensitivityResult" into sensname
   concname <- paste0(ClConcDistr@name,"Result") # put "ClConcDistrResult" into concname
   ctname <- paste0(CT@name,"Result") # put "CTResult" into ctname
    
    
   ova <- merge(ClSensitivity, ClConcDistr) # merge to get the Obariables into the same table
   ova <- merge(ClSensitivity, CT) # merge to get the variables into the same table
   ova$Logdecrease <- as.numeric(as.character(ova$Logdecrease)) # make sure Logdecrease-column is numeric
   ova$Logdecrease <- as.numeric(as.character(ova$Logdecrease)) # make sure Logdecrease-column is numeric
 
   out <- aggregate(
   out <- aggregate(
     1:nrow(ova@output), #take a set of row numbers included in ova...
     1:nrow(ova@output), #take a set of row numbers included in ova...
     by = ova@output[ova@marginal & colnames(ova@output)!="Logdecrease"], #...that has a unique combination of values in the index-columns, except Logdecrease. It takes the row numbers with different values of Logdecrease, with the combination of other indices unique.
     by = ova@output[ova@marginal & colnames(ova@output)!="Logdecrease"], #...that has a unique combination of values in the
    FUN = function(x) {
            # index-columns, except Logdecrease. It takes the row numbers with different values of Logdecrease, with the
            # combination of other indices unique.
      FUN = function(x) {
       tmp <- ova@output[x,] # actually takes those rows whose numbers were selected above from ova
       tmp <- ova@output[x,] # actually takes those rows whose numbers were selected above from ova
       ord <- order(tmp$Logdecrease) # saves the order of rows ordered based on Logdecrease, smallest first.
       ord <- order(tmp$Logdecrease) # saves the order of rows ordered based on Logdecrease, smallest first.
       if(sum(tmp[[sensname]], na.rm=TRUE)==0) return(0) # if all the ct:s in this set of rows are 0, return 0
       if(sum(tmp[[sensname]], na.rm=TRUE)==0) return(0) # if all the ct:s in this set of rows are 0, return 0
       out <- approx( # Otherwise use approx to ... wait. This doesn't work.
       out <- approx( # Otherwise use approx to interpolate the log-decrease for the ct value(s) from earlier
         x=tmp[[sensname]][ord],
         x=tmp[[sensname]][ord],
         y=tmp$Logdecrease[ord],
         y=tmp$Logdecrease[ord],
         xout=tmp[[concname]][1],
         xout=tmp[[ctname]][1],
         rule=1:2
         rule=1:2
       )$y
       )$y
Line 218: Line 238:
   colnames(out)[colnames(out)=="x"] <- "Result"
   colnames(out)[colnames(out)=="x"] <- "Result"
   return(out)
   return(out)
}
 
testi(ClSensitivity, ClConcDistr)
  }
)
 
objects.store(ChlorineEfficiency)
 
cat("Ovariable ChlorineEfficiency saved.\n")


</rcode>
</rcode>

Latest revision as of 14:14, 23 March 2020

Question

How does chlorination affect the concentrations of pathogens in drinking water, reported in log-decrese?

Answer

⇤--arg2071: . Sapovirus missing --Päivi Meriläinen (talk) 14:14, 23 March 2020 (UTC) (type: truth; paradigms: science: attack)

Pathogen Log-dercease
Campylobacter 8.837981871
E.coli O157:H7 7.182699561
Rotavirus 11.97117474
Norovirus 13.55252482
Cryptosporidium 0
Giardia 0.095329311

Rationale

Chloriantion efficiency, or chlorine's capacity to destroy microbes, depends on many factors: the form of the chlorine, temperature, retention period, pH and concentration as well as other chemicals in the water. In some circumstances it might efficiently kill all indicator organisms, but some active viruses, protists or their cysts may remain in the water. The meter to measure the efficiency of chlorination is kloorikokema ⇤--arg5411: . Someone else has to translate this --Heta (talk) 14:31, 4 July 2019 (UTC) (type: truth; paradigms: science: attack), which is the concentration multiplied by retention period, so called CT-value. The required CT-value depends on the temperature: the lower the temperature, the higher the CT-value has to be.

[1]

Data

Pathogen sensitivity to chlorine:

The rows tell which pathogen the ct-values on that row are for.

The columns tell the ct-value required to decrease the amount of each pathogen in the drinking water to a certain level on the log-scale. Column 1 means pathogen concentration will drop to 10-1 of the original, column 2 means the concentration will drop to 10-2 and so on.

Drinking water chlorination efficiency: Difference between revisions((mg/l)*min)
ObsPathogen0123456
1campylobacter0 0.154 0.294 0.436 NA NA NA
2E.coli O157:H70 0.17 0.34 0.52 1.06 2.06 NA
3rotavirus0 0.12 0.16 0.2 0.3 NA NA
4norovirus0 0.09 0.18 0.245 0.314 NA NA
5sapovirus0 0.09 0.18 0.245 0.314 NA NA
6cryptosporidium0 NA NA NA NA NA NA
7giardia0 75 150 216 NA NA NA
Pathogen Reference
Campylobacter [2]; [3]
E.coli O157:H7 [2], [4]
Rotavirus [5]
Norovirus [6]
Sapovirus [7]
Cryptosporidium [8]
Giardia [5]

Causality


Unit

logarithmic decrease

Calculations

CT-value = Chlorine residue concentration (mg/l)* time (min)

+ Show code

+ Show code

+ Show code

+ Show code


+ Show code

See also

References

  1. Valve, M ja Isomäki, E. 2007. Klooraus - Tuttu ja turvallinen? Vesitalous 4/2007.
  2. 2.0 2.1 Blaser, M. J., Smith, P. F., Wang, W.‐L. L. and Hoff, J. C. (1986). "Inactivation of Campylobacter jejuni by Chlorine and Monochloramine." Applied and Environmental Microbiology 51(2): 307‐311.
  3. Lund, V. (1996). "Evaluation of E. coli as an indicator for the presence of Campylobacter jejuni and Yersinia enterocolitica in chlorinated and untreated oligotrophic lake water." Water Research 30(6): 1528‐ 1534.
  4. S. R. Petterson & T. A. Stenström 2015. Quantification of pathogen inactivation efficacy by free chlorine disinfection of drinking water for QMRA. J Water Health (2015) 13 (3): 625-644. [1]
  5. 5.0 5.1 Rice, E. W., Hoff, J. C. and III, F. W. S. (1982). "Inactivation of Giardia cysts by chlorine." Applied and Environmental Microbiology 43(1): 250‐251
  6. Keswick, B. H., Satterwhite, T. K., Johnson, P. C., DuPont, H. L., Secor, S. L., Bitsura, J. A., Gary, G. W. and Hoff, J. C. (1985). Inactivation of norwalk virus in drinking water by chlorine. Applied and Environmental Microbiology 50(2): 261-264.
  7. Keswick, B. H., Satterwhite, T. K., Johnson, P. C., DuPont, H. L., Secor, S. L., Bitsura, J. A., Gary, G. W. and Hoff, J. C. (1985). Inactivation of norwalk virus in drinking water by chlorine. Applied and Environmental Microbiology 50(2): 261-264.
  8. Benito Corona-Vasquez, Amy Samuelson, Jason L. Rennecker and Benito J. Mariñas (2002): Inactivation of Cryptosporidium parvum oocysts with ozone and free chlorine. Water Research 36, 4053-4063