public void IsomerGammaEmission(Particle p, double deltaDepth, int i)
            {
                Random random = new Random();
                double pp     = SimpleRNG.GetUniform();

                if (pp < pp_IsomerGammaEmission(deltaDepth, i))
                {
                    Particle p_gamma = new Particle(p_type.photon);
                    list_newParticles.Add(p_gamma);
                }
            }
 public void NewParticles(Particle p, double deltaDepth, int i)
 {
     if (p.p_t != p_type.neutron || p.p_t != p_type.proton)
     {
         Random random = new Random();
         double pp     = SimpleRNG.GetUniform();
         if (pp < 0.01)                   // improve the prob. of fragmentation
         {
             list_removeParticles.Add(p); // the primary disappears
             int n_products = 10;         // should be a random number of secondaries
             for (int j = 0; j < n_products / 2; j++)
             {
                 Particle p_born = new Particle(p_type.proton); // a constructor for a proton; later add more secondaries, like neutrons, light ions, etc.
                 list_newParticles.Add(p_born);
             }
             for (int j = 0; j < n_products / 2; j++)
             {
                 Particle p_born = new Particle(p_type.neutron); // a constructor for a proton; later add more secondaries, like neutrons, light ions, etc.
                 list_newParticles.Add(p_born);
             }
             //double z = p.Z - 2; // crude model of fragmentation    // zzz
             //double e = 0.8 * p.E;
             //double a = p.A - n_products / 2;
             //Particle p_primary_frag;
             //if (p.GetPtype(a, z, e) == p_type.not_known)
             //{
             //    p_primary_frag = new Particle();
             //    p_primary_frag.Initialize(a, z, e);
             //}
             //else
             //    p_primary_frag = new Particle(p.GetPtype(a, z, e)); // primary fragment
             //list_newParticles.Add(p_primary_frag);
             //Particle p_target_frag = new Particle();
             //p_target_frag.Initialize(14 + 13 - n_products / 2, 13 - 2, 0.2 * p.E); // give it Al A, Z, E  for now // target fragment
             //list_newParticles.Add(p_target_frag);
         }
     }
 }
            //
            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 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!");
                            }
                        }
                    }
                }
            }
Пример #5
0
        //
        public bool RestitutionKinetics(List <Object> listObjs)
        {
            // the class FreeEnds is derived from DSBs class and is based on DSBdata
            // Free_end class is for Objects (which are fragments that can have free ends)
            Random random = new Random();

            try
            {
                for (int i = 0; i < Convert.ToInt32(expTime / tau); i++) // number of elementary time steps
                {
                    if (!SplitObjects(listObjs, i * tau, (i + 1) * tau))
                    {
                        return(false); // split only using DSBs avaibale in time interval timeIncrement / tau
                    }

                    int availableFreeEnds = 0;
                    foreach (Object o in listObjs)
                    {
                        foreach (Free_end fe in o.md.f_e)
                        {
                            if (fe.FE_type == MetaData.FreeEndType.reactive)
                            {
                                availableFreeEnds++;
                            }
                        }
                    }
                    if (availableFreeEnds != 0)
                    {
                        for (int j = 0; j < availableFreeEnds / 2; j++) // cycle through all pairs of Free Ends in one elementary time step
                        {
                            int availableFreeEnds1 = 0;
                            foreach (Object o in listObjs)
                            {
                                foreach (Free_end fe in o.md.f_e)
                                {
                                    if (fe.FE_type == MetaData.FreeEndType.reactive)
                                    {
                                        availableFreeEnds1++; // determine the number of free ends, which are still reactive
                                    }
                                }
                            }
                            int end1, end2;
                            while (true)
                            {
                                end1 = random.Next(0, availableFreeEnds1);
                                end2 = random.Next(0, availableFreeEnds1);
                                if (end1 != end2)
                                {
                                    break;
                                }
                            }
                            int      itemp = 0;
                            Free_end freeend1 = null, freeend2 = null;
                            foreach (Object o in listObjs)
                            {
                                bool b = false;
                                foreach (Free_end fe in o.md.f_e)
                                {
                                    if (fe.FE_type == MetaData.FreeEndType.reactive)
                                    {
                                        if (itemp == end1)
                                        {
                                            fe.Reacting = true;
                                            freeend1    = fe;
                                            b           = true;
                                            break;
                                        }
                                        itemp++;
                                    }
                                }
                                if (b)
                                {
                                    break;
                                }
                            }
                            itemp = 0;
                            foreach (Object o in listObjs)
                            {
                                bool b = false;
                                foreach (Free_end fe in o.md.f_e)
                                {
                                    if (fe.FE_type == MetaData.FreeEndType.reactive)
                                    {
                                        if (itemp == end2)
                                        {
                                            fe.Reacting = true; // this marks a free end for rejoining/misrejoining
                                            freeend2    = fe;
                                            b           = true;
                                            break;
                                        }
                                        itemp++;
                                    }
                                }
                                if (b)
                                {
                                    break;
                                }
                            }
                            if (freeend1 != null && freeend2 != null)
                            {
                                if (freeend1.Position == freeend2.Position) // proper ends
                                {
                                    if (SimpleRNG.GetUniform() < P)
                                    {
                                        Object o_new = new Object();
                                        if (CreateMergedObj(o_new, listObjs)) // merge the chosen reactive ends in the chosen objects and remove the objs with this pair of free ends
                                        {
                                            listObjs.Add(o_new);
                                            //     renumber bands in the whole genome
                                            int[] b_index = new int[46];
                                            foreach (Object o in listObjs)
                                            {
                                                foreach (Band b in o.md.chromo_bands)
                                                {
                                                    b_index[b.Chromo_num]++;
                                                    b.Ordinal_number = b_index[b.Chromo_num];
                                                }
                                            }
                                        }
                                        else
                                        {
                                            o_new = null; // this happens when one if the members of listObjs becomes a ring
                                        }
                                    }
                                }
                                else
                                {
                                    if (SimpleRNG.GetUniform() < MisrejoiningProb(freeend1, freeend2))
                                    {
                                        Object o_new = new Object();
                                        if (CreateMergedObj(o_new, listObjs)) // merge the chosen reactive ends in the chosen objects
                                        {
                                            listObjs.Add(o_new);
                                            //     renumber bands in the whole genome
                                            int[] b_index = new int[46];
                                            foreach (Object o in listObjs)
                                            {
                                                foreach (Band b in o.md.chromo_bands)
                                                {
                                                    b_index[b.Chromo_num]++;
                                                    b.Ordinal_number = b_index[b.Chromo_num];
                                                }
                                            }
                                        }
                                        else
                                        {
                                            o_new = null; // this happens when one if the members of listObjs becomes a ring
                                        }
                                    }
                                }
                                // if nothing happens de-activate free ends
                                foreach (Object o in listObjs)
                                {
                                    foreach (Free_end fe in o.md.f_e)
                                    {
                                        if (fe.Reacting)
                                        {
                                            fe.Reacting = false;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                if (CheckDSBlist(DSBdata) && CheckObjList(listObjs))
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            catch
            { // merge failure
                Detailed_checkObjList(listObjs);
                Detailed_checkDSBlist(DSBdata);
                return(false);
            }
        }