OHDSI Home | Forums | Wiki | Github

Mapping to Clinical Drug

Over time, we’ve built lists of drugs for various purposes, primarily utilizing NDC and RxNorm codes, with a few oddballs thrown-in, to keep it interesting.

I would like to standardize these lists at the generic product with form and strength level. It would seem that the Clinical Drug concept type (RxNorm) would best suit our needs at present. Once the lists are cleaned up, I expect to explore moving then to ATC, with which I have had very little experience.

I tried a fairly simple way of translating the lists, using the “Maps to” relationship and filtering the results for concept_class_id=‘Clinical Drug’. When tested on some very small files, it appeared to work. However, when I used larger files, it became obvious that I losing many drug products in the process.

Exploring data, I note that many drug concepts do not map directly to concepts of the Clinical Drug class. I am thinking of writing a recursive query to follow appropriate relationships until I find a suitable concept is encountered, but A, I don’t know if that would work, and B, I assume that there MUST be a better (= simple & reliable) way to do this, which I am overlooking.

Here’s a list of the concept classes to which entries on my lists belong, by vocabulary. finding mappings .xlsx (10.4 KB) Some of these classes are clearly inappropriate and will be dropped, but I expect that for every NDC & RxNorm code, I should be able to find what I seek. No?


Hi Gerry! So far, it’s not exactly clear where your source concepts are coming from (it looks like a strange mix of pretty much anything in drug domain) and why you want to standardize them to the Clinical Drug level (you’ll be losing some info like brand names).
Also, with classification concepts you are likely to get multiple clinical drugs per 1 ATC/SPL as these vocabs aren’t meant to be used as mapping resources.

But if you do want to go this route, you can
a) retrieve the mappings from non-standard drug concepts to RxNorm, go to concept_ancestor, join on descendants and then filter ancestors to Clinical Drug. This approach won’t work if your NDCs (or else) map to Clinical Drug Form or ingredient levels.

b) If you need active ingredient + form + strength as separate fields, you can use concept_relationship and drug_strength (here again no need for recursion)

c) use concept_ancestor to get RxNorm descendants of ATC/SPL

d) do very little with SNOMED drugs (where are you getting these from anyway? :slight_smile: )

So knowing more on why you want to convert your potentially rich data to a certain level of granularity would be useful.

Hi Anna!

Sorry for the delay in replying. I had written a response the next day, but realized that my understanding was lacking and that I should wait until I had a better handle on the relationships, rather than risk wasting the time of others, so deleted my draft before hitting SAVE.

I understand more now and may be better able to explain my situation.

At DARTNet Institute, our primary sources of data are the EHR systems of providers and organizations, ranging in size from small practices to massive integrated delivery systems. Most commonly, we see NDC and RxNorm; some provide Multum, OMOP Concept IDs, or free text (OUCH!). And we may encounter a smattering of other codes, typically in defining lists of drugs of interest, “value sets”, rather than raw data. By the way, I can’t recall ever getting a SNOMED drug code from an EHR, though I may have seen it in some specifications. When I started out on the project, I wanted the resultant code to be widely applicable as possible; after several weeks on this, I am becoming more selective.

My present task is to write a query which, will map whatever is given, or as much as is practical, to the appropriate generic RxNorm Concept ID. Ideally, this will be to Clinical Drug level, as brand names are of no value to our projects. However, if the source can be uniquely mapped only to Clinical Form,Clinical Comp, or Ingredient concepts, we’ll happily take it.

I initially naively expected that the Maps to relationship might magically do the mappings, but soon was disabused of that notion and added Tradename of to my queries, as I found NDC would have a Maps to relationship to Branded Drug, I needed to include and another mapping from the Branded Drug concept to Clinical Drug concept.

I also discovered that using Maps to works not at all, or only in part for some vocabularies and concepts.
So I tried using a broader selection of relationships: Maps to, Tradename of, VAProd - RxNorm eq, CVX - RxNorm, SPL - RxNorm, Source - RxNorm eq, Quantified form of, Marketed form of, and Box of, with a de-dupping step for the overlaps. That was a painful lesson, leading me to scale back my ambition, as I discovered such concept types as Quantified Branded Drug Box which maps to Quantified Clinical Drug Box and Branded Drug Box and which each requires a different sequence of further mappings to eventually get to Clinical Drug, maybe.

