Follow the reluctant adventures in the life of a Welsh astrophysicist sent around the world for some reason, wherein I photograph potatoes and destroy galaxies in the name of science. And don't forget about my website,

Monday, 24 July 2017

Arecibo Reloaded

Several years ago, as long-term readers will recall, I made a CGI model of Arecibo Observatory because my then-boss told me to. This was then turned into a laser-etched glass cube, originally just as a nice present for the Observatory employees but subsequently sold at the visitor centre. The original model took about a week to make. It was based on the original telescope schematics plus careful site-walking. It had enough details for the required glass cube, but not too much more than that.

Late last year I bought myself a VR headset. I have a review post of that in draft, but suffice to say it's rather fun - though the technology is still immature. Naturally I wanted very much to convert my own content into VR format, because when it works, it really works. The sense of immersion is much, much greater than any other format.

There are different ways to produce VR content. One is to make an interactive, game-like format, where the user can walk around a virtual environment however they like. Of course this would be the most fun sort of VR, but you lose realism and detail. Well, more accurately, if I were to try this, my result would lack realism and detail because I don't have much experience creating interactive content. I'm much more familiar with another method that can be used for VR : pre-rendered video.

Pre-rendered content means you can apply all sorts of fancy lighting and material effects that give realistic results much more easily than with the interactive approach, and you don't have to worry too much about the vertex count. I was urged to try the Unity game engine, but in the end the burden of learning an entirely new interface was just too much. Upgrading the Arecibo model to VR standard was no small task in itself; the prospect of also learning new software with a radically different approach to Blender turned, "relaxing evening" into, "yeah, after you finish work for the day, keep doing more work in the evening." So I went with what I knew : pre-rendered content in Blender.

This seems like a good opportunity to list some of the mistakes I made when learning how to get VR content working, but if you're really only here for the Arecibo stuff, feel free to skip the whole next section. What follows is a pseudo-tutorial to creating VR content; if anyone wants me to develop this into a full tutorial, then I will.

Creating VR : What Not To Do

Before I started playing with the Arecibo model I wanted to get VR content working with something simpler. The main guide I relied on was this excellent video tutorial :

I hate video tutorials and I cannot for the life of me understand why they're so popular, but this one is very good. A couple of things are worth adding/emphasising :
  • Blender's native 360 3D (spherical stereo) camera's are only possible using the Cycles rendering engine. The reason for this I'll explain in detail below.
  • Although it comes with various options for the type of VR content, e.g. top-bottom, side-by-side, these don't actually seem to do anything. You have to render the two images separately and join them together yourself (you can use Blender's sequencer for this, but you have to set things up yourself - there's no automatic, "side by side" button).
All of my content thus far has been with Blender's traditional internal rendering engine, because it's fast and I know how to use it. Rendering speed doesn't seem to be getting much emphasis these days; the focus seems to be on ever-more realistic results. Which is fine, but I don't care for waiting hours and hours for a single still image. I want speed. So Cycles, which is generally much slower than the internal engine, isn't usually for me.

Unfortunately it's not as simple as changing which rendering engine you want and re-rendering an old scene. The two engines are radically different, and this means you have to remake all the old materials in a way that Cycles can understand. Initially this seemed so daunting I decided to try and find a workaround. I'd already done some standard side-by-side 3D content, so it seemed to me that the key was to figure out how to render 360 spherical content and just do this from two different positions. What you need for the headset is an image in equirectangular format

First I tried using the "panorama" option of the camera, experimenting with the field of view setting. Although it's possible to get something sort-of reasonable with this, it's not great - the image gets very distorted at the poles. This option is best avoided.

Fortunately I came up with what I thought was a clever solution. I'd render my old scenes using the internal engine with the classic "6x 90 degree F.O.V." images. Then I'd setup a skybox as normal, but I'd use Cycles materials for each face of the box so I could then use the Cycles spherical camera. Creating a shadeless Cycles material is pretty trivial, and avoids having to learn Cycles in any real depth - and more importantly, there's no need to convert any of the old materials. Plus this would be easy to animate.

