Commit cd76fe64 authored by jcorvi's avatar jcorvi

First Commit

parents
#
# Project specific excludes
#
tomcat
#
# Default excludes
#
# Binaries
*.7z
*.dmg
*.gz
*.iso
*.jar
*.rar
*.tar
*.zip
*.war
*.ear
*.sar
*.class
# Maven
target/
# IntelliJ project files
*.iml
*.iws
*.ipr
.idea/
# eclipse project file
.settings/
.classpath
.project
# NetBeans specific
nbproject/private/
build/
nbbuild/
dist/
nbdist/
nbactions.xml
nb-configuration.xml
# OS
.DS_Store
# Misc
*.swp
release.properties
pom.xml.releaseBackup
pom.xml.tag
#custom
pos/
FROM alpine:3.9
WORKDIR /usr/local/share/cdisc_etox_annotation
ARG HEP_TAGGER_VERSION=1.0
COPY docker-build.sh /usr/local/bin/docker-build.sh
COPY dictionaries dictionaries
COPY jape_rules jape_rules
RUN chmod u=rwx,g=rwx,o=r /usr/local/share/cdisc_etox_annotation -R
RUN docker-build.sh ${CDISC_ETOX_TAGGER_VERSION}
# cdisc-etox-annotation
This component annotated text using CDISC SEND and eTOX (OntoBrowser) terminologies. These terminologies are oriented to the preclinical study reports.
## Description
This component annotated several entities related to the treatment-related findings:
FINDINGS.
STUDY_TESTCDS.
SPECIMEN.
CDISC SEND controlled terminology: CDISC maintain and develop the official SEND terminology, available at: https://evs.nci.nih.gov/ftp1/CDISC/SEND/.
ETOX terminology: Information available from the Ontobrowser system was used to increase the terminology. The primary objective of these system was to provide an online collaborative solution for expert curators to map report terms (from the eTOX database) to preferred ontology (or controlled terminology) terms.
The cdisc-etox-annotation component uses the generic nlp-generic-dictionary-annotation https://github.com/inab/docker-textmining-tools/tree/master/nlp-generic-dictionary-annotation. This library is a generic component that annotate text with parametrices GATE-formatted gazetters/dictionaries. In other words, the hepatotoxicity-annotation library is an instance of the nlp-generic-dictionary-annotation with the hepatotoxicity dictionaries.
## For clone this component
git clone --depth 1 https://github.com/inab/docker-textmining-tools.git cdisc-etox-annotation
cd cdisc-etox-annotation
git filter-branch --prune-empty --subdirectory-filter cdisc-etox-annotation HEAD
## Build and Run the Docker
# To build the docker, just go into the cdisc-etox-annotation folder and execute
docker build -t cdisc-etox-annotation .
#To run the docker, just set the input_folder and the output
mkdir ${PWD}/output_annotation; docker run --rm -u $UID -v ${PWD}/input_folder:/in:ro -v ${PWD}/output_annoation:/out:rw cdisc-etox-annotation cdisc-etox-annotation -i /in -o /out -a MY_SET_NAME
Parameters:
<p>
-i input folder with the documents to annotated. The documents could be plain txt or xml gate documents.
</p>
<p>
-o output folder with the documents annotated in gate format.
</p>
<p>
-a annotation set output
</p>
## Built With
* [Docker](https://www.docker.com/) - Docker Containers
* [Maven](https://maven.apache.org/) - Dependency Management
* [GATE](https://gate.ac.uk/overview.html) - GATE: a full-lifecycle open source solution for text processing
## Versioning
We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [tags on this repository](https://github.com/inab/docker-textmining-tools/edit/master/nlp-standard-preprocessing/tags).
## Authors
* **Javier Corvi**
## License
This project is licensed under the GNU GENERAL PUBLIC LICENSE Version 3 - see the [LICENSE.md](LICENSE.md) file for details
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
etox_in-life-observations_dict.lst:ETOX_ILO:ETOX_ILO
etox_anatomy_dict.lst:ANATOMY_ETOX:ANATOMY_ETOX
etox_send_dict.lst:SEND_ETOX:SEND_ETOX
etox_moa_dict.lst:MOA_ETOX:MOA_ETOX
cdisc_send_dict.lst:SEND_CIDSC:SEND_CIDSC
\ No newline at end of file
#!/bin/sh
BASEDIR=/usr/local
CDISC_ETOX_TAGGER_HOME="${BASEDIR}/share/cdisc_etox_annotation/"
CDISC_ETOX_TAGGER_VERSION=1.0
# Exit on error
set -e
if [ $# -ge 1 ] ; then
CDISC_ETOX_TAGGER_VERSION="$1"
fi
if [ -f /etc/alpine-release ] ; then
# Installing OpenJDK 8
apk add --update openjdk8-jre
# dict tagger development dependencies
apk add openjdk8 git maven
else
# Runtime dependencies
apt-get update
apt-get install openjdk-8-jre
# The development dependencies
apt-get install openjdk-8-jdk git maven
fi
git clone --depth 1 https://github.com/inab/docker-textmining-tools.git nlp_gate_generic_component
cd nlp_gate_generic_component
git filter-branch --prune-empty --subdirectory-filter nlp-gate-generic-component HEAD
mvn clean install -DskipTests
cd ..
#rename jar
mv nlp_gate_generic_component/target/nlp-gate-generic-component-0.0.1-SNAPSHOT-jar-with-dependencies.jar nlp-gate-generic-component-${CDISC_ETOX_TAGGER_VERSION}.jar
cat > /usr/local/bin/cdisc-etox-annotation <<EOF
#!/bin/sh
exec java \$JAVA_OPTS -jar "${CDISC_ETOX_TAGGER_HOME}/nlp-gate-generic-component-${CDISC_ETOX_TAGGER_VERSION}.jar" -workdir "${CDISC_ETOX_TAGGER_HOME}" -l dictionaries/lists.def -j jape_rules/main.jape "\$@"
EOF
chmod +x /usr/local/bin/cdisc-etox-annotation
#delete target, do not delete for now because it has the jape rules inside
#rm -R nlp_generic_annotation
#add bash for nextflow
apk add bash
if [ -f /etc/alpine-release ] ; then
# Removing not needed tools
apk del openjdk8 git maven
rm -rf /var/cache/apk/*
else
apt-get remove openjdk-8-jdk git maven
rm -rf /var/cache/dpkg
fi
Imports: {
import static gate.Utils.*;
}
Phase:firstphase
Input: Lookup
Options: control = appelt
Rule: cdisc_anatomical_location_mapping
(
{Lookup.minorType=="SEND_CIDSC"}
)
:lookup
-->
{
gate.AnnotationSet lookup = (gate.AnnotationSet) bindings.get("lookup");
gate.Annotation ann = (gate.Annotation) lookup.iterator().next();
FeatureMap lookupFeatures = ann.getFeatures();
String label = lookupFeatures.get("LABEL").toString();
String content = stringFor(doc, ann);
if(label.contains("ANATOMICAL LOCATION")){
gate.FeatureMap features = Factory.newFeatureMap();
features.put("text",content);
features.put("SOURCE","CDISC");
features.put("RULE","DISC_ANATOMICAL_LOCATION_MAPPING");
features.put("study_domain", label);
features.putAll(lookupFeatures);
features.remove("majorType");
features.remove("minorType");
features.remove("INTERNAL_CODE");
try{
outputAS.add(lookup.firstNode().getOffset(),lookup.lastNode().getOffset(), "SPECIMEN", features);
}catch(InvalidOffsetException e){
throw new LuckyException(e);
}
//remove old lookup
inputAS.remove(ann);
}else{
//System.out.println(" Not a domain : " + label + " term : " + content);
}
}
\ No newline at end of file
Imports: {
import static gate.Utils.*;
}
Phase:firstphase
Input: Lookup
Options: control = appelt
Rule: cdisc_finding_mapping
(
{Lookup.minorType=="SEND_CIDSC"}
)
:lookup
-->
{
gate.AnnotationSet lookup = (gate.AnnotationSet) bindings.get("lookup");
gate.Annotation ann = (gate.Annotation) lookup.iterator().next();
FeatureMap lookupFeatures = ann.getFeatures();
String label = lookupFeatures.get("LABEL").toString();
String content = stringFor(doc, ann);
if(label.contains("FXFINDRS") || label.contains("NONNEO") || label.contains("NEOPLASM") || label.contains("NEOPLASTIC FINDING TYPE") || label.contains("CSTATE") || label.contains("BODSYS")){
gate.FeatureMap features = Factory.newFeatureMap();
features.put("text",content);
features.put("SOURCE","CDISC");
features.put("RULE","CDISC_FINDING_MAPPING");
features.putAll(lookupFeatures);
features.remove("majorType");
features.remove("minorType");
features.remove("INTERNAL_CODE");
try{
outputAS.add(lookup.firstNode().getOffset(),lookup.lastNode().getOffset(), "FINDING", features);
}catch(InvalidOffsetException e){
throw new LuckyException(e);
}
//remove old lookup
inputAS.remove(ann);
}
}
\ No newline at end of file
Imports: {
import static gate.Utils.*;
}
Phase:firstphase
Input: Lookup
Options: control = appelt
Rule: cdisc_route_of_administration_mapping
(
{Lookup.minorType=="SEND_CIDSC"}
)
:lookup
-->
{
gate.AnnotationSet lookup = (gate.AnnotationSet) bindings.get("lookup");
gate.Annotation ann = (gate.Annotation) lookup.iterator().next();
FeatureMap lookupFeatures = ann.getFeatures();
String label = lookupFeatures.get("LABEL").toString();
String content = stringFor(doc, ann);
if(label.contains("SPEC_")){
gate.FeatureMap features = Factory.newFeatureMap();
features.put("text",content);
features.put("SOURCE","CDISC");
features.put("RULE","CDISC_SPEC_MAPPING");
features.putAll(lookupFeatures);
features.remove("majorType");
features.remove("minorType");
features.remove("INTERNAL_CODE");
try{
outputAS.add(lookup.firstNode().getOffset(),lookup.lastNode().getOffset(), "ROUTE_OF_ADMINISTRATION222", features);
}catch(InvalidOffsetException e){
throw new LuckyException(e);
}
//remove old lookup
inputAS.remove(ann);
}else{
//System.out.println(" Not a domain : " + label + " term : " + content);
}
}
\ No newline at end of file
Imports: {
import static gate.Utils.*;
}
Phase:firstphase
Input: Lookup
Options: control = appelt
Rule: cdisc_spec_mapping
(
{Lookup.minorType=="SEND_CIDSC"}
)
:lookup
-->
{
gate.AnnotationSet lookup = (gate.AnnotationSet) bindings.get("lookup");
gate.Annotation ann = (gate.Annotation) lookup.iterator().next();
FeatureMap lookupFeatures = ann.getFeatures();
String label = lookupFeatures.get("LABEL").toString();
String content = stringFor(doc, ann);
if(label.contains("SPEC_")){
gate.FeatureMap features = Factory.newFeatureMap();
features.put("text",content);
features.put("SOURCE","CDISC");
features.put("RULE","CDISC_SPEC_RULE");
features.put("study_domain", label);
features.putAll(lookupFeatures);
features.remove("majorType");
features.remove("minorType");
features.remove("INTERNAL_CODE");
try{
outputAS.add(lookup.firstNode().getOffset(),lookup.lastNode().getOffset(), "SPECIMEN", features);
}catch(InvalidOffsetException e){
throw new LuckyException(e);
}
//remove old lookup
inputAS.remove(ann);
}else{
//System.out.println(" Not a domain : " + label + " term : " + content);
}
}
\ No newline at end of file
Imports: {
import static gate.Utils.*;
}
Phase:firstphase
Input: Lookup
Options: control = appelt
Rule: cdisc_study_domain_mapping
(
{Lookup.minorType=="SEND_CIDSC"}
)
:lookup
-->
{
gate.AnnotationSet lookup = (gate.AnnotationSet) bindings.get("lookup");
gate.Annotation ann = (gate.Annotation) lookup.iterator().next();
FeatureMap lookupFeatures = ann.getFeatures();
String label = lookupFeatures.get("LABEL").toString();
String content = stringFor(doc, ann);
if(label.contains("SDOMAIN") || label.contains("CLCAT")){
gate.FeatureMap features = Factory.newFeatureMap();
features.put("text",content);
features.put("SOURCE","CDISC");
features.put("RULE","CDISC_STUDY_DOMAIN_MAPPING");
features.put("study_domain", label);
features.putAll(lookupFeatures);
features.remove("majorType");
features.remove("minorType");
features.remove("INTERNAL_CODE");
try{
outputAS.add(lookup.firstNode().getOffset(),lookup.lastNode().getOffset(), "STUDY_DOMAIN", features);
}catch(InvalidOffsetException e){
throw new LuckyException(e);
}
//remove old lookup
inputAS.remove(ann);
}else{
//System.out.println(" Not a domain : " + label + " term : " + content);
}
}
\ No newline at end of file
Imports: {
import static gate.Utils.*;
}
Phase:firstphase
Input: Lookup
Options: control = appelt
Rule: cdisc_study_testcd_mapping
(
{Lookup.minorType=="SEND_CIDSC"}
)
:lookup
-->
{
gate.AnnotationSet lookup = (gate.AnnotationSet) bindings.get("lookup");
gate.Annotation ann = (gate.Annotation) lookup.iterator().next();
FeatureMap lookupFeatures = ann.getFeatures();
String label = lookupFeatures.get("LABEL").toString();
String content = stringFor(doc, ann);
if(label.contains("PKPARMCD_") || label.contains("PKPARM_") || label.endsWith("TEST NAME") || label.endsWith("TEST CODE")){
gate.FeatureMap features = Factory.newFeatureMap();
features.put("text",content);
features.put("SOURCE","CDISC");
features.put("RULE","CDISC_STUDY_TESTCD_RULE");
features.putAll(lookupFeatures);
features.remove("majorType");
features.remove("minorType");
features.remove("INTERNAL_CODE");
if(label.endsWith("TEST CODE")) {
if(!label.contains("STSPRM")){
try{
outputAS.add(lookup.firstNode().getOffset(),lookup.lastNode().getOffset(), "STUDY_TESTCD", features);
if(
label.contains("BGTEST") ||
label.contains("BWTEST") ||
label.contains("DDTEST") ||
label.contains("EGTEST") ||
label.contains("FMTEST") ||
label.contains("FXTEST") ||
label.contains("FWTEST") ||
label.contains("BWTEST") ||
label.contains("MATEST") ||
label.contains("OMTEST") ||
label.contains("PYTEST") ||
label.contains("SCVTST") ||
label.contains("MITEST") ||
label.contains("SRETST") ||
label.contains("TFTEST") ||
label.contains("VSTEST")
)
{
try{
outputAS.add(lookup.firstNode().getOffset(),lookup.lastNode().getOffset(), "STUDY_DOMAIN", features);
}catch(InvalidOffsetException e){
throw new LuckyException(e);
}
}
}catch(InvalidOffsetException e){
throw new LuckyException(e);
}
}
}else {
try{
outputAS.add(lookup.firstNode().getOffset(),lookup.lastNode().getOffset(), "STUDY_TESTCD", features);
}catch(InvalidOffsetException e){
throw new LuckyException(e);
}
}
//remove old lookup
inputAS.remove(ann);
}else{
//System.out.println(" Not a domain : " + label + " term : " + content);
}
}
\ No newline at end of file
Phase:secondphase
Input: Lookup
Options: control = all
Rule: delete_rule
(
{Lookup}
)
:lookup
-->
{
gate.AnnotationSet lookup = (gate.AnnotationSet) bindings.get("lookup");
gate.Annotation ann = (gate.Annotation) lookup.iterator().next();
inputAS.remove(ann);
}
\ No newline at end of file
Imports: {
import static gate.Utils.*;
}
Phase:firstphase
Input: Lookup
Options: control = appelt
Rule: etox_anatomy_mapping
(
{Lookup.minorType=="ANATOMY_ETOX" , Lookup.LABEL=="ANATOMY"}
)
:lookup
-->
{
gate.AnnotationSet lookup = (gate.AnnotationSet) bindings.get("lookup");
gate.Annotation ann = (gate.Annotation) lookup.iterator().next();
FeatureMap lookupFeatures = ann.getFeatures();
String label = lookupFeatures.get("LABEL").toString();
String content = stringFor(doc, ann);
gate.FeatureMap features = Factory.newFeatureMap();
lookupFeatures.remove("majorType");
lookupFeatures.remove("minorType");
lookupFeatures.remove("SYNONYM_DAT");
lookupFeatures.remove("INTERNAL_CODE");
features.put("text",content);
features.put("SOURCE","ETOX");
features.put("RULE","ETOX_ANATOMY_MAPPING");
features.putAll(lookupFeatures);
try{
outputAS.add(lookup.firstNode().getOffset(),lookup.lastNode().getOffset(), "SPECIMEN", features);
}catch(InvalidOffsetException e){
throw new LuckyException(e);
}
//remove old lookup
inputAS.remove(ann);
}
\ No newline at end of file
Imports: {
import static gate.Utils.*;
}
Phase:firstphase
Input: Lookup
Options: control = appelt
Rule: etox_ilo_domain_mapping
(
{Lookup.minorType=="ETOX_ILO"}
)
:lookup
-->
{
gate.AnnotationSet lookup = (gate.AnnotationSet) bindings.get("lookup");
gate.Annotation ann = (gate.Annotation) lookup.iterator().next();
FeatureMap lookupFeatures = ann.getFeatures();
String label = lookupFeatures.get("LABEL").toString();
String content = stringFor(doc, ann);
if(label.contains("_DOMAIN")){
gate.FeatureMap features = Factory.newFeatureMap();
lookupFeatures.remove("majorType");
lookupFeatures.remove("minorType");
features.put("text",content);
features.put("SOURCE","ETOX");
lookupFeatures.remove("SYNONYM_DAT");
lookupFeatures.remove("INTERNAL_CODE");
features.put("RULE","ETOX_ILO_DOMAIN_MAPPING");
features.putAll(lookupFeatures);
try{
outputAS.add(lookup.firstNode().getOffset(),lookup.lastNode().getOffset(), "STUDY_DOMAIN", features);
outputAS.add(lookup.firstNode().getOffset(),lookup.lastNode().getOffset(), "FINDING", features);
}catch(InvalidOffsetException e){
throw new LuckyException(e);
}
//remove old lookup
inputAS.remove(ann);
}else if(label.contains("IN_LIFE_OBSERVATION")){
gate.FeatureMap features = Factory.newFeatureMap();
lookupFeatures.remove("majorType");
lookupFeatures.remove("minorType");
features.put("text",content);
features.put("SOURCE","ETOX");
lookupFeatures.remove("SYNONYM_DAT");
lookupFeatures.remove("INTERNAL_CODE");
features.put("RULE","etox_ilo_domain_mapping");
features.putAll(lookupFeatures);
try{
outputAS.add(lookup.firstNode().getOffset(),lookup.lastNode().getOffset(), "FINDING", features);
}catch(InvalidOffsetException e){
throw new LuckyException(e);
}
//remove old lookup
inputAS.remove(ann);
}else{
System.out.println(" Not a domain : " + label + " term : " + content);
}
}
\ No newline at end of file
Imports: {
import static gate.Utils.*;
}
Phase:firstphase
Input: Lookup
Options: control = appelt
Rule: etox_ilo_trigger_mapping
(
{Lookup.minorType=="ETOX_ILO", Lookup.LABEL=="NO_TREATMENT_RELATED_EFFECT_DETECTED"}
)
:lookup
-->
{
gate.AnnotationSet lookup = (gate.AnnotationSet) bindings.get("lookup");
gate.Annotation ann = (gate.Annotation) lookup.iterator().next();
FeatureMap lookupFeatures = ann.getFeatures();
String label = lookupFeatures.get("LABEL").toString();
String content = stringFor(doc, ann);
gate.FeatureMap features = Factory.newFeatureMap();
lookupFeatures.remove("majorType");
lookupFeatures.remove("minorType");
features.put("text",content);
features.put("SOURCE","ETOX");
features.put("RULE","ETOX_ILO_TRIGGER_MAPPING");
lookupFeatures.remove("SYNONYM_DAT");
lookupFeatures.remove("INTERNAL_CODE");
features.putAll(lookupFeatures);
try{
outputAS.add(lookup.firstNode().getOffset(),lookup.lastNode().getOffset(), "NO_TREATMENT_RELATED_TRIGGER", features);
}catch(InvalidOffsetException e){
throw new LuckyException(e);
}
//remove old lookup
inputAS.remove(ann);
}
\ No newline at end of file
Imports: {
import static gate.Utils.*;
}
Phase:firstphase
Input: Lookup
Options: control = appelt
Rule: etox_moa_mapping
(
{Lookup.minorType=="MOA_ETOX"}
)
:lookup
-->
{
gate.AnnotationSet lookup = (gate.AnnotationSet) bindings.get("lookup");
gate.Annotation ann = (gate.Annotation) lookup.iterator().next();
FeatureMap lookupFeatures = ann.getFeatures();
String content = stringFor(doc, ann);
gate.FeatureMap features = Factory.newFeatureMap();
lookupFeatures.remove("majorType");
lookupFeatures.remove("minorType");
features.put("text",content);
features.put("SOURCE","ETOX");
lookupFeatures.remove("SYNONYM_DAT");
lookupFeatures.remove("INTERNAL_CODE");
features.put("RULE","ETOX_MOA_RULE");
features.putAll(lookupFeatures);
try{
outputAS.add(lookup.firstNode().getOffset(),lookup.lastNode().getOffset(), "MODE_OF_ACTION", features);
}catch(InvalidOffsetException e){
throw new LuckyException(e);
}
//remove old lookup
inputAS.remove(ann);
}
\ No newline at end of file
Imports: {
import static gate.Utils.*;
}
Phase:firstphase
Input: Lookup
Options: control = appelt
Rule: etox_send_mapping
(
{Lookup.minorType=="SEND_ETOX"}
)
:lookup
-->
{
gate.AnnotationSet lookup = (gate.AnnotationSet) bindings.get("lookup");
gate.Annotation ann = (gate.Annotation) lookup.iterator().next();
FeatureMap lookupFeatures = ann.getFeatures();
String label = lookupFeatures.get("LABEL").toString();
String content = stringFor(doc, ann);
gate.FeatureMap features = Factory.newFeatureMap();
lookupFeatures.remove("majorType");
lookupFeatures.remove("minorType");
features.put("text",content);
features.put("SOURCE","ETOX");
features.put("RULE","ETOX_SEND_MAPPING");
lookupFeatures.remove("SYNONYM_DAT");
lookupFeatures.remove("INTERNAL_CODE");
features.putAll(lookupFeatures);
if(label.equals("ROUTE")){
features.put("ETOX_ORIGINAL_LABEL", label);
try{
outputAS.add(lookup.firstNode().getOffset(),lookup.lastNode().getOffset(), "ROUTE_OF_ADMINISTRATION", features);
}catch(InvalidOffsetException e){
throw new LuckyException(e);
}
//remove old lookup
inputAS.remove(ann);
}else if(label.equals("LBTEST") && content.length() > 3){
features.put("ETOX_ORIGINAL_LABEL", label);
try{
outputAS.add(lookup.firstNode().getOffset(),lookup.lastNode().getOffset(), "STUDY_TESTCD", features);
}catch(InvalidOffsetException e){
throw new LuckyException(e);
}
//remove old lookup
inputAS.remove(ann);
}else if(label.equals("SEXPOP")){
if(content.length()==1) {
features.put("abrev", "true");
}
try{
outputAS.add(lookup.firstNode().getOffset(),lookup.lastNode().getOffset(), "SEX", features);
}catch(InvalidOffsetException e){
throw new LuckyException(e);
}
//remove old lookup
inputAS.remove(ann);
}else if(label.equals("STRAIN")){
features.put("ETOX_ORIGINAL_LABEL", label);
try{
outputAS.add(lookup.firstNode().getOffset(),lookup.lastNode().getOffset(), "SPECIMEN", features);
}catch(InvalidOffsetException e){
throw new LuckyException(e);
}
//remove old lookup
inputAS.remove(ann);
}else if(label.equals("SPECIES")){
features.put("ETOX_ORIGINAL_LABEL", label);
try{
outputAS.add(lookup.firstNode().getOffset(),lookup.lastNode().getOffset(), "SPECIMEN", features);
}catch(InvalidOffsetException e){
throw new LuckyException(e);
}
//remove old lookup
inputAS.remove(ann);
} else if(label.equals("PKPARM")){
features.put("ETOX_ORIGINAL_LABEL", label);
try{
outputAS.add(lookup.firstNode().getOffset(),lookup.lastNode().getOffset(), "STUDY_TESTCD", features);
}catch(InvalidOffsetException e){
throw new LuckyException(e);
}
//remove old lookup