As of last night, I had dumped my consideration of the various RxNorm and RxNorm Extension concept types to Clinical Drug, Clinical Form , Clinical Comp , or Ingredient, and their branded counterparts, and restricted my source vocabularies to NDC, RxNorm, RxNorm Extension, CVX, VA Prod and Multum.

I thought that I was home free last night, until I saw how my code dealt with

21051061 Branded Drug  Methylphenidate 30 MG Extended Release Oral Capsule [Equasym] is trade name for both
•	40221126             Clinical Drug 50/50 Release 24 HR methylphenidate hydrochloride 30 MG Extended Release Oral Capsule and
•	40221131             Clinical Drug 30/70 Release 24 HR methylphenidate hydrochloride 30 MG Extended Release Oral Capsule  

My clinical colleague advises me that “Equasym is a 30/70 XL drug, while Ritalin LA is a 50/50 drug”. Thus the mapping to 40221126 is incorrect.

This upset the apple cart because I had thought of the Tradename of relationship as many-to-one e.g.

Branded drug Clinical drug
Walgreens Ibuprofen Pain Reliever/Fever Reducer 200mg Tablets Ibuprofen 200 mg Tablet (Clinical Drug)
Advil Coated Tablets Pain Reliever and Fever Reducer, Ibuprofen 200mg

Thus the mapping is in error and I am no longer confident of my understanding of the Tradename of relationship. Is it truly many-to-one, and I simply came across an error in the data?

So, tonight I am going to review your suggestion about using ancestry relationships, as I probably should have two weeks ago!


Thanks for the detailed description!
The general way to go with NDC, Multum, VA Product, CVX would be:

  1. Use Maps to to get mappings to the standard RxNorm/RxE/CVX concepts. If your source concept is already standard, you’ll get a link to itself.

  2. If the standard counterpart obtained in step 1 is not Clinical Drug/Comp/Ingredient, use CONCEPT_ANCESTOR to get a desired level of granularity.

For your source vocabularies no other relationships are needed. For example, Tradename of is embedded
in CONCEPT_ANESTOR and VAProd - RxNorm eq is not recommended as it’s not always a direct 1:1 mapping (can be used though if no Maps to exists and you’re fine with approximate mapping).

Will the same strategy work for other vocabularies? Not essential now, but good to know.

Yes, for drugs should work for all of them

Thank you. It seemed that some of the mappings using the “maps to” relationship were incomplete and that by using vocabulary-specific relationships the match rate improved. If I am inferring correctly, relationships other than Maps to and Ancestor of should not be assumed as accurate as those.

Hi Anna,

Here’s another question about mapping beyond “Maps to”.

For RxNorm and RxNorm Extension concepts that don’t map to the concept types I seek, using the ‘Maps to’ relationship, I tried other relationships, with some puzzling results.

Relationships I expected to be reliably one-to-one or many-to-one, but aren’t, include:

Source Relationship Target Note
Clinical Drug Box Box of Clinical Drug
Quant Clinical Drug Quantified form of Clinical Drug
Quant Clinical Drug Marketed form of Clinical Drug
Marketed Product Marketed form of Clinical Drug
Branded Drug Marketed form of Clinical Drug
Branded Drug Tradename of Clinical Drug
Branded Drug Comp Tradename of Clinical Drug Comp
Branded Drug Form Tradename of Clinical Drug Form
Brand Name Brand name of Ingredient Not sure of what is meant by Brand name of an Ingredient

Am I misunderstanding some of the relationships and/or might I have stumbled upon some mis-mappings?

It would be easier if you can provide some examples of the source codes you are struggling with. So far it is not clear to me why you’d want to use the relationships above.

Following this chain and I’d be interested in seeing some of the examples as well.

I will look through my work for some examples.

Typically the concept code representing an 11-digit NDC or 9-digit NDC maps to a single Clinical Drug , however sometimes that relationship takes us to multiple records of a different type, typically Ingredient , but occasionally one of the other classes in which we are interested (Clinical Drug Comp, Clinical Drug Form).
Similarly, this occurs with eleven CVX source codes, using the CVX – RxNorm relationship.

Let’s start with what I just encountered. Should CVX concepts map 1:1 to Clinical Drug? I will dig up examples from NDC-RxNorm next.