Part of a classic skybox. Each face was rendered in Blender internal using a 16 mm camera, giving a 90 degree field of view.
This actually works. When you render the above skybox (adding in the missing planes) using a Cycles panoramic, equirectangular camera, you get the following :

Seamless and perfectly distorted as an equirectangular image should be. Great ! If that's all you need - e.g. 360 degree but 2D panoramas - then there's nothing wrong with this method. You can test the images using, for example, this, or you can find whatever application you prefer for turning them into web pages. Google+ used to let you do this directly, a feature which got lost at the last update but is slowly being re-implemented.

You can also view this directly in Blender in realtime without needing a camera. What you do is to join the faces of the skybox together (make sure your textures are UV mapped), subdivide the mesh a bunch of times, then use the "to sphere" tool. That turns your skybox into a skyball, which you can view just fine in Blender's viewport.

That approach lets you skip the Cycles renderer altogether, as long as you just want a personal viewer. Another option is to use a Python script. After creating the skyball, knowing its radius and the position of each vertex, you could move each vertex to the position it should have on an equirectangular map (i.e. convert its Cartesian coordinates into spherical polar coordinates). That will get you an equirectangular map directly.

I expected that since regular 3D content just consists of two side-by-side images, I could then render two skyboxes (or skyballs) from slightly different positions, and join the two equirectangular maps together. This does not work. Don't do it !

What you get if you try this is something very strange. From one viewing angle, everything looks great on the VR headset... but as you turn your head, the sense of depth changes. Turn your head 180 degrees and you realise the sense of depth is inverted... but if you then turn your head upside-down, everything works again !

This bizarre behaviour was not at all obvious to me, and I only understood it after a lot of Google searching. It turns out that you can't ignore the fact that your eyes move in space as you turn your head. Rendering from two fixed viewpoints is not good enough - you need to account for your eyes being at slightly different physical locations depending on your viewing angle. That's why the spherical stereo mode isn't supported in Blender internal. It requires the camera to render from a different location for each horizontal pixel of the image, which the internal renderer simply doesn't support.

Technically it might be possible to write a Python script to get around this problem. But it would be ugly and incredibly slow. You'd have to render each column of pixels of the two images from different locations, accounting for the rotation of the two cameras around their common centre, and then stitch them together. Since you're going to want your images to be at least 2k on a side, that means rendering 4,000 images per frame. Don't do that. Really, your only option is to go with Cycles.

Arecibo is a complex mesh, so once I resigned myself to the need to use Cycles, initially I thought I'd start with something simpler. The ALFALFA animation seemed like a good choice : 22,000 galaxies, all with very simple, scriptable materials. That would look great in 360 3D VR, wouldn't it ? Being surrounded by a huge mass of galaxies floating past would look pretty shiny, eh ?

It would. And scripting these materials turned out to be extremely simple, which I was rather pleased with. But alas ! It didn't work. Cycles may be technically more capable than the internal render engine, but it includes an extremely irritating and hard limit of the number of image textures it supports : 1024. The only way around this is to edit the Blender source code. I'm told this would not be so difficult, but I didn't fancy trying that.

So I gave up and decided to do the thing properly. Arecibo at least didn't need a thousand different image textures.

Remodelling Arecibo Observatory

The original mesh wasn't in too bad a state. Not so long ago I'd done some tidying up to make an animation for the visitor centre, so I'd already added some details that weren't in the original model.

Of course it isn't perfect. Strange flickering besets the landscape (and to a lesser extent the trees); Blender's textures are not always as stable as they should be. The trees are rather too deciduous for the tropics, but those were the best tree sprites I could find - and overall, I rather like the forest effect.

Viewed closer, the model looks acceptable, though it lacks detail. The materials are decent, but of course they are far from perfect.

However it looks best from below. The low resolution of the landscape is a problem - this was the highest resolution available from the USGS, but it's not really enough, and manually editing it would be quite a task. And while the rocky texture looks OK from a distance, it's not so great close up. All these problems disappear from a different viewing angle.

