/// <summary>
        /// Get the ScienceSubject for an asteroid experiment.
        /// </summary>
        /// <param name="mse">The science experiment module must be cast as a ModuleScienceExperiment.</param>
        /// <param name="sit">The current Experiment Situation value; see the getExperimentSituation method above.</param>
        /// <returns>Returns the ScienceSubject for that specific asteroid, experiment, and ExperimentSituation; returns null if the module is not of the right type, the experiment is not suitable for astroids, if no asteroids are detected, or if the current asteroid situation is not suitable for the experiment.</returns>
        public static ScienceSubject getAsteroidSubject(ModuleScienceExperiment mse, ExperimentSituations sit)
        {
            if (mse == null)
            {
                return(null);
            }

            Type t = mse.GetType();

            if (t != typeof(DMModuleScienceAnimateGeneric_NM.DMModuleScienceAnimateGeneric))
            {
                return(null);
            }

            DMModuleScienceAnimateGeneric_NM.DMModuleScienceAnimateGeneric DMMod = (DMModuleScienceAnimateGeneric_NM.DMModuleScienceAnimateGeneric)mse;

            if (!isAsteroidExperiment(DMMod))
            {
                return(null);
            }

            if (DMMod.scienceExp == null)
            {
                return(null);
            }

            if (sit == ExperimentSituations.InSpaceLow)
            {
                if (!isAsteroidNear())
                {
                    return(null);
                }
            }
            else if (sit == ExperimentSituations.SrfLanded)
            {
                if (!isAsteroidGrappled())
                {
                    return(null);
                }
            }
            else
            {
                return(null);
            }

            if ((DMMod.scienceExp.situationMask & (int)sit) == 0)
            {
                return(null);
            }

            string oldBodyName = FlightGlobals.Bodies[16].bodyName;

            DMAsteroidScienceGen newAsteroid = new DMAsteroidScienceGen();
            ScienceSubject       sub         = new ScienceSubject(DMMod.scienceExp, sit, newAsteroid.Body, newAsteroid.AClass);

            sub.subjectValue          = newAsteroid.SciMult;
            sub.scienceCap            = DMMod.scienceExp.scienceCap * sub.subjectValue;
            newAsteroid.Body.bodyName = oldBodyName;
            return(sub);
        }
		//Create the science data
		public ScienceData makeScience()
		{
			ExperimentSituations vesselSituation = getSituation();
			string biome = getBiome(vesselSituation);
			CelestialBody mainBody = vessel.mainBody;
			DMAsteroidScienceGen newAsteroid = null;
			bool asteroid = false;

			//Check for asteroids and alter the biome and celestialbody values as necessary
			if (asteroidReports && (DMAsteroidScienceGen.AsteroidGrappled || DMAsteroidScienceGen.AsteroidNear))
			{
				bodyNameFixed = FlightGlobals.Bodies[16].bodyName;
				newAsteroid = new DMAsteroidScienceGen();
				mainBody = newAsteroid.Body;
				biome = newAsteroid.AClass;
				asteroid = true;
			}

			ScienceData data = null;
			ScienceSubject sub = ResearchAndDevelopment.GetExperimentSubject(scienceExp, vesselSituation, mainBody, biome);
			sub.title = scienceExp.experimentTitle + situationCleanup(vesselSituation, biome);

			if (asteroid)
			{
				sub.subjectValue = newAsteroid.SciMult;
				sub.scienceCap = scienceExp.scienceCap * sub.subjectValue;
				mainBody.bodyName = bodyNameFixed;
				asteroid = false;
			}

			if (sub != null)
				data = new ScienceData(scienceExp.baseValue * sub.dataScale, xmitDataScalar, vessel.VesselValues.ScienceReturn.value, sub.id, sub.title, false, part.flightID);
			return data;
		}