CVX concept ID CVX concept name CVX Code RxNorm concept name RxNorm Concept ID RxNorm Code RxNorm concept class ID
40213186 Novel influenza-H1N1-09, injectable 127 influenza A-California-7-2009-(H1N1)v-like virus vaccine 0.03 MG/ML Injectable Suspension 40166607 864704 Clinical Drug
influenza A-California-7-2009-(H1N1)v-like virus vaccine 40166605 864701 Ingredient
40213188 Novel Influenza-H1N1-09, live virus for nasal administration 125 influenza A-California-7-2009-(H1N1)v-like virus vaccine 158000000 UNT/ML Nasal Spray 42801283 1298819 Clinical Drug
influenza A-California-7-2009-(H1N1)v-like virus vaccine Nasal Spray 40166610 864813 Clinical Drug Form
40213189 Novel influenza-H1N1-09, preservative-free, injectable 126 influenza A-California-7-2009-(H1N1)v-like virus vaccine 0.03 MG/ML Injectable Suspension 40166607 864704 Clinical Drug
influenza A-California-7-2009-(H1N1)v-like virus vaccine 40166605 864701 Ingredient
40213196 pertussis vaccine 11 pertussis vaccine Injectable Solution 40068748 450547 Clinical Drug Form
pertussis vaccine 19033193 8080 Ingredient
40213232 tetanus toxoid, adsorbed 35 tetanus toxoid vaccine, inactivated 10 UNT/ML Injectable Suspension 19027665 204527 Clinical Drug
tetanus toxoid vaccine, inactivated 529411 798306 Ingredient
40213264 Adenovirus, type 4 and type 7, live, oral 143 adenovirus type 4 vaccine live 32000 UNT Delayed Release Oral Tablet 40237615 1099936 Clinical Drug
adenovirus type 7 vaccine live 32000 UNT Delayed Release Oral Tablet 40237619 1099940 Clinical Drug
adenovirus type 4 vaccine live Delayed Release Oral Tablet 40237616 1099935 Clinical Drug Form
adenovirus type 7 vaccine live Delayed Release Oral Tablet 40237620 1099939 Clinical Drug Form
40213265 adenovirus vaccine, type 4, live, oral 54 adenovirus type 4 vaccine live Delayed Release Oral Tablet 40237616 1099935 Clinical Drug Form
adenovirus type 4 vaccine live 40237613 1099933 Ingredient
40213266 adenovirus vaccine, type 7, live, oral 55 adenovirus type 7 vaccine live Delayed Release Oral Tablet 40237620 1099939 Clinical Drug Form
40213266 adenovirus vaccine, type 7, live, oral 55 adenovirus type 7 vaccine live 40237617 1099937 Ingredient
40213271 Bacillus Calmette-Guerin vaccine 19 BCG, live, Tice strain 50 MG Injection 46234108 1653579 Clinical Drug
BCG Vaccine 19015423 1344 Ingredient
40213279 diphtheria antitoxin 12 diphtheria toxoid vaccine, inactivated Injectable Solution 40034345 371915 Clinical Drug Form
diphtheria antitoxin 19031041 3510 Ingredient
40213326 Influenza A monovalent (H5N1), adjuvanted, National stockpile 2013 160 influenza A virus A/Indonesia/05/2005 (H5N1) antigen 0.0075 MG/ML Injectable Suspension 1594219 1869640 Clinical Drug
influenza A virus (H5N1) antigen 40220901 1804260 Ingredient


These CVX codes are already standard and should be used as such. For most of them you won’t get 1:1 mapping to RxNorm and almost always there is no way to assert such mapping. CVX codes are broad vaccine terms (compared to narrow strains in RxNorm).

It is because you are capturing redundant RxNorm relationship. RxNorm Ingredient rolls up to the other RxNorm concept classes (ie Clinical Drug, Clinical Drug Form…)


I tried to persuade my colleagues of that, regarding CVX and will try again. They want as much as possible of patient’s medication profile to be expressed using Clinical drugs, failing that, Clinical Form / Clinical Comp, as last resort: Ingredients.