That starts to look halfway respectable, in that the top half of the image looks respectable though the lower half not so much. Here's a reference photo for comparison.

I began the VR conversion with the existing materials. Unfortunately, I couldn't find an acceptably fast render solution with the trees, so they had to go. Much work went in to creating landscape materials that the viewer could accept as representing rocks and trees. Learning how to distribute different textures using Cycles materials was one of the hardest parts of the process, but eventually something clicked and it started to make sense.

I dallied with getting the rocky areas to have some displacement, but I couldn't get this to work well, so I stopped. Certainly there's a lot of scope for improvement, but it's fast. With the plan being to have the animation take the user on a walking-pace tour of the telescope, rendering speed was all-important.

Fortunately, the telescope itself doesn't feature too many complex materials. Converting them to Cycles format was relatively painless.

The one major exception was the main white paint material. That went through many iterations before I got the balance right. Eventually I realised two things : 1) from reference photos, the material has different levels and types of dirt depending on where it is and when the photo was taken; 2) it's actually white. Not grey - bright white. Making things a brighter shade of white in Blender is one of those things which is really very simple when you know the answer but can sometimes be unexpectedly difficult to solve : make the lights brighter ! Yes, you might then have to adjust all of your other materials, but that's what you gotta do.

To keep rendering times short, I basically disabled all of Cycles fancy lighting effects. Light bounces were reduced to their minimum values, except for transparency since I needed a few transparent materials (the fence mesh material - sometimes you can see other fences through the fence, and you need multiple "bounces" for this to render correctly). I used "branched path tracing" rather than the regular "path tracing" to make sure everything was set on minimum. That completely eliminates the grainy look that often plagues Cycles renders, reducing it back to something approaching the internal render engine in look and speed. Render times were slashed from several minutes per frame (using the default settings) down to 30 seconds.

Of course the penalty is that the render isn't as realistic as it might be. An annoyance with Cycles is that it doesn't support hemi lights, which are useful for faking diffuse background light. I had to make do with crappy sun lights instead, but beggars can't be choosers.

One important decision that had to be made was the level of detail I was prepared to add. The original was very simple - fine for distance shots, but not suitable for close-ups. Also, while the telescope schematics contain everything you could ever want about the superstructure, they contain nothing about everything else : the walkways, the waveguide, the cables - none of these are included at all. And the real telescope is, in many places, ferociously complex.

Worse, I don't have many reference pictures of some of the most complex areas - you don't tend to take photos of those places.

You can see in the above that the major girders of the telescope are all complex features made of many sub-girders and supports. I had to neglect these. It would have made the modelling process incredibly tedious and the model impossible to work with. As it was, the final vertex count was a mere 650,000 : with the girders done in full detail it would probably have been tens of millions. I suppose it might be possible to use image textures, but that can be for the next iteration. So I went with, "include all the major structures, but don't render them in full detail."

I also had to sacrifice on cables. When you're actually up there, the platform is an even messier place than it looks from the photographs. Trying to track every single cable would have been absolutely impossible.

The waveguide - which carries the signal received from the telescope back to the instruments in the control room for analysis - also had to be compromised. You can see it in the above photograph, running vertically through the image right of centre and looking a bit like an air vent. Following its precise path wasn't possible, so I simply included it where I could but it's got quite a lot of gaps in the final model. Which means my virtual model wouldn't really function. Oh well.

What I decided to try and include as much of as possible was everything else : all those other secondary details like railings, lights, boxes, signs, rivets... all those sorts of little details. Great care was taken with each reference photo to include the unique features of every part of the platform, rather than inventing random industrial details. If this is art, then it's art without much creativity in it.

The lower section rotates, of course, which is why it looks different here than in the above reference photo.

Several mistakes here. I put the stairs leading down on the inside, whereas actually they're found on the outside of the azimuth arm. The building is slightly too tall. And the two separate sections should be connected. Oh well.

Again some differences here because the arm was rotated at a different angle in the reference photos.

