Skip to content

Commit

Permalink
Added pPC101 capabilities.
Browse files Browse the repository at this point in the history
  • Loading branch information
pablocarderam committed Jun 16, 2024
1 parent fcc6c77 commit 1984738
Show file tree
Hide file tree
Showing 8 changed files with 523 additions and 9 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

GeneTargeter creates custom gene-editing constructs designed for knock-out or conditional knock-down in [_Plasmodium falciparum_](http://www.who.int/mediacentre/factsheets/fs094/en/). It is developed by the [Niles Lab at MIT](http://web.mit.edu/nileslab/) and [described in detail in this article](https://www.liebertpub.com/doi/epdf/10.1089/crispr.2021.0069).

At the Niles Lab, GeneTargeter is used to deliver 3' or 5' UTR post-transcriptional regulatory element payload to a specific given gene ([Ganesan et al., 2016](https://dx.doi.org/10.1038%2Fncomms10727), [Nasamu et al., 2021](https://doi.org/10.1038/s41598-020-77644-4)). However, user-defined custom plasmids can be used as well.
At the Niles Lab, GeneTargeter is used to deliver 3' or 5' UTR post-transcriptional regulatory element payload to a specific given gene ([Ganesan et al., 2016](https://dx.doi.org/10.1038%2Fncomms10727), [Nasamu et al., 2021](https://doi.org/10.1038/s41598-020-77644-4)). It can also deliver 5' synthetic transcriptional regulatory payloads (preprint forthcoming). User-defined custom plasmids can be used as well.

Most applications can be served well through the web application running at [genetargeter.mit.edu](genetargeter.mit.edu) .

Expand Down
454 changes: 454 additions & 0 deletions input/plasmids/ppc101-template.gb

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,14 +109,14 @@ def gene_message(message):
for gbName in geneGBs: # for every gb
sigPep = chkSignalPeptide5Prime(gbName,signalPDB); # signalP info
haTag = False; # don't use HA tags by default
if plasmidType == "pSN150" and ( haTagMsg == "Yes" or (haTagMsg == "Auto" and not sigPep) ): # if forcing HA tags or 5' end does not contain signal peptide and auto HA-tagging
if (plasmidType == "pSN150" or plasmidType == "pPC101") and ( haTagMsg == "Yes" or (haTagMsg == "Auto" and not sigPep) ): # if forcing HA tags or 5' end does not contain signal peptide and auto HA-tagging
haTag = True; # use HA tags

try:
output = targetGene(gbName, geneGBs[gbName], codonOptimize=codonOptimize, useFileStrs=True, HRannotated=HRann,lengthLHR=lengthLHR, lengthRHR=lengthRHR, gibsonHomRange=lengthGib, optimRangeLHR=optimLHR, optimRangeRHR=optimRHR, endSizeLHR=endsLHR, endSizeRHR=endsRHR, endTempLHR=endTempLHR, endTempRHR=endTempRHR, gibTemp=gibTemp, gibTDif=gibTDif, maxDistLHR=maxDistLHR, maxDistRHR=maxDistRHR, minGBlockSize=minFragSize, maxGBlockSize=maxFragSize, codonSampling=codonSampling, minGRNAGCContent=minGRNAGCContent, onTargetMethod=onTargetMethod, minOnTargetScore=minOnTargetScore, offTargetMethod=offTargetMethod, minOffTargetScore=minOffTargetScore, maxOffTargetHitScore=maxOffTargetHitScore, enzyme=enzyme, PAM=PAM, gBlockDefault=gBlockDefault, plasmidType=plasmidType, haTag=haTag, sigPep=sigPep, setCoding=setCoding, bulkFile=bulkFile, prefix=prefix, basePlasmid=basePlasmidGB, basePlasmidName=basePlasmidName, locationType=locationType, filterCutSites=filterCutSites); # call result

outMsg = outMsg + sep + output["geneName"] + sep + output["geneFileStr"] + sep + output["plasmidFileStr"] + sep + output["editedLocusFileStr"] + sep + output["oligoFileStr"] + sep + output["gBlockFileStr"] + sep + output["gRNATable"] + sep + output["logFileStr"];
if haTag and plasmidType == "pSN150": # if using HA tags and pSN150,
if haTag and (plasmidType == "pSN150" or plasmidType == "pPC101"): # if using HA tags and pSN150,
outputHA = output["outputHA"]; # save HA outputs
outMsgHA = outMsgHA + sep + outputHA["geneName"] + sep + outputHA["geneFileStr"] + sep + outputHA["plasmidFileStr"] + sep + outputHA["editedLocusFileStr"] + sep + outputHA["oligoFileStr"] + sep + outputHA["gBlockFileStr"] + sep + outputHA["gRNATable"] + sep + outputHA["logFileStr"];
sendMsg(outMsgHA, "geneOutput", channel_id);
Expand Down
16 changes: 12 additions & 4 deletions py/genetargeter/GeneTargeterMethods.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ def targetGene(geneName, geneGB, codonOptimize="T. gondii", HRannotated=False, l



elif plasmidType == "pSN150" or plasmidType == "pSN150-KO" or plasmidType == "pSN150-Ter" or plasmidType == "pSN150-KO-Ter": # if using 5' plasmid
elif plasmidType == "pSN150" or plasmidType == "pSN150-KO" or plasmidType == "pSN150-Ter" or plasmidType == "pSN150-KO-Ter" or plasmidType == "pPC101": # if using 5' plasmid
if plasmidType == "pSN150" or plasmidType == "pSN150-KO": # if using the normal ones,
if enzyme == "Cas9": # if Cas9,
plasmid = pSN150_Cas9; # set plasmid
Expand All @@ -138,6 +138,9 @@ def targetGene(geneName, geneGB, codonOptimize="T. gondii", HRannotated=False, l
elif enzyme == "Cas12": # if Cas12,
plasmid = pSN150_Cas12_Ter; # set plasmid

elif plasmidType == "pPC101": # if using old version
plasmid = pPC101; # set plasmid


closestGene = 0; # by default, assume next gene downstream is before start of file
target3Prime = False; # this plasmid targets 5' end
Expand Down Expand Up @@ -207,6 +210,9 @@ def targetGene(geneName, geneGB, codonOptimize="T. gondii", HRannotated=False, l
elif plasmidType=="pSN150-KO":
flankingSeqsLHR = ['ggcc','ggcc']
flankingSeqsRHR = ['cgcc','cccg']
elif plasmidType=="pPC101":
flankingSeqsLHR = ['ggcc','ggcc']
flankingSeqsRHR = ['','cgta']
elif plasmidType=="custom":
flankingSeqsLHR = ['','']
flankingSeqsRHR = ['','']
Expand All @@ -219,7 +225,7 @@ def targetGene(geneName, geneGB, codonOptimize="T. gondii", HRannotated=False, l
LHR = chooseHR(geneGB, gene, doingHR='LHR', targetExtreme='start', lengthHR=lengthLHR, minTmEnds=endTempLHR, endsLength=endSizeLHR, targetRegionOverride=(plasmidType=="custom" or plasmidType=="pSN150-KO"), flankingSeqs=flankingSeqsLHR, filterCutSites=filterCutSites); # chooses LHR
if plasmidType == "pSN150-KO" or (plasmidType=="custom" and locationType=="center"): # if knocking gene out,
RHR = chooseHR(geneGB, gene, doingHR='RHR', targetExtreme='end', lengthHR=lengthRHR, minTmEnds=endTempRHR, endsLength=endSizeRHR, gBlockDefault=gBlockDefault, minGBlockSize=minGBlockSize, codingGene=codingGene, targetRegionOverride=(plasmidType=="custom" or plasmidType=="pSN150-KO"), flankingSeqs=flankingSeqsRHR, filterCutSites=filterCutSites); # chooses an RHR at end of gene!
elif plasmidType == "pSN150" or (plasmidType=="custom" and locationType=="5prime"): # otherwise if KD construct
elif plasmidType == "pSN150" or plasmidType == "pPC101" or (plasmidType=="custom" and locationType=="5prime"): # otherwise if KD construct
RHR = chooseHR(geneGB, gene, doingHR='RHR', targetExtreme='start', lengthHR=lengthRHR, minTmEnds=endTempRHR, endsLength=endSizeRHR, gBlockDefault=gBlockDefault, minGBlockSize=minGBlockSize, codingGene=codingGene, targetRegionOverride=(plasmidType=="custom" or plasmidType=="pSN150-KO"), flankingSeqs=flankingSeqsRHR, filterCutSites=filterCutSites); # chooses an RHR at beginning

if LHR["out"] is None or RHR["out"] is None and not HRannotated: # if searches fail and HR's not provided,
Expand Down Expand Up @@ -271,6 +277,8 @@ def targetGene(geneName, geneGB, codonOptimize="T. gondii", HRannotated=False, l
flankingSeqsRec = [LHR.seq[-4:],'gcga'] # 054
if plasmidType=="pSN150":
flankingSeqsRec = ['tagc',RHR.seq[0:4]]
if plasmidType=="pPC101":
flankingSeqsRec = ['gATG',RHR.seq[0:4]]
elif plasmidType=="custom":
flankingSeqsRec = ['','']

Expand Down Expand Up @@ -356,7 +364,7 @@ def postProcessPlasmid(geneName, geneGB, gene, plasmidArmed, recoded, outputDic,
extIndex = ( minGBlockSize - gibsonHomRange[1]*2 ) # extension length of gBlock such that it satisfies minimum gBlock length
if plasmidType=="pSN054": # extend in different directions depending on plasmid
recodedGBlock = GenBankAnn(gene.label + " extension", "misc_feature", plasmidArmed.origin[recodedOnPlasmid.index[0]:recodedOnPlasmid.index[0]+extIndex], False, [recodedOnPlasmid.index[0],recodedOnPlasmid.index[0]+extIndex]) # make extended recoded region gBlock annotation
elif plasmidType=="pSN150":
elif plasmidType=="pSN150" or plasmidType=="pPC101":
recodedGBlock = GenBankAnn(gene.label + " extension", "misc_feature", plasmidArmed.origin[recodedOnPlasmid.index[1]-extIndex:recodedOnPlasmid.index[1]], False, [recodedOnPlasmid.index[1]-extIndex,recodedOnPlasmid.index[1]]) # make extended recoded region gBlock annotation
elif plasmidType=="custom":
recodedGBlock = GenBankAnn(gene.label + " extension", "misc_feature", plasmidArmed.origin[recodedOnPlasmid.index[0]:recodedOnPlasmid.index[0]+extIndex], False, [recodedOnPlasmid.index[0],recodedOnPlasmid.index[0]+extIndex]) # make extended recoded region gBlock annotation
Expand Down Expand Up @@ -413,7 +421,7 @@ def postProcessPlasmid(geneName, geneGB, gene, plasmidArmed, recoded, outputDic,
if plasmidType == "pSN054": # if using pSN150 instead of pSN054,
gRNACassetteStart = plasmidArmed.findAnnsLabel("Lox")[0].index[0] + 4; # gBlock starts at first Lox +4 bp to avoid error due to repeated lox sequence
gRNACassetteEnd = plasmidArmed.findAnnsLabel("RHR_vector overlap_left")[0].index[1]; # gBlock ends at RHR_vector overlap_left
if plasmidType == "pSN150": # if using pSN150 instead of pSN054,
if plasmidType == "pSN150" or plasmidType=="pPC101": # if using pSN150 instead of pSN054,
gRNACassetteStart = plasmidArmed.findAnnsLabel(geneName + " RHR")[0].index[1]; # gBlock starts at end of RHR
gRNACassetteEnd = max(gRNACassetteStart + minGBlockSize,findFirst(plasmidArmed.origin, cut_AsiSI)+len(cut_AsiSI)+gibsonHomRange[1]); # gBlock ends after AsiSI
elif plasmidType == "pSN150-KO": # if using pSN150-KO instead of pSN054,
Expand Down
7 changes: 7 additions & 0 deletions py/genetargeter/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
'pSN054_V5' : [cut_FseI,cut_AsiSI,cut_IPpoI,cut_ISceI,cut_AflII,cut_AhdI],
'pSN150-Ter' : [cut_FseI,cut_AsiSI,cut_IPpoI,cut_AhdI,cut_XmaI,cut_NheI],
'pSN150-KO-Ter' : [cut_FseI,cut_AsiSI,cut_IPpoI,cut_AhdI,cut_AscI,cut_XmaI,cut_NheI],
'pPC101' : [cut_FseI,cut_AsiSI,cut_BsiWI],
'custom' : []
}

Expand Down Expand Up @@ -66,6 +67,9 @@
pSN150_Cas12 = GenBank();
pSN150_Cas12.load("input/plasmids/psn150_cas12.gb",loadFromFile=True); # load Cas9 plasmid sequence from GenBank format
pSN150_Cas12.setAllColors(annColors['otherAnnColor'])
pPC101 = GenBank();
pPC101.load("input/plasmids/ppc101-template.gb",loadFromFile=True); # load Cas12 plasmid sequence from GenBank format
pPC101.setAllColors(annColors['otherAnnColor'])

# Codon usage tables
codonUsageTables = {
Expand All @@ -91,11 +95,14 @@

instructions_pSN150_KO = '\n*** Assembly instructions for pSN150-type constructs for knock-out: ***\n\n 1. Obtain primers in Oligo csv file and gene fragments in gBlock fasta file \n from DNA synthesis\n 2. PCR the RHR and LHR fragments from genomic DNA using the corresponding\n Gibson Assembly primers in Oligo csv file\n 3. Digest empty parent vector with restriction enzyme FseI\n 4. Gibson Assembly to insert LHR into digestion product\n 5. Digest resulting vector with restriction enzymes AhdI and AsiSI\n 6. Gibson Assembly to insert sgRNA cassette and RHR into digestion product; if design includes \n recoded region, include in assembly as well\n 7. Check all steps by sequencing\n 8. Transfect into Cas9 or Cas12-containing cell lines!'

instructions_pPC101 = '\n*** Assembly instructions for pPC101-type constructs for transcriptional conditional knock-down: ***\n\n 1. Obtain primers in Oligo csv file and gene fragments in gBlock fasta file \n from DNA synthesis\n 2. PCR the LHR and RHR* fragments from genomic DNA using the corresponding \n Gibson Assembly primers in Oligo csv file\n 3. Digest empty parent vector with restriction enzyme FseI\n 4. Gibson Assembly to insert LHR into digestion product\n 5. Digest resulting vector with restriction enzyme AsiSI\n 6. Gibson Assembly to insert RHR and sgRNA cassette into digestion product; if design includes \n recoded region, include in assembly as well\n 7. Check all steps by sequencing\n 8. Transfect into Cas9 or Cas12-containing cell lines!\n * Alternatively, the tags, recoded region, RHR, and sgRNA \ncassette can often be synthesized commercially as \na single gene fragment to be inserted in a simpler Gibson reaction.'

instructions_custom = '\n*** Assembly instructions for custom base plasmid constructs: ***\n\n 1. Obtain primers in Oligo csv file and gene fragments in gBlock fasta file \n from DNA synthesis\n 2. PCR the RHR and LHR fragments from genomic DNA using the corresponding\n Gibson Assembly primers in Oligo csv file\n 3. Digest empty parent vector with restriction enzymes as needed for the custom plasmid\n 4. Gibson Assembly fragments as required for custom plasmid\n 5. Check all steps by sequencing\n 6. Transfect into Cas9 or Cas12-containing cell lines!'

instructions = {
'pSN054':instructions_pSN054,
'pSN150':instructions_pSN150,
'pSN150-KO':instructions_pSN150_KO,
'pPC101': instructions_pPC101,
'custom': instructions_custom
}
43 changes: 42 additions & 1 deletion py/genetargeter/plasmidConstruction.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ def insertTargetingElementsPSN054(plasmid, geneName, gRNA, LHR, recodedRegion, R
return plas; # returns modified plasmid



"""
Inserts targeting elements given as arguments into pSN150 at predetermined
sites. Elements given as arguments must be strings, not GenBankAnn objects.
Expand Down Expand Up @@ -118,6 +117,46 @@ def insertTargetingElementsPSN150(plasmid, geneName, gRNA, LHR, recodedRegion, R

return plas; # returns modified plasmid

def insertTargetingElementsPPC101(plasmid, geneName, gRNA, LHR, recodedRegion, RHR, haTag=True):
plas = copy.deepcopy(plasmid); # makes a copy of the plasmid object to modify without altering the original

inLHR = findFirst(plas.origin, cut_FseI) + len(cut_FseI); # index of LHR start site (at end of FseI cut sequence)
plas.insertSeq(LHR.upper() + cut_FseI, inLHR); # inserts LHR sequence
annLHR = GenBankAnn(geneName+" LHR", "misc_feature", LHR, False, [inLHR,inLHR+len(LHR)], annColors['LHRColor']); # annotation object
plas.features.append(annLHR); # adds annotation

endRHR = findFirst(plas.origin, cut_BsiWI); # index of RHR end site is middle of AhdI cut sequence, conserves frame
startRHR = findFirst(plas.origin, cut_AsiSI) + 3; # assume keeping HA tag
plas.removeSeq([startRHR, startRHR+2]); # removes sequence that RHR will replace

if len(recodedRegion) > 0: # if there is a recoded region,
inRecode = startRHR; # index of recoded region start site (middle of AhdI cut sequence)
plas.insertSeq(recodedRegion.upper(), inRecode); # inserts recoded region sequence

annRecoded = GenBankAnn(geneName+" Recoded Region", "misc_feature", recodedRegion, False, [inRecode,inRecode+len(recodedRegion)], annColors['recodedRegionColor']); # annotation object
plas.features.append(annRecoded); # adds annotation
startRHR = inRecode + len(recodedRegion); # shift RHR start site downstream of recoded region
if haTag: # if recoded region contains HA tag,
annHATag1 = GenBankAnn("HA tag (recoded)", "misc_feature", recodedRegion[9:len(ha_tag)+9], False, [inRecode+9,inRecode+len(ha_tag)+9], annColors['otherAnnColor']); # annotation object for HA tag
annHATag2 = GenBankAnn("HA tag (recoded)", "misc_feature", recodedRegion[15+len(ha_tag):len(ha_tag)*2+15], False, [inRecode+15+len(ha_tag),inRecode+len(ha_tag)*2+15], annColors['otherAnnColor']); # annotation object for HA tag
plas.features.append(annHATag1); # adds annotation
plas.features.append(annHATag2); # adds annotation
# plas.insertSeq('ATG', inRecode); # inserts recoded region sequence
# startRHR = startRHR + 3; # shift RHR start site downstream of recoded region

plas.insertSeq(RHR.upper(), startRHR); # inserts RHR sequence
annRHR = GenBankAnn(geneName+" RHR", "misc_feature", RHR, False, [startRHR,startRHR+len(RHR)], annColors['RHRColor']); # annotation object
plas.features.append(annRHR); # adds annotation

startGRNA = findFirst(plas.origin, 'AGGGTATACAGGGATATCGA'); # index of gRNA start site (at start of I-PpoI cut sequence)
endGRNA = startGRNA + len('AGGGTATACAGGGATATCGA'); # index of gRNA end site (at end of I-PpoI cut sequence)
plas.removeSeq([startGRNA, endGRNA]); # removes sequence that gRNA will replace
plas.insertSeq(gRNA.upper(), startGRNA); # inserts gRNA sequence with gg sequence used by T7 polymerase
annGRNA = GenBankAnn(geneName+" gRNA", "misc_feature", gRNA, False, [startGRNA,startGRNA+len(gRNA)], annColors['gRNAColor']); # annotation object. Note that gRNA starts after "gg" added for T7 polymerase
plas.features.append(annGRNA); # adds annotation

return plas; # returns modified plasmid


"""
Inserts targeting elements given as arguments into a custom plasmid.
Expand Down Expand Up @@ -223,6 +262,8 @@ def insertTargetingElements(plasmid, geneName, gRNA, LHR, recodedRegion, RHR, pl
out = insertTargetingElementsPSN150(plasmid, geneName, gRNA, LHR, recodedRegion, RHR, haTag); # use other method
elif plasmidType == 'pSN150-KO': # if using pSN150-KO,
out = insertTargetingElementsPSN150(plasmid, geneName, gRNA, LHR, recodedRegion, RHR, haTag, KO=True); # use other method
elif plasmidType == 'pPC101':
out = insertTargetingElementsPPC101(plasmid, geneName, gRNA, LHR, recodedRegion, RHR, haTag); # use other method
elif plasmidType == 'custom':
out = insertTargetingElementsCustom(plasmid, geneName, gRNA, LHR, recodedRegion, RHR); # use other method

Expand Down
3 changes: 3 additions & 0 deletions static/js/main_v1.js → static/js/main_v2.js
Original file line number Diff line number Diff line change
Expand Up @@ -820,6 +820,9 @@ function changeUTRTarget() {
else if (document.getElementById('plasmidType').value === 'pSN150') {
document.getElementById('locationType').value = '5prime';
}
else if (document.getElementById('plasmidType').value === 'pPC101') {
document.getElementById('locationType').value = '5prime';
}
else if (document.getElementById('plasmidType').value === 'pSN150-KO') {
document.getElementById('locationType').value = 'center';
}
Expand Down
3 changes: 2 additions & 1 deletion templates/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
<link rel="stylesheet" href="static/css/style_v1.css">
<script type="text/javascript" src="static/js/jszip.js"></script>
<script type="text/javascript" src="static/js/FileSaver.min.js"></script>
<script type="text/javascript" src="static/js/main_v1.js"></script>
<script type="text/javascript" src="static/js/main_v2.js"></script>
<script type="text/javascript" src="static/js/EPPZScroll.js"></script>
</head>

Expand Down Expand Up @@ -65,6 +65,7 @@
<option value="pSN054">pSN054 (3' knockdown)</option>
<option value="pSN150">pSN150 (5' knockdown)</option>
<option value="pSN150-KO">pSN150 (knockout)</option>
<option value="pPC101">pPC101 (5' transcriptional knockdown)</option>
<option value="custom">Custom plasmid</option>
<!-- <option value="pSN150-Ter">pSN150 with Nhe1-free T7 terminator (5' payload)</option> -->
<!-- <option value="pSN150-KO-Ter">pSN150 with Nhe1-free T7 terminator (KO construct)</option> -->
Expand Down

0 comments on commit 1984738

Please sign in to comment.