Esempio n. 1
0
 //
 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;
 }
Esempio n. 3
0
 //
 public bool ApplyRadiation(RadiationSchema rs)
 {
     if (CreateRadBreaks(rs))
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
Esempio n. 4
0
 //
 public bool DoTimeEvolution(RadiationSchema rs, List <Object> listObjs)
 {
     if (ApplyRadAndRepair(rs, listObjs))
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
Esempio n. 5
0
 //
 public bool CreateRadBreaks(RadiationSchema rs)
 {
     //DSBdata = new DSBs("default");
     //return true;
     if (DNAbreakage.PrepairDSBpositionsInGenome(rs, DSBdata))
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
Esempio n. 6
0
 //
 public bool ApplyBreakage(RadiationSchema rs)
 {
     if (ApplyRadiation(rs))
     {
         if (ApplyBystanderEffect())
         {
             return(true);
         }
         else
         {
             return(false);
         }
     }
     else
     {
         return(false);
     }
 }
Esempio n. 7
0
 //
 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!");
                            }
                        }
                    }
                }
            }
Esempio n. 11
0
        //
        public void Do()
        {
            RadiationSchema rs = new RadiationSchema();

            MonteCarloSimlation(rs);
        }
Esempio n. 12
0
 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();
 }