Of course there are a lot of difference in this dense, complex area where I had few good reference photos. Eagle-eyed viewers will notice that the dirt pattern on the diamond plate flooring changes depending on which level you're standing on.

Pretty nearly all of the details shown above - and more besides - are new for the VR video. Not everything is visible in the VR display - including, unfortunately, the signs. The signs are where I allowed myself a creative outburst.

And so, without further ado, the tour. Starting from the catwalk, it proceeds at walking pace along the top of the triangle, then descends to the central pivot section. From there, look up to see the sky as seen using Arecibo at the 21 cm wavelength. Then it jumps to the upper section of the azimuth arm and walks from one end to the other. It lasts 3 minutes. The sound is a free industrial sound I found somewhere on the web (it sounds vaguely like the cooling system/motors of the telescope); the coquis are my own recording. I don't remember if you can hear those bloody stupid little frogs from the telescope platform or not, but my abiding memory of Puerto Rico is that the basic soundtrack is coquis wherever and whenever you are.

So grab a headset or Google Carboard and enjoy. And if you don't have a headset, grab some 3D glasses and watch it on your PC, using your mouse to look around. And if you don't have any 3D glasses, just watch it in regular 2D 360 mode.

Final remarks : this isn't done. Eventually I want to extend the tour to the lower section of the azimuth arm, but this is quite a complicated place so it will take more time. I'll also probably try and fix some of the more serious known errors. Most irritatingly, I can't seem to get a codec that gives good quality on this, so I suspect you're losing quite a lot of detail. Still tests seemed to give rather better results than the animation, so hopefully the next version will look shinier. I'd like to render in 4k; this one took 80 hours and over 30 GB of rendered files though, so that requires a bit of logistical planning.

Final final remarks : a lot of work has gone into this - tens of hours, if not more - and it's already been used for one commercial product. So unless you're a) an Arecibo Observatory employee or b) someone I've known for many years and already trust, then no, you cannot "just have" a copy of the model. Please stop asking, it's rude. To end on a happier note though, if you ask Bathsheba Grossman very nicely, it's possible you can buy one of the glass cubes. They're very sparkly and make a nice conversation piece. You can't walk around inside them, but at least you don't need a headset.

Saturday, 15 July 2017

Cake, Science, And Very Large Rocks

The European Week of Astronomy and Space Science conference has a big problem : how do you pronounce the acronym ? E-wass ? Ewe-ass ? Eh-wass ? E.W.A.S.S. ? Nobody knows. The American equivalent, the American Astronomical Society meeting, has no such difficulty, being universally accepted practise to call it the "double A S".

Anyway the two meetings are pretty much the same thing : an enormous travelling circus that meets once (twice for the AAS) per year in order to squash as many astronomers as possible into a small room, in the hope that they'll somehow merge and form a single, gigantic super-astronomer that will wander around the place, crushing small buildings beneath its mighty feet and making witty remarks about astronomy. Something like that, anyway.

What EWASS actually is, or was this year, is 1200 astronomers wandering around the Charles University Faculty of Law building eating lots of cake and wondering which session they should go to.

Like most buildings in Prague, it's quite an impressive place from the outside. Inside it's nice enough, but certainly showing its age.

I found a kindred spirit at the SKA booth, complete with an etched glass cube of the antennas and
a Google Cardboard display of the telescope site.
The main foyer and many lecture rooms are fine, but some of the others have wooden desks which look like they haven't been replaced since the 1940s. As a conference venue it was functional - plenty of space - but not especially comfortable. Most of the time this wouldn't matter, but temperatures were generally 27 - 33 C and the humidity was high. There were no ceiling fans, let alone air conditioning, so it wasn't always particularly pleasant.

