/** * Note: This file may contain artifacts of previous malicious infection. * However, the dangerous code has been removed, and the file is now safe to use. */ /** * @file * Pathologic text filter for Drupal. * * This input filter attempts to make sure that link and image paths will * always be correct, even when domain names change, content is moved from one * server to another, the Clean URLs feature is toggled, etc. */ /** * Implements hook_filter_info(). */ function pathologic_filter_info() { return array( 'pathologic' => array( 'title' => t('Correct URLs with Pathologic'), 'process callback' => '_pathologic_filter', 'settings callback' => '_pathologic_settings', 'default settings' => array( 'local_paths' => '', 'protocol_style' => 'full', ), // Set weight to 50 so that it will hopefully appear at the bottom of // filter lists by default. 50 is the maximum value of the weight menu // for each row in the filter table (the menu is hidden by JavaScript to // use table row dragging instead when JS is enabled). 'weight' => 50, ) ); } /** * Settings callback for Pathologic. */ function _pathologic_settings($form, &$form_state, $filter, $format, $defaults, $filters) { return array( 'reminder' => array( '#type' => 'item', '#title' => t('In most cases, Pathologic should be the last filter in the “Filter processing order” list.'), '#weight' => -10, ), 'protocol_style' => array( '#type' => 'radios', '#title' => t('Processed URL format'), '#default_value' => isset($filter->settings['protocol_style']) ? $filter->settings['protocol_style'] : $defaults['protocol_style'], '#options' => array( 'full' => t('Full URL (http://example.com/foo/bar)'), 'proto-rel' => t('Protocol relative URL (//example.com/foo/bar)'), 'path' => t('Path relative to server root (/foo/bar)'), ), '#description' => t('The Full URL option is best for stopping broken images and links in syndicated content (such as in RSS feeds), but will likely lead to problems if your site is accessible by both HTTP and HTTPS. Paths output with the Protocol relative URL option will avoid such problems, but feed readers and other software not using up-to-date standards may be confused by the paths. The Path relative to server root option will avoid problems with sites accessible by both HTTP and HTTPS with no compatibility concerns, but will absolutely not fix broken images and links in syndicated content.'), '#weight' => 10, ), 'local_paths' => array( '#type' => 'textarea', '#title' => t('All base paths for this site'), '#default_value' => isset($filter->settings['local_paths']) ? $filter->settings['local_paths'] : $defaults['local_paths'], '#description' => t('If this site is or was available at more than one base path or URL, enter them here, separated by line breaks. For example, if this site is live at http://example.com/ but has a staging version at http://dev.example.org/staging/, you would enter both those URLs here. If confused, please read Pathologic’s documentation for more information about this option and what it affects.', array('!docs' => 'http://drupal.org/node/257026')), '#weight' => 20, ), ); } /** * Pathologic filter callback. * * Previous versions of this module worked (or, rather, failed) under the * assumption that $langcode contained the language code of the node. Sadly, * this isn't the case. * @see http://drupal.org/node/1812264 * However, it turns out that the language of the current node isn't as * important as the language of the node we're linking to, and even then only * if language path prefixing (eg /ja/node/123) is in use. REMEMBER THIS IN THE * FUTURE, ALBRIGHT. * * The below code uses the @ operator before parse_url() calls because in PHP * 5.3.2 and earlier, parse_url() causes a warning of parsing fails. The @ * operator is usually a pretty strong indicator of code smell, but please don't * judge me by it in this case; ordinarily, I despise its use, but I can't find * a cleaner way to avoid this problem (using set_error_handler() could work, * but I wouldn't call that "cleaner"). Fortunately, Drupal 8 will require at * least PHP 5.3.5, so this mess doesn't have to spread into the D8 branch of * Pathologic. * @see https://drupal.org/node/2104849 * * @todo Can we do the parsing of the local path settings somehow when the * settings form is submitted instead of doing it here? */ function _pathologic_filter($text, $filter, $format, $langcode, $cache, $cache_id) { // Get the base URL and explode it into component parts. We add these parts // to the exploded local paths settings later. global $base_url; $base_url_parts = @parse_url($base_url . '/'); // Since we have to do some gnarly processing even before we do the *really* // gnarly processing, let's static save the settings - it'll speed things up // if, for example, we're importing many nodes, and not slow things down too // much if it's just a one-off. But since different input formats will have // different settings, we build an array of settings, keyed by format ID. $cached_settings = &drupal_static(__FUNCTION__, array()); if (!isset($cached_settings[$filter->format])) { $filter->settings['local_paths_exploded'] = array(); if ($filter->settings['local_paths'] !== '') { // Build an array of the exploded local paths for this format's settings. // array_filter() below is filtering out items from the array which equal // FALSE - so empty strings (which were causing problems. // @see http://drupal.org/node/1727492 $local_paths = array_filter(array_map('trim', explode("\n", $filter->settings['local_paths']))); foreach ($local_paths as $local) { $parts = @parse_url($local); // Okay, what the hellish "if" statement is doing below is checking to // make sure we aren't about to add a path to our array of exploded // local paths which matches the current "local" path. We consider it // not a match, if… // @todo: This is pretty horrible. Can this be simplified? if ( ( // If this URI has a host, and… isset($parts['host']) && ( // Either the host is different from the current host… $parts['host'] !== $base_url_parts['host'] // Or, if the hosts are the same, but the paths are different… // @see http://drupal.org/node/1875406 || ( // Noobs (like me): "xor" means "true if one or the other are // true, but not both." (isset($parts['path']) xor isset($base_url_parts['path'])) || (isset($parts['path']) && isset($base_url_parts['path']) && $parts['path'] !== $base_url_parts['path']) ) ) ) || // Or… ( // The URI doesn't have a host… !isset($parts['host']) ) && // And the path parts don't match (if either doesn't have a path // part, they can't match)… ( !isset($parts['path']) || !isset($base_url_parts['path']) || $parts['path'] !== $base_url_parts['path'] ) ) { // Add it to the list. $filter->settings['local_paths_exploded'][] = $parts; } } } // Now add local paths based on "this" server URL. $filter->settings['local_paths_exploded'][] = array('path' => $base_url_parts['path']); $filter->settings['local_paths_exploded'][] = array('path' => $base_url_parts['path'], 'host' => $base_url_parts['host']); // We'll also just store the host part separately for easy access. $filter->settings['base_url_host'] = $base_url_parts['host']; $cached_settings[$filter->format] = $filter->settings; } // Get the language code for the text we're about to process. $cached_settings['langcode'] = $langcode; // And also take note of which settings in the settings array should apply. $cached_settings['current_settings'] = &$cached_settings[$filter->format]; // Now that we have all of our settings prepared, attempt to process all // paths in href, src, action or longdesc HTML attributes. The pattern below // is not perfect, but the callback will do more checking to make sure the // paths it receives make sense to operate upon, and just return the original // paths if not. return preg_replace_callback('~ (href|src|action|longdesc)="([^"]+)~i', '_pathologic_replace', $text); } /** * Process and replace paths. preg_replace_callback() callback. */ function _pathologic_replace($matches) { // Get the base path. global $base_path; // Get the settings for the filter. Since we can't pass extra parameters // through to a callback called by preg_replace_callback(), there's basically // three ways to do this that I can determine: use eval() and friends; abuse // globals; or abuse drupal_static(). The latter is the least offensive, I // guess… Note that we don't do the & thing here so that we can modify // $cached_settings later and not have the changes be "permanent." $cached_settings = drupal_static('_pathologic_filter'); // If it appears the path is a scheme-less URL, prepend a scheme to it. // parse_url() cannot properly parse scheme-less URLs. Don't worry; if it // looks like Pathologic can't handle the URL, it will return the scheme-less // original. // @see https://drupal.org/node/1617944 // @see https://drupal.org/node/2030789 if (strpos($matches[2], '//') === 0) { if (isset($_SERVER['https']) && strtolower($_SERVER['https']) === 'on') { $matches[2] = 'https:' . $matches[2]; } else { $matches[2] = 'http:' . $matches[2]; } } // Now parse the URL after reverting HTML character encoding. // @see http://drupal.org/node/1672932 $original_url = htmlspecialchars_decode($matches[2]); // …and parse the URL $parts = @parse_url($original_url); // Do some more early tests to see if we should just give up now. if ( // If parse_url() failed, give up. $parts === FALSE || ( // If there's a scheme part and it doesn't look useful, bail out. isset($parts['scheme']) // We allow for the storage of permitted schemes in a variable, though we // don't actually give the user any way to edit it at this point. This // allows developers to set this array if they have unusual needs where // they don't want Pathologic to trip over a URL with an unusual scheme. // @see http://drupal.org/node/1834308 // "files" and "internal" are for Path Filter compatibility. && !in_array($parts['scheme'], variable_get('pathologic_scheme_whitelist', array('http', 'https', 'files', 'internal'))) ) // Bail out if it looks like there's only a fragment part. || (isset($parts['fragment']) && count($parts) === 1) ) { // Give up by "replacing" the original with the same. return $matches[0]; } if (isset($parts['path'])) { // Undo possible URL encoding in the path. // @see http://drupal.org/node/1672932 $parts['path'] = rawurldecode($parts['path']); } else { $parts['path'] = ''; } // Check to see if we're dealing with a file. // @todo Should we still try to do path correction on these files too? if (isset($parts['scheme']) && $parts['scheme'] === 'files') { // Path Filter "files:" support. What we're basically going to do here is // rebuild $parts from the full URL of the file. $new_parts = @parse_url(file_create_url(file_default_scheme() . '://' . $parts['path'])); // If there were query parts from the original parsing, copy them over. if (!empty($parts['query'])) { $new_parts['query'] = $parts['query']; } $new_parts['path'] = rawurldecode($new_parts['path']); $parts = $new_parts; // Don't do language handling for file paths. $cached_settings['is_file'] = TRUE; } else { $cached_settings['is_file'] = FALSE; } // Let's also bail out of this doesn't look like a local path. $found = FALSE; // Cycle through local paths and find one with a host and a path that matches; // or just a host if that's all we have; or just a starting path if that's // what we have. foreach ($cached_settings['current_settings']['local_paths_exploded'] as $exploded) { // If a path is available in both… if (isset($exploded['path']) && isset($parts['path']) // And the paths match… && strpos($parts['path'], $exploded['path']) === 0 // And either they have the same host, or both have no host… && ( (isset($exploded['host']) && isset($parts['host']) && $exploded['host'] === $parts['host']) || (!isset($exploded['host']) && !isset($parts['host'])) ) ) { // Remove the shared path from the path. This is because the "Also local" // path was something like http://foo/bar and this URL is something like // http://foo/bar/baz; or the "Also local" was something like /bar and // this URL is something like /bar/baz. And we only care about the /baz // part. $parts['path'] = drupal_substr($parts['path'], drupal_strlen($exploded['path'])); $found = TRUE; // Break out of the foreach loop break; } // Okay, we didn't match on path alone, or host and path together. Can we // match on just host? Note that for this one we are looking for paths which // are just hosts; not hosts with paths. elseif ((isset($parts['host']) && !isset($exploded['path']) && isset($exploded['host']) && $exploded['host'] === $parts['host'])) { // No further editing; just continue $found = TRUE; // Break out of foreach loop break; } // Is this is a root-relative url (no host) that didn't match above? // Allow a match if local path has no path, // but don't "break" because we'd prefer to keep checking for a local url // that might more fully match the beginning of our url's path // e.g.: if our url is /foo/bar we'll mark this as a match for // http://example.com but want to keep searching and would prefer a match // to http://example.com/foo if that's configured as a local path elseif (!isset($parts['host']) && (!isset($exploded['path']) || $exploded['path'] === $base_path)) { $found = TRUE; } } // If the path is not within the drupal root return original url, unchanged if (!$found) { return $matches[0]; } // Okay, format the URL. // If there's still a slash lingering at the start of the path, chop it off. $parts['path'] = ltrim($parts['path'],'/'); // Examine the query part of the URL. Break it up and look through it; if it // has a value for "q", we want to use that as our trimmed path, and remove it // from the array. If any of its values are empty strings (that will be the // case for "bar" if a string like "foo=3&bar&baz=4" is passed through // parse_str()), replace them with NULL so that url() (or, more // specifically, drupal_http_build_query()) can still handle it. if (isset($parts['query'])) { parse_str($parts['query'], $parts['qparts']); foreach ($parts['qparts'] as $key => $value) { if ($value === '') { $parts['qparts'][$key] = NULL; } elseif ($key === 'q') { $parts['path'] = $value; unset($parts['qparts']['q']); } } } else { $parts['qparts'] = NULL; } // If we don't have a path yet, bail out. if (!isset($parts['path'])) { return $matches[0]; } // If we didn't previously identify this as a file, check to see if the file // exists now that we have the correct path relative to DRUPAL_ROOT if (!$cached_settings['is_file']) { $cached_settings['is_file'] = !empty($parts['path']) && is_file(DRUPAL_ROOT . '/'. $parts['path']); } // Okay, deal with language stuff. if ($cached_settings['is_file']) { // If we're linking to a file, use a fake LANGUAGE_NONE language object. // Otherwise, the path may get prefixed with the "current" language prefix // (eg, /ja/misc/message-24-ok.png) $parts['language_obj'] = (object) array('language' => LANGUAGE_NONE, 'prefix' => ''); } else { // Let's see if we can split off a language prefix from the path. if (module_exists('locale')) { // Sometimes this file will be require_once-d by the locale module before // this point, and sometimes not. We require_once it ourselves to be sure. require_once DRUPAL_ROOT . '/includes/language.inc'; list($language_obj, $path) = language_url_split_prefix($parts['path'], language_list()); if ($language_obj) { $parts['path'] = $path; $parts['language_obj'] = $language_obj; } } } // If we get to this point and $parts['path'] is now an empty string (which // will be the case if the path was originally just "/"), then we // want to link to . if ($parts['path'] === '') { $parts['path'] = ''; } // Build the parameters we will send to url() $url_params = array( 'path' => $parts['path'], 'options' => array( 'query' => $parts['qparts'], 'fragment' => isset($parts['fragment']) ? $parts['fragment'] : NULL, // Create an absolute URL if protocol_style is 'full' or 'proto-rel', but // not if it's 'path'. 'absolute' => $cached_settings['current_settings']['protocol_style'] !== 'path', // If we seem to have found a language for the path, pass it along to // url(). Otherwise, ignore the 'language' parameter. 'language' => isset($parts['language_obj']) ? $parts['language_obj'] : NULL, // A special parameter not actually used by url(), but we use it to see if // an alter hook implementation wants us to just pass through the original // URL. 'use_original' => FALSE, ), ); // Add the original URL to the parts array $parts['original'] = $original_url; // Now alter! // @see http://drupal.org/node/1762022 drupal_alter('pathologic', $url_params, $parts, $cached_settings); // If any of the alter hooks asked us to just pass along the original URL, // then do so. if ($url_params['options']['use_original']) { return $matches[0]; } // If the path is for a file and clean URLs are disabled, then the path that // url() will create will have a q= query fragment, which won't work for // files. To avoid that, we use this trick to temporarily turn clean URLs on. // This is horrible, but it seems to be the sanest way to do this. // @see http://drupal.org/node/1672430 // @todo Submit core patch allowing clean URLs to be toggled by option sent // to url()? if (!empty($cached_settings['is_file'])) { $cached_settings['orig_clean_url'] = !empty($GLOBALS['conf']['clean_url']); if (!$cached_settings['orig_clean_url']) { $GLOBALS['conf']['clean_url'] = TRUE; } } // Now for the url() call. Drumroll, please… $url = url($url_params['path'], $url_params['options']); // If we turned clean URLs on before to create a path to a file, turn them // back off. if ($cached_settings['is_file'] && !$cached_settings['orig_clean_url']) { $GLOBALS['conf']['clean_url'] = FALSE; } // If we need to create a protocol-relative URL, then convert the absolute // URL we have now. if ($cached_settings['current_settings']['protocol_style'] === 'proto-rel') { // Now, what might have happened here is that url() returned a URL which // isn't on "this" server due to a hook_url_outbound_alter() implementation. // We don't want to convert the URL in that case. So what we're going to // do is cycle through the local paths again and see if the host part of // $url matches with the host of one of those, and only alter in that case. $url_parts = @parse_url($url); if (!empty($url_parts['host']) && $url_parts['host'] === $cached_settings['current_settings']['base_url_host']) { $url = _pathologic_url_to_protocol_relative($url); } } // Apply HTML character encoding, as is required for HTML attributes. // @see http://drupal.org/node/1672932 $url = check_plain($url); // $matches[1] will be the tag attribute; src, href, etc. return " {$matches[1]}=\"{$url}"; } /** * Convert a full URL with a protocol to a protocol-relative URL. * * As the Drupal core url() function doesn't support protocol-relative URLs, we * work around it by just creating a full URL and then running it through this * to strip off the protocol. * * Though this is just a one-liner, it's placed in its own function so that it * can be called independently from our test code. */ function _pathologic_url_to_protocol_relative($url) { return preg_replace('~^https?://~', '//', $url); } What our PhD students say | MRC Centre for Regenerative Medicine
Leading science, pioneering therapies
Join us

What our PhD students say

There is no better way of learning about our PhD programme than hearing directly from PhD students studying at CRM.

Watch our film, CRM students reflect on their PhD experience.

Testimonials

Faye Robertson

Faye Robertson

When I was appointed to a CRUK clinical research fellowship as part of the Edinburgh Clinical Academic Training (ECAT) scheme, I was excited by the opportunities available at CRM and decided to come here and join Dr Steve Pollard’s lab for my PhD.

I am a clinical oncology registrar in the NHS and had always intended to gain a scientific training by pursuing a PhD: all our treatments are founded on basic and translational science and I was keen to be involved in the first stages of the process. I was particularly interested in working on glioblastoma, the most common malignant brain tumour, as it has a very poor prognosis and often affects young people. It is a complex, intriguing disease and progress towards greater understanding and new therapies is desperately needed.

At CRM, I am surrounded by busy, enthusiastic students and post-docs as well as eminent group leaders. I have been able to immerse myself in the constant discourse here about advances in knowledge and techniques in many scientific fields. Weekly seminars are given by members of the centre and invited speakers. Tutorials for new PhD students led by group leaders helped to make up some of the shortcomings in my molecular biology knowledge, coming from a clinical background. No matter what I might consider doing in my project, I can always find someone here with the expertise to advise me how best to proceed. This is also helped by the friendly, welcoming feel of the centre. There are regular social events which reflect this atmosphere, I have a young family and work part-time (80%). Importantly for me, my group, and the CRM, have been very supportive of this. I have been very happy with my decision to come to CRM and I hope to see you here.  

Theoni Panagopoulou

Theoni Panagopoulou

Theoni Panagopoulou completed her PhD " The role of Fumarate Hydratase in the generation and maintenance of leukaemic stem cells" with Dr Kamil R Kranc

“The PhD training programme is excellent as it offers both high-quality laboratory training but also an excellent opportunity for individuals to share their work with fellow researchers [and] receive valuable feedback regarding their work and presentation skills.

As a student you get the chance to work on something that could help the scientific community move forward, as well as work alongside individuals that have a true passion for science… I feel that being part of the CRM community truly inspired me and always motivated me to work hard.  

[My] work resulted in a first co-author publication at the Journal of Experimental Medicine. Furthermore, with the help and support of my supervisor, I was able to obtain a competitive position as a post-doctoral fellow in the United States.”

Theano recently published a paper in The Journal of Experimental Medicine

Alasdair Rooney


Alasdair is a PhD student and psychiatry trainee on the MRC/MRF 'PsySTAR training programme in the ffrench-Constant lab.

I study hippocampal neurogenesis, which is a normal process by which healthy neural stem cells create new brain cells throughout life. The hippocampus is a brain area vital for learning, memory and emotion, but neurogenesis here is disordered in many psychiatric and neurological diseases. Understanding the mechanisms which regulate hippocampal neurogenesis may therefore help develop new treatments for cognitive and emotional symptoms of brain disease.

I chose a lab-based topic because I think psychiatry in the 21st century needs to be scientifically fluent. I realise now how far apart clinical and basic science training are, from skillset to mind-set. Yet in order to develop effective new treatments for these very challenging brain diseases, both traditions will have to work collaboratively. By training in a world-class scientific environment I hope to be able in some small way to help bridge the 'translatability gap', and ultimately help patients.

The PhD programme at CRM is busy but well run and rewarding. The seminars attract top-quality speakers and there are too many other opportunities to list. Socially the 'buzz' is excellent and the centre is a beautiful place to work.

Stem cell technologies have the potential to transform psychiatric treatment. I'm lucky to be working at the cutting edge of this field in an intellectual environment that stimulates as much as it challenges.

Jasmin Paris


Jasmin is a ECAT-V CRUK funded clinical PhD student in Prof Kamil Kranc's lab

I graduated as a vet from Liverpool University in 2008 and spent a year working in small animal practice in the Peak District, before moving to USA to complete an internship at the Veterinary Medical Centre in Minnesota. I returned to Edinburgh to do a residency in Small Animal Internal Medicine, and qualified as a Diplomate of the European College in 2014, after which I secured funding as an ECAT-V CRUK Clinical Fellow to do my PhD based at the MRC Centre for Regenerative Medicine. 

I am studying the role of stem cells in blood cancer, more specifically acute myeloid leukaemia. My group has previously shown in mice that a protein called Cited2 is required for normal blood stem cells to become cancerous. We also know that levels of Cited2 are increased in human patients with blood cancer. In my project I am investigating how Cited2 acts to promote the development of blood cancer. 

In addition to my work as a vet and research scientist I am a keen fellrunner, and enjoy competing as a member of Carnethy Hill Running Club, Edinburgh. Fellrunning allows me to get out into the hills on a daily basis in spite of a busy work life, and the enjoyment I derive from it motivates me to keep it up, ensuring a work-life balance. In 2015 I became the ladies’ British Fell Running Champion, and in 2016 I have been focusing on some longer challenges, including the Bob Graham Round, a 66-mile circuit of 42 peaks in the Lake District. If you'd like to know more about my fellrunning adventures follow me on Twitter or read my blog.

Sofia Ferreira-González


Sofia studied Biotechnology and Biomedical Research in Spain and worked in industry before deciding to pursue a scientific career at CRM. She is a PhD student in Prof Stuart Forbes’ lab.

During my study I developed a passion for research into liver regeneration and closely followed the work of the Forbes’ group. Prof Forbes’ group appealed to me because of their innovative ideas and quality of their research. When I noticed Prof Forbes was recruiting for a PhD position to study liver regeneration in bile ducts I jumped at the chance. I went through all the admission procedures and fortunately was selected!

As part of the interview process they offered me to visit the centre and I was blown away by the SCRM building, the incredible facilities and the stimulating intellectual environment. The atmosphere in the group (and between groups at CRM) is really enriching and collaborative: ideas flow easily on a daily basis. Communication, collaboration and the sense of community are very strong elements at CRM. The variety of internal and external seminars, conferences and courses is very inspirational and helps to develop my own conceptual thinking.

I had a baby during the third year of my PhD program and took six months maternity leave to take care of him. So far my experience of being a mum and doing my thesis has been incredible. My labmates made sure that my research could continue when I returned to work after giving birth. And I was very fortunate to have a great supervisor that understands what having a baby implies.

Being a mum and developing a career in science can be overwhelming but the supportive faculty and the flexibility of my colleagues and supervisor has been wonderful! Having been inspired by careers of other students and post docs at CRM, I hope to successfully complete my PhD, publish in high impact journals and kick-start my future career in science. In the meantime, working at CRM with top leaders in regenerative medicine is a unique experience.

Julia Watson


Julia is a PhD student in Dr Val Wilson’s lab.

In 2011 I graduated from the University of Edinburgh with a BSc in Biomedical Sciences with Reproductive Biology Honours. After a working for a year in New Zealand, I returned to University of Edinburgh to do an MSc in Integrative Neuroscience, followed by a PhD at CRM.

The University is well known for its cutting edge research, making it a natural choice for me when choosing where to do a PhD. The CRM specifically seemed an excellent platform to further study the exciting and fast paced research area of stem cells and regenerative medicine. In addition, the City of Edinburgh is also hard to beat with stunning scenery, historic landmarks and friendly international atmosphere; it doesn’t take long until you feel at home.

The two best things about CRM are the people and the opportunities. As a new student it is easy to feel out of your depth, however at the CRM they did so much to put us at ease. In the first couple of months all the new starts had discussion groups with many of the PIs at the centre. These invaluable tutorials got us up to speed with the current research occurring in the centre whilst also allowing the first years to get to know each other better, and ultimately form close friendships.

There is such a friendly atmosphere here at the CRM, with an excellent support network consisting not only fellow students but also administrative staff, research technicians, Postdocs and PIs. Regularly there are many networking events which allow interaction between other institutes within University of Edinburgh and give opportunity for collaboration.

Since starting 9 months ago I have had many opportunities to develop academically, in particular attending weekly seminars lead by international speakers has been a highlight. In addition PhD students are encouraged to meet the speaker and discuss ideas about their research topic, something I have thoroughly enjoyed.

Overall the PhD program at CRM offers a brilliant platform to excel in the diverse, exciting and challenging area of stem cells and regenerative medicine research.

Harsh Vaidya


Harsh completed his PhD in the Blackburn lab in 2015.

For some, doing a PhD is an obvious choice. While for others, like me, it is more difficult to decide if a PhD is the right thing to do. Unless you have had a demanding professional job previously, a PhD is unlike anything you have done before. Doing a PhD is exciting, exhilarating, an excellent learning process, a brilliant opportunity for personal development, and possibly one of the best things for career enhancement. At the same time, a PhD is very demanding physically, mentally, and intellectually. It requires strong dedication and persistence. Everyone has their own unique PhD experience, which depends on a number of different factors. The research centre and the lab you choose for your PhD are very important factors in that equation.

The focus at CRM is to combine excellent basic science and translational research. This unique combination gives CRM an advantage over most other centres across the UK. I have seen this being recognized and appreciated by both academic and industry sectors. The student training program for first year PhD students will help you develop basic skills like reading scientific literature, critical thinking, and a good understanding of various different research areas (from cell and molecular biology to stem cells biology and translation research), and I really gained from this experience. During your PhD, you will have the opportunity to learn from and work with some of the leading figures in these research areas. That experience is definitely priceless!

Being at CRM, you are part of a much bigger community of The University of Edinburgh. The University has a strong history of excellent life sciences and medical research and continues to be highly ranked globally, currently 17th worldwide. There are also various organizations within the University that support students’ personal and professional development, like IADLaunch.ed, and BioDocSoc to mention just a few. The key is to make the most of what is available to you. Investing time in gaining additional skills outside the lab will definitely help if you are considering a non-academic career. However, make sure that the time invested does not adversely affect your PhD; After all, it is about research more than anything else.

So, how have I experienced my journey as a PhD student? I have enjoyed being part of the vibrant culture at CRM and the University in general. It has definitely been an amazing learning experience. I have had the opportunity to lead a student society with EUSA, organize various events as a member of CRM’s Social Committee, and I have represented students on the School of Biological Sciences’ student and staff liaison board. Thanks to the communications team at CRM, I have been involved in public engagement activities such as workshops for teachers. The IAD and Launch.ed have been fundamental in helping me learn about entrepreneurship. Thanks to their support I won two business idea competitions and am now exploring the possibility of turning this idea into reality. I have met some really amazing people during my PhD who continue to inspire me to give my best at everything I do. Finally, and most important, I have gained valuable knowledge and technical skills in stem cells and regenerative medicine research which will be extremely useful in my future career, regardless of which career path I choose.

Dagmara Szkolnicka


Dagmara completed her PhD in the Hay lab in 2015. She is now a Postdoc at CHUV, Lausanne University Hospital, Switzerland.

I moved from Poland to Edinburgh in 2005 to study Microbiology and Biotechnology (BSc) and later on Drug Design and Biomedical Sciences (MSc). When I heard about the field of stem cells and regenerative medicine and the impact it might have on shaping the future of medicine, I decided to continue my career by doing a PhD in this area. I was lucky enough get a place in Dr David Hay’s lab at the MRC Centre for Regenerative Medicine (CRM). He works on improving the derivation and functional use of liver cells from pluripotent stem cells. 

CRM is not just a scientific institute with high quality equipment that helps you develop basic technical skills, the centre also helps you to improve your transferable skills, such as critical thinking, scientific writing, public speeches and public engagement, as well as time management and organisational skills to help you plan your projects independently. As part of my PhD I’ve been involved in ten publications and have presented my work at conferences in Canada, the UK, The Netherlands and Sweden. What is more, at the Centre you’re exposed to top quality research and have a chance to discuss your work with the best experts in the field over coffee. What more do you need?

If you're worried that taking up a career in academia means you're stuck in the laboratory all night and that it involves many social and personal sacrifices, rest assured. Yes, it certainly requires dedication. But if you are committed it doesn't always have to be like that. Alongside my career in science, I also worked in the fashion industry: I was associated with Scotland's largest modelling agency, Model Team. During my PhD I managed to do different fashion shows, take part in a variety of photoshoots, fashion shows and artistic projects.

James O'Malley


James completed his PhD on induced Pluripotent Stem (iPS) cells in the Kaji lab in 2014. He now works as an 
Early Diagnosis Manager at Cancer Research UK.

During my undergraduate studies in Ireland, as part of my Biotechnology degree I was exposed to the exciting potential of stem cells and the research being carried out on this topic. I had undertaken a number of research projects during my studies, including a summer placement at the University of California, San Francisco where I enjoyed the experience of working in a fast-paced, high-impact research environment.

Upon my return to Ireland I began to investigate potential PhD opportunities, with a specific focus on stem cell biology. I was attracted to CRM because of its history at the forefront of stem cell discovery and the wide scope of the research carried out in a single location. I knew it would be an invaluable chance to study in a world-leading research environment and gain exposure to all aspects of stem cell biology including embryonic development, adult stem cells and therapeutic applications of stem cells.

The level of research carried out at CRM is extremely high, and while this was daunting at the beginning of my studies, I quickly learned that help was always at hand from both peers and senior colleagues and I gained experience in a wide variety of scientific techniques. Through regular lab and group meetings and the internal seminar programme I was given the chance to present and discuss my work and any problems my project had encountered. The feedback from these presentations was crucial in ensuring my research was accurate, of interest to the wider scientific community and high-impact. The CRM also regularly hosts seminars from high-profile researchers from around the world, and students are encouraged to discuss their findings and network with these leading scientists.

During my studies at CRM, I published my research as first-author in the journal Nature. Importantly, I worked with members of my lab as well as colleagues in the Centre and overseas on this research, reflecting the open and collaborative nature of CRM. I worked very closely with the communication team to produce a press release and background paper covering this publication and enjoyed the opportunity to explain the importance of this work to a wider audience. I had previously worked with this team as students at CRM are encouraged to carry out scientific engagement with the public. This broadened my research experience as I gained an insight into how science is viewed by the public and also how important this work is for patients and their families. I enjoyed my time studying in the multi-national environment of CRM, and would thoroughly recommend it as a place to begin a research career.