# The (not so) secret mechanisms behind classical thin lens IOL formulas

Third generation formulas are based on thin lens optics. They have the same "skeleton". The value they use to determine the corneal power from the anterior radius of curvature differ - neither do they use the same keratometric index, nor the same rules to predict the lens position from the biometric parameters. However, once those values are calculated, the prediction process is the same for every formula.

Let's dive into the details :-)

## The SRK/T Formula

Published in 1990 by Sanders, Retzlaff and Kraff, the SRK/T (1,2) has long been the favourite IOL calculation method among ophthalmologists, and is still extremely popular.

In this formula, the axial length is slightly modified before being used to predict the lens position. It allows to lower its impact on lens position prediction for high AL values.

```
def setLCOR(LA):
if LA <= 24.2:
LCOR = LA
else:
LCOR = -3.446 + (1.715 * LA) - (0.0237* (LA**2))
return LCOR
```

To be more precise, the modified AL value (LCOR) is used, with the K value, to predict the Corneal Width (Cw). Cw and R are then used to calculate H, which is added to the transformed A constant to give the ELP.

`Cw = -5.40948 + (0.58412 * LCOR) + (0.098 * K)`

```
def setH(r, Cw):
x = r**2 - (Cw**2 / 4.0)
if x < 0:
x = 0
else:
pass
H = r - math.sqrt(x)
return H
```

The influence of the AL value on lens position has a ceiling...

... and the predACD value has a strange relationship with the anterior corneal radius value :

This is because the value entered in the square root of the formula allowing the calculation of H is set to zero when negative (3) !

Let's use a 3D representation :

Also, note that the AL value used in the optical equation is modified by adding a theoretical Retinal Thickness (RETHICK) value to it. RETHICK is itself a function of AL.

`RETHICK = 0.65696 - 0.02029*LA `

This is the final SRK/T function :

```
def SRKT_SE(LA, r, aconst, power):
# a keratometric index value of 1.3375 is used to compute the ACD via the Cw value
# but : a keratometric index value of 1.333 is used as the real keratometric index in the optical calculation ! (cf ncml value)
K = 337.5/r
V = 12.0
na = 1.336
nc = 1.333
ncml = 0.333
# the SRK A constant is modified to represent a physical offset
ACDconst = 0.62467 * aconst - 68.747
offset = ACDconst - 3.336
# The eye-specific lens position is calculated
LCOR = setLCOR(LA)
Cw = -5.40948 + (0.58412 * LCOR) + (0.098 * K)
H = setH(r, Cw)
# The ELP is added to the modified A constant
ACDest = H + offset
# The optical AL is equal to AL + retinal thickness
RETHICK = 0.65696 - 0.02029*LA
LOPT = LA + RETHICK
# the thin lens calculation is finally done
num = 1000 * na * (na *r - ncml * LOPT)- power * (LOPT-ACDest) * (na * r - ncml * ACDest)
denum = na * (V*(na * r - ncml * LOPT) + LOPT * r) - 0.001 * power * (LOPT-ACDest) * (V * (na * r - ncml * ACDest) + ACDest * r)
SEpred = num/denum
return round(SEpred,3)
```

## The Hoffer Q Formula

The Hoffer Q formula (4-7) is the most difficult, among the third generations formulas, to code correctly. The AL value is used to generate 3 other values, which are used along with the K value to calculate the lens position. pACD + 0.05 is added to the predicted value. K is calculated using a keratometric index of 1.3375. The original K and AL values are used in the optical equations.

```
def defMG(LA):
if LA <= 23.0:
M = 1.0
G = 28.0
else:
M = -1.0
G = 23.5
return M, G
```

```
def defA(LA):
if LA > 31.0:
A = 31.0
elif LA < 18.5:
A = 18.5
else:
A = LA
return A
```

The lens position function is complicated :

```
import math
def predACD(LA, K, pACD):
M, G = defMG(LA)
A = defA(LA)
p2 = 0.3 * (A - 23.5)
p3 = (math.tan(K*(math.pi / 180.0)))**2
p4 = 0.1 * M * ((23.5 - A)**2)
p5 = math.tan((0.1 * (G - A)**2) * (math.pi / 180.0))
ACD = pACD + p2 + p3 + (p4 * p5) - 0.99166
return ACD
```

