Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  • DONE Intro page that doesn't have as login
    • DONE Initial page now routes to "landing" view, with landing.html. Initial version includes only placeholder text and link to #/login
    • Note: May want to introduce route bypass if user hits login page while logged in (i.e. content -> landing or landing -> content). Or may not.
  • New front-page website with description, screenshots, video
  • "Login" link (with logout link on header)
  • Have the "upload" and "source" tabs from transformer here
    • "Snomed starter kit"
  • Create a video demo of the site (camtasia) and post as a link on the header (video glyphicon if there is one)
    • also screenshots that are clickable, etc.
  • Verify all entry pages for applications are officially mobile friendly
  • Update campaigns for  SNOMED/UMLS/ICD browsers on google adwords.
  • Training Video for UMLS browser (need 10 min)
  • Training Video for SNOMED browser (simple 5 min)
  • Find the SNOMED video that Anil sent, redo with RF2 - same content!
  • Other notes (from email)
    • Google adwords campaign
      • “free icd-10” browser, “free SNOMED CT US Extension browser”, “free UMLS browser
    • Get webmaster setup for the icd/umls/snomed pages
      • Use config setup for that
    • Find east bay healthcare startups
      • Pursue like job search (to know they’re hiring, etc)
      • Tech
      • Device
      • Information/informatics 
    • Meetups