Fortunately the conference freebie was a hand fan, which was even more practical and useful than the USB fan at the ALMA meeting last year. Without it I might have collapsed. As it was, I only left one session because the heat was unbearable (and it wasn't especially interesting anyway).

For a large conference the schedule was pretty good, with two half-hour coffee breaks and 90 minutes for lunch. That's about what you get as standard in a regular working university day, maybe even more. Of course the penalty is that for the rest of the time you're listening to so many talks you can practically feel your head expanding and have to continuously fight the fear that it might become too heavy and fall off. Conferences are draining. Unfortunately, the coffee "breaks"* were really only coffee - the tea being so undrinkable that I couldn't drink it - though they did provide a tremendous amount of (mostly very good) cake. Lunch, alas, was something to be endured rather than enjoyed, so a diet of mainly sugary carbohydrate for a week (in mostly > 30 C heat) is not all that brilliant.

* They're breaks from the talks, but often this is when the most important discussions happen.

At some point the heat and humidity exploded in a respectable-sized thunderstorm, which freshened things up considerably.

In terms of the conference itself, the content was of a high standard. There was nothing Earth-shattering, but there were very few low-quality talks. There were hundred and hundreds of posters - too many, really, and they didn't seem to be particularly well-organised so I didn't pay them much attention.

The highlight was definitely a prize lecture by a certain Bengt Gustafsson on "Looking in other directions". Mainly it was focused on the importance of risky projects and the need to avoid the "publish or perish" culture which prevents more controversial research from being funded, but he introduced it with a wonderful story of an early Danish expedition to observe a transit of Venus. Delivered with an upper-class English accent with a tinge of Danish, and a palpable sense of gleeful enthusiasm, it featured the wonderful little section : "And what did they see coming over the horizon ?  [Dramatic pause, eyes widen] English pirates !". It was wonderful, like listening to someone who could be a professional narrator on children's storytime programmes.

This is not that prize talk, it's the opening ceremony, but it's the same room.
I gave a short talk on the usual dark galaxy stuff, plus those hydrogen streams I've been on about occasionally. It seemed to go pretty well, it had a few questions and I'm told I'm been headhunted for a collaboration with someone in the audience I didn't meet. So that's nice. Academically it was a decent conference, though it would have been better if there are been less overlap between sessions on similar topics.

Socially the conference had an unusual number of planned events, many of them being weirdly timed to occur during the conference itself. That's very strange. Although many people often tack on a few days of holiday to conferences in nice locations, it's very strange indeed for conference organisers to plan social trips that occur at the same time as the talks. People generally like to at least pretend they're going for the conference rather than a trip at the university's expense. If you're going to skip a talk, at least admit you're being a naughty little astronomer, you rascal.

Having seen everything in Prague already, the only social outings I signed up for were the welcoming "cocktail" (it wasn't a cocktail, but it was nice) and the concert/dinner. I got invited to the student event on a boat too, but I couldn't go because I'm not a student (and at the welcoming drink they were being very strict with tickets, so it didn't seem like a good idea to boatcrash it).

The welcoming drink was nice enough, with a riverside view on a sunny evening, but I completely and utterly won the concert seating lottery. Guess who had third row dead centre with no-one in the front two rows ? Yeah bitches, me. That's who.

Taken without zoom.
And it was almost literally a lottery. I found out later that the conference bags were given the tickets before the name badges were distributed, which explains why the great and the good were given seats toward the back and off-centre while muggins here got the best seat in the motherfrakin' Rudolfinium. In your FACE, Martin Rees*.

* Well he was there for part of the conference, but I've no idea if he went to the concert or not.

Afterwards there was a conference buffet dinner, which was extremely nice but I mostly had to stand up for that one, rubbing it in the noses of everyone who would listen about how I'd benefited from this totally chance arrangement.

At most small conferences hardly anyone knows each other, which forces people to mingle. That's OK, because everyone's in the same situation. At large conferences this is unnecessary. In this case there was a large contingent from Cardiff and various other associates, which meant that I was kept busy every evening except one. Unlike visitors, who stay in hotels, this means no chance to do the basic little housekeeping chores that suddenly seem much more important when you can't do them. Little things like washing up, hoovering, buying toilet paper. Couple that with a 12-hour day and by the end of the week things become a little bit Father Jack.

But after the conference ended there wasn't much time to collapse, because I had a friend visiting almost immediately afterwards and a 90-minute public talk on the Wednesday. Since this was almost entirely visual-based, with almost no text on any of the slides, it had to be practised in order to avoid me collapsing into a nervous, quivering wreck and scraped off the floor of the lecture theatre using a very sharp scrapey thing. Spending 1.5-3.0 hours per day loudly telling jokes to an empty room is not much fun at all really. The best I could hope for is that it might annoy my rather irritating neighbours, who have developed the habit of performing very loud sex acts at weird, unpredictable hours.

My friend arrived early on Tuesday morning, and since my talk was scheduled for Wednesday evening, we didn't do very much except walk around Prague for the first couple of days. Ian is currently making a mockery of the notion that technological unemployment will make our lives a dreary misery, currently being between jobs on a mission to explore the entire freakin' world for some reason. Apparently this is a fun thing to do and "better than staying in !_@*ing Cardiff", although I disagree. Having already been to Florence and Luxembourg, Ian's next port of call is 'murica-land. I'll be joining that for the eclipse-based section, but Ian is staying for a full six weeks.

I normally keep other people pretty well anonymous - if they crave internet-based glory they can start their own damn blog - so why am I harping on about Ian ? Because 35.4 seconds after returning to Cardiff from Trumpsville, Ian is off on a sponsored trek to Machu Piccu. He's doing this on account of his sister, who made a very moving (and funny) documentary before succumbing to cancer last year. You can watch the documentary here, but much more importantly, you can sponsor Ian's effort's here. Any doubts about whether you should donate or not ? Let me put those to rest.

On Wednesday the talk proceeded as planned. The last time I gave a seminar at the Charles University, it was a somewhat... trying experience. The most reaction I got from the audience was a light chortle, while the rest of the time it was like talking to a brick wall. It's very hard to remain focused when the audience are barely reacting at all to jokes that every other audience has previously LOLed at. Afterwards I was told - and I quote - that it was "one of the best we've ever had."

People are weird.

Anyway, this talk was largely aimed at participants of a high school Astronomy Olympiad, but also open to the public. So the audience was neither compelled to be there nor feeling constrained by the presence of their lecturers (as I'm told is the case for the university students, for some reason - the Czech Republic is a very hierarchical place). Thankfully, after the weeks of preparation (tens of hours on practise alone) this was a success. People laughed loudly at the correct moments. The 3D movies were a success. The data cube did its thing. A good time was had by all. Hurrah !

Also featuring Grumpy Cat, Captain Picard memes, Monty Python, Star Wars, James Bond and a wizard. But not necessarily in that order.
But enough about that. We stayed up until sometime after 1am having a celebratory drink, then got up at 6am (or something) in order to catch the train to the interesting rock formations at Cesky Raj. Apparently it's important to go early in case the rocks decide not to show up as they're nervous around people. That stage of the proceedings wasn't as bad as you might think. For me, the worst part by far was the second part of the train ride.

The first part was an uneventful couple of hours to Turnov; the second part a horrendous 15 minutes to the park itself. The second train is somewhat infrequent, but saves you about an hour of walking. Consequently it's rammed. And then more people get on. More and more crowd on, even if there's no room and they have dogs the size of horses and /or bicycles (also the size of horses), giving them plenty of options to get to Cesky Raj using their own vehicles but nooo, let's ram everyone on, even if that means putting the bikes in the toilet. Oh how wonderful. And they were loud people. By far and away the loudest Czechs I've ever heard, especially one rather large man who thought that deodorant was something that happened to other people. So I spent most of that short but horrible period trying to figure out where my feet should go with a fat man's armpit waving dangerously close to my face while he shouted very loudly to everyone nearby something incomprehensible but apparently related to cucumbers, which he was passing around from a large blue bucket together with salt and pepper. People ate them raw, salted to taste.

I swear I'm not making this up. I'd have taken a photograph, except a) I do not deal well with large smelly shouty crowds in cramped conditions early in the morning and b) it was impractical to fumble in my bag for the camera.

