Files
geant4/examples/advanced/dna/moleculardna/human_cell_chromosomes.py
2024-12-06 11:11:40 +01:00

229 lines
7.2 KiB
Python

# %%
# To run, change the links and definitions in this script and
# type in the terminal containing the file
# $python3 chromosAnalysis.py
# python version tested 3.10.12
# developed in visual studio code (jupyter notebook)
# Author contact, Konstantinos Chatzipapas, konstantinos.chatzipapas@cern.ch, 08/12/2023
# %%
import ROOT as root
import numpy as np
import matplotlib.pyplot as plt
# %%
# Define filenames
iRootFile = "molecular-dna.root"
print("Loaded file: ",iRootFile )
# %%
# Initial parameters (need be inserted manually, if modifications are made in the geometry)
eVtoJ = 1.60218e-19
r3 = 10575e-9 * 3450e-9 * 10575e-9 # a * b * c
mass = 997 * 4 * 3.141592 * r3 / 3 # waterDensity * 4/3 * pi * r3 in kg
# %%
# Length of chromosomes in base pairs (bp) (need be inserted manually, if geometry file is modified)
lc =np.zeros((24,1))
lc[1] = (335601410)
lc[2] = (424230628)
lc[3] = (330358245)
lc[4] = (214431219)
lc[5] = (225844963)
lc[6] = (187075736)
lc[7] = (104619404)
lc[8] = (523147774)
lc[9] = (286308941)
lc[10] = (308642731)
lc[11] = (281141907)
lc[12] = (286680368)
lc[13] = (297671931)
lc[14] = (242439583)
lc[15] = (517729277)
lc[16] = (363900456)
lc[17] = (407437606)
lc[18] = (352426730)
lc[19] = (165113373)
lc[20] = (137667917)
lc[21] = (132362463)
lc[22] = (159987865)
lc[23] = (99027882)
# Calculation of cumulative length and total length of the cell DNA
sum_lc=0
slc =np.zeros((24,1))
for j in range(len(lc)):
sum_lc += lc[j]
slc[j] = sum_lc
print("Total length of DNA in the cell(bp): ", sum_lc)
#print(slc) #Length of each chromosome
# %%
# Calculate the damage yield
number = 0
f = root.TFile(iRootFile)
gTree = f.Get("tuples/primary_source")
number += gTree.GetEntries()
nEntries = 0
fTree = f.Get("tuples/damage")
nEntries += fTree.GetEntries()
#print (nEntries)
c_DSBBPID = {}
for i in range(1,len(lc)):
c_DSBBPID[i] = []
SSB = 0
ttSSB = 0
ttDSB = 0
c_SSB =np.zeros(24)
c_DSB =np.zeros(24)
cc_SSB=np.zeros(24)
cc_DSB=np.zeros(24)
c_SSBp = np.zeros(24)
c_DSBp = np.zeros(24)
c_SSBpp = np.zeros(24)
c_DSBpp = np.zeros(24)
DSBd = np.zeros(24)
DSBi = np.zeros(24)
DSBm = np.zeros(24)
DSBh = np.zeros(24)
SSBd = np.zeros(24)
SSBi = np.zeros(24)
SSBm = np.zeros(24)
# Calculate total number of SSB, DSB, as well as initial break positions for the calculation of fragments
DD = 0
for e in fTree:
if (e.TypeClassification=="DSB" or e.TypeClassification=="DSB+" or e.TypeClassification=="DSB++"):
DD += 1
ttDSB += e.DirectBreaks + e.IndirectBreaks
for i in range(1,len(lc)):
if (e.BasePair>=slc[i-1] and e.BasePair<slc[i]):
cc_DSB[i] += 1 #e.DirectBreaks + e.IndirectBreaks
c_DSBBPID[i].append((e.Event, e.BasePair, e.TypeClassification))
if (e.TypeClassification=="SSB" or e.TypeClassification=="SSB+" or e.TypeClassification=="2SSB"):
SSB += 1
ttSSB += e.DirectBreaks + e.IndirectBreaks
for i in range(len(lc)):
if (e.BasePair>=slc[i-1] and e.BasePair<slc[i]):
cc_SSB[i] += 1 #e.DirectBreaks + e.IndirectBreaks
#print(DD,SSB) #Used for testing
# Calculate damage complexity for each chromosome
for e in fTree:
for i in range(1,len(lc)):
if (e.BasePair>=slc[i-1] and e.BasePair<slc[i]):
if e.TypeClassification=="DSB":
c_DSB[i] += 1
elif e.TypeClassification=="DSB+":
c_DSBp[i] += 1
elif e.TypeClassification=="DSB++":
c_DSBpp[i] += 1
elif e.TypeClassification=="SSB":
c_SSB[i] += 1
elif e.TypeClassification=="SSB+":
c_SSBp[i] += 1
elif e.TypeClassification=="2SSB":
c_SSBpp[i] += 1
for e in fTree:
for i in range(1,len(lc)):
if (e.BasePair>=slc[i-1] and e.BasePair<slc[i]):
if e.SourceClassification=="DSBd":
DSBd[i] += 1
elif e.SourceClassification=="DSBi":
DSBi[i] += 1
elif e.SourceClassification=="DSBm":
DSBm[i] += 1
elif e.SourceClassification=="DSBh":
DSBh[i] += 1
elif e.SourceClassification=="SSBd":
SSBd[i] += 1
elif e.SourceClassification=="SSBi":
SSBi[i] += 1
elif e.SourceClassification=="SSBm":
SSBm[i] += 1
# Damage classification, this is not needed
repDSB = 0
irrDSB =0
tDSB = 0
gTree = f.Get("tuples/classification")
for e in gTree:
repDSB += e.DSB
irrDSB += e.DSBp + e.DSBpp
tDSB += e.DSB + e.DSBp + 2*e.DSBpp
tSSB = 0
ffTree = f.Get("tuples/source")
for e in ffTree:
tSSB += e.SSBd + e.SSBi + e.SSBm
totalDSB = repDSB + irrDSB
#print (ttDSB,tDSB,totalDSB,repDSB,irrDSB," ",SSB,ttSSB,tSSB,tSSB/ttDSB, tSSB/i) #Used for testing
acc_edep=0
hTree= f.Get("tuples/chromosome_hits")
for e in hTree:
acc_edep += (e.e_chromosome_kev + e.e_dna_kev )*1e3
dose = acc_edep * eVtoJ / mass
#print("Accumulated deposited energy in the cell(MeV): ", acc_edep)
#print("Absorbed Dose to the cell(Gy): ", dose)
# %%
#print(c_DSBBPID)
#print(c_DSBBPID[22])
# %%
# Printing damage classification for each chromosome
cSSBsum =0
cSSBpsum =0
cSSBppsum =0
cDSBsum =0
cDSBpsum =0
cDSBppsum =0
ccSSBsum =0
ccDSBsum =0
for i in range(1,len(lc)):
print("\nchromosome",i," total DSB/Gy/GBp: ", cc_DSB[i]/(lc[i]/1e+9)/dose," --> DSB:", c_DSB[i]/(lc[i]/1e+9)/dose, "DSB+:", c_DSBp[i]/(lc[i]/1e+9)/dose, "DSB++:", c_DSBpp[i]/(lc[i]/1e+9)/dose)
print( "chromosome",i," total SSB/Gy/GBp: ", cc_SSB[i]/(lc[i]/1e+9)/dose," --> SSB:", c_SSB[i]/(lc[i]/1e+9)/dose, "SSB+:", c_SSBp[i]/(lc[i]/1e+9)/dose, "SSB++:", c_SSBpp[i]/(lc[i]/1e+9)/dose)
print( "chromosome",i," DSBd: ", DSBd[i]/(lc[i]/1e+9)/dose,"DSBi:", DSBi[i]/(lc[i]/1e+9)/dose, "DSBm:", DSBm[i]/(lc[i]/1e+9)/dose, "DSBh:", DSBh[i]/(lc[i]/1e+9)/dose)
print( "chromosome",i," SSBd: ", SSBd[i]/(lc[i]/1e+9)/dose,"SSBi:", SSBi[i]/(lc[i]/1e+9)/dose, "DSBm:", SSBm[i]/(lc[i]/1e+9)/dose)
#print("chromosome",i," total DSB/Gy/GBp: ", cc_DSB[i]/(lc[i]/1e+9)/dose, " \tchromosome",i," total SSB/Gy/GBp: ", cc_SSB[i]/(lc[i]/1e+9)/dose)
cDSBsum += c_DSB[i]+c_DSBp[i]+c_DSBpp[i]
cSSBsum += c_SSB[i]+c_SSBp[i]+c_SSBpp[i]
cSSBpsum += c_SSBp[i]
cSSBppsum += c_SSBpp[i]
cDSBpsum += c_DSBp[i]
cDSBppsum += c_DSBpp[i]
ccDSBsum += cc_DSB[i]
ccSSBsum += cc_SSB[i]
#print("total DSB/Gy/GBp:",ccDSBsum/(sum_lc/1e+9)/dose, "\ttotal SSB/Gy/GBp:",ccSSBsum/(sum_lc/1e+9)/dose)
print("\nIf the geometry is considered as a whole nucleus:")
#print("total DSB/Gy/GBp:",cDSBsum/(sum_lc/1e+9)/dose, "\ttotal SSB/Gy/GBp:",cSSBsum/(sum_lc/1e+9)/dose)
print("total DSB/Gy/GBp:",cDSBsum/(sum_lc/1e+9)/dose, " --> DSB:", (cDSBsum-cDSBpsum-cDSBppsum)/(sum_lc/1e+9)/dose, "DSB+:", cDSBpsum/(sum_lc/1e+9)/dose, "DSB++:", cDSBppsum/(sum_lc/1e+9)/dose)
print("total SSB/Gy/GBp:",cSSBsum/(sum_lc/1e+9)/dose, " --> SSB:", (cSSBsum-cSSBpsum-cSSBppsum)/(sum_lc/1e+9)/dose, "SSB+:", cSSBpsum/(sum_lc/1e+9)/dose, "SDSB++:", cSSBppsum/(sum_lc/1e+9)/dose)
print("SSB/DSB ratio: ", cSSBsum/cDSBsum)
print("Total dose (Gy): ", dose)
#print(cDSBsum,ccDSBsum,cSSBsum,ccSSBsum)
print("\nThank you for using molecularDNA and supporting the Geant4-DNA collaboration.!")