Core Application Enhancement - P1

  • DONE (BC): Fix long error header - attach icon not showing, where it displays error is not in the error area.
  • DONE PG: Need to index atoms as lowercase string, punctuation replaced by whitespace, no trailing, duplicate, or leading whitespace.
    • Create a new tokenizer factory for this and define in @AnalyzerDefs in AbstractAtomClass
    • "Cholsterol.in HDL/Cholesterol.in LDL" => " cholesterol in hdl cholesterol in ldl"
    • "ABC def----ghi" => "abc def ghi"
    • "ABC     ////df3948123,.3482932–..xx abc" => "abc df3948123 3482932 xx abc"

    • Add an AtomJpa method called getNameNorm() that isn't analyzed but returns a lowercased string split on punctuation

    • Put algorigthm into ConfigUtility - getIndexerNormalizedString
      • String.join(" ","hiv antibody".toLowerCase().split("[ \t-({[)}]_!@#%&*\\:;\"',.?/~+=|<>$`^]")).replaceAll(" +"," ");
    • Default search handler can include as a boosted "or" clause in the query, e.g. by 10
      • if literalField.endsWith("Sort"), create normField = literalField.replace("Sort","Norm"),
      • add an OR clause with this field and the normalized value.
    • "HIV Antibody" => 
      • (HIV Antibody OR nameNorm:\"hiv antibody\"^10.0 OR nameSort:\"HIV Antibody\"^20.0) AND ...
    • "1-2,Anydroxy" =>
      • (1-2,Anhydroxy OR nameNorm:\"1 2 anhydroxy\"^10.0 OR nameSort:\"1-2,Anhydroxy\"^20.0) AND .. .
    PG: Support RF2 "atom association refset members" as atom relationships.
    • REMAINING: Need to decide how to handle non-concept association reference refset members (e
      • .
      g
      • .
      descriptions)
  • Clear filters on new searches or navigating (e.g. atom filters stick around)
  • Relationship sort order - allow sorting on REL, RELA, or TO(terminology)ID
  • Color code search results based on log base value -> GREEN for high, YELLOW, RED for low.  Based on score indexed to a 1 value.
    • Advanced search - like mapping
      • Semantic type
      • terminology
      • term type
      • others?
      • Normalize scores with a "log base", e.g. take the raw score (may be 12.5, may be 0.83) Choose a log base, e.g. "5", if the score is > 5, it gets a value of 1, otherwise it is the log of the score with the base (e.g. "5").
      • when getScoreMap is called -> every score should be in a range from 0 - 1
    • Advanced search - like mapping
      • Semantic type - [ picklist ]
        • semanticTypes.semanticType:"Clinical Drug"
      • term type  - [ picklist ]
        • atoms.termType:...
      • match terminology - [ picklist ] (only for "metathesaurus")
        • atoms.terminology:..
      • language  - [ picklist ]
        • atoms.language:...
      • LATER: Expression. - e..g. "Search Criteria" - for "descriptionLogicTerminology"  only
        • descendants of
        • has relationship -> xx
    • PG: redo header/footer - controllers. (like refset tool)
    • PG:  Implement Diagramming
      • model transformation
      • Show ONLY for "description logic terminology"
      • Enhancements to RRF preferred name computer
      • support multiple UMLS's - e.g. have a high-level terminology/version
      • reuse the same default precedence list.
    • PG: Use directives for reports
      • Move all http calls to services.
    • DONE PG: Paging controls are no longer showing up for subcategories (e.g. atoms, relationships)
    • Use route params to dynamically load a "report" (and be able to bookmark URLs)
    • Support opening a concept in a new window (e.g. there's a pointing off arrow icon that opens a new window with a routing URL that  shows exactly that concept - then drag/drop between windows can be editing mechanism).
    • User Preferences stuff
      • Bring over model from Refset tool.
      • Add "last query" (e.g. "brain" and whether it's "list" or "tree" mode).
      • Add "last report" (e.g. type/ui/terminology/version)
    • Remove "void addXXX" and "void removeXXX" methods from model objects. Use getObjects().add/remove(...) only
      • e.g. AtomClass doesn't need addAtom or removeAtom
      • Rewire any uses of them  
      • "addXXX" -> "getXXX().add"
      • "removeXXX" -> "getXXX().remove"
      • same if there is "clear"
    • DSS: Model
      • Mapping, MapRecord, MapEntry (each with attributes) - 
        • similar to Subset, SubsetMember except with one more layer.
      • MapSet extends ComponentHasAttributes
        • name (String)
        • type (String)
        • fromTerminology/Version: String
        • toTerminology/Version: String
        • to/fromComplexity (String)
        • to/fromExhaustive (String)
        • get/setMappings -> use mappedFrom in @OneToMany
      • Mapping extends ComponentHasAttributes
        • fromTerminologyId, fromIdType
        • toTerminologyId, toIdType
        • mapSet
        • relationshipType, additionalRelationshipType
        • subsetId => group
        • rank
        • rule
        • restriction -> rename to 'advice'
        • In Jpa class
          • Add  @XmlTransient methods with @Field
          • getFromTermionlogy(), getFromVersion() - call getMapSet().getXXX
          • getToTermionlogy(), getToVersion() - call getMapSet().getXXX
      • Remove MapObject
      • MappingList/Jpa 
      • ContentService - Jpa
        • add/remove/update MapSet/Mapping
        • getMapping(Long id)
        • getMapping(String terminologyid, terminology, version, branch)
        • findMappingsForMapSet(Long mapSetId, query, pfs)
        • findMappingsForConcept(Long conceptId, query, pfs)
          • call getConcept(conceptId).
          • then perform a "from" search based on the terminologyId, terminology, version, and idType (e.g. CONCEPT)
        • findMappingsForCode(Long codetId, query, pfs)
        • findMappingsForDescriptor(Long descriptorId, query, pfs)
      • REST layer - ContentServiceRest (Impl,Client)
        • getMapsets
          • /mapset/all/{terminology}/{version}
        • getMapset
          • /mapset/{terminologyId}/{terminology}/{version}
        • findMappingsForMapSet(Long mapSetId, query, pfs)
          • /mapset/{terminologyId}/{terminology}/{version}/mappings
        • findMappingsForXXX(Long xxxId, query, pfs)
          • /cui/{terminology}/{version}/{terminologyId}/mappings
          • /code/...
          • /dui/...
      • Integration tests
        • jpa
        • REST
          • basic test of client layer - e.g. make sure the calls to the server actually work and return something
      • Unit Tests
        • MapSetJpa, MappingJpa, MappingListJpa
      • Loaders
        • Then implement this for RRF loader
          • MRSAT
            • Handle in loadMrsat

              • Have a class-level   Map<String, MapSet> mapSetMap variable
              • When encountering a "mapping" attribute, create an entry in this map if it doesn't exist
                • use the CUI as the key
              • Extrac the mapset from the map, then set the corresponding field
              • At the end of loadMrsat, for each mapSet in the variable, call service.addMapSet(...)
            • MTH_MAPFROMEXHAUSTIVE => mapSet.fromExhaustive

            • MTH_MAPTOEXHAUSTIVE => mapSet.toExhaustive

            • MTH_MAPSETCOMPLEXITY => mapSet.complexity

            • MTH_MAPSETFROMCOMPLEXITY => mapSet.fromComplexity
            • MTH_MAPSETTOCOMPLEXITY => mapSet.toComplexity
            • MAPSETSID = mapSet.terminologyId

            • MAPSETNAME = mapSet.name
            • MAPSETVERSION = mapSet.mapVersion

            • MAPSETFROMVERSION = mapSet.mapVersion
            • MAPSETTOVERSION = mapSet.mapVersion
            MRMAP:
            • Add a loadMrmap method
              • use mapSetMap when processing mapping entries.
              • skip entries where the FROMTYPE or TOTYPE fields cannot be resolved to an IdType enum (IdType.valueOf(...) fails)
              • Look up the MapSetCui in mapSetMap, use this for mapping.setMapSet
            • MAPSETCUI - used to look up in mapSetMap
            • MAPSETSAB - mapSet.terminology
            • MAPSUBSETID = mapping.group
            • MAPRANK = mapping.rank
            • MAPID, MAPSID = mapping attribute, name="MAPID" value = "value of the MAPID field"
            • FROMID, FROMSID = mapping attribute
            • FROMEXPR = mapping.fromTerminologyId
            • FROMTYPE = mapping.fromIdType
            • FROMRULE, FROMRES = mapping attribute
            • REL,RELA = mapping.relationshipType, additionalRelationshipType
            • TOID,TOSID = mapping attribute
            • TOEXPR = mapping.toTerminologyId
            • TOTYPE = mapping.toIdType
            • TORULE,TORES = mapping attribute
            • MAPRULE = mapping.rule
            • MAPRES = mapping.advice
            • MAPTYPE = mapping.type
            • MAPATN,MAPATV = mapping attribute
            • CVF - n/a
        • Then implement this for RF2 loader (snapshot)
        • Then implement this for RF2 loader (delta)
      • Show mappings in UI.

    Core Application Enhancement - P2

    • PG: Support RF2 "atom association refset members" as atom relationships.
      • * REMAINING: Need to decide how to handle non-concept association reference refset members (e.g. descriptions)
      Enable glass pane while switching tabs (between content/metadata)
    • Bring "source data file" and "source data" over from transformer application, along with other things.
      • Put the objects into the package structure of terminology server (e.g. put with Project and User)
      • Need to update transformer too so it continues to work.
      • Leave mojos behind. 
    • Add features for "deep" relationships when browsing UMLS.    
      • it is definitely only for "concept" and for "metathesaurus" content
      • Add new section to concept report (e.g. "Deep relationships")

    ...