Got feedback or spotted a mistake?

Leave a comment at the end of this page or email contact@krishagni.com

Configure derivative and aliquot page

You can configure the derivative/aliquot page based on the different criteria. This helps you eliminate the unwanted fields that are not needed on derivative/aliquot pages.

OpenSpecimen allows you to configure the derivative/aliquot page at the 'Collection Protocol' level and 'System Level'.

Protocol-level configuration

If you want to configure the derivative/aliquot page for a specific collection protocol, use CP level workflow JSON.

Refer to the 'Protocol Level Configuration' page to set the JSON file to the specific CP.

Derivative Page Configuration

To configure the derivative page user needs to add the "derivedSpecimens" section in the "data" block mentioned in the below JSON.

 Click here to expand...

Example:  In the below example, the specified fields like 'Parent Label', 'Type', 'Derived Type', 'Yield' etc. fields only displayed when you create the derived specimen from the 'Tissue' type sample.

JSON code
{
  "name": "common",
  "view": null,
  "ctrl": null,
  "data": {
    "derivedSpecimens":[
      {
        "title" : "Create Derivative: Solid Tissue",
        "criteria": {
        "op": "AND",
          "rules": [{
            "field": "specimen.parent.id",
            "op": "exists"
          },
            {
              "field": "specimen.parent.specimenClass",
              "op": "==",
              "value": "'Tissue'"
            }
          ]
        },
        "enableCofrc" : false,
        "fields" : [
          {
            "name": "specimen.parent.label",
            "caption": "Parent Specimen",
            "type": "span",
			"url": "specimen({specimenId: specimen.parent.id})"
          },
          {
            "name": "specimen.parent.type",
            "caption": "Specimen Type",
            "type": "span"
          },
          {
            "name": "specimen.type",
            "caption": "Derivative Type",
            "type" : "specimen-type",
            "specimen" : "specimen",
            "optional": false,
            "width": "170px"
          },
          {
          "name": "specimen.concentration",
          "caption": "Concentration",
          "type": "specimen-quantity",
          "specimen" : "specimen",
          "measure": "concentration",
          "optional": true,
          "width": "120px"
          },
          {
            "name": "specimen.extensionDetail.attrsMap.ST15",
            "baseField": "specimen.extensionDetail.attrsMap.ST15",
            "width": "80px"
          },
          {
           "name": "specimen.initialQty",
           "caption": "Volume",
           "type" : "specimen-quantity",
           "specimen": "specimen",
           "optional": true,
           "width": "80px"
         },
          {
            "name": "specimen.extensionDetail.attrsMap.ST16",
            "baseField": "specimen.extensionDetail.attrsMap.ST16",
            "width": "90px"
          },
          {
            "name": "specimen.extensionDetail.attrsMap.ST17",
            "baseField": "specimen.extensionDetail.attrsMap.ST17",
            "width": "90px"
          },
          {
           "name": "specimen.storageLocation",
           "caption": "Location",
           "type" : "storage-position",
           "optional": true,
           "cpId": "specimen.cpId",
           "entity": "specimen",
           "width": "240px",
           "copyValueFn": "function(firstRowVal, currentVal) { if ((!!currentVal && !!currentVal.reservationId) && (!!firstRowVal && !!firstRowVal.reservationId)) { return currentVal;} else if (firstRowVal) { return { id: '', name: firstRowVal.name, mode: firstRowVal.mode, positionX: '', positionY: '', position: '', reservationId: '' };} else { return {}; }}"
         },
          {
            "name": "specimen.printLabel",
            "caption": "Print",
            "icon": "fa fa-print",
            "type": "toggle-checkbox",
            "width": "30px"
          },
          {
            "name": "specimen.closeParent",
            "caption": "Close Parent",
            "icon": "fa fa-ban",
            "type": "toggle-checkbox",
            "width": "30px",
            "defaultValue": true   /*Close parent sample checkbox configuration, checked when set to true, unchecked when set to false
          }
        ]
      },
      {
        "title" : "Create Derivative: Biofluid",
        "criteria": {
        "op": "AND",
          "rules": [{
            "field": "specimen.parent.id",
            "op": "exists"
          },
            {
              "field": "specimen.parent.specimenClass",
              "op": "==",
              "value": "'Fluid'"
            }
          ]
        },
        "enableCofrc" : false,
        "fields" : [
          {
            "name": "specimen.parent.label",
            "caption": "Parent Specimen",
            "type": "span",
			"url": "specimen({specimenId: specimen.parent.id})"
          },
          {
            "name": "specimen.parent.type",
            "caption": "Specimen Type",
            "type": "span"
          },
          {
            "name": "specimen.extensionDetail.attrsMap.DD11",
            "baseField": "specimen.extensionDetail.attrsMap.DD11",
            "width": "120px"
          },
          {
            "name": "specimen.type",
            "caption": "Derivative Type",
            "type" : "specimen-type",
            "specimen" : "specimen",
            "optional": false,
            "width": "170px"
          },
          {
           "name": "specimen.initialQty",
           "caption": "Volume",
           "type" : "specimen-quantity",
           "specimen": "specimen",
           "optional": true,
           "width": "80px"
         },
         {
          "name": "specimen.concentration",
          "caption": "Concentration",
          "type": "specimen-quantity",
          "specimen" : "specimen",
          "measure": "concentration",
          "optional": true,
          "width": "120px"
        },
        {
          "name": "specimen.extensionDetail.attrsMap.DD24",
          "baseField": "specimen.extensionDetail.attrsMap.DD24",
          "width": "150px"
        },
        {
          "name": "specimen.extensionDetail.attrsMap.DP25",
          "baseField": "specimen.extensionDetail.attrsMap.DP25",
          "width": "150px",
          "type" : "date",
           "optional" : true
        },
          {
            "name": "specimen.printLabel",
            "caption": "Print",
            "icon": "fa fa-print",
            "type": "toggle-checkbox",
            "width": "30px"
          },
          {
            "name": "specimen.closeParent",
            "caption": "Close Parent",
            "icon": "fa fa-ban",
            "type": "toggle-checkbox",
            "width": "30px",
            "defaultValue": true
          }
        ]
      }
    ]
  }
}

Screenshot: Create a derivative page after JSON configured columns. 

Aliquot Page Configuration

To configure the aliquot page user needs to add the "aliquotsCollection" section in the "data" block mentioned in the below JSON.

 Example:  In the below example, the specified fields like  'Parent Label', 'Type', 'Tissue Status', 'Length' etc., are displayed only when you create the aliquot from the 'Tissue' type sample.


JSON code
{
  "name": "common",
  "view": null,
  "ctrl": null,
  "data": {
    "aliquotsCollection": [{
      "title": "Aliquots",
      "criteria": {
      "op": "AND",
        "rules": [{
          "field": "specimen.parent.id",
          "op": "exists"
        },
        {
          "field": "specimen.specimenClass",
          "op": "==",
          "value": "'Tissue'"
        }
        ]
      },
      "enableCofrc": false,
      "fields": [
                  {
                      "name": "specimen.parent.label",
                      "caption": "Parent Specimen",
                      "type": "span",
                      "url": "specimen({specimenId: specimen.parent.id})"
                  },
                  {
                      "name": "specimen.parent.availableQty",
                      "caption": "Parent Quantity",
                      "type": "span",
                      "width": "120px"
                  },
                  {
                      "name": "specimen.type",
                      "caption": "Type",
                      "type" : "specimen-type",
                      "specimen" : "specimen",
                      "optional": false,
                      "width": "185px"
                  },
                  {
                      "name": "specimen.noOfAliquots",
                      "caption": "Count",
                      "type": "text",
                      "pattern" : "/^[1-9][0-9]*$/",
                      "modelOpts": {"allowInvalid": true},
                      "optional": true,
                      "width": "80px",
                      "showIf": {
                          "tabMode": true,
                          "op": "OR",
                          "rules": [
                              {
                                  "field": "viewCtx.inputLabels",
                                  "op": "==",
                                  "value": "false"
                              }
                          ]
                      }
                  },
                  {
                      "name": "specimen.labels",
                      "caption": "Labels",
                      "type": "textarea",
                      "optional": false,
                      "showIf": {
                          "tabMode": true,
                          "op": "OR",
                          "rules": [
                              {
                                  "field": "viewCtx.inputLabels",
                                  "op": "==",
                                  "value": "true"
                              }
                          ]
                      },
                      "copyValueFn" : "function(firstRowVal, currentVal) { if (!!currentVal) { return currentVal; } else { return ''; } }"
                  },
                  {
                      "name": "specimen.qtyPerAliquot",
                      "caption": "Quantity",
                      "type" : "specimen-quantity",
                      "specimen": "specimen",
                      "optional": true,
                      "width": "100px"
                  },
                  {
                      "name": "specimen.createdOn",
                      "caption" : "Created On",
                      "type" : "date",
                      "optional" : true,
                      "defaultValue" : "current_date"
                  },
                  {
                      "name": "specimen.createdBy",
                      "caption": "Created By",
                      "type": "user",
                      "defaultValue": "current_user",
                      "optional": true,
                      "listSource": {
                          "queryParams": {
                              "static": {
                                  "excludeType": "CONTACT"
                              }
                          }
                      }
                  },
                  {
                    "name": "specimen.extensionDetail.attrsMap.DD2",
                    "baseField": "specimen.extensionDetail.attrsMap.DD2",
                    "optional": false

                  },
                  {
                      "name": "specimen.storageLocation",
                      "caption": "Location",
                      "type" : "storage-position",
                      "optional": true,
                      "cpId": "specimen.cpId",
                      "entity": "specimen",
                      "width": "240px",
                      "copyValueFn": "function(firstRowVal, currentVal) { if ((!!currentVal && !!currentVal.reservationId) && (!!firstRowVal && !!firstRowVal.reservationId)) { return currentVal;} else if (firstRowVal) { return { id: '', name: firstRowVal.name, mode: firstRowVal.mode, positionX: '', positionY: '', position: '', reservationId: '' };} else { return {}; }}"
                  },
                  {
                      "name": "specimen.printLabel",
                      "caption": "Print",
                      "icon": "fa fa-print",
                      "type": "toggle-checkbox",
                      "width": "30px"
                  },
                  {
                      "name": "specimen.closeParent",
                      "caption": "Close Parent",
                      "icon": "fa fa-ban",
                      "type": "toggle-checkbox",
                      "width": "30px",
                      "defaultValue": false
                  }
              ]
    }]
  }
}

Screenshot: Create aliquot page after JSON configured columns

System-level configuration

Refer to the 'System-Level Configuration' page to set the System- Level Workflow.

Once you configure the derivative/aliquot at the system level, it affects all the collection protocols present in the OpenSpecimen.

Selecting specimens of multiple CPs from the cart view or any other view and subsequently clicking on "Create Aliquots" or "Create Derivatives" displays configurable derivative/aliquots data table. The configurable table is displayed only if SDE is installed and derivative/aliquot fields are configured at the system level.

 Click here to expand...


JSON code
[
    {
      "name": "common",
      "view": null,
      "ctrl": null,
      "data": {
        "derivedSpecimens":[
          {
            "title" : "Create Derivative: Solid Tissue",
            "criteria": {
            "op": "AND",
              "rules": [{
                "field": "specimen.parent.id",
                "op": "exists"
              },
                {
                  "field": "specimen.parent.specimenClass",
                  "op": "==",
                  "value": "'Tissue'"
                }
              ]
            },
            "enableCofrc" : false,
            "fields" : [
              {
                "name": "specimen.parent.label",
                "caption": "Parent Specimen",
                "type": "span",
				"url": "specimen({specimenId: specimen.parent.id})"
              },
              {
                "name": "specimen.parent.type",
                "caption": "Specimen Type",
                "type": "span"
              },
              {
                "name": "specimen.type",
                "caption": "Derivative Type",
                "type" : "specimen-type",
                "specimen" : "specimen",
                "optional": false,
                "width": "170px"
              },
              {
              "name": "specimen.concentration",
              "caption": "Concentration",
              "type": "specimen-quantity",
              "specimen" : "specimen",
              "measure": "concentration",
              "optional": true,
              "width": "120px"
              },
              {
                "name": "specimen.extensionDetail.attrsMap.ST15",
                "baseField": "specimen.extensionDetail.attrsMap.ST15",
                "width": "80px"
              },
              {
               "name": "specimen.initialQty",
               "caption": "Volume",
               "type" : "specimen-quantity",
               "specimen": "specimen",
               "optional": true,
               "width": "80px"
             },
              {
                "name": "specimen.extensionDetail.attrsMap.ST16",
                "baseField": "specimen.extensionDetail.attrsMap.ST16",
                "width": "90px"
              },
              {
                "name": "specimen.extensionDetail.attrsMap.ST17",
                "baseField": "specimen.extensionDetail.attrsMap.ST17",
                "width": "90px"
              },
              {
               "name": "specimen.storageLocation",
               "caption": "Location",
               "type" : "storage-position",
               "optional": true,
               "cpId": "specimen.cpId",
               "entity": "specimen",
               "width": "240px",
               "copyValueFn": "function(firstRowVal, currentVal) { if ((!!currentVal && !!currentVal.reservationId) && (!!firstRowVal && !!firstRowVal.reservationId)) { return currentVal;} else if (firstRowVal) { return { id: '', name: firstRowVal.name, mode: firstRowVal.mode, positionX: '', positionY: '', position: '', reservationId: '' };} else { return {}; }}"
             },
              {
                "name": "specimen.printLabel",
                "caption": "Print",
                "icon": "fa fa-print",
                "type": "toggle-checkbox",
                "width": "30px"
              },
              {
                "name": "specimen.closeParent",
                "caption": "Close Parent",
                "icon": "fa fa-ban",
                "type": "toggle-checkbox",
                "width": "30px",
                "defaultValue": true
              }
            ]
          },
          {
            "title" : "Create Derivative: Biofluid",
            "criteria": {
            "op": "AND",
              "rules": [{
                "field": "specimen.parent.id",
                "op": "exists"
              },
                {
                  "field": "specimen.parent.specimenClass",
                  "op": "==",
                  "value": "'Fluid'"
                }
              ]
            },
            "enableCofrc" : false,
            "fields" : [
              {
                "name": "specimen.parent.label",
                "caption": "Parent Specimen",
                "type": "span",
				"url": "specimen({specimenId: specimen.parent.id})"
              },
              {
                "name": "specimen.parent.type",
                "caption": "Specimen Type",
                "type": "span"
              },
              {
                "name": "specimen.type",
                "caption": "Derivative Type",
                "type" : "specimen-type",
                "specimen" : "specimen",
                "optional": false,
                "width": "170px"
              },
              {
               "name": "specimen.initialQty",
               "caption": "Volume",
               "type" : "specimen-quantity",
               "specimen": "specimen",
               "optional": true,
               "width": "80px"
             },
             {
              "name": "specimen.concentration",
              "caption": "Concentration",
              "type": "specimen-quantity",
              "specimen" : "specimen",
              "measure": "concentration",
              "optional": true,
              "width": "120px"
            },
              {
                "name": "specimen.printLabel",
                "caption": "Print",
                "icon": "fa fa-print",
                "type": "toggle-checkbox",
                "width": "30px"
              },
              {
                "name": "specimen.closeParent",
                "caption": "Close Parent",
                "icon": "fa fa-ban",
                "type": "toggle-checkbox",
                "width": "30px",
                "defaultValue": true
              }
            ]
          }
        ],
        "aliquotsCollection": [{
          "title": "Aliquots",
          "criteria": {
          "op": "AND",
            "rules": [{
              "field": "specimen.parent.id",
              "op": "exists"
            },
            {
              "field": "specimen.specimenClass",
              "op": "==",
              "value": "'Tissue'"
            }
            ]
          },
          "enableCofrc": false,
          "fields": [{
              "name": "specimen.parent.label",
              "caption": "Parent Specimen",
              "type": "span",
			  "url": "specimen({specimenId: specimen.parent.id})"
            },
            {
              "name": "specimen.type",
              "baseField": "specimen.type"
            },
            {
              "name": "specimen.extensionDetail.attrsMap.DD20",
              "baseField": "specimen.extensionDetail.attrsMap.DD20"
            },
            {
            "name": "specimen.noOfAliquots",
            "caption": "Aliquots Count",
            "type": "text"
            },
            {
              "name": "specimen.qtyPerAliquot",
              "baseField": "specimen.initialQty"
            },
            {
              "name": "specimen.extensionDetail.attrsMap.NT21",
              "baseField": "specimen.extensionDetail.attrsMap.NT21"
            },
            {
              "name": "specimen.extensionDetail.attrsMap.NT22",
              "baseField": "specimen.extensionDetail.attrsMap.NT22"
            },
            {
              "name": "specimen.extensionDetail.attrsMap.NT23",
              "baseField": "specimen.extensionDetail.attrsMap.NT23"
            },
            {
              "name": "specimen.storageLocation",
              "baseField": "specimen.storageLocation",
              "caption": "Location"
            },
            {
              "name": "specimen.printLabel",
              "caption": "Print",
              "icon": "fa fa-print",
              "type": "toggle-checkbox",
              "width": "30px"
            },
            {
              "name": "specimen.closeParent",
              "caption": "Close Parent",
              "icon": "fa fa-ban",
              "type": "toggle-checkbox",
              "width": "30px"
            }
          ]
        }]

      }
    }
]

Screenshot: Create derivatives and aliquots from the cart page

Screenshot:  Cart view page → Create Derivative Page

Screenshot:  Cart view page → Create Aliquot Page

Extra features in creating derived and aliquot page

Hide 'Copy first to all' link on derivative and aliquot pages

There is a button 'Copy first to all' on the aliquots and derivatives pages, which will allow creating similar aliquots and derivatives at once. Some users do not need this as a similar type of children are generally created in a single row, and 'Copy first to all' might be confusing.

In v6.0, this button can be hidden. To hide "Copy first to all" a button from derived or aliquot pages, add the following setting in JSON under aliquotsCollection and derivedSpecimens sections

{
    ...
    "aliquotsCollection": [
      ...
      {
        "title": ...,
        ...,
        "hideCopyFirstToAll": true
        ...
      },
      ...
    ],

   "derivedSpecimens": [
      ...
      {
        "title": ...,
        ...,
        "hideCopyFirstToAll": true
        ...
      },
      ...
    ],
    ...
  }

Before configuring the JSON, the "Copy first to all" button is present on Create derivative page:

After configuring the JSON, "Copy first to all" button is hidden on Create derivative page:

After configuring the JSON, "Copy first to all" button is hidden on Create aliquot page:

Add ability to create aliquots from the 'Create Derivatives' page

Added an option to allow users to create aliquots when creating unplanned derivatives. The default system workflow includes the option to create aliquots.

The customized CP workflows can add the following JSON to the "derivedspecimens" workflow to activate the option:

Code:
{
      "name": "specimen.createAliquots",
      "caption": "Create Aliquots?",
      "icon": "fa fa-share-alt",
      "type": "toggle-checkbox",
      "width": "30px"
    }


Example JSON:

Example JSON
{
  "name" : "common",
  "view" : null,
  "ctrl" : null,
  "data" : {
    "derivedSpecimens" : [ {
      "title" : "Derived Specimens",
      "criteria" : {
        "rules" : [ {
          "field" : "specimen.parent.id",
          "op" : "exists"
        } ]
      },
      "enableCofrc" : false,
      "fields" : [ {
        "name" : "specimen.parent.label",
        "caption" : "Parent Specimen",
        "type" : "span",
        "url" : "specimen({specimenId: specimen.parent.id})"
      }, {
        "name" : "specimen.parent.type",
        "caption" : "Parent Type",
        "type" : "span"
      }, {
        "name" : "specimen.label",
        "caption" : "Label",
        "type" : "text",
        "optional" : false,
        "showIf" : {
          "tabMode" : true,
          "op" : "OR",
          "rules" : [ {
            "field" : "viewCtx.inputLabels",
            "op" : "==",
            "value" : "true"
          } ]
        },
        "copyValueFn" : "function(firstRowVal, currentVal) { if (!!currentVal) { return currentVal; } else { return ''; } }"
      }, {
        "name" : "specimen.parent.availableQty",
        "caption" : "Parent Quantity",
        "type" : "span",
        "width" : "120px"
      }, {
        "name" : "specimen.type",
        "caption" : "Type",
        "type" : "specimen-type",
        "specimen" : "specimen",
        "optional" : false,
        "width" : "185px"
      }, {
        "name" : "specimen.initialQty",
        "caption" : "Quantity",
        "type" : "specimen-quantity",
        "specimen" : "specimen",
        "optional" : true,
        "width" : "100px"
      }, {
        "name" : "specimen.createdOn",
        "caption" : "Created On",
        "type" : "date",
        "optional" : true,
        "defaultValue" : "current_date"
      }, {
        "name" : "specimen.createdBy",
        "caption" : "Created By",
        "type" : "user",
        "defaultValue" : "current_user",
        "optional" : true,
        "listSource" : {
          "queryParams" : {
            "static" : {
              "excludeType" : "CONTACT"
            }
          }
        }
      }, 
      {
        "name" : "specimen.storageLocation",
        "caption" : "Location",
        "type" : "storage-position",
        "optional" : true,
        "cpId" : "specimen.cpId",
        "entity" : "specimen",
        "width" : "240px",
        "copyValueFn" : "function(firstRowVal, currentVal) { if ((!!currentVal && !!currentVal.reservationId) && (!!firstRowVal && 					!!firstRowVal.reservationId)) { return currentVal;} else if (firstRowVal) { return { id: '', name: firstRowVal.name, mode: firstRowVal.mode, positionX: '', positionY: '', position: '', reservationId: '' };} else { return {}; }}"
      }, {
        "name" : "specimen.createAliquots",
        "caption" : "Create Aliquots?",
        "icon" : "fa fa-share-alt",
        "type" : "toggle-checkbox",
        "width" : "30px"
      }, {
        "name" : "specimen.printLabel",
        "caption" : "Print",
        "icon" : "fa fa-print",
        "type" : "toggle-checkbox",
        "width" : "30px"
      }, {
        "name" : "specimen.closeParent",
        "caption" : "Close Parent",
        "icon" : "fa fa-ban",
        "type" : "toggle-checkbox",
        "width" : "30px",
        "defaultValue" : false
      } ]
    } ]
  }
}, 


Set default and hide the field in the derived/aliquots creation page.

In the below example, the field is defaulted to its parent value and hidden from the data entry screen.

Example JSON
{
        "name" : "specimen.extensionDetail.attrsMap.ST4",
        "baseField" : "specimen.extensionDetail.attrsMap.ST4",
        "defaultValue" : "field: specimen.parent.extensionDetail.attrsMap.ST4",
        "hideColumn" : true
 }, 

Add the Specimen Barcode field in 'Create Aliquot' page

To configure the'Create Aliquot' page with the Barcode field, use the below code in the aliquotsCollection under the common section.  

Example = JSON
{
        "name" : "specimen.barcodes",
        "caption" : "Barcodes",
        "type" : "textarea",
        "optional" : false
     },


Example Barcode field in aliquots page.json

Difference between the specimen. barcode field in dictionary and specimen.barcodes in common section:

  • The ‘specimen.barcodes’ field in the aliquot section is a textarea field similar to the labels field for aliquots, where you can scan the comma/newline/tab-delimited barcodes. Each barcode corresponds to one aliquot. This field will basically create the aliquots.

  • The ‘specimen.barcode’ field in the dictionary section is the text field which will specify only one barcode corresponding to one specimen. Thus, the barcode entered on the create aliquot page will be stored and displayed on the overview page.


Got feedback or spotted a mistake?

Leave a comment at the end of this page or email contact@krishagni.com