Robert Elder commited on
Commit
3b782bc
·
1 Parent(s): 7b9c3c4

quantity module: added number of extraction iterations as an input

Browse files
quantity_module/functions.py CHANGED
@@ -330,7 +330,14 @@ def get_D_dists_new(w,T,Polymer_Tg,Solvent_Name,Solvent_MW,Solute_MW,Solute_Vabc
330
  else:
331
  return D_dist_noswell, D_dist_swell
332
 
333
- def PlaneSheetFiniteBathMass(M0,D,K,PolymerVolume,SurfaceArea,SolventVolume,ExtractionTime,nterms,Qv=1):
 
 
 
 
 
 
 
334
  ### works with scalar- or vector-valued M0 and D
335
  L = PolymerVolume/SurfaceArea #effective length scale of the component
336
  #alpha = SolventVolume/PolymerVolume/K
@@ -348,7 +355,7 @@ def PlaneSheetFiniteBathMass(M0,D,K,PolymerVolume,SurfaceArea,SolventVolume,Extr
348
  result = Minfty*result
349
  return result
350
 
351
- def PlaneSheetFiniteBathMassApprox(M0,D,K,PolymerVolume,SurfaceArea,SolventVolume,ExtractionTime,Qv=1):
352
  ### works with scalar- or vector-valued M0 and D
353
  L = PolymerVolume/SurfaceArea #effective length scale of the component
354
  alpha = (SolventVolume-PolymerVolume*(Qv-1))/(Qv*PolymerVolume*K)
@@ -369,14 +376,79 @@ def PlaneSheetFiniteBathMassApprox(M0,D,K,PolymerVolume,SurfaceArea,SolventVolum
369
  result = Minfty*result
370
  return result
371
 
372
- def PlaneSheetAnalytical(M0,D,K,PolymerVolume,SurfaceArea,SolventVolume,ExtractionTime,nterms=5,Qv=1):
373
- L = PolymerVolume/SurfaceArea #effective length scale of the component
374
- T = D*ExtractionTime/L**2.
375
- result = (T>0.05) * PlaneSheetFiniteBathMass(M0,D,K,PolymerVolume,SurfaceArea,SolventVolume,ExtractionTime,nterms,Qv=Qv) + \
376
- (T<=0.05) * PlaneSheetFiniteBathMassApprox(M0,D,K,PolymerVolume,SurfaceArea,SolventVolume,ExtractionTime,Qv=Qv)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
377
  return result
378
 
379
- def get_M_dist(D_dist, M_expt, PolymerVolume, SurfaceArea, SolventVolume, ExtractionTime, K_expt=10, Qv=1):
380
- M_M0 = PlaneSheetAnalytical(1.0, D_dist, K_expt, PolymerVolume, SurfaceArea, SolventVolume, ExtractionTime, nterms=5, Qv=Qv) # much faster and indistinguishable distribution from Mfunc_film
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
381
  M0_pred = M_expt/M_M0
382
  return M0_pred
 
 
330
  else:
331
  return D_dist_noswell, D_dist_swell
332
 
333
+ def PlaneSheetAnalytical_old(M0,D,K,PolymerVolume,SurfaceArea,SolventVolume,ExtractionTime,nterms=5,Qv=1):
334
+ L = PolymerVolume/SurfaceArea #effective length scale of the component
335
+ T = D*ExtractionTime/L**2.
336
+ result = (T>0.05) * PlaneSheetFiniteBathMass(M0,D,K,PolymerVolume,SurfaceArea,SolventVolume,ExtractionTime,nterms,Qv=Qv) + \
337
+ (T<=0.05) * PlaneSheetFiniteBathMassApprox(M0,D,K,PolymerVolume,SurfaceArea,SolventVolume,ExtractionTime,Qv=Qv)
338
+ return result
339
+
340
+ def PlaneSheetFiniteBathMass_old(M0,D,K,PolymerVolume,SurfaceArea,SolventVolume,ExtractionTime,nterms,Qv=1):
341
  ### works with scalar- or vector-valued M0 and D
342
  L = PolymerVolume/SurfaceArea #effective length scale of the component
343
  #alpha = SolventVolume/PolymerVolume/K
 
355
  result = Minfty*result
356
  return result
357
 
358
+ def PlaneSheetFiniteBathMassApprox_old(M0,D,K,PolymerVolume,SurfaceArea,SolventVolume,ExtractionTime,Qv=1):
359
  ### works with scalar- or vector-valued M0 and D
360
  L = PolymerVolume/SurfaceArea #effective length scale of the component
361
  alpha = (SolventVolume-PolymerVolume*(Qv-1))/(Qv*PolymerVolume*K)
 
376
  result = Minfty*result
377
  return result
378
 
379
+ def PlaneSheetFiniteBathMass(tau,alpha,nterms=5):
380
+ ### works with scalar- or vector-valued tau
381
+ Minfty = 1.0/(1.+1./(alpha))
382
+ eps = 1e-12
383
+ f = lambda x: np.tan(x)+alpha*x
384
+ qn = np.zeros((nterms))
385
+ for j in range(nterms):
386
+ rts = bisect(f,np.pi/2.+j*np.pi+eps, np.pi*(1.+j)-eps)
387
+ qn[j] = rts
388
+ result = 1.
389
+ for j in range(nterms):
390
+ result = result - (2.*alpha*(1.+alpha))*np.exp(-tau*qn[j]**2.)/(1.+alpha+alpha**2.*qn[j]**2.)
391
+ result = Minfty*result
392
+ return result
393
+
394
+ def PlaneSheetFiniteBathMassApprox(tau,alpha):
395
+ ### works with scalar- or vector-valued tau
396
+ Minfty = 1/(1.+1./(alpha))
397
+ # if exp will blow up, use asymptotic expansion instead
398
+ if not np.ndim(tau):
399
+ if(tau/alpha**2.<100.):
400
+ result = (1.+alpha)*(1.-np.exp(tau/alpha**2.)*sp.special.erfc(np.sqrt(tau)/alpha))
401
+ else:
402
+ result = (1.+alpha)*(1.-alpha/(np.sqrt(np.pi)*np.sqrt(tau))+alpha**3./(2.*np.sqrt(np.pi)*(tau)**1.5)-3.*alpha**5./(4.*np.sqrt(np.pi)*(tau)**2.5))
403
+ else:
404
+ result = np.zeros(len(tau))
405
+ m = tau/alpha**2.<100.
406
+ result[m] = (1.+alpha)*(1.-np.exp(tau[m]/alpha**2.)*sp.special.erfc(np.sqrt(tau[m])/alpha))
407
+ m = tau/alpha**2.>=100.
408
+ result[m] = (1.+alpha)*(1.-alpha/(np.sqrt(np.pi)*np.sqrt(tau[m]))+alpha**3./(2.*np.sqrt(np.pi)*(tau[m])**1.5)-3.*alpha**5./(4.*np.sqrt(np.pi)*(tau[m])**2.5))
409
+ result = Minfty*result
410
+ return result
411
+
412
+ def PlaneSheetAnalytical(tau,alpha,nterms=5):
413
+ result = (tau>0.05) * PlaneSheetFiniteBathMass(tau,alpha,nterms) + \
414
+ (tau<=0.05) * PlaneSheetFiniteBathMassApprox(tau,alpha)
415
  return result
416
 
417
+ def Conservative(tau):
418
+ release = (tau <= 0.2) * 2. * np.sqrt(tau / np.pi) + \
419
+ (tau > 0.2) * (1. - (8. / (np.pi ** 2.)) * np.exp(-tau * np.pi ** 2. / 4.))
420
+ return release
421
+
422
+ ## XXX work out different alphas
423
+ def multiEquilSwell(alpha, Kps, swell, iterations):
424
+ # alpha is initial before swelling
425
+ result = 1.-(Kps*(swell+alpha)/(Kps*(swell+alpha)+swell-1.))*(swell/(swell+alpha))**iterations
426
+ return result
427
+
428
+ def multiELSwell(tau, alpha, Kps, swell, iterations):
429
+ resultEq = multiEquilSwell(alpha, Kps, swell, iterations)
430
+ resultKinetic = Conservative(tau*iterations)
431
+ result = (resultEq < resultKinetic) * resultEq + (resultEq >= resultKinetic) * resultKinetic
432
+ return result
433
+
434
+ def Extraction(tau, alpha, Kps, swell, iterations):
435
+ tauSpec = tau*iterations
436
+ alphaSpec = (alpha*iterations/swell)-(swell-1)/swell/Kps # for a single iteration
437
+ result = (tauSpec > 1.) * multiELSwell(tau, alpha, Kps, swell, iterations) + (tauSpec <= 1.) * PlaneSheetAnalytical(tauSpec,alphaSpec)
438
+ return result
439
+
440
+ def get_M_dist(D_dist, M_expt, PolymerVolume, SurfaceArea, SolventVolume, ExtractionTime, K_expt=10, Qv=1, iterations=1):
441
+ L = PolymerVolume/SurfaceArea
442
+ tau = D_dist*ExtractionTime/L**2.
443
+ if 1:
444
+ alpha = (SolventVolume)/(PolymerVolume*K_expt) # without swelling; swelling is dealt with downstream
445
+ M_M0 = Extraction(tau, alpha, Kps=K_expt, swell=Qv, iterations=iterations)
446
+ #print('ITERATION TEST') # similar to PlaneSheetAnalytical for 1 iteration
447
+ #print(np.quantile(M_M0, [0.05,0.25,0.5,0.75,0.95]))
448
+ if 0:
449
+ alpha = (SolventVolume-PolymerVolume*(Qv-1))/(Qv*PolymerVolume*K_expt) # with swelling
450
+ M_M0 = PlaneSheetAnalytical(tau, alpha, nterms=5)
451
+ #M_M0 = PlaneSheetAnalytical_old(1.0, D_dist, K_expt, PolymerVolume, SurfaceArea, SolventVolume, ExtractionTime, nterms=5, Qv=Qv) # much faster and indistinguishable distribution from Mfunc_film
452
  M0_pred = M_expt/M_M0
453
  return M0_pred
454
+
quantity_module/quantity.py CHANGED
@@ -99,6 +99,7 @@ def exp_post():
99
  Swelling_percent = float(request.form['swelling'])
100
  Swelling_wtfrac = Swelling_percent/100
101
  Extraction_Time = float(request.form['time'])
 
102
  K_expt = float(request.form['K'])
103
  Solvent_MW = Solvent_MWs[Solvent_Name]
104
  Solvent_Density = Solvent_Densities[Solvent_Name]
@@ -140,11 +141,11 @@ def exp_post():
140
  # outside training domain, default to Wilke-Chang
141
  method = 'qrf/wc'
142
  D_dist_noswell, D_dist_swell = get_D_dists_new(Swelling_wtfrac, T, Polymer_Tg, Solvent_Name, Solvent_MW, Solute_MW, Solute_Vabc, 'G2', return_DCs=False, N=N_sample)
143
- M0_pred = get_M_dist(D_dist_swell, M_expt, Polymer_Volume, Surface_Area, Solvent_Volume, Extraction_Time*3600, K_expt=K_expt, Qv=Qv)
144
  else:
145
  method = 'qrf'
146
  D_dist_noswell, D_dist_swell = get_D_dists_new(Swelling_wtfrac, T, Polymer_Tg, Solvent_Name, Solvent_MW, Solute_MW, Solute_Vabc, CHRIS_category, return_DCs=False, N=N_sample, input_Ds=diff)
147
- M0_pred = get_M_dist(D_dist_swell, M_expt, Polymer_Volume, Surface_Area, Solvent_Volume, Extraction_Time*3600, K_expt=K_expt, Qv=Qv)
148
  else:
149
  ## use categories
150
  CHRIS_category = categories[pIndex]
@@ -154,7 +155,7 @@ def exp_post():
154
  CHRIS_flag = 'wc'
155
  CHRIS_category = 'G2'
156
  D_dist_noswell, D_dist_swell = get_D_dists_new(Swelling_wtfrac, T, Polymer_Tg, Solvent_Name, Solvent_MW, Solute_MW, Solute_Vabc, CHRIS_category, return_DCs=False, N=N_sample, input_Ds=None)
157
- M0_pred = get_M_dist(D_dist_swell, M_expt, Polymer_Volume, Surface_Area, Solvent_Volume, Extraction_Time*3600, K_expt=K_expt, Qv=Qv)
158
  if CHRIS_flag is None:
159
  method = 'category'
160
  else:
@@ -184,14 +185,14 @@ def exp_post():
184
  styles = [dict(selector="th", props=[("padding", "0 0.5em")]), dict(selector="td", props=[("padding", "0 0.5em")]),]
185
  table = df_table.style.set_table_styles(styles).set_properties(subset=[r'\( D \) (cm<sup>2</sup>/s)', r'\( M/M_0 \)', f'\( M_0 \) ({units})', r'\( M_0 \) (% median)'], **{'text-align': 'right'}).set_table_attributes('border="2"').hide(axis='index').to_html(index=False, escape=False, justify='center')
186
 
187
- tau = np.nanquantile(D_dist_swell,0.5) * (Extraction_Time*3600) / (Polymer_Volume/Surface_Area)**2
188
 
189
  M0_out = SigFigs(np.nanquantile(M0_pred,0.5),6)
190
  tau_out = SigFigs(tau,6)
191
  mass_units = SigFigs(mass_units,6)
192
 
193
  return render_template('quantity_report.html', show_properties=show_properties, polymers=polymers, pIndex=pIndex,
194
- area=Surface_Area, vol=Polymer_Volume, units=units, M=M_expt, M0=M0_out, time=Extraction_Time,
195
  solventvol=Solvent_Volume, solventname=Solvent_Name, swelling=Swelling_percent, K=K_expt, T=T, tau=tau_out,
196
  chemName=chemName, MW=MW, LogP=LogP, rho=rho, mp=mp, iupac=iupac, cas=cas, smiles=smiles, molImage=molImage, table=table,
197
  LogP_origin=LogP_origin, rho_origin=rho_origin, mp_origin=mp_origin, ceramic=is_ceramic, methods=[method,round(Polymer_Tg-273.15),Polymer_Density],
 
99
  Swelling_percent = float(request.form['swelling'])
100
  Swelling_wtfrac = Swelling_percent/100
101
  Extraction_Time = float(request.form['time'])
102
+ iterations = float(request.form['iterations'])
103
  K_expt = float(request.form['K'])
104
  Solvent_MW = Solvent_MWs[Solvent_Name]
105
  Solvent_Density = Solvent_Densities[Solvent_Name]
 
141
  # outside training domain, default to Wilke-Chang
142
  method = 'qrf/wc'
143
  D_dist_noswell, D_dist_swell = get_D_dists_new(Swelling_wtfrac, T, Polymer_Tg, Solvent_Name, Solvent_MW, Solute_MW, Solute_Vabc, 'G2', return_DCs=False, N=N_sample)
144
+ M0_pred = get_M_dist(D_dist_swell, M_expt, Polymer_Volume, Surface_Area, Solvent_Volume, Extraction_Time*3600, K_expt=K_expt, Qv=Qv, iterations=iterations)
145
  else:
146
  method = 'qrf'
147
  D_dist_noswell, D_dist_swell = get_D_dists_new(Swelling_wtfrac, T, Polymer_Tg, Solvent_Name, Solvent_MW, Solute_MW, Solute_Vabc, CHRIS_category, return_DCs=False, N=N_sample, input_Ds=diff)
148
+ M0_pred = get_M_dist(D_dist_swell, M_expt, Polymer_Volume, Surface_Area, Solvent_Volume, Extraction_Time*3600, K_expt=K_expt, Qv=Qv, iterations=iterations)
149
  else:
150
  ## use categories
151
  CHRIS_category = categories[pIndex]
 
155
  CHRIS_flag = 'wc'
156
  CHRIS_category = 'G2'
157
  D_dist_noswell, D_dist_swell = get_D_dists_new(Swelling_wtfrac, T, Polymer_Tg, Solvent_Name, Solvent_MW, Solute_MW, Solute_Vabc, CHRIS_category, return_DCs=False, N=N_sample, input_Ds=None)
158
+ M0_pred = get_M_dist(D_dist_swell, M_expt, Polymer_Volume, Surface_Area, Solvent_Volume, Extraction_Time*3600, K_expt=K_expt, Qv=Qv, iterations=iterations)
159
  if CHRIS_flag is None:
160
  method = 'category'
161
  else:
 
185
  styles = [dict(selector="th", props=[("padding", "0 0.5em")]), dict(selector="td", props=[("padding", "0 0.5em")]),]
186
  table = df_table.style.set_table_styles(styles).set_properties(subset=[r'\( D \) (cm<sup>2</sup>/s)', r'\( M/M_0 \)', f'\( M_0 \) ({units})', r'\( M_0 \) (% median)'], **{'text-align': 'right'}).set_table_attributes('border="2"').hide(axis='index').to_html(index=False, escape=False, justify='center')
187
 
188
+ tau = np.nanquantile(D_dist_swell,0.5) * (Extraction_Time*3600) / (Polymer_Volume/Surface_Area)**2 * iterations
189
 
190
  M0_out = SigFigs(np.nanquantile(M0_pred,0.5),6)
191
  tau_out = SigFigs(tau,6)
192
  mass_units = SigFigs(mass_units,6)
193
 
194
  return render_template('quantity_report.html', show_properties=show_properties, polymers=polymers, pIndex=pIndex,
195
+ area=Surface_Area, vol=Polymer_Volume, units=units, M=M_expt, M0=M0_out, time=Extraction_Time, iterations=iterations,
196
  solventvol=Solvent_Volume, solventname=Solvent_Name, swelling=Swelling_percent, K=K_expt, T=T, tau=tau_out,
197
  chemName=chemName, MW=MW, LogP=LogP, rho=rho, mp=mp, iupac=iupac, cas=cas, smiles=smiles, molImage=molImage, table=table,
198
  LogP_origin=LogP_origin, rho_origin=rho_origin, mp_origin=mp_origin, ceramic=is_ceramic, methods=[method,round(Polymer_Tg-273.15),Polymer_Density],
quantity_module/templates/quantity_index.html CHANGED
@@ -152,6 +152,7 @@ please see the <a href="{{url_for('.static', filename='RST.html')}}"> RST inform
152
  <tr><td colspan="2"><h4> Extraction parameters <button type=button class="Info_btn" data-toggle="modal" data-target="#ExtractionModal">&#9432;</button></td></tr> </h4>
153
  <tr><th>Device surface area (cm<sup>2</sup>)</th><td> <input name="area" id="area" step="any" value="5.0" min="0.001" type="number" required></td></tr>
154
  <tr><th>Duration (hours)</th><td> <input name="time" id="time" step="any" value="24.0" min="0.001" type="number" required></td></tr>
 
155
  <tr><th>Temperature (&deg;C)</th><td> <input name="T" id="T" step="any" value="50.0" min="25" max="75" type="number" required></td></tr>
156
  <tr><th>Solvent</th>
157
  <td> <select name="solventname" id="solventname">
@@ -177,6 +178,7 @@ please see the <a href="{{url_for('.static', filename='RST.html')}}"> RST inform
177
  <div class="modal-body">
178
  <p><em>Device surface area</em> - Enter the solvent-contacting surface area of the component being evaluated in square centimeters.
179
  <p><em>Duration</em> - Enter the duration of the extraction experiment in hours.
 
180
  <p><em>Temperature</em> - Enter the temperature of the extraction experiment in degrees Celsius.
181
  <p><em>Solvent</em> - Select the extraction solvent from the list.
182
  <p><em>Solvent volume</em> - Enter the volume of solvent used for extraction.
 
152
  <tr><td colspan="2"><h4> Extraction parameters <button type=button class="Info_btn" data-toggle="modal" data-target="#ExtractionModal">&#9432;</button></td></tr> </h4>
153
  <tr><th>Device surface area (cm<sup>2</sup>)</th><td> <input name="area" id="area" step="any" value="5.0" min="0.001" type="number" required></td></tr>
154
  <tr><th>Duration (hours)</th><td> <input name="time" id="time" step="any" value="24.0" min="0.001" type="number" required></td></tr>
155
+ <tr><th>Iterations</th><td> <input name="iterations" id="iterations" step="1" value="1" min="1" type="number" required></td></tr>
156
  <tr><th>Temperature (&deg;C)</th><td> <input name="T" id="T" step="any" value="50.0" min="25" max="75" type="number" required></td></tr>
157
  <tr><th>Solvent</th>
158
  <td> <select name="solventname" id="solventname">
 
178
  <div class="modal-body">
179
  <p><em>Device surface area</em> - Enter the solvent-contacting surface area of the component being evaluated in square centimeters.
180
  <p><em>Duration</em> - Enter the duration of the extraction experiment in hours.
181
+ <p><em>Iterations</em> - Enter the number of iterations (i.e., number of extraction cycles).
182
  <p><em>Temperature</em> - Enter the temperature of the extraction experiment in degrees Celsius.
183
  <p><em>Solvent</em> - Select the extraction solvent from the list.
184
  <p><em>Solvent volume</em> - Enter the volume of solvent used for extraction.
quantity_module/templates/quantity_report.html CHANGED
@@ -96,13 +96,14 @@ This estimate was derived using the solutions to the conservative plane sheet mo
96
  \end{array} \right.
97
  \]
98
 
99
- where \( \tau= D t A^2 / V_p^2 \), \( A \) and \( V_p \) are the surface area and volume of the polymer matrix, respectively, \( D \) is an estimated distribution of the diffusion coefficient of the extractable within the swollen polymer matrix, and \( t \) is time. The quantity \( \Psi = V_s/V_p K \), where \( V_s \) is the solvent volume and \( K \) is the polymer-solvent partition coefficient for the extractable. \( q_n \) are the roots of \( \tan x + \Psi x = 0 \). \( M_0 \) is total quantity initially contained in the polymer. Based on the input provided, the calculation used the following values:
100
  </p>
101
 
102
  <p>
103
  Extracted amount \( M \) = {{M}} {{units}} <br>
104
  Surface area \( A \) = {{area}} cm<sup>2</sup> <br>
105
  Duration \( t \) = {{time}} h <br>
 
106
  Temperature = {{T}} &deg;C <br>
107
  Solvent = {{solventname}} <br>
108
  Solvent volume \( V_s \) = {{solventvol}} cm<sup>3</sup> <br>
@@ -120,7 +121,7 @@ Swelling = {{swelling}} wt% (used to estimate \( D \))<br>
120
  <!-- <p>The progress of the extraction can be expressed through the dimensionless time \( \tau \). For your extraction, \( \tau \) = {{tau}}. Extractions with \( \tau \geq 0.1 \) result in more accurate estimates of the total quantity. When \( \tau \geq 1.0 \), the extracted amount may be used directly as the total quantity if the extraction is diffusion-controlled (i.e., \( \Psi \) is sufficiently large). For example, if \( \Psi > 10 \) and \( \tau \geq 1.0 \) less than 10% of the extractable will remain in the test article, consistent with exhaustive extraction. The total quantity from this tool may be used in the CHRIS exposure modules to estimate clinical exposure.</p> --!>
121
  <h3> Notes </h3>
122
  <ul>
123
- <li>The progress of the extraction can be expressed through the dimensionless time \( \tau \). For your extraction, \( \tau \) = {{tau}}. Extractions with \( \tau \geq 0.1 \) result in more accurate estimates of the total quantity.</li>
124
  <li>If the median \( M / M_0 > 0.9 \), the extraction can be considered exhaustive, and the extracted amount may be used directly as the total quantity.</li>
125
  <li>The total quantity predicted with this tool can be used in the CHRIS exposure modules to estimate clinical exposure.</li>
126
  </ul>
 
96
  \end{array} \right.
97
  \]
98
 
99
+ where \( \tau= D t A^2 / V_p^2 \), \( A \) and \( V_p \) are the surface area and volume of the polymer matrix, respectively, \( D \) is an estimated distribution of the diffusion coefficient of the extractable within the swollen polymer matrix, and \( t \) is time. The quantity \( \Psi = V_s/V_p K \), where \( V_s \) is the solvent volume and \( K \) is the polymer-solvent partition coefficient for the extractable. \( q_n \) are the roots of \( \tan x + \Psi x = 0 \). \( M_0 \) is total quantity initially contained in the polymer. The amount of swelling and number of iterations \( N \) are used to adjust \( \tau \) and \( \Psi \). Based on the input provided, the calculation used the following values:
100
  </p>
101
 
102
  <p>
103
  Extracted amount \( M \) = {{M}} {{units}} <br>
104
  Surface area \( A \) = {{area}} cm<sup>2</sup> <br>
105
  Duration \( t \) = {{time}} h <br>
106
+ Iterations \( N \) = {{iterations}} <br>
107
  Temperature = {{T}} &deg;C <br>
108
  Solvent = {{solventname}} <br>
109
  Solvent volume \( V_s \) = {{solventvol}} cm<sup>3</sup> <br>
 
121
  <!-- <p>The progress of the extraction can be expressed through the dimensionless time \( \tau \). For your extraction, \( \tau \) = {{tau}}. Extractions with \( \tau \geq 0.1 \) result in more accurate estimates of the total quantity. When \( \tau \geq 1.0 \), the extracted amount may be used directly as the total quantity if the extraction is diffusion-controlled (i.e., \( \Psi \) is sufficiently large). For example, if \( \Psi > 10 \) and \( \tau \geq 1.0 \) less than 10% of the extractable will remain in the test article, consistent with exhaustive extraction. The total quantity from this tool may be used in the CHRIS exposure modules to estimate clinical exposure.</p> --!>
122
  <h3> Notes </h3>
123
  <ul>
124
+ <li>The progress of the extraction can be expressed through the dimensionless time \( \tau \). For your extraction, the median \( \tau \) = {{tau}}. Extractions with \( \tau \geq 0.1 \) result in more accurate estimates of the total quantity.</li>
125
  <li>If the median \( M / M_0 > 0.9 \), the extraction can be considered exhaustive, and the extracted amount may be used directly as the total quantity.</li>
126
  <li>The total quantity predicted with this tool can be used in the CHRIS exposure modules to estimate clinical exposure.</li>
127
  </ul>