diff --git a/docs/notebooks/dispersion_analysis/dispersion_analysis.ipynb b/docs/notebooks/dispersion_analysis/dispersion_analysis.ipynb
index 518dbd848..da512012d 100644
--- a/docs/notebooks/dispersion_analysis/dispersion_analysis.ipynb
+++ b/docs/notebooks/dispersion_analysis/dispersion_analysis.ipynb
@@ -37,7 +37,7 @@
"metadata": {},
"outputs": [],
"source": [
- "%git clone https://github.com/giovaniceotto/RocketPy.git\n",
+ "%git clone https://github.com/RocketPy-Team/RocketPy.git\n",
"import os\n",
"\n",
"os.chdir(\"RocketPy/docs/notebooks/dispersion_analysis\")"
@@ -67,12 +67,13 @@
"outputs": [],
"source": [
"%pip install netCDF4\n",
- "%pip install rocketpy"
+ "%pip install rocketpy\n",
+ "%pip install ipympl"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 1,
"metadata": {
"id": "rNY7u8fApOP_"
},
@@ -99,7 +100,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 2,
"metadata": {
"id": "0uEmvBIt5Ltg"
},
@@ -140,7 +141,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 3,
"metadata": {
"id": "fwoCdOgKpOQD"
},
@@ -148,7 +149,7 @@
"source": [
"analysis_parameters = {\n",
" # Mass Details\n",
- " \"rocketMass\": (\n",
+ " \"rocket_mass\": (\n",
" 8.257,\n",
" 0.001,\n",
" ), # Rocket's dry mass (kg) and its uncertainty (standard deviation)\n",
@@ -161,48 +162,48 @@
" 6 / 1000,\n",
" 1 / 1000,\n",
" ), # Motor's grain separation (axial distance between two grains) (m)\n",
- " \"grainDensity\": (1707, 50), # Motor's grain density (kg/m^3)\n",
- " \"grainOuterRadius\": (21.4 / 1000, 0.375 / 1000), # Motor's grain outer radius (m)\n",
- " \"grainInitialInnerRadius\": (\n",
+ " \"grain_density\": (1707, 50), # Motor's grain density (kg/m^3)\n",
+ " \"grain_outer_radius\": (21.4 / 1000, 0.375 / 1000), # Motor's grain outer radius (m)\n",
+ " \"grain_initial_inner_radius\": (\n",
" 9.65 / 1000,\n",
" 0.375 / 1000,\n",
" ), # Motor's grain inner radius (m)\n",
- " \"grainInitialHeight\": (120 / 1000, 1 / 1000), # Motor's grain height (m)\n",
+ " \"grain_initial_height\": (120 / 1000, 1 / 1000), # Motor's grain height (m)\n",
" # Aerodynamic Details - run help(Rocket) for more information\n",
- " \"inertiaI\": (\n",
+ " \"inertia_I\": (\n",
" 3.675,\n",
" 0.03675,\n",
" ), # Rocket's inertia moment perpendicular to its axis (kg*m^2)\n",
- " \"inertiaZ\": (\n",
+ " \"inertia_Z\": (\n",
" 0.007,\n",
" 0.00007,\n",
" ), # Rocket's inertia moment relative to its axis (kg*m^2)\n",
" \"radius\": (40.45 / 1000, 0.001), # Rocket's radius (kg*m^2)\n",
- " \"distanceRocketNozzle\": (\n",
+ " \"distance_rocket_nozzle\": (\n",
" -1.024,\n",
" 0.001,\n",
" ), # Distance between rocket's center of dry mass and nozzle exit plane (m) (negative)\n",
- " \"distanceRocketPropellant\": (\n",
+ " \"distance_rocket_propellant\": (\n",
" -0.571,\n",
" 0.001,\n",
" ), # Distance between rocket's center of dry mass and and center of propellant mass (m) (negative)\n",
- " \"powerOffDrag\": (\n",
+ " \"power_off_drag\": (\n",
" 0.9081 / 1.05,\n",
" 0.033,\n",
" ), # Multiplier for rocket's drag curve. Usually has a mean value of 1 and a uncertainty of 5% to 10%\n",
- " \"powerOnDrag\": (\n",
+ " \"power_on_drag\": (\n",
" 0.9081 / 1.05,\n",
" 0.033,\n",
" ), # Multiplier for rocket's drag curve. Usually has a mean value of 1 and a uncertainty of 5% to 10%\n",
- " \"noseLength\": (0.274, 0.001), # Rocket's nose cone length (m)\n",
- " \"noseDistanceToCM\": (\n",
+ " \"nose_length\": (0.274, 0.001), # Rocket's nose cone length (m)\n",
+ " \"nose_distance_to_CM\": (\n",
" 1.134,\n",
" 0.001,\n",
" ), # Axial distance between rocket's center of dry mass and nearest point in its nose cone (m)\n",
- " \"finSpan\": (0.077, 0.0005), # Fin span (m)\n",
- " \"finRootChord\": (0.058, 0.0005), # Fin root chord (m)\n",
- " \"finTipChord\": (0.018, 0.0005), # Fin tip chord (m)\n",
- " \"finDistanceToCM\": (\n",
+ " \"fin_span\": (0.077, 0.0005), # Fin span (m)\n",
+ " \"fin_root_chord\": (0.058, 0.0005), # Fin root chord (m)\n",
+ " \"fin_tip_chord\": (0.018, 0.0005), # Fin tip chord (m)\n",
+ " \"fin_distance_to_CM\": (\n",
" -0.906,\n",
" 0.001,\n",
" ), # Axial distance between rocket's center of dry mass and nearest point in its fin (m)\n",
@@ -212,10 +213,10 @@
" 1,\n",
" ), # Launch rail inclination angle relative to the horizontal plane (degrees)\n",
" \"heading\": (53, 2), # Launch rail heading relative to north (degrees)\n",
- " \"railLength\": (5.7, 0.0005), # Launch rail length (m)\n",
- " \"ensembleMember\": list(range(10)), # Members of the ensemble forecast to be used\n",
+ " \"rail_length\": (5.7, 0.0005), # Launch rail length (m)\n",
+ " \"ensemble_member\": list(range(10)), # Members of the ensemble forecast to be used\n",
" # Parachute Details - run help(Rocket) for more information\n",
- " \"CdSDrogue\": (\n",
+ " \"cd_s_drogue\": (\n",
" 0.349 * 1.3,\n",
" 0.07,\n",
" ), # Drag coefficient times reference area for the drogue chute (m^2)\n",
@@ -247,7 +248,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 4,
"metadata": {
"id": "5XCL9JaIpOQH"
},
@@ -293,7 +294,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 5,
"metadata": {
"id": "1eC2p3jEpOQO"
},
@@ -302,57 +303,41 @@
"def export_flight_data(flight_setting, flight_data, exec_time):\n",
" # Generate flight results\n",
" flight_result = {\n",
- " \"outOfRailTime\": flight_data.outOfRailTime,\n",
- " \"outOfRailVelocity\": flight_data.outOfRailVelocity,\n",
- " \"apogeeTime\": flight_data.apogeeTime,\n",
- " \"apogeeAltitude\": flight_data.apogee - Env.elevation,\n",
- " \"apogeeX\": flight_data.apogeeX,\n",
- " \"apogeeY\": flight_data.apogeeY,\n",
- " \"impactTime\": flight_data.tFinal,\n",
- " \"impactX\": flight_data.xImpact,\n",
- " \"impactY\": flight_data.yImpact,\n",
- " \"impactVelocity\": flight_data.impactVelocity,\n",
- " \"initialStaticMargin\": flight_data.rocket.staticMargin(0),\n",
- " \"outOfRailStaticMargin\": flight_data.rocket.staticMargin(\n",
- " TestFlight.outOfRailTime\n",
+ " \"out_of_rail_time\": flight_data.out_of_rail_time,\n",
+ " \"out_of_rail_velocity\": flight_data.out_of_rail_velocity,\n",
+ " \"max_velocity\": flight_data.speed.max,\n",
+ " \"apogee_time\": flight_data.apogee_time,\n",
+ " \"apogee_altitude\": flight_data.apogee - Env.elevation,\n",
+ " \"apogee_x\": flight_data.apogee_x,\n",
+ " \"apogee_y\": flight_data.apogee_y,\n",
+ " \"impact_time\": flight_data.t_final,\n",
+ " \"impact_x\": flight_data.x_impact,\n",
+ " \"impact_y\": flight_data.y_impact,\n",
+ " \"impact_velocity\": flight_data.impact_velocity,\n",
+ " \"initial_static_margin\": flight_data.rocket.static_margin(0),\n",
+ " \"out_of_rail_static_margin\": flight_data.rocket.static_margin(\n",
+ " flight_data.out_of_rail_time\n",
" ),\n",
- " \"finalStaticMargin\": flight_data.rocket.staticMargin(\n",
- " TestFlight.rocket.motor.burnOutTime\n",
+ " \"final_static_margin\": flight_data.rocket.static_margin(\n",
+ " flight_data.rocket.motor.burn_out_time\n",
" ),\n",
- " \"numberOfEvents\": len(flight_data.parachuteEvents),\n",
- " \"executionTime\": exec_time,\n",
+ " \"number_of_events\": len(flight_data.parachute_events),\n",
+ " \"execution_time\": exec_time,\n",
" }\n",
"\n",
- " # Calculate maximum reached velocity\n",
- " sol = np.array(flight_data.solution)\n",
- " flight_data.vx = Function(\n",
- " sol[:, [0, 4]], \"Time (s)\", \"Vx (m/s)\", \"linear\", extrapolation=\"natural\"\n",
- " )\n",
- " flight_data.vy = Function(\n",
- " sol[:, [0, 5]], \"Time (s)\", \"Vy (m/s)\", \"linear\", extrapolation=\"natural\"\n",
- " )\n",
- " flight_data.vz = Function(\n",
- " sol[:, [0, 6]], \"Time (s)\", \"Vz (m/s)\", \"linear\", extrapolation=\"natural\"\n",
- " )\n",
- " flight_data.v = (\n",
- " flight_data.vx**2 + flight_data.vy**2 + flight_data.vz**2\n",
- " ) ** 0.5\n",
- " flight_data.maxVel = np.amax(flight_data.v.source[:, 1])\n",
- " flight_result[\"maxVelocity\"] = flight_data.maxVel\n",
- "\n",
" # Take care of parachute results\n",
- " if len(flight_data.parachuteEvents) > 0:\n",
- " flight_result[\"drogueTriggerTime\"] = flight_data.parachuteEvents[0][0]\n",
- " flight_result[\"drogueInflatedTime\"] = (\n",
- " flight_data.parachuteEvents[0][0] + flight_data.parachuteEvents[0][1].lag\n",
+ " if len(flight_data.parachute_events) > 0:\n",
+ " flight_result[\"drogue_triggerTime\"] = flight_data.parachute_events[0][0]\n",
+ " flight_result[\"drogue_inflated_time\"] = (\n",
+ " flight_data.parachute_events[0][0] + flight_data.parachute_events[0][1].lag\n",
" )\n",
- " flight_result[\"drogueInflatedVelocity\"] = flight_data.v(\n",
- " flight_data.parachuteEvents[0][0] + flight_data.parachuteEvents[0][1].lag\n",
+ " flight_result[\"drogue_inflated_velocity\"] = flight_data.speed(\n",
+ " flight_data.parachute_events[0][0] + flight_data.parachute_events[0][1].lag\n",
" )\n",
" else:\n",
- " flight_result[\"drogueTriggerTime\"] = 0\n",
- " flight_result[\"drogueInflatedTime\"] = 0\n",
- " flight_result[\"drogueInflatedVelocity\"] = 0\n",
+ " flight_result[\"drogue_triggerTime\"] = 0\n",
+ " flight_result[\"drogue_inflated_time\"] = 0\n",
+ " flight_result[\"drogue_inflated_velocity\"] = 0\n",
"\n",
" # Write flight setting and results to file\n",
" dispersion_input_file.write(str(flight_setting) + \"\\n\")\n",
@@ -386,7 +371,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 6,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
@@ -395,11 +380,21 @@
"id": "GILiaO30pOQS",
"outputId": "5a2ae15d-5c16-4ae0-f28b-165730d2419d"
},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'Starting'"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
"source": [
"# Basic analysis info\n",
- "filename = \"dispersion_analysis_outputs/valetudo_rocket_v0\"\n",
- "number_of_simulations = 20000\n",
+ "filename = \"dispersion_analysis_outputs/valetudo_rocket_v1\"\n",
+ "number_of_simulations = 10\n",
"\n",
"# Create data files for inputs, outputs and error logging\n",
"dispersion_error_file = open(str(filename) + \".disp_errors.txt\", \"w\")\n",
@@ -416,16 +411,16 @@
"Env = Environment(\n",
" date=(2019, 8, 10, 21), latitude=-23.363611, longitude=-48.011389\n",
")\n",
- "Env.setElevation(668)\n",
- "Env.maxExpectedHeight = 1500\n",
- "Env.setAtmosphericModel(\n",
+ "Env.set_elevation(668)\n",
+ "Env.max_expected_height = 1500\n",
+ "Env.set_atmospheric_model(\n",
" type=\"Ensemble\",\n",
" file=\"dispersion_analysis_inputs/LASC2019_reanalysis.nc\",\n",
" dictionary=\"ECMWF\",\n",
")\n",
"\n",
"# Set up parachutes. This rocket, named Valetudo, only has a drogue chute.\n",
- "def drogueTrigger(p, h, y):\n",
+ "def drogue_trigger(p, h, y):\n",
" # Check if rocket is going down, i.e. if it has passed the apogee\n",
" vertical_velocity = y[5]\n",
" # Return true to activate parachute once the vertical velocity is negative\n",
@@ -439,80 +434,82 @@
" i += 1\n",
"\n",
" # Update environment object\n",
- " Env.selectEnsembleMember(setting[\"ensembleMember\"])\n",
+ " Env.select_ensemble_member(setting[\"ensemble_member\"])\n",
"\n",
" # Create motor\n",
" Keron = SolidMotor(\n",
- " thrustSource=\"dispersion_analysis_inputs/thrustCurve.csv\",\n",
+ " thrust_source=\"dispersion_analysis_inputs/thrustCurve.csv\",\n",
" burn_time=5.274,\n",
- " reshapeThrustCurve=(setting[\"burn_time\"], setting[\"impulse\"]),\n",
+ " reshape_thrust_curve=(setting[\"burn_time\"], setting[\"impulse\"]),\n",
" nozzle_radius=setting[\"nozzle_radius\"],\n",
" throat_radius=setting[\"throat_radius\"],\n",
- " grainsCenterOfMassPosition=setting[\"distanceRocketPropellant\"],\n",
- " grainNumber=6,\n",
+ " grains_center_of_mass_position=setting[\"distance_rocket_propellant\"],\n",
+ " grain_number=6,\n",
" grain_separation=setting[\"grain_separation\"],\n",
- " grainDensity=setting[\"grainDensity\"],\n",
- " grainOuterRadius=setting[\"grainOuterRadius\"],\n",
- " grainInitialInnerRadius=setting[\"grainInitialInnerRadius\"],\n",
- " grainInitialHeight=setting[\"grainInitialHeight\"],\n",
- " interpolationMethod=\"linear\",\n",
- " nozzlePosition=setting[\"distanceRocketNozzle\"],\n",
- " coordinateSystemOrientation=\"nozzleToCombustionChamber\",\n",
+ " grain_density=setting[\"grain_density\"],\n",
+ " grain_outer_radius=setting[\"grain_outer_radius\"],\n",
+ " grain_initial_inner_radius=setting[\"grain_initial_inner_radius\"],\n",
+ " grain_initial_height=setting[\"grain_initial_height\"],\n",
+ " interpolation_method=\"linear\",\n",
+ " nozzle_position=setting[\"distance_rocket_nozzle\"],\n",
+ " coordinate_system_orientation=\"nozzle_to_combustion_chamber\",\n",
+ " dry_mass=0,\n",
+ " dry_inertia=(0, 0, 0),\n",
+ " center_of_dry_mass_position=0\n",
" )\n",
" # Create rocket\n",
" Valetudo = Rocket(\n",
" radius=setting[\"radius\"],\n",
- " mass=setting[\"rocketMass\"],\n",
- " inertiaI=setting[\"inertiaI\"],\n",
- " inertiaZ=setting[\"inertiaZ\"],\n",
- " powerOffDrag=\"dispersion_analysis_inputs/Cd_PowerOff.csv\",\n",
- " powerOnDrag=\"dispersion_analysis_inputs/Cd_PowerOn.csv\",\n",
- " centerOfDryMassPosition=0,\n",
- " coordinateSystemOrientation=\"tailToNose\",\n",
+ " mass=setting[\"rocket_mass\"],\n",
+ " inertia=(setting[\"inertia_I\"],setting[\"inertia_I\"],setting[\"inertia_Z\"]),\n",
+ " power_off_drag=\"dispersion_analysis_inputs/Cd_PowerOff.csv\",\n",
+ " power_on_drag=\"dispersion_analysis_inputs/Cd_PowerOn.csv\",\n",
+ " center_of_mass_without_motor=0,\n",
+ " coordinate_system_orientation=\"tail_to_nose\",\n",
" )\n",
- " Valetudo.setRailButtons(0.224, -0.93, 30)\n",
+ " Valetudo.set_rail_buttons(0.224, -0.93, 30)\n",
"\n",
- " Valetudo.addMotor(Keron, position=setting[\"distanceRocketNozzle\"])\n",
+ " Valetudo.add_motor(Keron, position=setting[\"distance_rocket_nozzle\"])\n",
"\n",
" # Edit rocket drag\n",
- " Valetudo.powerOffDrag *= setting[\"powerOffDrag\"]\n",
- " Valetudo.powerOnDrag *= setting[\"powerOnDrag\"]\n",
+ " Valetudo.power_off_drag *= setting[\"power_off_drag\"]\n",
+ " Valetudo.power_on_drag *= setting[\"power_on_drag\"]\n",
" # Add rocket nose, fins and tail\n",
- " NoseCone = Valetudo.addNose(\n",
- " length=setting[\"noseLength\"],\n",
+ " NoseCone = Valetudo.add_nose(\n",
+ " length=setting[\"nose_length\"],\n",
" kind=\"vonKarman\",\n",
- " position=setting[\"noseDistanceToCM\"] + setting[\"noseLength\"],\n",
+ " position=setting[\"nose_distance_to_CM\"],\n",
" )\n",
- " FinSet = Valetudo.addTrapezoidalFins(\n",
+ " FinSet = Valetudo.add_trapezoidal_fins(\n",
" n=3,\n",
- " span=setting[\"finSpan\"],\n",
- " rootChord=setting[\"finRootChord\"],\n",
- " tipChord=setting[\"finTipChord\"],\n",
- " position=setting[\"finDistanceToCM\"],\n",
- " cantAngle=0,\n",
+ " span=setting[\"fin_span\"],\n",
+ " root_chord=setting[\"fin_root_chord\"],\n",
+ " tip_chord=setting[\"fin_tip_chord\"],\n",
+ " position=setting[\"fin_distance_to_CM\"],\n",
+ " cant_angle=0,\n",
" airfoil=None,\n",
" )\n",
" # Add parachute\n",
- " Drogue = Valetudo.addParachute(\n",
+ " Drogue = Valetudo.add_parachute(\n",
" \"Drogue\",\n",
- " CdS=setting[\"CdSDrogue\"],\n",
- " trigger=drogueTrigger,\n",
- " samplingRate=105,\n",
+ " cd_s=setting[\"cd_s_drogue\"],\n",
+ " trigger=drogue_trigger,\n",
+ " sampling_rate=105,\n",
" lag=setting[\"lag_rec\"] + setting[\"lag_se\"],\n",
" noise=(0, 8.3, 0.5),\n",
" )\n",
"\n",
" # Run trajectory simulation\n",
" try:\n",
- " TestFlight = Flight(\n",
+ " test_flight = Flight(\n",
" rocket=Valetudo,\n",
" environment=Env,\n",
- " railLength=setting[\"railLength\"],\n",
+ " rail_length=setting[\"rail_length\"],\n",
" inclination=setting[\"inclination\"],\n",
" heading=setting[\"heading\"],\n",
- " maxTime=600,\n",
+ " max_time=600,\n",
" )\n",
- " export_flight_data(setting, TestFlight, process_time() - start_time)\n",
+ " export_flight_data(setting, test_flight, process_time() - start_time)\n",
" except Exception as E:\n",
" print(E)\n",
" export_flight_error(setting)\n",
@@ -534,7 +531,7 @@
"## Close files\n",
"dispersion_input_file.close()\n",
"dispersion_output_file.close()\n",
- "dispersion_error_file.close()\n"
+ "dispersion_error_file.close()"
]
},
{
@@ -561,7 +558,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 9,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
@@ -569,33 +566,41 @@
"id": "-7qgTJzRpOQb",
"outputId": "76d2cecd-a09f-429f-cca2-f4e03e39d49e"
},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Number of simulations: 10\n"
+ ]
+ }
+ ],
"source": [
- "filename = \"dispersion_analysis_outputs/valetudo_rocket_v0\"\n",
+ "filename = \"dispersion_analysis_outputs/valetudo_rocket_v1\"\n",
"\n",
"# Initialize variable to store all results\n",
"dispersion_general_results = []\n",
"\n",
"dispersion_results = {\n",
- " \"outOfRailTime\": [],\n",
- " \"outOfRailVelocity\": [],\n",
- " \"apogeeTime\": [],\n",
- " \"apogeeAltitude\": [],\n",
- " \"apogeeX\": [],\n",
- " \"apogeeY\": [],\n",
- " \"impactTime\": [],\n",
- " \"impactX\": [],\n",
- " \"impactY\": [],\n",
- " \"impactVelocity\": [],\n",
- " \"initialStaticMargin\": [],\n",
- " \"outOfRailStaticMargin\": [],\n",
- " \"finalStaticMargin\": [],\n",
- " \"numberOfEvents\": [],\n",
- " \"maxVelocity\": [],\n",
- " \"drogueTriggerTime\": [],\n",
- " \"drogueInflatedTime\": [],\n",
- " \"drogueInflatedVelocity\": [],\n",
- " \"executionTime\": [],\n",
+ " \"out_of_rail_time\": [],\n",
+ " \"out_of_rail_velocity\": [],\n",
+ " \"apogee_time\": [],\n",
+ " \"apogee_altitude\": [],\n",
+ " \"apogee_x\": [],\n",
+ " \"apogee_y\": [],\n",
+ " \"impact_time\": [],\n",
+ " \"impact_x\": [],\n",
+ " \"impact_y\": [],\n",
+ " \"impact_velocity\": [],\n",
+ " \"initial_static_margin\": [],\n",
+ " \"out_of_rail_static_margin\": [],\n",
+ " \"final_static_margin\": [],\n",
+ " \"number_of_events\": [],\n",
+ " \"max_velocity\": [],\n",
+ " \"drogue_triggerTime\": [],\n",
+ " \"drogue_inflated_time\": [],\n",
+ " \"drogue_inflated_velocity\": [],\n",
+ " \"execution_time\": [],\n",
"}\n",
"\n",
"# Get all dispersion results\n",
@@ -645,7 +650,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 10,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
@@ -654,17 +659,1109 @@
"id": "1JQSzd5cpOQh",
"outputId": "455abcdf-9dd7-4689-9523-50154c7fb302"
},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Out of Rail Time - Mean Value: 1.024 s\n",
+ "Out of Rail Time - Standard Deviation: 0.246 s\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ "\n",
+ "\n",
+ "\n"
+ ],
+ "text/plain": [
+ "