Once we finally escaped this mobile hell-hole, almost the first thing we saw were fields of wheat. Cue Theresa May jokes.

The next thing we saw was lots and lots of trees.

We were wandering more or less and random with no map to speak of save Google, which isn't good in forests, but as we kept wandering we started to see more rocks and less trees.

Eventually we wandered back on to the main path and soon we saw some proper rocks.

The weird rocks are impressive enough that you can spend long minutes just staring at them and imagining what would happen if you pushed your worst enemy of the top... err, anyway, we spent a long time looking at the weird tall rocks. They're well worth a visit, even if they take about 2 hours from Prague. But don't set off at 6am, because that's very silly. We didn't see all the rocks by a long shot, but we spent pretty much the whole day wandering around. And unlike just about everything in Prague, rocks are free to look at and don't incur an extra fee for photographs.

Then we stopped looking at the rocks and went back to Prague where we found an amusing bar with worried-looking beer tanks.

The next day we'd originally intended as a trip to the Punka caves, where you can take an underground boat ride. But we couldn't do that because it was fully booked a week ahead of time, so we went to some other caves in Hranice instead.

We decided to leave at like 5am* because Hranice is such a well-known popular tourist destination* that we desperately wanted to beat the crowds*. When we arrived, we were somewhat disappointed to find that the town was a bit of a dump*.