Similarly with mapping from NDC codes, using the maps to relationship… Here are examples from that realm. The problems here are mostly in the OTC realm and kits, it seems. If I encounter an NDC code for a kit (I cant recall ever doing so with project data) I expect that I would list using multiple Clinical Drug or Clinical Comp codes, retaining the info for the kit in the source_code and source_concept_ID fields on each. However, I see in CONCEPT lots of products where the NDC seems to go directly to **ingredient**s. If a patient is taking a multi-vitamin tablet, listing 15 ingredients separately is a bit much, I would prefer a single Clinical Drug type concept.

Here’s a sample of what I am encountering going from NDC to RxNorm, using maps to.

source concept ID source concept name source concept code source concept class id RxNorm concept name RxNorm concept ID RxNorm concept code RxNorm concept class ID
729283 menthol and camphor 5g/100mL / 3.25g/100mL TOPICAL SPRAY 730450002 9-digit NDC menthol 50 MG/ML 902193 446254 Clinical Drug Comp
camphor 32.5 MG/ML 40235643 1091380 Clinical Drug Comp
46340615 LYTENSOPRIL - lisinopril, arginine kit 68405007006 11-digit NDC lisinopril 1308216 29046 Ingredient
arginine 19006410 1091 Ingredient
44845008 KCL-LIDOCA-NS 10 MEQ-10 MG/100 24200103004 11-digit NDC potassium chloride 10 MEQ 19049429 316543 Clinical Drug Comp
lidocaine 10 MG 19110450 440800 Clinical Drug Comp
sodium chloride 9 MG/ML 46276153 1661411 Clinical Drug Comp
1104874 NOVAFERRUM MULTIVITAMIN WITH IRON PEDIATRIC DROPS - iron, vitamin a, ascorbic acid, vitamin d, .alpha.-tocopherol, thiamine, riboflavin, niacin, and pyridoxine liquid 52304071650 11-digit NDC iron 1360067 90176 Ingredient
niacin 1517824 7393 Ingredient
pyridoxine 19005046 684879 Ingredient
vitamin A 19008339 11246 Ingredient
vitamin D 19009405 11253 Ingredient
ascorbic acid 19011773 1151 Ingredient
riboflavin 19062817 9346 Ingredient
thiamine 19137312 10454 Ingredient
tocopherol 42709318 1236136 Ingredient
1723927 fish oil, dha, epa, vitamins b-1, b-2, b-3, b-6, b-12, c, d3, e, biotin, iron, zinc, copper, iodine,… 1mg/1 / 2mg/1 / 3mg/1 / 10mg/1 / 20mg/1 / 25mg/1 / 25ug/1 / 27mg/1 / 45mg/1 / 60mg/1 / 100ug/1 / 150 ORAL CAPSULE, GELATIN COATED [tricare prenatal dha 67112040230 11-digit NDC docusate 941258 82003 Ingredient
vitamin B12 1308738 11248 Ingredient
vitamin B6 1353228 42954 Ingredient
iron 1360067 90176 Ingredient
niacin 1517824 7393 Ingredient
iodine 1780601 5933 Ingredient
zinc 19010696 11416 Ingredient
ascorbic acid 19011773 1151 Ingredient
docosahexaenoate 19016670 73 Ingredient
biotin 19024770 1588 Ingredient
riboflavin 19062817 9346 Ingredient
copper 19071128 2837 Ingredient
eicosapentaenoate 19087063 618597 Ingredient
fish oils 19110701 4419 Ingredient
thiamine 19137312 10454 Ingredient
tocopherol 42709318 1236136 Ingredient
vitamin D3 42709324 1244014 Ingredient
35404133 THRIVITE RX - folic acid, .beta.-carotene, cholecalciferol, .alpha.-tocopherol acetate, dl-, ascorbic acid, thiamine mononitrate, riboflavin, niacinamide, pyridoxine hydrochloride, cyanocobalamin, biotin, calcium pantothenate, calcium carbonate, potassium 58657013390 11-digit NDC vitamin B12 1308738 11248 Ingredient
pyridoxine 19005046 684879 Ingredient
ascorbic acid 19011773 1151 Ingredient
niacinamide 19018419 7405 Ingredient
biotin 19024770 1588 Ingredient
calcium carbonate 19035704 1897 Ingredient
beta carotene 19037223 19143 Ingredient
alpha tocopherol 19056802 237099 Ingredient
riboflavin 19062817 9346 Ingredient
pantothenate 19088079 62400 Ingredient
cholecalciferol 19095164 2418 Ingredient
folic acid 19111620 4511 Ingredient
thiamine 19137312 10454 Ingredient
35404144 VP-CH-PNV - cholecalciferol, .alpha.-tocopherol acetate, dl-, pyridoxine hydrochloride, folic acid, calcium citrate, iron pentacarbonyl, docusate sodium, doconexent, and icosapent capsule 69543022430 11-digit NDC docusate 941258 82003 Ingredient
iron carbonyl 1400498 262150 Ingredient
pyridoxine 19005046 684879 Ingredient
alpha tocopherol 19056802 237099 Ingredient
calcium citrate 19058572 47613 Ingredient
cholecalciferol 19095164 2418 Ingredient
folic acid 19111620 4511 Ingredient
doconexent 40224726 1006469 Ingredient
icosapent ethyl 42874246 1304974 Ingredient


@meerawhy ,

I appreciate that these ingredients should roll up to Clinical Drug concepts.

My understanding though that the relationship between Clinical Drug and its components and characteristics does not use the maps to relationship, but others. Applying maps to to the NDC of a drug typically leads to one Clinical Drug, which in turn will be related to at least one each of Clinical Drug Comp, Clinical Drug Form, and Ingredient. Similarly, the NDC on a box holding multiple units would map to something like a Box, which in turn would have a relationship with a Clinical Drug.

Is my understanding correct?


What’s a bit weird about this is that if any patient is taking the Pre-natal vitamin having 11-digit NDC 67112040230, Concept_ID=1723927, we appear to be able to standardize the record only by blowing up one NDC-bearing record to 17 ingredient records.

Note from this query, there appear to be no other concepts related to it.

select unique
    relationship_ID ,
    v5.concept                     as c
        inner join
    v5.concept_relationship        as cr
        on cr.concept_ID_2=c.concept_ID
    cr.concept_ID_1    = 1723927         |
    c.concept_ID       = 1723927
relationship_id concept_id concept_name domain_id vocabulary_id concept_class_id standard_concept concept_code valid_start_date valid_end_date invalid_reason
Mapped from 1723927 fish oil, dha, epa, vitamins b-1, b-2, b-3, b-6, b-12, c, d3, e, biotin, iron, zinc, copper, iodine,… 1mg/1 / 2mg/1 / 3mg/1 / 10mg/1 / 20mg/1 / 25mg/1 / 25ug/1 / 27mg/1 / 45mg/1 / 60mg/1 / 100ug/1 / 150 ORAL CAPSULE, GELATIN COATED [tricare prenatal dha Drug NDC 11-digit NDC 67112040230 15MAR2019 31DEC2099
Maps to 941258 docusate Drug RxNorm Ingredient S 82003 01JAN1970 31DEC2099
Maps to 1308738 vitamin B12 Drug RxNorm Ingredient S 11248 01JAN1970 31DEC2099
Maps to 1353228 vitamin B6 Drug RxNorm Ingredient S 42954 01JAN1970 31DEC2099
Maps to 1360067 iron Drug RxNorm Ingredient S 90176 01JAN1970 31DEC2099
Maps to 1517824 niacin Drug RxNorm Ingredient S 7393 01JAN1970 31DEC2099
Maps to 1780601 iodine Drug RxNorm Ingredient S 5933 01JAN1970 31DEC2099
Maps to 19010696 zinc Drug RxNorm Ingredient S 11416 01JAN1970 31DEC2099
Maps to 19011773 ascorbic acid Drug RxNorm Ingredient S 1151 01JAN1970 31DEC2099
Maps to 19016670 docosahexaenoate Drug RxNorm Ingredient S 73 14MAY2006 31DEC2099
Maps to 19024770 biotin Drug RxNorm Ingredient S 1588 01JAN1970 31DEC2099
Maps to 19062817 riboflavin Drug RxNorm Ingredient S 9346 01JAN1970 31DEC2099
Maps to 19071128 copper Drug RxNorm Ingredient S 2837 01JAN1970 31DEC2099
Maps to 19087063 eicosapentaenoate Drug RxNorm Ingredient S 618597 14MAY2006 31DEC2099
Maps to 19110701 fish oils Drug RxNorm Ingredient S 4419 01JAN1970 31DEC2099
Maps to 19137312 thiamine Drug RxNorm Ingredient S 10454 01JAN1970 31DEC2099
Maps to 42709318 tocopherol Drug RxNorm Ingredient S 1236136 07MAY2012 31DEC2099
Maps to 42709324 vitamin D3 Drug RxNorm Ingredient S 1244014 07MAY2012 31DEC2099

I’ve been watching this thread and I think your expectations do not align with your source data.

  1. Your source data isn’t at the level of granularity your colleagues need as evidence by
  1. You have expectations for NDC codes to map to a single Clinical Drug. When the reality is NDCs are controlled by the pharmaceutical companies and RxNorm by the NLM. Two separate entities with very different purposes. And expect CVX drugs to map to a clinical drug, but as Anna explained, these CVX drugs are less granular than RxNorm Clinical Drug class.

From NLM:

NLM doesn’t map your NDC example above to a RxCUI. And a large part of the Drug domain comes from the NLM’s source code to RxNorm mappings. The other part of the Drug domain is built by the OHDSI vocabulary team. When a NDC isn’t mapped to a RxNorm code by the NLM, the OHDSI vocabulary team takes the drugs and maps them to the most granular standard concept_id possible. This is how we get the multi-ingredient drugs represented as source NDC codes mapping to many standard concept_ids. There isn’t always a 1:1 relationship between NDC and RxNorm.

What’s your use case for OTC drugs? Is the dose necessary? If yes, then the ETL needs to be modified to include the dosages for the each of the ingredients in a 1:M mapping situation. This is a HUGE undertaking because OTC drugs vary widely in their dosages of ingredients. There isn’t much standardization, probably part of the reason NLM hasn’t undertaken the mapping and creation of Clinical Drug RxCUIs for Vitamins/Minerals/Supplements. If you just need to know a Person took a certain ingredient, use the Drug Era table and skip modifying the ETL

If you have source codes which map to the Clinical Drug or more granular concept classes, use the Concept Ancestor table to get to the Clinical Drug level. You can’t go from an ingredient to a Clinical Drug concept class, but you can use the Drug Era table to know a Person was exposed to a particular ingredient.

1 Like


Thank you for helping me to understand.

The task with which I have been charged is to be able to standardize any source code that might come to us to an RxNorm concept. However, after failing to persuade the folk who set the requirement to accept CVX, ultimately I must do the best that I can to satisfy them.

The only OTC drug that I for which I recall needing ingredient strength for a project is Aspirin, as this can be useful when teasing out prophylactic usage.

Aside from ASA and other NSAIDs there is actually little interest in OTC drugs. I have been writing my code to be as generally applicable as possible, thus I test it against many different vocabularies of the Drug Domain to see where it might fail to standardize an exposure. I see now that I will need to report back that there are some NDC, typically for OTC, which simply cannot be mapped to a Clinical Drug. I doubt that this will be terribly worrisome.

As an example of what I am dealing with, the second need for my code is to translate “value sets” that have been built up over the years for specifying groupings of drugs for various purposes. I was amazed to see just how many different types of concepts were used in specifying drugs. Clearly, many must be artifacts from a data entry and prior efforts of mapping.

Fortunately, I have been successful in obtaining agreement to overhaul our system to take advantage of the strengths of OMOP structures. Value sets will henceforth be defined by the minimum number of standard characteristics needed. Typically, I expect that a list of ingredients will suffice.


You are up against something the NLM officially gave up on. The sheer amount of multi-vitamin OTC drugs on the market, and their constant change, makes it impossible for NLM (or us for that matter) to keep up. These are drugs that are not individually approved by the FDA, and therefore their content is not standardized anywhere. In order to at least know what’s in them we added the “Maps to” Ingredient relationships. But that also is spotty.

If you want to help fix the problem: We can easily run them through the RxNorm Extension machinery. But we need the ingredient(s), strength(s) and dose form information for each. So, if you think you have some quiet time over the holidays for googling a ton of NDC codes - very happy to take that in. There is no other solution as far as I know.

Hi Gerald, Hi Christian,

We actually might have a technology for this. It’s quite new and we are looking for test cases. Have a look at our research website www.dynaccurate.com

It is designed to remap changing references, which seems to be partially the case here. However, it also depends on the information format, which I can see is also an issue based on what you describe, so I don’t want to over-promise.

Contact me if you want to set up a call on this, and we can see if something can be done,

Best wishes,