Final Hoffer Q function :

```
def HofferQ_SE(LA, r, pACD, power):
K = 337.5/r
ACD = predACD(LA, K, pACD)
R = (1.336 / (1.336/(1336 / (LA - ACD - 0.05) - power) + (ACD + 0.05) / 1000.0)) - K
SEpred = R / (1.0 + 0.012 * R)
return round(SEpred, 3)
```

## The Holladay 1 Formula

The Holladay 1 formula (8) uses a keratometric index of 4/3. The lens position (ACD) is inferred from the ARC (with a flooring below 7.0mm) and from the AL (with a ceiling after 25.32mm, approximately).

```
def setRag(R):
if R < 7:
Rag = 7
else:
Rag = R
return Rag
```

```
def setAG(LA):
AG = 12.5 * LA / 23.45
if AG > 13.5:
AG = 13.5
else:
AG = AG
return AG
# the AG has a ceiling when greater than 13.5 : this corresponds to an AL value of 25.32mm
```

The lens position, ACD, is a function of Rag and AG :

```
def setACD(Rag, AG):
ACD = 0.56 + Rag - (math.sqrt( (Rag**2) -((AG**2) /4) ))
return ACD
```

A retinal thickness value of 0.2mm is added to the AL.

Final Holladay 1 function :

```
def Holladay_SE(LA, R, SF, power):
Rag = setRag(R)
AG = setAG(LA)
ACD = setACD(Rag, AG)
nc = 4/3
na = 1.336
RT = 0.2
V = 12
ALm = LA + RT
num = 1000*na*(na*R - (nc - 1)*ALm) - power*(ALm - ACD - SF)*(na*R - (nc - 1)*(ACD + SF)) denum = na*(V*(na*R-(nc-1)*ALm)+ALm*R)-0.001*power*(ALm-ACD-SF)*(V*(na*R-(nc-1)*(ACD+SF))+(ACD+SF)*R) result = round(num / denum, 3)
return result
```

## The Haigis Formula

The Haigis formula (9) is the most simple third generation formula... and also consistently has the best outcomes when using its triple-optimized version. The lens position d is obtained using a multiple regression taking ACD and AL as inputs :

*d = a0 + a1 x ACD + a2 x AL*

What's your favourite approach ?

## References

1. Retzlaff JA, Sanders DR, Kraff MC. Development of the SRK/T intraocular lens implant power calculation formula. J Cataract Refract Surg. 1990 May;16(3):333-40.

2. Retzlaff JA, Sanders DR, Kraff MC. Development of the SRK/T intraocular lens implant power calculation formula: Erratum. J Cataract Refract Surg. 1990;16(4):528.

3. Haigis W. Occurrence of erroneous anterior chamber depth in the SRK/T formula. J Cataract Refract Surg. 1993 May;19(3):442-6.

4. Hoffer, Kenneth J. M.D.^{a}. The Hoffer Q formula: A comparison of theoretic and regression formulas. Journal of Cataract & Refractive Surgery: November 1993 - Volume 19 - Issue 6 - p 700-712

5. Hoffer, Kenneth J. MD. Reply: Errata in printed Hoffer Q formula. Journal of Cataract & Refractive Surgery: January 2007 - Volume 33 - Issue 1 - p 2-3

doi: 10.1016/j.jcrs.2006.08.056

6. Zuberbuhler B, Morrell AJ. Errata in printed Hoffer Q formula. J Cataract Refract Surg. 2007 Jan;33(1):2; author reply 2-3.

7. Hoffer, K. Errors in self-programming the Hoffer Q formula. *Eye***21**, 429 (2007).

8. Holladay JT, Musgrove KH, Prager TC, Lewis JW, Chandler TY, Ruiz RS. A three-part system for refining intraocular lens power calculations. J Cataract Refract Surg. 1988;14(1):17–24.

9. Haigis W, Lege B, Miller N, Schneider B. Comparison of immersion ultrasound biometry and partial coherence interferometry for intraocular lens calculation according to Haigis. Graefes Arch Clin Exp Ophthalmol. 2000;238(9): 765–773.