Luciferase is een algemene naam voor een klasse van enzymen1 die gewoonlijk in de natuur voor bioluminescentie2 zorgen. De naam is afgeleid van het Latijnse woord voor "licht" (lux) en "dragen" (ferre). Het bekendste voorbeeld is een luciferase van de glimworm Photinus pyralis.

glimworm
Bioluminescentie door luciferase bij een glimworm.

In luminescente3 reacties wordt licht geproduceerd door de oxidatie4 van een luciferine5 (een pigment) en adenosinetrifosfaat6 (ATP). De reactiesnelheid7 van deze reactie tussen luciferine8 en zuurstof is bijzonder langzaam, tenzij ze door luciferase wordt gekatalyseerd9, dikwijls vergemakkelijkt door de aanwezigheid van calciumionen10 (vergelijkbaar met spiersamentrekking11). De reactie vindt plaats in twee stappen:

luciferine12 + ATP → luciferyladenylaat + PPi13

luciferyladenylaat + O2 oxyluciferine14 + AMP15 + licht

Er wordt licht geproduceerd omdat de reactie oxyluciferine vormt in een elektronisch aangeslagen toestand. Bij de reactie komt een foton van licht vrij als oxyluciferine teruggaat naar de grondtoestand. Deze reactie is zeer efficiënt: bijna alle energie wordt in licht omgezet. Ter vergelijking, een gloeilamp verliest bijna 90% van haar vermogen in de vorm van warmte.

Luciferinen en luciferasen worden door verschillende diersoorten in verschillende vormen geproduceerd. Naast glimwormen zijn er onder andere paddenstoelen (Omphalotus olearius), insecten, vissen, weekdieren en algen zoals de zeevonk16 (het lichten van de zee17) bekend die met behulp van luciferase licht produceren. Sommige soorten hebben zelfs verschillende luciferasen die met dezelfde luciferine verschillende kleuren licht kunnen produceren.

Maar de meest duivelse van allemaal is wel Oceanobacillus caeni18: een staafvormige, gram-positieve bacterie die geïsoleerd werd uit actief slib van een afvalwaterzuiveringssysteem in Zuid-Korea. Haar luciferase (KPH7874319) bevat een peptide20 ASPGLUVALILELEU:

MKLSILDQSP ISKGKTPKDA LEASIELAKL TDELGYHRYW VAEHHDLGGL ASPAPDILLG IIGSQTEQIR
IGSGAVLLPN YSPYHIAERY NELATLYPNR VDLGLGRAPG GSAEVSIALA GNFLEKVRMY PKLVDEVILF
LHQDFPSDHM YAKVSATPVP KTPPVPWLLG TSNKSAKLAI EKRLPFVFGH FMSNEDGPSI VKEYMKNVLN
GKSNVIVTVS AICAETTEEA EEIAMSNYLW KILQDKGEGK EGVPSIEEAK AYPYSLEEKE RIERMKQNQI
VGNPSQVREQ LENLQSEYEV DELMIVTITH SYEARKKSYQ LLAEEFCLA

Opgave

In de biologie is een sequentiemotief een peptide (een deel van een eiwit) die in heel veel verschillende eiwitten voorkomt. Het herhaald voorkomen houdt meestal verband met een biologische functie21 van het macromolecuul waarin het motief voorkomt. De zoektocht naar motieven wordt vaak bemoeilijkt doordat er kleine variaties optreden, waardoor de herhalingen niet exact gelijk zijn aan elkaar.

Om alle mogelijke variaties van een motief te kunnen voorstellen, gebruikt de eiwitdatabank PROSITE22 een patroon dat uit één of meer eenheden bestaat die van elkaar gescheiden worden door koppeltekens (-), bijvoorbeeld [AC]-x-V-x-{ED}. Elke eenheid beschrijft welke letters kunnen voorkomen op één bepaalde positie in het motief. Er zijn vier mogelijke notaties voor eenheden:

Het is toegelaten dat dezelfde hoofdletter meerdere keren voorkomt tussen een paar vierkante haakjes of accolades, maar dit verandert niets aan het patroon. Omdat elke eenheid correspondeert met één enkele positie in een motief, is de lengte van een motief dat matcht met een patroon dus altijd gelijk aan het aantal eenheden van het patroon.

Zo beschrijft [DJINN]-x-V-x-{SATAN} bijvoorbeeld een patroon met vijf eenheden. Dit patroon matcht met motieven van vijf letters, waarbij de eerste letter een D, I, J of N moet zijn, de tweede en de vierde letter gelijk welke letter kunnen zijn, de derde letter een V moet zijn, en de vijfde letter geen A, N, S of T kan zijn. Dit patroon matcht bijvoorbeeld met het motief DEVIL.

Gevraagd wordt:

Als het eerste argument dat aan deze functies wordt doorgegeven geen string (str) is die een geldig patroon voorstelt, dan moet een AssertionError opgeworpen worden met de boodschap ongeldig patroon.

Voorbeeld

>>> eenheid('V')
'V'
>>> eenheid('x')
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> eenheid('[DJINN]')
'DIJN'
>>> eenheid('{SATAN}')
'BCDEFGHIJKLMOPQRUVWXYZ'
>>> eenheid('abc')
Traceback (most recent call last):
AssertionError: ongeldig patroon

>>> uitbreiden('[DJINN]-x-V-x-{SATAN}')
['DIJN', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'V', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'BCDEFGHIJKLMOPQRUVWXYZ']

>>> ismotief('[DJINN]-x-V-x-{SATAN}', 'DEVIL')
True
>>> ismotief('[DJINN]-x-V-x-{SATAN}', 'dive')
False
>>> ismotief('[DJINN]-x-V-x-{SATAN}', 'SATAN')
False

>>> motieven('[DJINN]-x-V-x-{SATAN}', 'GNFLEKVRMYPKLVDEVILFLHQDFPSDHMYAKVSATPVPKTPPVPWLLGTSNKSAKLAI')
{(14, 'DEVIL')}
>>> motieven('[DIL]-x-{AEIOU}-[AEIOU]-x-x-[ORS]', 'fanhymkkcllnpwsdetailslmmipiedqcwwffvluciferrhaqcnhgqdyytspmhinfernodkwcfiyveagp')
{(15, 'details'), (37, 'lucifer'), (61, 'inferno')}