// public void MonteCarloSimlation(RadiationSchema rs) { for (int i = 0; i < rs.MChistories; i++) { TimeOperator timeOperator = new TimeOperator(); switch (RadiationSchema.rad_repair_action) // zzz-- enable only DNA breakage { case 0: { timeOperator.DoTimeEvolution(rs, listObjs); // recursion creates time loop } break; // case 1: // { //// timeOperator.ApplyBreakage(rs, listObjs); // } // break; // default: // { // // timeOperator.ApplyRadAndRepair(rs, listObjs); // } // break; } } }
public Work(int thread, int n, RadiationSchema r, DSBs dd) { nThread = thread; nThreads = n; rs = r; DSBdata = dd; }
// public bool ApplyRadiation(RadiationSchema rs) { if (CreateRadBreaks(rs)) { return(true); } else { return(false); } }
// public bool DoTimeEvolution(RadiationSchema rs, List <Object> listObjs) { if (ApplyRadAndRepair(rs, listObjs)) { return(true); } else { return(false); } }
// public bool CreateRadBreaks(RadiationSchema rs) { //DSBdata = new DSBs("default"); //return true; if (DNAbreakage.PrepairDSBpositionsInGenome(rs, DSBdata)) { return(true); } else { return(false); } }
// public bool ApplyBreakage(RadiationSchema rs) { if (ApplyRadiation(rs)) { if (ApplyBystanderEffect()) { return(true); } else { return(false); } } else { return(false); } }
// public bool ApplyRadAndRepair(RadiationSchema rs, List <Object> listObjs) { if (ApplyBreakage(rs)) { if (RestitutionKinetics(listObjs)) { return(true); } else { return(false); } } else { return(false); } }
// public static bool ApplyRad2RWs(RadiationSchema rs, RandomWalk rw, DSBs DSBdata) { int ndsb = 0; try { double dose; double dose_total = 0.0; for (int nb = 0; nb < rs.nBeams; nb++) // iterate over all beams { foreach (int j in rw.nmonomer) { dose = Dconst; dose_total += Dconst; try { for (int i = 0; i < amorphous_partile_tracks[nb].track_struct.ntracks; i++) { int x = amorphous_partile_tracks[nb].track_struct.X[i]; int y = amorphous_partile_tracks[nb].track_struct.Y[i]; int dist2 = (x - rw.LL[j].X) * (x - rw.LL[j].X) + (y - rw.LL[j].Y) * (y - rw.LL[j].Y); if (dist2 < Convert.ToInt32((RadiationSchema.Pr / lattice_dim) * (RadiationSchema.Pr / lattice_dim))) { int t = Convert.ToInt32(MainForm.Particle.Tracks.grid * lattice_dim * Math.Sqrt(dist2) / RadiationSchema.Pr); // microns dose += amorphous_partile_tracks[nb].track_struct.dose[t]; dose_total += amorphous_partile_tracks[nb].track_struct.dose[t]; } } } catch { return(false); } double Q = 0.812 * 35.0 / 25.0; // multiply by 35./25. for high/low LET; also 1e-5 is factored out if (amorphous_partile_tracks[nb].p_t == MainForm.Radiation.p_type.photon) { Q = 0.812; // multiply by 35./25. for high LET } else { Q = 0.812 * 35.0 / 25.0; // multiply by 35./25. for high LET } Q *= 1.0e-5; // Q is determined from PFGE experiments Random random = new Random(); try { if (SimpleRNG.GetUniform() < 1.0 - Math.Exp(-Q * dose)) { ndsb++; DSBs.DSBstruct new_dsb = new DSBs.DSBstruct { ndsb = ndsb, L = rw.LL[j], position = rw.nmonomer[j], entry_time = rs.entryTime[nb], exit_time = rs.exitTime[nb] }; new_dsb.random_time = SimpleRNG.GetUniform() * (new_dsb.exit_time - new_dsb.entry_time) + new_dsb.entry_time; // a DSB is created sometime during the fractionation interval double r = SimpleRNG.GetUniform(); if (r < DSBs.DSBcomplP[0]) { new_dsb.DSBcmplx = DSBs.DSBstruct.DSBcomplexity.simpleDSB; } else { if (r >= DSBs.DSBcomplP[0] && r < DSBs.DSBcomplP[1]) // zzz can a DSB appear more than 1 time at the same monomer { new_dsb.DSBcmplx = DSBs.DSBstruct.DSBcomplexity.DSBplus; } else { new_dsb.DSBcmplx = DSBs.DSBstruct.DSBcomplexity.DSBplusplus; } } DSBdata.listDSBs.Add(new_dsb); } } catch { return(false); } } } dose_total /= Convert.ToDouble(rw.nmonomer.Length); // total dose integrated over all monomers // zzz might wanna output somewhere return(true); } catch { return(false); } }
// public bool PrepairDSBpositionsInGenome(RadiationSchema rs, DSBs DSBdata) { bool bParallel = false; // zzz666 try { RandomWalk rw = new RandomWalk(); int nmonomers = IntactHumanGenome.WholeGenome(); rw.LL = new Location[nmonomers]; rw.nmonomer = new int[nmonomers]; Random random = new Random(); int rnucleus = Convert.ToInt32(R / lattice_dim); int j = 0; if (!bParallel) { for (int chn = 0; chn < IntactHumanGenome.nObjs; chn++) // zzz666 split these into subtasks { while (true) { rw.LL[j].X = random.Next(0, 2 * rnucleus) - rnucleus; // RW random origin rw.LL[j].Y = random.Next(0, 2 * rnucleus) - rnucleus; rw.LL[j].Z = random.Next(0, 2 * rnucleus) - rnucleus; if (InsideEllipsoid(rw.LL[j])) { break; } } // zzz666 these RWs don't have loops or domains yet rw.nmonomer[j] = j; j++; for (int i = 0; i < Convert.ToInt32(IntactHumanGenome.NC[chn] / IntactHumanGenome.monomerSize) - 1; i++) { Location l_temp; switch (random.Next(0, 3)) { case 0: { l_temp.X = rw.LL[j - 1].X + (2 * random.Next(0, 2) - 1); l_temp.Y = rw.LL[j - 1].Y; l_temp.Z = rw.LL[j - 1].Z; if (InsideEllipsoid(l_temp)) { rw.LL[j] = l_temp; } } break; case 1: { l_temp.X = rw.LL[j - 1].X; l_temp.Y = rw.LL[j - 1].Y + (2 * random.Next(0, 2) - 1); l_temp.Z = rw.LL[j - 1].Z; if (InsideEllipsoid(l_temp)) { rw.LL[j] = l_temp; } } break; case 2: { l_temp.X = rw.LL[j - 1].X; l_temp.Y = rw.LL[j - 1].Y; l_temp.Z = rw.LL[j - 1].Z + (2 * random.Next(0, 2) - 1); if (InsideEllipsoid(l_temp)) { rw.LL[j] = l_temp; } } break; default: break; } rw.nmonomer[j] = j; j++; } } if (ApplyRad2RWs(rs, rw, DSBdata)) // collect all sets of DSBs and put them into a list { return(true); } else { return(false); } } else { //foreach (var item in new ManagementObjectSearcher("Select * from Win32_ComputerSystem").Get()) //{ // Console.WriteLine("Number Of Physical Processors: {0} ", item["NumberOfProcessors"]); //} int coreCount = 0; foreach (var item in new ManagementObjectSearcher("Select * from Win32_Processor").Get()) { coreCount += int.Parse(item["NumberOfCores"].ToString()); } //Console.WriteLine("Number Of Cores: {0}", coreCount); //Console.WriteLine("Number Of Logical Processors: {0}", Environment.ProcessorCount); int processorCount = Environment.ProcessorCount; int logicalprocessorCount = 0; foreach (var item in new ManagementObjectSearcher("Select * from Win32_ComputerSystem").Get()) { //Console.WriteLine("Number Of Logical Processors: {0}", item["NumberOfLogicalProcessors"]); logicalprocessorCount += int.Parse(item["NumberOfLogicalProcessors"].ToString()); } int nThreads = coreCount; // zzz ? or logicalprocessorCount? Thread[] oThread = null; for (thread = 0; thread < nThreads; thread++) { Work w = new Work(thread, nThreads, rs, DSBdata); ThreadStart threadDelegate = new ThreadStart(Work.DoWork); oThread[thread] = new Thread(threadDelegate); oThread[thread].Start(); } } return(true); // zzz666 run subtask all the way here, so that every CPU would produce DSBdata for each own RW, which has 46/nCPU chromosomes; meaure time with and w/o parallelization } catch { return(false); } }
public NASARTI_original(RadiationSchema rs) { amorphous_partile_tracks = new MainForm.Particle[rs.nBeams]; SimpleRNG.SetSeedFromSystemTime(); // setting seed from computer time for (int nb = 0; nb < rs.nBeams; nb++) // iterate over all beams { amorphous_partile_tracks[nb] = new MainForm.Particle(rs.pt[nb]) { track_struct = new MainForm.Particle.Tracks() }; amorphous_partile_tracks[nb].track_struct.distance = new List <double>(); amorphous_partile_tracks[nb].track_struct.dose = new List <double>(); string appPath = Application.StartupPath; string trackData; string[] RDinput; double LET; double LET1; double fraction_of_energy_lost = 0.0; if (rs.pt[nb] == MainForm.Radiation.p_type.photon) { Dconst += rs.D[nb]; } else { if (File.Exists(appPath + @"\RD\RD.dat")) { trackData = File.ReadAllText(appPath + @"\RD\RD.dat"); RDinput = trackData.Split((char[])null, StringSplitOptions.RemoveEmptyEntries); // define particles with track properties LET = Convert.ToDouble(RDinput[0]); LET1 = Convert.ToDouble(RDinput[1]); fraction_of_energy_lost = Convert.ToDouble(RDinput[2]); Dconst += rs.D[nb] * fraction_of_energy_lost; for (int i = 0; i < RDinput.Length - 3; i++) { switch (i % 5) { case 0: { amorphous_partile_tracks[nb].E = amorphous_partile_tracks[nb].track_struct.energy = Convert.ToInt32(Convert.ToDouble(RDinput[i + 3])); } break; case 1: { amorphous_partile_tracks[nb].A = amorphous_partile_tracks[nb].track_struct.mass = Convert.ToInt32(Convert.ToDouble(RDinput[i + 3])); } break; case 2: { amorphous_partile_tracks[nb].Z = amorphous_partile_tracks[nb].track_struct.charge = Convert.ToInt32(Convert.ToDouble(RDinput[i + 3])); } break; case 3: { amorphous_partile_tracks[nb].track_struct.distance.Add(Convert.ToDouble(RDinput[i + 3])); } break; case 4: { amorphous_partile_tracks[nb].track_struct.dose.Add(Convert.ToDouble(RDinput[i + 3])); } break; default: break; } } string source = appPath + @"\RD\RD.dat"; string destination = appPath + @"\RD\RD_" + Convert.ToInt32(amorphous_partile_tracks[nb].track_struct.mass).ToString() + "_" + Convert.ToInt32(amorphous_partile_tracks[nb].track_struct.charge).ToString() + "_" + Convert.ToInt32(amorphous_partile_tracks[nb].track_struct.energy).ToString() + ".dat"; try { File.Copy(source, destination, true); File.Delete(source); } catch { MessageBox.Show("File RD.dat with the amorphous track structure was not processed!"); } } else { try { // parse file name trackData = File.ReadAllText(appPath + @"\RD\RD_" + Convert.ToInt32(amorphous_partile_tracks[nb].A).ToString() + "_" + Convert.ToInt32(amorphous_partile_tracks[nb].Z).ToString() + "_" + Convert.ToInt32(amorphous_partile_tracks[nb].E).ToString() + ".dat"); RDinput = trackData.Split((char[])null, StringSplitOptions.RemoveEmptyEntries); // define particles with track properties LET = Convert.ToDouble(RDinput[0]); LET1 = Convert.ToDouble(RDinput[1]); fraction_of_energy_lost = Convert.ToDouble(RDinput[2]); Dconst += rs.D[nb] * fraction_of_energy_lost; for (int i = 0; i < RDinput.Length - 3; i++) { switch (i % 5) { case 0: { amorphous_partile_tracks[nb].E = amorphous_partile_tracks[nb].track_struct.energy = Convert.ToInt32(Convert.ToDouble(RDinput[i + 3])); } break; case 1: { amorphous_partile_tracks[nb].A = amorphous_partile_tracks[nb].track_struct.mass = Convert.ToInt32(Convert.ToDouble(RDinput[i + 3])); } break; case 2: { amorphous_partile_tracks[nb].Z = amorphous_partile_tracks[nb].track_struct.charge = Convert.ToInt32(Convert.ToDouble(RDinput[i + 3])); } break; case 3: { amorphous_partile_tracks[nb].track_struct.distance.Add(Convert.ToDouble(RDinput[i + 3])); } break; case 4: { amorphous_partile_tracks[nb].track_struct.dose.Add(Convert.ToDouble(RDinput[i + 3])); } break; default: break; } } amorphous_partile_tracks[nb].p_t = GetPtype(amorphous_partile_tracks[nb].A, amorphous_partile_tracks[nb].Z, amorphous_partile_tracks[nb].E); amorphous_partile_tracks[nb].track_struct.X = new List <int>(); amorphous_partile_tracks[nb].track_struct.Y = new List <int>(); amorphous_partile_tracks[nb].lambda = rs.D[nb] / (LET * 1.6021 / 10.0) * (Math.PI * (R + RadiationSchema.Pr) * (R + RadiationSchema.Pr)); amorphous_partile_tracks[nb].nParticles = Convert.ToInt32(amorphous_partile_tracks[nb].lambda); amorphous_partile_tracks[nb].track_struct.ntracks = SimpleRNG.GetPoisson(amorphous_partile_tracks[nb].lambda); // Poisson dist. ntracks Random random = new Random(); for (int i = 0; i < amorphous_partile_tracks[nb].track_struct.ntracks; i++) { int cell_r = Convert.ToInt32(R / lattice_dim); amorphous_partile_tracks[nb].track_struct.X.Add(random.Next(0, 2 * cell_r) - cell_r); amorphous_partile_tracks[nb].track_struct.Y.Add(random.Next(0, 2 * cell_r) - cell_r); } } catch { MessageBox.Show("Input file with the radial dose could not be found!"); } } } } }
// public void Do() { RadiationSchema rs = new RadiationSchema(); MonteCarloSimlation(rs); }
public readonly double sigma2 = 2.0e3; // get it from fits to the experiment; sigma2 parameter in the distance exp. // public TimeOperator() { rs = new RadiationSchema(); DNAbreakage = new NASARTI_original(rs); DSBdata = new DSBs(); }