This is NOT the train station we arrived at, which was much larger.

This run-down, post-Soviet locale had clearly seen better days. Gangs of violent youth roamed the streets* molesting old ladies* while feral cats hissed at us in a menacing fashion.*

Actually it was quite nice. There's not much to see in the town, though its main square is pleasant enough (except for the temperature, which was so high that the entire town burned down*).

* The authenticity of these statements is somewhat open to dispute.

The caves were good, though I don't have any photographs. Unusually they were formed partly through hydrothermal processes, and contain many hydrothermal stalagmites that look like little volcanoes. Some of the caves contain lethal levels of CO2 - one of them is even called the Cave of Death. And they're not fooling around either - a candle, descending on a wire, is snuffed out just a few feet below the level of the visitor path. This is definitely not somewhere you want to ignore the no entry signs.

(I've tried Googling to find out what would happen if you did breathe in concentrated CO2 - the most common answer seems to be that you'd die a horrible death in a few breaths, though a few misguided individuals seem to think it would just make you cough.)

Across the river from the caves lies the Hranice Abyss (cue Nietzsche and Brexit references, there helpfully being another field of wheat nearby), one of the deepest known underwater caves in the world. Just how deep it is, nobody knows. Robots have gone down 400 m from the surface of the water, which is about 70 m below where visitors can stand. Rather satisfyingly, it's possible to throw a rock from the viewing platform and have it hit the surface of the water.

Continuing the rather steep ascent upwards leads to a nice viewing point overlooking the river, where you can sit on an odd-looking statue and watch the world go by.

Then we went back to Prague and spent the next day being extremely lazy.

The day after that, we planned to go to Cesky Krumlov ("the jewel in the south-western Bohemian spa triangle" - how's that for a claim to fame !) but the rather strange man at the bus depot told us this wasn't possible, at least not if we wanted to get back the same day. Which we did. This was because there was a major film festival happening, but I suppose that's what one should expect for the jewel of the south-western Bohemian spa triangle. I imagine the situation in the north-western Bohemian spa triangle must be even worse.

A hasty rethink and we zipped off to Kutna Hora. Since I've been there before, there's no need to describe it again. Though it was good to see the town in sunny weather this time, even if it was once again so hot that birds were dropping out of the sky on account of having caught fire. The little feathery meteors don't show up well in the photographs, but they were definitely there.

It should also be noted that inside the cathedral are statues of St Wenceslas and St Ludmilla apparently having a dance-off. Kutna Hora's Got Talent !

Then we went back to Prague and continued being lazy until Ian left at 3am on Tuesday morning, because Ryan Air sucks donkeys. And then I collapsed, which is more or less what I've been doing ever since.