LiftoffTools: a toolkit for comparing gene annotations mapped between genome assemblies

preprint OA: closed
Full text JSON View at publisher
AI-generated deep summary by claude@2026-07, 2026-07-03 · read from full text

The provided text does not contain the scientific content of the paper “LiftoffTools: a toolkit for comparing gene annotations mapped between genome assemblies,” but instead shows unrelated embedded web/analytics code and does not describe study aims, datasets, methods, results, or limitations. Because the manuscript’s substantive sections are missing, I cannot determine what population or biological system was analyzed or what key finding the toolkit enables. The only explicit information present is that the work is associated with “LiftoffTools” as a gene-annotation comparison toolkit across genome assemblies, but no end-to-end methodological or evaluative details are included here. This paper is not clearly discussed in the provided excerpt; it was included in the corpus via a keyword match in the upstream search index, and the excerpt itself does not explicitly mention endometriosis or adenomyosis.

Read from the paper's body, not the abstract. Not a substitute for reading the paper. No clinical advice. How this works

Abstract

In 2020 we published Liftoff, which was the first standalone tool specifically designed for transferring gene annotations between genome assemblies of the same or closely related species. While the gene content is expected to be very similar in closely related genomes, the differences may be biologically consequential, and a computational method to extract all gene-related differences should prove useful in the analysis of such genomes. Here we present LiftoffTools, a toolkit to automate the detection and analysis of gene sequence variants, synteny, and gene copy number changes.  We provide a description of the toolkit and an example of its use comparing genes mapped between two human genome assemblies.
Full text 152,060 characters · extracted from preprint-html · click to expand
LiftoffTools: a toolkit for comparing gene... | F1000Research "use strict";function _typeof(t){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}!function(){var t=function(){var t,e,o=[],n=window,r=n;for(;r;){try{if(r.frames.__tcfapiLocator){t=r;break}}catch(t){}if(r===n.top)break;r=r.parent}t||(!function t(){var e=n.document,o=!!n.frames.__tcfapiLocator;if(!o)if(e.body){var r=e.createElement("iframe");r.style.cssText="display:none",r.name="__tcfapiLocator",e.body.appendChild(r)}else setTimeout(t,5);return!o}(),n.__tcfapi=function(){for(var t=arguments.length,n=new Array(t),r=0;r 3&&2===parseInt(n[1],10)&&"boolean"==typeof n[3]&&(e=n[3],"function"==typeof n[2]&&n[2]("set",!0)):"ping"===n[0]?"function"==typeof n[2]&&n[2]({gdprApplies:e,cmpLoaded:!1,cmpStatus:"stub"}):o.push(n)},n.addEventListener("message",(function(t){var e="string"==typeof t.data,o={};if(e)try{o=JSON.parse(t.data)}catch(t){}else o=t.data;var n="object"===_typeof(o)&&null!==o?o.__tcfapiCall:null;n&&window.__tcfapi(n.command,n.version,(function(o,r){var a={__tcfapiReturn:{returnValue:o,success:r,callId:n.callId}};t&&t.source&&t.source.postMessage&&t.source.postMessage(e?JSON.stringify(a):a,"*")}),n.parameter)}),!1))};"undefined"!=typeof module?module.exports=t:t()}(); dataLayer = dataLayer || []; // Standard GTM initialization - Google Consent Mode handles consent automatically (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl+ '>m_auth=hzk0Vc3qFsQYhCrIoHz68A>m_preview=env-1>m_cookies_win=x';f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-MWFK8L5J'); ;window.NREUM||(NREUM={});NREUM.init={distributed_tracing:{enabled:true},privacy:{cookies_enabled:true},ajax:{deny_list:["bam.nr-data.net"]}}; ;NREUM.loader_config={accountID:"438030",trustKey:"438030",agentID:"772317073",licenseKey:"97f8f67f26",applicationID:"772317073"} ;NREUM.info={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net",licenseKey:"97f8f67f26",applicationID:"772317073",sa:1} ;/*! For license information please see nr-loader-spa-1.236.0.min.js.LICENSE.txt */ (()=>{"use strict";var e,t,r={5763:(e,t,r)=>{r.d(t,{P_:()=>l,Mt:()=>g,C5:()=>s,DL:()=>v,OP:()=>T,lF:()=>D,Yu:()=>y,Dg:()=>h,CX:()=>c,GE:()=>b,sU:()=>_});var n=r(8632),i=r(9567);const o={beacon:n.ce.beacon,errorBeacon:n.ce.errorBeacon,licenseKey:void 0,applicationID:void 0,sa:void 0,queueTime:void 0,applicationTime:void 0,ttGuid:void 0,user:void 0,account:void 0,product:void 0,extra:void 0,jsAttributes:{},userAttributes:void 0,atts:void 0,transactionName:void 0,tNamePlain:void 0},a={};function s(e){if(!e)throw new Error("All info objects require an agent identifier!");if(!a[e])throw new Error("Info for ".concat(e," was never set"));return a[e]}function c(e,t){if(!e)throw new Error("All info objects require an agent identifier!");a[e]=(0,i.D)(t,o),(0,n.Qy)(e,a[e],"info")}var u=r(7056);const d=()=>{const e={blockSelector:"[data-nr-block]",maskInputOptions:{password:!0}};return{allow_bfcache:!0,privacy:{cookies_enabled:!0},ajax:{deny_list:void 0,enabled:!0,harvestTimeSeconds:10},distributed_tracing:{enabled:void 0,exclude_newrelic_header:void 0,cors_use_newrelic_header:void 0,cors_use_tracecontext_headers:void 0,allowed_origins:void 0},session:{domain:void 0,expiresMs:u.oD,inactiveMs:u.Hb},ssl:void 0,obfuscate:void 0,jserrors:{enabled:!0,harvestTimeSeconds:10},metrics:{enabled:!0},page_action:{enabled:!0,harvestTimeSeconds:30},page_view_event:{enabled:!0},page_view_timing:{enabled:!0,harvestTimeSeconds:30,long_task:!1},session_trace:{enabled:!0,harvestTimeSeconds:10},harvest:{tooManyRequestsDelay:60},session_replay:{enabled:!1,harvestTimeSeconds:60,sampleRate:.1,errorSampleRate:.1,maskTextSelector:"*",maskAllInputs:!0,get blockClass(){return"nr-block"},get ignoreClass(){return"nr-ignore"},get maskTextClass(){return"nr-mask"},get blockSelector(){return e.blockSelector},set blockSelector(t){e.blockSelector+=",".concat(t)},get maskInputOptions(){return e.maskInputOptions},set maskInputOptions(t){e.maskInputOptions={...t,password:!0}}},spa:{enabled:!0,harvestTimeSeconds:10}}},f={};function l(e){if(!e)throw new Error("All configuration objects require an agent identifier!");if(!f[e])throw new Error("Configuration for ".concat(e," was never set"));return f[e]}function h(e,t){if(!e)throw new Error("All configuration objects require an agent identifier!");f[e]=(0,i.D)(t,d()),(0,n.Qy)(e,f[e],"config")}function g(e,t){if(!e)throw new Error("All configuration objects require an agent identifier!");var r=l(e);if(r){for(var n=t.split("."),i=0;i {r.d(t,{D:()=>i});var n=r(50);function i(e,t){try{if(!e||"object"!=typeof e)return(0,n.Z)("Setting a Configurable requires an object as input");if(!t||"object"!=typeof t)return(0,n.Z)("Setting a Configurable requires a model to set its initial properties");const r=Object.create(Object.getPrototypeOf(t),Object.getOwnPropertyDescriptors(t)),o=0===Object.keys(r).length?e:r;for(let a in o)if(void 0!==e[a])try{"object"==typeof e[a]&&"object"==typeof t[a]?r[a]=i(e[a],t[a]):r[a]=e[a]}catch(e){(0,n.Z)("An error occurred while setting a property of a Configurable",e)}return r}catch(e){(0,n.Z)("An error occured while setting a Configurable",e)}}},6818:(e,t,r)=>{r.d(t,{Re:()=>i,gF:()=>o,q4:()=>n});const n="1.236.0",i="PROD",o="CDN"},385:(e,t,r)=>{r.d(t,{FN:()=>a,IF:()=>u,Nk:()=>f,Tt:()=>s,_A:()=>o,il:()=>n,pL:()=>c,v6:()=>i,w1:()=>d});const n="undefined"!=typeof window&&!!window.document,i="undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self.navigator instanceof WorkerNavigator||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis.navigator instanceof WorkerNavigator),o=n?window:"undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis),a=""+o?.location,s=/iPad|iPhone|iPod/.test(navigator.userAgent),c=s&&"undefined"==typeof SharedWorker,u=(()=>{const e=navigator.userAgent.match(/Firefox[/\s](\d+\.\d+)/);return Array.isArray(e)&&e.length>=2?+e[1]:0})(),d=Boolean(n&&window.document.documentMode),f=!!navigator.sendBeacon},1117:(e,t,r)=>{r.d(t,{w:()=>o});var n=r(50);const i={agentIdentifier:"",ee:void 0};class o{constructor(e){try{if("object"!=typeof e)return(0,n.Z)("shared context requires an object as input");this.sharedContext={},Object.assign(this.sharedContext,i),Object.entries(e).forEach((e=>{let[t,r]=e;Object.keys(i).includes(t)&&(this.sharedContext[t]=r)}))}catch(e){(0,n.Z)("An error occured while setting SharedContext",e)}}}},8e3:(e,t,r)=>{r.d(t,{L:()=>d,R:()=>c});var n=r(2177),i=r(1284),o=r(4322),a=r(3325);const s={};function c(e,t){const r={staged:!1,priority:a.p[t]||0};u(e),s[e].get(t)||s[e].set(t,r)}function u(e){e&&(s[e]||(s[e]=new Map))}function d(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"feature";if(u(e),!e||!s[e].get(t))return a(t);s[e].get(t).staged=!0;const r=[...s[e]];function a(t){const r=e?n.ee.get(e):n.ee,a=o.X.handlers;if(r.backlog&&a){var s=r.backlog[t],c=a[t];if(c){for(var u=0;s&&u {let[t,r]=e;return r.staged}))&&(r.sort(((e,t)=>e[1].priority-t[1].priority)),r.forEach((e=>{let[t]=e;a(t)})))}function f(e,t){var r=e[1];(0,i.D)(t[r],(function(t,r){var n=e[0];if(r[0]===n){var i=r[1],o=e[3],a=e[2];i.apply(o,a)}}))}},2177:(e,t,r)=>{r.d(t,{c:()=>f,ee:()=>u});var n=r(8632),i=r(2210),o=r(1284),a=r(5763),s="nr@context";let c=(0,n.fP)();var u;function d(){}function f(e){return(0,i.X)(e,s,l)}function l(){return new d}function h(){u.aborted=!0,u.backlog={}}c.ee?u=c.ee:(u=function e(t,r){var n={},c={},f={},g=!1;try{g=16===r.length&&(0,a.OP)(r).isolatedBacklog}catch(e){}var p={on:b,addEventListener:b,removeEventListener:y,emit:v,get:x,listeners:w,context:m,buffer:A,abort:h,aborted:!1,isBuffering:E,debugId:r,backlog:g?{}:t&&"object"==typeof t.backlog?t.backlog:{}};return p;function m(e){return e&&e instanceof d?e:e?(0,i.X)(e,s,l):l()}function v(e,r,n,i,o){if(!1!==o&&(o=!0),!u.aborted||i){t&&o&&t.emit(e,r,n);for(var a=m(n),s=w(e),d=s.length,f=0;fn,p:()=>i});var n=r(2177).ee.get("handle");function i(e,t,r,i,o){o?(o.buffer([e],i),o.emit(e,t,r)):(n.buffer([e],i),n.emit(e,t,r))}},4322:(e,t,r)=>{r.d(t,{X:()=>o});var n=r(5546);o.on=a;var i=o.handlers={};function o(e,t,r,o){a(o||n.E,i,e,t,r)}function a(e,t,r,i,o){o||(o="feature"),e||(e=n.E);var a=t[o]=t[o]||{};(a[r]=a[r]||[]).push([e,i])}},3239:(e,t,r)=>{r.d(t,{bP:()=>s,iz:()=>c,m$:()=>a});var n=r(385);let i=!1,o=!1;try{const e={get passive(){return i=!0,!1},get signal(){return o=!0,!1}};n._A.addEventListener("test",null,e),n._A.removeEventListener("test",null,e)}catch(e){}function a(e,t){return i||o?{capture:!!e,passive:i,signal:t}:!!e}function s(e,t){let r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=arguments.length>3?arguments[3]:void 0;window.addEventListener(e,t,a(r,n))}function c(e,t){let r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=arguments.length>3?arguments[3]:void 0;document.addEventListener(e,t,a(r,n))}},4402:(e,t,r)=>{r.d(t,{Ht:()=>u,M:()=>c,Rl:()=>a,ky:()=>s});var n=r(385);const i="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx";function o(e,t){return e?15&e[t]:16*Math.random()|0}function a(){const e=n._A?.crypto||n._A?.msCrypto;let t,r=0;return e&&e.getRandomValues&&(t=e.getRandomValues(new Uint8Array(31))),i.split("").map((e=>"x"===e?o(t,++r).toString(16):"y"===e?(3&o()|8).toString(16):e)).join("")}function s(e){const t=n._A?.crypto||n._A?.msCrypto;let r,i=0;t&&t.getRandomValues&&(r=t.getRandomValues(new Uint8Array(31)));const a=[];for(var s=0;s {r.d(t,{Bq:()=>n,Hb:()=>o,oD:()=>i});const n="NRBA",i=144e5,o=18e5},7894:(e,t,r)=>{function n(){return Math.round(performance.now())}r.d(t,{z:()=>n})},7243:(e,t,r)=>{r.d(t,{e:()=>o});var n=r(385),i={};function o(e){if(e in i)return i[e];if(0===(e||"").indexOf("data:"))return{protocol:"data"};let t;var r=n._A?.location,o={};if(n.il)t=document.createElement("a"),t.href=e;else try{t=new URL(e,r.href)}catch(e){return o}o.port=t.port;var a=t.href.split("://");!o.port&&a[1]&&(o.port=a[1].split("/")[0].split("@").pop().split(":")[1]),o.port&&"0"!==o.port||(o.port="https"===a[0]?"443":"80"),o.hostname=t.hostname||r.hostname,o.pathname=t.pathname,o.protocol=a[0],"/"!==o.pathname.charAt(0)&&(o.pathname="/"+o.pathname);var s=!t.protocol||":"===t.protocol||t.protocol===r.protocol,c=t.hostname===r.hostname&&t.port===r.port;return o.sameOrigin=s&&(!t.hostname||c),"/"===o.pathname&&(i[e]=o),o}},50:(e,t,r)=>{function n(e,t){"function"==typeof console.warn&&(console.warn("New Relic: ".concat(e)),t&&console.warn(t))}r.d(t,{Z:()=>n})},2587:(e,t,r)=>{r.d(t,{N:()=>c,T:()=>u});var n=r(2177),i=r(5546),o=r(8e3),a=r(3325);const s={stn:[a.D.sessionTrace],err:[a.D.jserrors,a.D.metrics],ins:[a.D.pageAction],spa:[a.D.spa],sr:[a.D.sessionReplay,a.D.sessionTrace]};function c(e,t){const r=n.ee.get(t);e&&"object"==typeof e&&(Object.entries(e).forEach((e=>{let[t,n]=e;void 0===u[t]&&(s[t]?s[t].forEach((e=>{n?(0,i.p)("feat-"+t,[],void 0,e,r):(0,i.p)("block-"+t,[],void 0,e,r),(0,i.p)("rumresp-"+t,[Boolean(n)],void 0,e,r)})):n&&(0,i.p)("feat-"+t,[],void 0,void 0,r),u[t]=Boolean(n))})),Object.keys(s).forEach((e=>{void 0===u[e]&&(s[e]?.forEach((t=>(0,i.p)("rumresp-"+e,[!1],void 0,t,r))),u[e]=!1)})),(0,o.L)(t,a.D.pageViewEvent))}const u={}},2210:(e,t,r)=>{r.d(t,{X:()=>i});var n=Object.prototype.hasOwnProperty;function i(e,t,r){if(n.call(e,t))return e[t];var i=r();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(e,t,{value:i,writable:!0,enumerable:!1}),i}catch(e){}return e[t]=i,i}},1284:(e,t,r)=>{r.d(t,{D:()=>n});const n=(e,t)=>Object.entries(e||{}).map((e=>{let[r,n]=e;return t(r,n)}))},4351:(e,t,r)=>{r.d(t,{P:()=>o});var n=r(2177);const i=()=>{const e=new WeakSet;return(t,r)=>{if("object"==typeof r&&null!==r){if(e.has(r))return;e.add(r)}return r}};function o(e){try{return JSON.stringify(e,i())}catch(e){try{n.ee.emit("internal-error",[e])}catch(e){}}}},3960:(e,t,r)=>{r.d(t,{K:()=>a,b:()=>o});var n=r(3239);function i(){return"undefined"==typeof document||"complete"===document.readyState}function o(e,t){if(i())return e();(0,n.bP)("load",e,t)}function a(e){if(i())return e();(0,n.iz)("DOMContentLoaded",e)}},8632:(e,t,r)=>{r.d(t,{EZ:()=>u,Qy:()=>c,ce:()=>o,fP:()=>a,gG:()=>d,mF:()=>s});var n=r(7894),i=r(385);const o={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net"};function a(){return i._A.NREUM||(i._A.NREUM={}),void 0===i._A.newrelic&&(i._A.newrelic=i._A.NREUM),i._A.NREUM}function s(){let e=a();return e.o||(e.o={ST:i._A.setTimeout,SI:i._A.setImmediate,CT:i._A.clearTimeout,XHR:i._A.XMLHttpRequest,REQ:i._A.Request,EV:i._A.Event,PR:i._A.Promise,MO:i._A.MutationObserver,FETCH:i._A.fetch}),e}function c(e,t,r){let i=a();const o=i.initializedAgents||{},s=o[e]||{};return Object.keys(s).length||(s.initializedAt={ms:(0,n.z)(),date:new Date}),i.initializedAgents={...o,[e]:{...s,[r]:t}},i}function u(e,t){a()[e]=t}function d(){return function(){let e=a();const t=e.info||{};e.info={beacon:o.beacon,errorBeacon:o.errorBeacon,...t}}(),function(){let e=a();const t=e.init||{};e.init={...t}}(),s(),function(){let e=a();const t=e.loader_config||{};e.loader_config={...t}}(),a()}},7956:(e,t,r)=>{r.d(t,{N:()=>i});var n=r(3239);function i(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=arguments.length>2?arguments[2]:void 0,i=arguments.length>3?arguments[3]:void 0;return void(0,n.iz)("visibilitychange",(function(){if(t)return void("hidden"==document.visibilityState&&e());e(document.visibilityState)}),r,i)}},1214:(e,t,r)=>{r.d(t,{em:()=>v,u5:()=>N,QU:()=>S,_L:()=>I,Gm:()=>L,Lg:()=>M,gy:()=>U,BV:()=>Q,Kf:()=>ee});var n=r(2177);const i="nr@original";var o=Object.prototype.hasOwnProperty,a=!1;function s(e,t){return e||(e=n.ee),r.inPlace=function(e,t,n,i,o){n||(n="");var a,s,c,u="-"===n.charAt(0);for(c=0;c 2?n-2:0),o=2;o {r(A[T],e,w),r(E[T],e,w)})),r(l._A,"fetch",y),t.on(y+"end",(function(e,r){var n=this;if(r){var i=r.headers.get("content-length");null!==i&&(n.rxSize=i),t.emit(y+"done",[null,r],n)}else t.emit(y+"done",[e],n)})),t}const O={},j=["pushState","replaceState"];function S(e){const t=function(e){return(e||n.ee).get("history")}(e);return!l.il||O[t.debugId]++||(O[t.debugId]=1,s(t).inPlace(window.history,j,"-")),t}var P=r(3239);const C={},R=["appendChild","insertBefore","replaceChild"];function I(e){const t=function(e){return(e||n.ee).get("jsonp")}(e);if(!l.il||C[t.debugId])return t;C[t.debugId]=!0;var r=s(t),i=/[?&](?:callback|cb)=([^&#]+)/,o=/(.*)\.([^.]+)/,a=/^(\w+)(\.|$)(.*)$/;function c(e,t){var r=e.match(a),n=r[1],i=r[3];return i?c(i,t[n]):t[n]}return r.inPlace(Node.prototype,R,"dom-"),t.on("dom-start",(function(e){!function(e){if(!e||"string"!=typeof e.nodeName||"script"!==e.nodeName.toLowerCase())return;if("function"!=typeof e.addEventListener)return;var n=(a=e.src,s=a.match(i),s?s[1]:null);var a,s;if(!n)return;var u=function(e){var t=e.match(o);if(t&&t.length>=3)return{key:t[2],parent:c(t[1],window)};return{key:e,parent:window}}(n);if("function"!=typeof u.parent[u.key])return;var d={};function f(){t.emit("jsonp-end",[],d),e.removeEventListener("load",f,(0,P.m$)(!1)),e.removeEventListener("error",l,(0,P.m$)(!1))}function l(){t.emit("jsonp-error",[],d),t.emit("jsonp-end",[],d),e.removeEventListener("load",f,(0,P.m$)(!1)),e.removeEventListener("error",l,(0,P.m$)(!1))}r.inPlace(u.parent,[u.key],"cb-",d),e.addEventListener("load",f,(0,P.m$)(!1)),e.addEventListener("error",l,(0,P.m$)(!1)),t.emit("new-jsonp",[e.src],d)}(e[0])})),t}var k=r(5763);const H={};function L(e){const t=function(e){return(e||n.ee).get("mutation")}(e);if(!l.il||H[t.debugId])return t;H[t.debugId]=!0;var r=s(t),i=k.Yu.MO;return i&&(window.MutationObserver=function(e){return this instanceof i?new i(r(e,"fn-")):i.apply(this,arguments)},MutationObserver.prototype=i.prototype),t}const z={};function M(e){const t=function(e){return(e||n.ee).get("promise")}(e);if(z[t.debugId])return t;z[t.debugId]=!0;var r=n.c,o=s(t),a=k.Yu.PR;return a&&function(){function e(r){var n=t.context(),i=o(r,"executor-",n,null,!1);const s=Reflect.construct(a,[i],e);return t.context(s).getCtx=function(){return n},s}l._A.Promise=e,Object.defineProperty(e,"name",{value:"Promise"}),e.toString=function(){return a.toString()},Object.setPrototypeOf(e,a),["all","race"].forEach((function(r){const n=a[r];e[r]=function(e){let i=!1;[...e||[]].forEach((e=>{this.resolve(e).then(a("all"===r),a(!1))}));const o=n.apply(this,arguments);return o;function a(e){return function(){t.emit("propagate",[null,!i],o,!1,!1),i=i||!e}}}})),["resolve","reject"].forEach((function(r){const n=a[r];e[r]=function(e){const r=n.apply(this,arguments);return e!==r&&t.emit("propagate",[e,!0],r,!1,!1),r}})),e.prototype=a.prototype;const n=a.prototype.then;a.prototype.then=function(){var e=this,i=r(e);i.promise=e;for(var a=arguments.length,s=new Array(a),c=0;c e())),t};function m(e,t){i.inPlace(t,["onreadystatechange"],"fn-",E)}function b(){var e=this,t=r.context(e);e.readyState>3&&!t.resolved&&(t.resolved=!0,r.emit("xhr-resolved",[],e)),i.inPlace(e,f,"fn-",E)}if(function(e,t){for(var r in e)t[r]=e[r]}(o,p),p.prototype=o.prototype,i.inPlace(p.prototype,J,"-xhr-",E),r.on("send-xhr-start",(function(e,t){m(e,t),function(e){h.push(e),a&&(y?y.then(A):u?u(A):(w=-w,x.data=w))}(t)})),r.on("open-xhr-start",m),a){var y=c&&c.resolve();if(!u&&!c){var w=1,x=document.createTextNode(w);new a(A).observe(x,{characterData:!0})}}else t.on("fn-end",(function(e){e[0]&&e[0].type===d||A()}));function A(){for(var e=0;e {r.d(t,{t:()=>n});const n=r(3325).D.ajax},6660:(e,t,r)=>{r.d(t,{A:()=>i,t:()=>n});const n=r(3325).D.jserrors,i="nr@seenError"},3081:(e,t,r)=>{r.d(t,{gF:()=>o,mY:()=>i,t9:()=>n,vz:()=>s,xS:()=>a});const n=r(3325).D.metrics,i="sm",o="cm",a="storeSupportabilityMetrics",s="storeEventMetrics"},4649:(e,t,r)=>{r.d(t,{t:()=>n});const n=r(3325).D.pageAction},7633:(e,t,r)=>{r.d(t,{Dz:()=>i,OJ:()=>a,qw:()=>o,t9:()=>n});const n=r(3325).D.pageViewEvent,i="firstbyte",o="domcontent",a="windowload"},9251:(e,t,r)=>{r.d(t,{t:()=>n});const n=r(3325).D.pageViewTiming},3614:(e,t,r)=>{r.d(t,{BST_RESOURCE:()=>i,END:()=>s,FEATURE_NAME:()=>n,FN_END:()=>u,FN_START:()=>c,PUSH_STATE:()=>d,RESOURCE:()=>o,START:()=>a});const n=r(3325).D.sessionTrace,i="bstResource",o="resource",a="-start",s="-end",c="fn"+a,u="fn"+s,d="pushState"},7836:(e,t,r)=>{r.d(t,{BODY:()=>A,CB_END:()=>E,CB_START:()=>u,END:()=>x,FEATURE_NAME:()=>i,FETCH:()=>_,FETCH_BODY:()=>v,FETCH_DONE:()=>m,FETCH_START:()=>p,FN_END:()=>c,FN_START:()=>s,INTERACTION:()=>l,INTERACTION_API:()=>d,INTERACTION_EVENTS:()=>o,JSONP_END:()=>b,JSONP_NODE:()=>g,JS_TIME:()=>T,MAX_TIMER_BUDGET:()=>a,REMAINING:()=>f,SPA_NODE:()=>h,START:()=>w,originalSetTimeout:()=>y});var n=r(5763);const i=r(3325).D.spa,o=["click","submit","keypress","keydown","keyup","change"],a=999,s="fn-start",c="fn-end",u="cb-start",d="api-ixn-",f="remaining",l="interaction",h="spaNode",g="jsonpNode",p="fetch-start",m="fetch-done",v="fetch-body-",b="jsonp-end",y=n.Yu.ST,w="-start",x="-end",A="-body",E="cb"+x,T="jsTime",_="fetch"},5938:(e,t,r)=>{r.d(t,{W:()=>o});var n=r(5763),i=r(2177);class o{constructor(e,t,r){this.agentIdentifier=e,this.aggregator=t,this.ee=i.ee.get(e,(0,n.OP)(this.agentIdentifier).isolatedBacklog),this.featureName=r,this.blocked=!1}}},9144:(e,t,r)=>{r.d(t,{j:()=>m});var n=r(3325),i=r(5763),o=r(5546),a=r(2177),s=r(7894),c=r(8e3),u=r(3960),d=r(385),f=r(50),l=r(3081),h=r(8632);function g(){const e=(0,h.gG)();["setErrorHandler","finished","addToTrace","inlineHit","addRelease","addPageAction","setCurrentRouteName","setPageViewName","setCustomAttribute","interaction","noticeError","setUserId"].forEach((t=>{e[t]=function(){for(var r=arguments.length,n=new Array(r),i=0;i 1?r-1:0),i=1;i {e.exposed&&e.api[t]&&o.push(e.api[t](...n))})),o.length>1?o:o[0]}(t,...n)}}))}var p=r(2587);function m(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},m=arguments.length>2?arguments[2]:void 0,v=arguments.length>3?arguments[3]:void 0,{init:b,info:y,loader_config:w,runtime:x={loaderType:m},exposed:A=!0}=t;const E=(0,h.gG)();y||(b=E.init,y=E.info,w=E.loader_config),(0,i.Dg)(e,b||{}),(0,i.GE)(e,w||{}),(0,i.sU)(e,x),y.jsAttributes??={},d.v6&&(y.jsAttributes.isWorker=!0),(0,i.CX)(e,y),g();const T=function(e,t){t||(0,c.R)(e,"api");const h={};var g=a.ee.get(e),p=g.get("tracer"),m="api-",v=m+"ixn-";function b(t,r,n,o){const a=(0,i.C5)(e);return null===r?delete a.jsAttributes[t]:(0,i.CX)(e,{...a,jsAttributes:{...a.jsAttributes,[t]:r}}),x(m,n,!0,o||null===r?"session":void 0)(t,r)}function y(){}["setErrorHandler","finished","addToTrace","inlineHit","addRelease"].forEach((e=>h[e]=x(m,e,!0,"api"))),h.addPageAction=x(m,"addPageAction",!0,n.D.pageAction),h.setCurrentRouteName=x(m,"routeName",!0,n.D.spa),h.setPageViewName=function(t,r){if("string"==typeof t)return"/"!==t.charAt(0)&&(t="/"+t),(0,i.OP)(e).customTransaction=(r||"http://custom.transaction")+t,x(m,"setPageViewName",!0)()},h.setCustomAttribute=function(e,t){let r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if("string"==typeof e){if(["string","number"].includes(typeof t)||null===t)return b(e,t,"setCustomAttribute",r);(0,f.Z)("Failed to execute setCustomAttribute.\nNon-null value must be a string or number type, but a type of was provided."))}else(0,f.Z)("Failed to execute setCustomAttribute.\nName must be a string type, but a type of was provided."))},h.setUserId=function(e){if("string"==typeof e||null===e)return b("enduser.id",e,"setUserId",!0);(0,f.Z)("Failed to execute setUserId.\nNon-null value must be a string type, but a type of was provided."))},h.interaction=function(){return(new y).get()};var w=y.prototype={createTracer:function(e,t){var r={},i=this,a="function"==typeof t;return(0,o.p)(v+"tracer",[(0,s.z)(),e,r],i,n.D.spa,g),function(){if(p.emit((a?"":"no-")+"fn-start",[(0,s.z)(),i,a],r),a)try{return t.apply(this,arguments)}catch(e){throw p.emit("fn-err",[arguments,this,"string"==typeof e?new Error(e):e],r),e}finally{p.emit("fn-end",[(0,s.z)()],r)}}}};function x(e,t,r,i){return function(){return(0,o.p)(l.xS,["API/"+t+"/called"],void 0,n.D.metrics,g),i&&(0,o.p)(e+t,[(0,s.z)(),...arguments],r?null:this,i,g),r?void 0:this}}function A(){r.e(439).then(r.bind(r,7438)).then((t=>{let{setAPI:r}=t;r(e),(0,c.L)(e,"api")})).catch((()=>(0,f.Z)("Downloading runtime APIs failed...")))}return["actionText","setName","setAttribute","save","ignore","onEnd","getContext","end","get"].forEach((e=>{w[e]=x(v,e,void 0,n.D.spa)})),h.noticeError=function(e,t){"string"==typeof e&&(e=new Error(e)),(0,o.p)(l.xS,["API/noticeError/called"],void 0,n.D.metrics,g),(0,o.p)("err",[e,(0,s.z)(),!1,t],void 0,n.D.jserrors,g)},d.il?(0,u.b)((()=>A()),!0):A(),h}(e,v);return(0,h.Qy)(e,T,"api"),(0,h.Qy)(e,A,"exposed"),(0,h.EZ)("activatedFeatures",p.T),T}},3325:(e,t,r)=>{r.d(t,{D:()=>n,p:()=>i});const n={ajax:"ajax",jserrors:"jserrors",metrics:"metrics",pageAction:"page_action",pageViewEvent:"page_view_event",pageViewTiming:"page_view_timing",sessionReplay:"session_replay",sessionTrace:"session_trace",spa:"spa"},i={[n.pageViewEvent]:1,[n.pageViewTiming]:2,[n.metrics]:3,[n.jserrors]:4,[n.ajax]:5,[n.sessionTrace]:6,[n.pageAction]:7,[n.spa]:8,[n.sessionReplay]:9}}},n={};function i(e){var t=n[e];if(void 0!==t)return t.exports;var o=n[e]={exports:{}};return r[e](o,o.exports,i),o.exports}i.m=r,i.d=(e,t)=>{for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.f={},i.e=e=>Promise.all(Object.keys(i.f).reduce(((t,r)=>(i.f[r](e,t),t)),[])),i.u=e=>(({78:"page_action-aggregate",147:"metrics-aggregate",242:"session-manager",317:"jserrors-aggregate",348:"page_view_timing-aggregate",412:"lazy-feature-loader",439:"async-api",538:"recorder",590:"session_replay-aggregate",675:"compressor",733:"session_trace-aggregate",786:"page_view_event-aggregate",873:"spa-aggregate",898:"ajax-aggregate"}[e]||e)+"."+{78:"ac76d497",147:"3dc53903",148:"1a20d5fe",242:"2a64278a",317:"49e41428",348:"bd6de33a",412:"2f55ce66",439:"30bd804e",538:"1b18459f",590:"cf0efb30",675:"ae9f91a8",733:"83105561",786:"06482edd",860:"03a8b7a5",873:"e6b09d52",898:"998ef92b"}[e]+"-1.236.0.min.js"),i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),e={},t="NRBA:",i.l=(r,n,o,a)=>{if(e[r])e[r].push(n);else{var s,c;if(void 0!==o)for(var u=document.getElementsByTagName("script"),d=0;d {s.onerror=s.onload=null,clearTimeout(h);var i=e[r];if(delete e[r],s.parentNode&&s.parentNode.removeChild(s),i&&i.forEach((e=>e(n))),t)return t(n)},h=setTimeout(l.bind(null,void 0,{type:"timeout",target:s}),12e4);s.onerror=l.bind(null,s.onerror),s.onload=l.bind(null,s.onload),c&&document.head.appendChild(s)}},i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.j=364,i.p="https://js-agent.newrelic.com/",(()=>{var e={364:0,953:0};i.f.j=(t,r)=>{var n=i.o(e,t)?e[t]:void 0;if(0!==n)if(n)r.push(n[2]);else{var o=new Promise(((r,i)=>n=e[t]=[r,i]));r.push(n[2]=o);var a=i.p+i.u(t),s=new Error;i.l(a,(r=>{if(i.o(e,t)&&(0!==(n=e[t])&&(e[t]=void 0),n)){var o=r&&("load"===r.type?"missing":r.type),a=r&&r.target&&r.target.src;s.message="Loading chunk "+t+" failed.\n("+o+": "+a+")",s.name="ChunkLoadError",s.type=o,s.request=a,n[1](s)}}),"chunk-"+t,t)}};var t=(t,r)=>{var n,o,[a,s,c]=r,u=0;if(a.some((t=>0!==e[t]))){for(n in s)i.o(s,n)&&(i.m[n]=s[n]);if(c)c(i)}for(t&&t(r);u {i.r(o);var e=i(3325),t=i(5763);const r=Object.values(e.D);function n(e){const n={};return r.forEach((r=>{n[r]=function(e,r){return!1!==(0,t.Mt)(r,"".concat(e,".enabled"))}(r,e)})),n}var a=i(9144);var s=i(5546),c=i(385),u=i(8e3),d=i(5938),f=i(3960),l=i(50);class h extends d.W{constructor(e,t,r){let n=!(arguments.length>3&&void 0!==arguments[3])||arguments[3];super(e,t,r),this.auto=n,this.abortHandler,this.featAggregate,this.onAggregateImported,n&&(0,u.R)(e,r)}importAggregator(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(this.featAggregate||!this.auto)return;const r=c.il&&!0===(0,t.Mt)(this.agentIdentifier,"privacy.cookies_enabled");let n;this.onAggregateImported=new Promise((e=>{n=e}));const o=async()=>{let t;try{if(r){const{setupAgentSession:e}=await Promise.all([i.e(860),i.e(242)]).then(i.bind(i,3228));t=e(this.agentIdentifier)}}catch(e){(0,l.Z)("A problem occurred when starting up session manager. This page will not start or extend any session.",e)}try{if(!this.shouldImportAgg(this.featureName,t))return void(0,u.L)(this.agentIdentifier,this.featureName);const{lazyFeatureLoader:r}=await i.e(412).then(i.bind(i,8582)),{Aggregate:o}=await r(this.featureName,"aggregate");this.featAggregate=new o(this.agentIdentifier,this.aggregator,e),n(!0)}catch(e){(0,l.Z)("Downloading and initializing ".concat(this.featureName," failed..."),e),this.abortHandler?.(),n(!1)}};c.il?(0,f.b)((()=>o()),!0):o()}shouldImportAgg(r,n){return r!==e.D.sessionReplay||!1!==(0,t.Mt)(this.agentIdentifier,"session_trace.enabled")&&(!!n?.isNew||!!n?.state.sessionReplay)}}var g=i(7633),p=i(7894);class m extends h{static featureName=g.t9;constructor(r,n){let i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(super(r,n,g.t9,i),("undefined"==typeof PerformanceNavigationTiming||c.Tt)&&"undefined"!=typeof PerformanceTiming){const n=(0,t.OP)(r);n[g.Dz]=Math.max(Date.now()-n.offset,0),(0,f.K)((()=>n[g.qw]=Math.max((0,p.z)()-n[g.Dz],0))),(0,f.b)((()=>{const t=(0,p.z)();n[g.OJ]=Math.max(t-n[g.Dz],0),(0,s.p)("timing",["load",t],void 0,e.D.pageViewTiming,this.ee)}))}this.importAggregator()}}var v=i(1117),b=i(1284);class y extends v.w{constructor(e){super(e),this.aggregatedData={}}store(e,t,r,n,i){var o=this.getBucket(e,t,r,i);return o.metrics=function(e,t){t||(t={count:0});return t.count+=1,(0,b.D)(e,(function(e,r){t[e]=w(r,t[e])})),t}(n,o.metrics),o}merge(e,t,r,n,i){var o=this.getBucket(e,t,n,i);if(o.metrics){var a=o.metrics;a.count+=r.count,(0,b.D)(r,(function(e,t){if("count"!==e){var n=a[e],i=r[e];i&&!i.c?a[e]=w(i.t,n):a[e]=function(e,t){if(!t)return e;t.c||(t=x(t.t));return t.min=Math.min(e.min,t.min),t.max=Math.max(e.max,t.max),t.t+=e.t,t.sos+=e.sos,t.c+=e.c,t}(i,a[e])}}))}else o.metrics=r}storeMetric(e,t,r,n){var i=this.getBucket(e,t,r);return i.stats=w(n,i.stats),i}getBucket(e,t,r,n){this.aggregatedData[e]||(this.aggregatedData[e]={});var i=this.aggregatedData[e][t];return i||(i=this.aggregatedData[e][t]={params:r||{}},n&&(i.custom=n)),i}get(e,t){return t?this.aggregatedData[e]&&this.aggregatedData[e][t]:this.aggregatedData[e]}take(e){for(var t={},r="",n=!1,i=0;i t.max&&(t.max=e),e 2&&void 0!==arguments[2])||arguments[2];super(e,r,j.t,n),c.il&&((0,t.OP)(e).initHidden=Boolean("hidden"===document.visibilityState),(0,N.N)((()=>(0,s.p)("docHidden",[(0,p.z)()],void 0,j.t,this.ee)),!0),(0,O.bP)("pagehide",(()=>(0,s.p)("winPagehide",[(0,p.z)()],void 0,j.t,this.ee))),this.importAggregator())}}var P=i(3081);class C extends h{static featureName=P.t9;constructor(e,t){let r=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];super(e,t,P.t9,r),this.importAggregator()}}var R,I=i(2210),k=i(1214),H=i(2177),L={};try{R=localStorage.getItem("__nr_flags").split(","),console&&"function"==typeof console.log&&(L.console=!0,-1!==R.indexOf("dev")&&(L.dev=!0),-1!==R.indexOf("nr_dev")&&(L.nrDev=!0))}catch(e){}function z(e){try{L.console&&z(e)}catch(e){}}L.nrDev&&H.ee.on("internal-error",(function(e){z(e.stack)})),L.dev&&H.ee.on("fn-err",(function(e,t,r){z(r.stack)})),L.dev&&(z("NR AGENT IN DEVELOPMENT MODE"),z("flags: "+(0,b.D)(L,(function(e,t){return e})).join(", ")));var M=i(6660);class B extends h{static featureName=M.t;constructor(r,n){let i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];super(r,n,M.t,i),this.skipNext=0;try{this.removeOnAbort=new AbortController}catch(e){}const o=this;o.ee.on("fn-start",(function(e,t,r){o.abortHandler&&(o.skipNext+=1)})),o.ee.on("fn-err",(function(t,r,n){o.abortHandler&&!n[M.A]&&((0,I.X)(n,M.A,(function(){return!0})),this.thrown=!0,(0,s.p)("err",[n,(0,p.z)()],void 0,e.D.jserrors,o.ee))})),o.ee.on("fn-end",(function(){o.abortHandler&&!this.thrown&&o.skipNext>0&&(o.skipNext-=1)})),o.ee.on("internal-error",(function(t){(0,s.p)("ierr",[t,(0,p.z)(),!0],void 0,e.D.jserrors,o.ee)})),this.origOnerror=c._A.onerror,c._A.onerror=this.onerrorHandler.bind(this),c._A.addEventListener("unhandledrejection",(t=>{const r=function(e){let t="Unhandled Promise Rejection: ";if(e instanceof Error)try{return e.message=t+e.message,e}catch(t){return e}if(void 0===e)return new Error(t);try{return new Error(t+(0,D.P)(e))}catch(e){return new Error(t)}}(t.reason);(0,s.p)("err",[r,(0,p.z)(),!1,{unhandledPromiseRejection:1}],void 0,e.D.jserrors,this.ee)}),(0,O.m$)(!1,this.removeOnAbort?.signal)),(0,k.gy)(this.ee),(0,k.BV)(this.ee),(0,k.em)(this.ee),(0,t.OP)(r).xhrWrappable&&(0,k.Kf)(this.ee),this.abortHandler=this.#e,this.importAggregator()}#e(){this.removeOnAbort?.abort(),this.abortHandler=void 0}onerrorHandler(t,r,n,i,o){"function"==typeof this.origOnerror&&this.origOnerror(...arguments);try{this.skipNext?this.skipNext-=1:(0,s.p)("err",[o||new F(t,r,n),(0,p.z)()],void 0,e.D.jserrors,this.ee)}catch(t){try{(0,s.p)("ierr",[t,(0,p.z)(),!0],void 0,e.D.jserrors,this.ee)}catch(e){}}return!1}}function F(e,t,r){this.message=e||"Uncaught error with no additional information",this.sourceURL=t,this.line=r}let U=1;const q="nr@id";function G(e){const t=typeof e;return!e||"object"!==t&&"function"!==t?-1:e===c._A?0:(0,I.X)(e,q,(function(){return U++}))}function V(e){if("string"==typeof e&&e.length)return e.length;if("object"==typeof e){if("undefined"!=typeof ArrayBuffer&&e instanceof ArrayBuffer&&e.byteLength)return e.byteLength;if("undefined"!=typeof Blob&&e instanceof Blob&&e.size)return e.size;if(!("undefined"!=typeof FormData&&e instanceof FormData))try{return(0,D.P)(e).length}catch(e){return}}}var X=i(7243);class W{constructor(e){this.agentIdentifier=e,this.generateTracePayload=this.generateTracePayload.bind(this),this.shouldGenerateTrace=this.shouldGenerateTrace.bind(this)}generateTracePayload(e){if(!this.shouldGenerateTrace(e))return null;var r=(0,t.DL)(this.agentIdentifier);if(!r)return null;var n=(r.accountID||"").toString()||null,i=(r.agentID||"").toString()||null,o=(r.trustKey||"").toString()||null;if(!n||!i)return null;var a=(0,_.M)(),s=(0,_.Ht)(),c=Date.now(),u={spanId:a,traceId:s,timestamp:c};return(e.sameOrigin||this.isAllowedOrigin(e)&&this.useTraceContextHeadersForCors())&&(u.traceContextParentHeader=this.generateTraceContextParentHeader(a,s),u.traceContextStateHeader=this.generateTraceContextStateHeader(a,c,n,i,o)),(e.sameOrigin&&!this.excludeNewrelicHeader()||!e.sameOrigin&&this.isAllowedOrigin(e)&&this.useNewrelicHeaderForCors())&&(u.newrelicHeader=this.generateTraceHeader(a,s,c,n,i,o)),u}generateTraceContextParentHeader(e,t){return"00-"+t+"-"+e+"-01"}generateTraceContextStateHeader(e,t,r,n,i){return i+"@nr=0-1-"+r+"-"+n+"-"+e+"----"+t}generateTraceHeader(e,t,r,n,i,o){if(!("function"==typeof c._A?.btoa))return null;var a={v:[0,1],d:{ty:"Browser",ac:n,ap:i,id:e,tr:t,ti:r}};return o&&n!==o&&(a.d.tk=o),btoa((0,D.P)(a))}shouldGenerateTrace(e){return this.isDtEnabled()&&this.isAllowedOrigin(e)}isAllowedOrigin(e){var r=!1,n={};if((0,t.Mt)(this.agentIdentifier,"distributed_tracing")&&(n=(0,t.P_)(this.agentIdentifier).distributed_tracing),e.sameOrigin)r=!0;else if(n.allowed_origins instanceof Array)for(var i=0;i 2&&void 0!==arguments[2])||arguments[2];super(r,n,Z.t,i),(0,t.OP)(r).xhrWrappable&&(this.dt=new W(r),this.handler=(e,t,r,n)=>(0,s.p)(e,t,r,n,this.ee),(0,k.u5)(this.ee),(0,k.Kf)(this.ee),function(r,n,i,o){function a(e){var t=this;t.totalCbs=0,t.called=0,t.cbTime=0,t.end=E,t.ended=!1,t.xhrGuids={},t.lastSize=null,t.loadCaptureCalled=!1,t.params=this.params||{},t.metrics=this.metrics||{},e.addEventListener("load",(function(r){_(t,e)}),(0,O.m$)(!1)),c.IF||e.addEventListener("progress",(function(e){t.lastSize=e.loaded}),(0,O.m$)(!1))}function s(e){this.params={method:e[0]},T(this,e[1]),this.metrics={}}function u(e,n){var i=(0,t.DL)(r);i.xpid&&this.sameOrigin&&n.setRequestHeader("X-NewRelic-ID",i.xpid);var a=o.generateTracePayload(this.parsedOrigin);if(a){var s=!1;a.newrelicHeader&&(n.setRequestHeader("newrelic",a.newrelicHeader),s=!0),a.traceContextParentHeader&&(n.setRequestHeader("traceparent",a.traceContextParentHeader),a.traceContextStateHeader&&n.setRequestHeader("tracestate",a.traceContextStateHeader),s=!0),s&&(this.dt=a)}}function d(e,t){var r=this.metrics,i=e[0],o=this;if(r&&i){var a=V(i);a&&(r.txSize=a)}this.startTime=(0,p.z)(),this.listener=function(e){try{"abort"!==e.type||o.loadCaptureCalled||(o.params.aborted=!0),("load"!==e.type||o.called===o.totalCbs&&(o.onloadCalled||"function"!=typeof t.onload)&&"function"==typeof o.end)&&o.end(t)}catch(e){try{n.emit("internal-error",[e])}catch(e){}}};for(var s=0;s 1?e[1]=i:e.push(i)}else e[0]&&e[0].headers&&s(e[0].headers,n)&&(this.dt=n);function s(e,t){var r=!1;return t.newrelicHeader&&(e.set("newrelic",t.newrelicHeader),r=!0),t.traceContextParentHeader&&(e.set("traceparent",t.traceContextParentHeader),t.traceContextStateHeader&&e.set("tracestate",t.traceContextStateHeader),r=!0),r}}function x(e,t){this.params={},this.metrics={},this.startTime=(0,p.z)(),this.dt=t,e.length>=1&&(this.target=e[0]),e.length>=2&&(this.opts=e[1]);var r,n=this.opts||{},i=this.target;"string"==typeof i?r=i:"object"==typeof i&&i instanceof Y?r=i.url:c._A?.URL&&"object"==typeof i&&i instanceof URL&&(r=i.href),T(this,r);var o=(""+(i&&i instanceof Y&&i.method||n.method||"GET")).toUpperCase();this.params.method=o,this.txSize=V(n.body)||0}function A(t,r){var n;this.endTime=(0,p.z)(),this.params||(this.params={}),this.params.status=r?r.status:0,"string"==typeof this.rxSize&&this.rxSize.length>0&&(n=+this.rxSize);var o={txSize:this.txSize,rxSize:n,duration:(0,p.z)()-this.startTime};i("xhr",[this.params,o,this.startTime,this.endTime,"fetch"],this,e.D.ajax)}function E(t){var r=this.params,n=this.metrics;if(!this.ended){this.ended=!0;for(var o=0;o 2&&void 0!==arguments[2])||arguments[2];super(e,t,we.t,r),this.importAggregator()}}new class{constructor(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:(0,_.ky)(16);c._A?(this.agentIdentifier=t,this.sharedAggregator=new y({agentIdentifier:this.agentIdentifier}),this.features={},this.desiredFeatures=new Set(e.features||[]),this.desiredFeatures.add(m),Object.assign(this,(0,a.j)(this.agentIdentifier,e,e.loaderType||"agent")),this.start()):(0,l.Z)("Failed to initial the agent. Could not determine the runtime environment.")}get config(){return{info:(0,t.C5)(this.agentIdentifier),init:(0,t.P_)(this.agentIdentifier),loader_config:(0,t.DL)(this.agentIdentifier),runtime:(0,t.OP)(this.agentIdentifier)}}start(){const t="features";try{const r=n(this.agentIdentifier),i=[...this.desiredFeatures];i.sort(((t,r)=>e.p[t.featureName]-e.p[r.featureName])),i.forEach((t=>{if(r[t.featureName]||t.featureName===e.D.pageViewEvent){const n=function(t){switch(t){case e.D.ajax:return[e.D.jserrors];case e.D.sessionTrace:return[e.D.ajax,e.D.pageViewEvent];case e.D.sessionReplay:return[e.D.sessionTrace];case e.D.pageViewTiming:return[e.D.pageViewEvent];default:return[]}}(t.featureName);n.every((e=>r[e]))||(0,l.Z)("".concat(t.featureName," is enabled but one or more dependent features has been disabled (").concat((0,D.P)(n),"). This may cause unintended consequences or missing data...")),this.features[t.featureName]=new t(this.agentIdentifier,this.sharedAggregator)}})),(0,T.Qy)(this.agentIdentifier,this.features,t)}catch(e){(0,l.Z)("Failed to initialize all enabled instrument classes (agent aborted) -",e);for(const e in this.features)this.features[e].abortHandler?.();const r=(0,T.fP)();return delete r.initializedAgents[this.agentIdentifier]?.api,delete r.initializedAgents[this.agentIdentifier]?.[t],delete this.sharedAggregator,r.ee?.abort(),delete r.ee?.get(this.agentIdentifier),!1}}}({features:[J,m,S,class extends h{static featureName=oe;constructor(t,r){if(super(t,r,oe,!(arguments.length>2&&void 0!==arguments[2])||arguments[2]),!c.il)return;const n=this.ee;let i;(0,k.QU)(n),this.eventsEE=(0,k.em)(n),this.eventsEE.on(se,(function(e,t){this.bstStart=(0,p.z)()})),this.eventsEE.on(ae,(function(t,r){(0,s.p)("bst",[t[0],r,this.bstStart,(0,p.z)()],void 0,e.D.sessionTrace,n)})),n.on(ce+ne,(function(e){this.time=(0,p.z)(),this.startPath=location.pathname+location.hash})),n.on(ce+ie,(function(t){(0,s.p)("bstHist",[location.pathname+location.hash,this.startPath,this.time],void 0,e.D.sessionTrace,n)}));try{i=new PerformanceObserver((t=>{const r=t.getEntries();(0,s.p)(te,[r],void 0,e.D.sessionTrace,n)})),i.observe({type:re,buffered:!0})}catch(e){}this.importAggregator({resourceObserver:i})}},C,xe,B,class extends h{static featureName=de;constructor(e,r){if(super(e,r,de,!(arguments.length>2&&void 0!==arguments[2])||arguments[2]),!c.il)return;if(!(0,t.OP)(e).xhrWrappable)return;try{this.removeOnAbort=new AbortController}catch(e){}let n,i=0;const o=this.ee.get("tracer"),a=(0,k._L)(this.ee),s=(0,k.Lg)(this.ee),u=(0,k.BV)(this.ee),d=(0,k.Kf)(this.ee),f=this.ee.get("events"),l=(0,k.u5)(this.ee),h=(0,k.QU)(this.ee),g=(0,k.Gm)(this.ee);function m(e,t){h.emit("newURL",[""+window.location,t])}function v(){i++,n=window.location.hash,this[ve]=(0,p.z)()}function b(){i--,window.location.hash!==n&&m(0,!0);var e=(0,p.z)();this[pe]=~~this[pe]+e-this[ve],this[ye]=e}function y(e,t){e.on(t,(function(){this[t]=(0,p.z)()}))}this.ee.on(ve,v),s.on(be,v),a.on(be,v),this.ee.on(ye,b),s.on(ge,b),a.on(ge,b),this.ee.buffer([ve,ye,"xhr-resolved"],this.featureName),f.buffer([ve],this.featureName),u.buffer(["setTimeout"+le,"clearTimeout"+fe,ve],this.featureName),d.buffer([ve,"new-xhr","send-xhr"+fe],this.featureName),l.buffer([me+fe,me+"-done",me+he+fe,me+he+le],this.featureName),h.buffer(["newURL"],this.featureName),g.buffer([ve],this.featureName),s.buffer(["propagate",be,ge,"executor-err","resolve"+fe],this.featureName),o.buffer([ve,"no-"+ve],this.featureName),a.buffer(["new-jsonp","cb-start","jsonp-error","jsonp-end"],this.featureName),y(l,me+fe),y(l,me+"-done"),y(a,"new-jsonp"),y(a,"jsonp-end"),y(a,"cb-start"),h.on("pushState-end",m),h.on("replaceState-end",m),window.addEventListener("hashchange",m,(0,O.m$)(!0,this.removeOnAbort?.signal)),window.addEventListener("load",m,(0,O.m$)(!0,this.removeOnAbort?.signal)),window.addEventListener("popstate",(function(){m(0,i>1)}),(0,O.m$)(!0,this.removeOnAbort?.signal)),this.abortHandler=this.#e,this.importAggregator()}#e(){this.removeOnAbort?.abort(),this.abortHandler=void 0}}],loaderType:"spa"})})(),window.NRBA=o})(); window.jQuery || document.write(' ') CKEDITOR_BASEPATH='https://f1000research.com/js/vendor/ckeditor/' window.reactTheme = 'research'; window.MathJax = { CommonHTML: { linebreaks: { automatic: true } }, 'HTML-CSS': { linebreaks: { automatic: true } }, SVG: { linebreaks: { automatic: true } }, AuthorInit: function() { MathJax.Hub.Register.MessageHook('End Process', function () { let timeout = false; // holder for timeout id const delay = 250; // delay after event is "complete" to run callback const reflowMath = function() { const dispFormulas = document.querySelectorAll('.disp-formula.panel'); if (!dispFormulas) { return; } for (const dispFormula of dispFormulas) { const child = dispFormula.querySelector('.MathJax_Preview').nextSibling.firstChild; const isMultiline = MathJax.Hub.getAllJax(dispFormula)[0].root.isMultiline; if (dispFormula.offsetWidth < child.offsetWidth || isMultiline) { MathJax.Hub.Queue(['Rerender', MathJax.Hub, dispFormula]); } } }; window.addEventListener('resize', function() { clearTimeout(timeout); // clear the timeout timeout = setTimeout(reflowMath, delay); // start timing for event "completion" }); }); }, }; if (window.location.hash == '#_=_'){ window.location = window.location.href.split('#')[0] } !function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function() {n.callMethod? n.callMethod.apply(n,arguments):n.queue.push(arguments)} ;if(!f._fbq)f._fbq=n; n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0; t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window, document,'script','https://connect.facebook.net/en_US/fbevents.js'); fbq('init', '1641728616063202'); fbq('track', "PixelInitialized", {}); (function(h,o,t,j,a,r){ h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)}; h._hjSettings={hjid:2318163,hjsv:6}; a=o.getElementsByTagName('head')[0]; r=o.createElement('script');r.async=1; r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv; a.appendChild(r); })(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv='); search file_upload Submit your research search menu close search Browse Gateways & Collections How to Publish Submit your Research My Submissions Article Guidelines Article Guidelines (New Versions) Open Data, Software and Code Guidelines Open Data and Accessible Source Materials Guidelines (HSS) Open Data, Software and Code Guidelines (PSE) Prepublication Checks Production Process Posters and Slides Guidelines Document Guidelines Article Processing Charges Peer Review Finding Article Reviewers About How it Works For Reviewers Our Advisors Policies Glossary FAQs For Developers Newsroom Contact My Research Submissions Content and Tracking Alerts My Details Sign In file_upload Submit your research { "@context": "https://schema.org", "@type": "ScholarlyArticle", "mainEntityOfPage": { "@type": "WebPage", "@id": "https://f1000research.com/articles/11-1230" }, "headline": "LiftoffTools: a toolkit for comparing gene annotations mapped between genome assemblies", "datePublished": "2022-10-28T15:52:52", "dateModified": "2024-04-29T17:20:36", "author": [ { "@type": "Person", "name": "Alaina Shumate" }, { "@type": "Person", "name": "Steven Salzberg" } ], "publisher": { "@type": "Organization", "name": "F1000Research", "logo": { "@type": "ImageObject", "url": "https://f1000research.com/img/AMP/F1000Research_image.png", "height": 480, "width": 60 } }, "image": { "@type": "ImageObject", "url": "https://f1000research.com/img/AMP/F1000Research_image.png", "height": 1200, "width": 150 }, "description": "In 2020 we published Liftoff, which was the first standalone tool specifically designed for transferring gene annotations between genome assemblies of the same or closely related species. While the gene content is expected to be very similar in closely related genomes, the differences may be biologically consequential, and a computational method to extract all gene-related differences should prove useful in the analysis of such genomes. Here we present LiftoffTools, a toolkit to automate the detection and analysis of gene sequence variants, synteny, and gene copy number changes. We provide a description of the toolkit and an example of its use comparing genes mapped between two human genome assemblies." } { "@context": "http://schema.org", "@type": "BreadcrumbList", "itemListElement": [ { "@type": "ListItem", "position": "1", "item": { "@id": "https://f1000research.com/", "name": "Home" } }, { "@type": "ListItem", "position": "2", "item": { "@id": "https://f1000research.com/browse/articles", "name": "Browse" } }, { "@type": "ListItem", "position": "3", "item": { "@id": "https://f1000research.com/articles/11-1230", "name": "LiftoffTools: a toolkit for comparing gene annotations mapped between..." } } ] } Home Browse LiftoffTools: a toolkit for comparing gene annotations mapped between... ALL Metrics - Views Downloads Get PDF Get XML Cite How to cite this article Shumate A and Salzberg S. LiftoffTools: a toolkit for comparing gene annotations mapped between genome assemblies [version 2; peer review: 2 approved] . F1000Research 2024, 11 :1230 ( https://doi.org/10.12688/f1000research.124059.2 ) NOTE: If applicable, it is important to ensure the information in square brackets after the title is included in all citations of this article. Close Copy Citation Details Export Export Citation Sciwheel EndNote Ref. Manager Bibtex ProCite Sente EXPORT Select a format first Track Share ▬ ✚ Software Tool Article Revised LiftoffTools: a toolkit for comparing gene annotations mapped between genome assemblies [version 2; peer review: 2 approved] Alaina Shumate https://orcid.org/0000-0002-4450-1857 1,2 , Steven Salzberg 1-4 Alaina Shumate https://orcid.org/0000-0002-4450-1857 1,2 , Steven Salzberg 1-4 PUBLISHED 29 Apr 2024 Author details Author details 1 Center for Computational Biology, Whiting School of Engineering, Johns Hopkins University, Baltimore, MD, 21211, USA 2 Biomedical Engineering, Johns Hopkins University, Baltimore, MD, 21218, USA 3 Biostatistics, Bloomberg School of Public Health, Johns Hopkins University, Baltimore, MD, 21205, USA 4 Computer Science, Johns Hopkins University, Baltimore, MD, 21218, USA Alaina Shumate Roles: Conceptualization, Methodology, Software, Writing – Original Draft Preparation Steven Salzberg Roles: Funding Acquisition, Supervision, Writing – Review & Editing OPEN PEER REVIEW DETAILS REVIEWER STATUS This article is included in the Genomics and Genetics gateway. This article is included in the Bioinformatics gateway. Abstract In 2020 we published Liftoff, which was the first standalone tool specifically designed for transferring gene annotations between genome assemblies of the same or closely related species. While the gene content is expected to be very similar in closely related genomes, the differences may be biologically consequential, and a computational method to extract all gene-related differences should prove useful in the analysis of such genomes. Here we present LiftoffTools, a toolkit to automate the detection and analysis of gene sequence variants, synteny, and gene copy number changes. We provide a description of the toolkit and an example of its use comparing genes mapped between two human genome assemblies. READ ALL READ LESS Keywords Bioinformatics, Genome annotation, Genomics Corresponding Author(s) Alaina Shumate ( [email protected] ) Close Corresponding author: Alaina Shumate Competing interests: No competing interests were disclosed. Grant information: This work was supported by NIH grant: HG006677 The funders had no role in study design, data collection and analysis, decision to publish, or preparation of the manuscript. Copyright: © 2024 Shumate A and Salzberg S. This is an open access article distributed under the terms of the Creative Commons Attribution License , which permits unrestricted use, distribution, and reproduction in any medium, provided the original work is properly cited. How to cite: Shumate A and Salzberg S. LiftoffTools: a toolkit for comparing gene annotations mapped between genome assemblies [version 2; peer review: 2 approved] . F1000Research 2024, 11 :1230 ( https://doi.org/10.12688/f1000research.124059.2 ) First published: 28 Oct 2022, 11 :1230 ( https://doi.org/10.12688/f1000research.124059.1 ) Latest published: 29 Apr 2024, 11 :1230 ( https://doi.org/10.12688/f1000research.124059.2 ) Revised Amendments from Version 1 The differences in this version are just minor updates to the text to further elaborate on points that were unclear to the reviewers. No data, methods, or conclusions have changed. The differences in this version are just minor updates to the text to further elaborate on points that were unclear to the reviewers. No data, methods, or conclusions have changed. See the authors' detailed response to the review by Mark Borodovsky See the authors' detailed response to the review by Adam Frankish READ REVIEWER RESPONSES Introduction Liftoff ( Shumate and Salzberg, 2021 ) is a computational tool specifically designed for mapping gene annotations from a reference assembly to a target assembly of the same or closely related species. Liftoff uses sequence alignment software to align the complete exon-intron structure of each annotated transcript from a source to a target, and it can also map virtually any other feature specified as an interval along the genome. It also includes a method to find additional copies of genes that might be present in higher copy numbers in the target genome. After lifting genes over, one of the first questions that many researchers have is how the sets of genes compare between the reference assembly and the target, and in particular whether any of the differences are biologically consequential. Here we introduce LiftoffTools, a toolkit to compare genes mapped from one assembly to another. LiftoffTools includes three different modules. The first identifies changes in protein-coding genes and their effects on the corresponding genes, including simple amino acid changes as well as more-serious alterations. The second compares the gene synteny ( e.g. , the preservation of gene order along the chromosomes), and the third clusters genes into groups of paralogs to evaluate gene copy number gain and loss. While LiftoffTools is designed to analyze the output of Liftoff, it is also compatible with the output of other annotation transfer tools such as UCSC liftOver ( Kuhn et al., 2013 ) that preserve the feature IDs between annotations. Here we provide a description of each module as well as results comparing genes in the GRCh38 human reference genome mapped onto CHM13, the first truly complete human genome ( Nurk et al., 2022 ). Methods The inputs required for all three modules of LiftoffTools are the sequences of the reference and target assemblies (in FASTA format), and the annotations of the reference and target assemblies (in GFF3 or GTF format). The target annotation can be derived from other lift-over tools besides Liftoff, as long as the feature IDs in the reference and target annotations are the same. All three modules can be run with the following command: liftofftools all -r reference.fasta -t target.fasta -rg reference.gff3 -tg target.gff3 Each module can also be run separately as detailed on GitHub. Operation LiftoffTools is designed and implemented in Python 3 (requires 3.6 or higher) and is easily installable with PyPi (pip install liftofftools) and bioconda (conda install -c bioconda liftofftools). Details on how to run LiftoffTools are available on the GitHub page. Variants The variants module calculates the sequence identity between mRNA transcripts in the reference genome and the corresponding transcripts in the target genome. For protein-coding genes, the module identifies variants that have a neutral or deleterious effect on the translated amino acid sequences in the target genome. The first step in the module will globally align the nucleotide sequences of the reference transcripts to the target transcripts using the Needleman-Wunsch algorithm implemented by Parasail ( Daily, 2016 ), which is a single instruction/multiple data (SIMD) C library for sequence alignment. If the transcript has an annotated protein-coding sequence (a CDS feature), we align the protein sequences again using Parasail. We then identify mismatches and gaps in the alignments and evaluate the effects on the protein sequence. The potential effects we look for are synonymous mutations, nonsynonymous mutations, in-frame deletions, in-frame insertions, start codon loss, 5′ truncations, 3′ truncations, frameshifts, and stop codon gain. For all transcripts we output the percent identity at the nucleotide level, and for protein-coding transcripts we also output the protein percent identity and the variant effect if applicable. While there may be multiple variants within a transcript, the intent of this module is to summarize the functional consequences of variation; therefore, if there is more than one variant, we report only the most severe. For example, if a transcript has a synonymous mutation and a frameshift mutation, we output ‘frameshift’ for that transcript as this would be more disruptive to gene function. Combining the sequence identity information with the variant effect can provide further insights into the severity of the variant. For example, a gene with a frameshift near the 3′ end or a gene with a second, compensatory frameshift nearby will have a high percent identity at the amino acid level and may still retain function. Synteny The synteny module compares the gene order in the reference annotation to the order in the target annotation. The genes present in both annotations are sorted first by chromosome and then by start coordinate in each annotation. Each gene is then plotted as a point on a 2D plot where the x-coordinate is the ordinal position ( e.g. , 1 st , 2 nd , 3 rd , etc.) in the reference genome and the y-coordinate is the ordinal position in the target genome. The color of the point corresponds to the sequence identity between the corresponding genes, where green indicates higher identity and red indicates lower identity. Note this color feature is only available for target annotations created by Liftoff which have the sequence identity information in the GTF/GFF3. The plot and a file with the ordinal positions and sequence identities of each gene is output. The user also has the option to calculate the edit distance between the reference order and the target order. Clusters This module clusters the genes into paralogous groups to evaluate gene copy number gain and loss. LiftoffTools first invokes MMSeqs2 ( Steinegger and Söding, 2017 ) to cluster the reference gene sequences. MMSeqs2 clusters the amino acid sequences of the protein-coding genes, and the nucleotide sequences of noncoding genes. For each gene we select only the longest isoform to be included in the clustering. For genes to be considered copies and be clustered together, they must be at least 90% identical across 90% of both of their lengths, although these parameters can be adjusted by the user. After clustering the reference genes, we create the target gene clusters by first iterating through each reference cluster and removing any gene absent in the target genome. Next, if Liftoff was run with the -copies option to identify extra gene copies in the target genome, we add the extra copies to the same cluster as their closest paralog. If Liftoff was run without the -copies option, no extra gene copies will be present in the target annotation, and thus the clusters modules will only report instances of copy number loss. For each cluster, we output the number of reference genes and the number of target genes belonging to that cluster as well as the gene IDs of the cluster members. Results To illustrate the use of these tools, we used them to compare the human annotation on the current reference genome, GRCh38, to the same annotation when mapped onto the first-ever complete human genome, CHM13 ( Nurk et al., 2022 ). We first mapped the human annotation onto CHM13 by running Liftoff v1.6.3 (with options -copies -sc 0.95 -polish) to map genes from RefSeq release 110 ( O’Leary et al., 2016 ) from GRCh38 onto CHM13v2.0. (This annotation is available on the Johns Hopkins Center for Computational Biology website ) We then ran each module of LiftoffTools on the resulting CHM13 annotation. Variants Running the variants module on GRCh38 and CHM13, we found that out of 130,316 protein-coding transcripts in GRCh38, 77,109 CHM13 transcripts were identical, 421 failed to map, and 52,669 had variants with the effects shown in Table 1 . The vast majority of these effects were either simple amino acid changes or insertion/deletions (indels) that preserved the reading frame; only 932 of the variants had a major effect on the translated protein sequence. Table 1. Effects of sequence differences on protein-coding transcripts and the number of transcripts affected in CHM13 identified by the LiftoffTools variants module. In-frame changes refer to insertions or deletions that are a multiple of 3 in length. Truncations are variants that shorten the protein sequence by removing either the 5′ or 3′ end of the transcript including the start or stop codon. Start codon loss variants are point mutations in the start codon, and stop codon gain variants are point mutations that result in a premature stop codon. Variant effect Number of transcripts None (synonymous) 21,823 Non-synonymous 28,507 In-frame deletion 744 In-frame insertion 663 Start codon lost 117 5’ truncation 1 3’ truncation 7 Frameshift 718 Stop codon gained 206 Synteny We ran the synteny module to compare the gene order of CHM13 to GRCh38. The dot plot in Figure 1 shows that the vast majority of genes were collinear and nearly identical in sequence, as expected. The small number of genes which were not collinear generally mapped with a lower sequence identity, suggesting they may have been mapped to a different (non-syntenic) copy of a gene in a multi-gene family. Figure 1. Dot plot showing the ordinal position of each gene in GRCh38 on the x-axis and the ordinal position in CHM13 on the y-axis. The color of each point indicates the sequence identity, and the gray lines separate the chromosomes. Clusters The clusters module found 5,213 genes in GRCh38 with at least one paralog that met the 90% sequence identity and alignment length minimums. These 5,213 genes were grouped into 1,629 clusters with copy numbers ranging from two to 66. In CHM13, 8,356 genes had at least one paralog. These copies were grouped into 2,089 clusters with copy numbers ranging from two to 228. (Note that the ribosomal DNA gene is the largest cluster, and most copies of this gene are not present in the GRCh38 assembly.) Among clusters with a copy number of at least 2 in GRCh38, 134 clusters had fewer gene copies in CHM13 resulting in a total loss of 188 gene copies. A total of 715 clusters had more copies in CHM13 resulting in a total gain of 3,035 gene copies. Conclusions Liftoff gave us the ability to easily map genes between closely related genomes, but further analysis is required to identify similarities and differences between the genes in each assembly that may be biologically important. LiftoffTools enables this analysis by automating the comparison of protein-coding variants, gene synteny, and gene copy loss and gain. Here we provided an example demonstrating the use of LiftoffTools to compare genes mapped between two human assemblies, and we hope this set of tools will be useful for a wide diversity of assembled genomes from species across all domains of life. Software availability Source code available from: https://github.com/agshumate/LiftoffTools Archived source code as at time of publication: https://doi.org/10.5281/zenodo.6967163 ( Shumate, 2022 ) License: GNU GPL v3 Data availability Underlying data GRCh38 sequence: https://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/001/405/GCF_000001405.26_GRCh38/GCF_000001405.26_GRCh38_genomic.fna.gz CHM13 sequence: https://s3-us-west-2.amazonaws.com/human-pangenomics/T2T/CHM13/assemblies/analysis_set/chm13v2.0.fa.gz CHM13 annotation: https://ccb.jhu.edu/T2T.shtml or ftp://ftp.ccb.jhu.edu/pub/data/T2T-CHM13/chm13v2.0_RefSeq_Liftoff_v3.gff3 (Note: The CHM13 annotation has been updated to v4 since the submission of this manuscript) References Daily J: Parasail: SIMD C library for global, semi-global, and local pairwise sequence alignments. BMC Bioinform. 2016; 17 : 1–11. Publisher Full Text Kuhn RM, et al. : The UCSC genome browser and associated tools. Brief Bioinform. 2013; 14 : 144–161. PubMed Abstract | Publisher Full Text Nurk S, et al. : The complete sequence of a human genome. Science (1979). 2022; 376 : 44–53. Publisher Full Text O’Leary NA, et al. : Reference sequence (RefSeq) database at NCBI: current status, taxonomic expansion, and functional annotation. Nucleic Acids Res. 2016; 44 : D733–D745. PubMed Abstract | Publisher Full Text Shumate A, Salzberg SL: Liftoff: accurate mapping of gene annotations. Bioinformatics. 2021; 37 : 1639–1643. PubMed Abstract | Publisher Full Text Shumate A: agshumate/LiftoffTools: (v0.4.3.2). [software] Zenodo.2022. Publisher Full Text Steinegger M, Söding J: MMseqs2 enables sensitive protein sequence searching for the analysis of massive data sets. Nat. Biotechnol. 2017; 35 : 1026–1028. PubMed Abstract | Publisher Full Text Comments on this article Comments (0) Version 2 VERSION 2 PUBLISHED 28 Oct 2022 ADD YOUR COMMENT Comment Author details Author details 1 Center for Computational Biology, Whiting School of Engineering, Johns Hopkins University, Baltimore, MD, 21211, USA 2 Biomedical Engineering, Johns Hopkins University, Baltimore, MD, 21218, USA 3 Biostatistics, Bloomberg School of Public Health, Johns Hopkins University, Baltimore, MD, 21205, USA 4 Computer Science, Johns Hopkins University, Baltimore, MD, 21218, USA Alaina Shumate Roles: Conceptualization, Methodology, Software, Writing – Original Draft Preparation Steven Salzberg Roles: Funding Acquisition, Supervision, Writing – Review & Editing Competing interests No competing interests were disclosed. Grant information This work was supported by NIH grant: HG006677 The funders had no role in study design, data collection and analysis, decision to publish, or preparation of the manuscript. Article Versions (2) version 2 Revised Published: 29 Apr 2024, 11:1230 https://doi.org/10.12688/f1000research.124059.2 version 1 Published: 28 Oct 2022, 11:1230 https://doi.org/10.12688/f1000research.124059.1 Copyright © 2024 Shumate A and Salzberg S. This is an open access article distributed under the terms of the Creative Commons Attribution License , which permits unrestricted use, distribution, and reproduction in any medium, provided the original work is properly cited. Download Export To Sciwheel Bibtex EndNote ProCite Ref. Manager (RIS) Sente metrics Views Downloads F1000Research - - PubMed Central info_outline Data from PMC are received and updated monthly. - - Citations open_in_new 0 open_in_new 0 open_in_new SEE MORE DETAILS CITE how to cite this article Shumate A and Salzberg S. LiftoffTools: a toolkit for comparing gene annotations mapped between genome assemblies [version 2; peer review: 2 approved] . F1000Research 2024, 11 :1230 ( https://doi.org/10.12688/f1000research.124059.2 ) NOTE: If applicable, it is important to ensure the information in square brackets after the title is included in all citations of this article. COPY CITATION DETAILS track receive updates on this article Track an article to receive email alerts on any updates to this article. TRACK THIS ARTICLE Share Open Peer Review Current Reviewer Status: ? Key to Reviewer Statuses VIEW HIDE Approved The paper is scientifically sound in its current form and only minor, if any, improvements are suggested Approved with reservations A number of small changes, sometimes more significant revisions are required to address specific details and improve the papers academic merit. Not approved Fundamental flaws in the paper seriously undermine the findings and conclusions Version 2 VERSION 2 PUBLISHED 29 Apr 2024 Revised Views 0 Cite How to cite this report: Frankish A. Reviewer Report For: LiftoffTools: a toolkit for comparing gene annotations mapped between genome assemblies [version 2; peer review: 2 approved] . F1000Research 2024, 11 :1230 ( https://doi.org/10.5256/f1000research.164429.r270095 ) The direct URL for this report is: https://f1000research.com/articles/11-1230/v2#referee-response-270095 NOTE: it is important to ensure the information in square brackets after the title is included in this citation. Close Copy Citation Details Reviewer Report 29 May 2024 Adam Frankish , European Bioinformatics Institute, Wellcome Genome Campus, European Molecular Biology Laboratory, Cambridge, UK Approved VIEWS 0 https://doi.org/10.5256/f1000research.164429.r270095 Thanks to the authors for their clear ... Continue reading READ ALL Thanks to the authors for their clear responses to questions and updates to the manuscript. Competing Interests: No competing interests were disclosed. Reviewer Expertise: Gene annotation I confirm that I have read this submission and believe that I have an appropriate level of expertise to confirm that it is of an acceptable scientific standard. Close READ LESS CITE CITE HOW TO CITE THIS REPORT Frankish A. Reviewer Report For: LiftoffTools: a toolkit for comparing gene annotations mapped between genome assemblies [version 2; peer review: 2 approved] . F1000Research 2024, 11 :1230 ( https://doi.org/10.5256/f1000research.164429.r270095 ) The direct URL for this report is: https://f1000research.com/articles/11-1230/v2#referee-response-270095 NOTE: it is important to ensure the information in square brackets after the title is included in all citations of this article. COPY CITATION DETAILS Report a concern Respond or Comment COMMENT ON THIS REPORT Version 1 VERSION 1 PUBLISHED 28 Oct 2022 Views 0 Cite How to cite this report: Borodovsky M. Reviewer Report For: LiftoffTools: a toolkit for comparing gene annotations mapped between genome assemblies [version 2; peer review: 2 approved] . F1000Research 2024, 11 :1230 ( https://doi.org/10.5256/f1000research.136230.r212791 ) The direct URL for this report is: https://f1000research.com/articles/11-1230/v1#referee-response-212791 NOTE: it is important to ensure the information in square brackets after the title is included in this citation. Close Copy Citation Details Reviewer Report 29 Nov 2023 Mark Borodovsky , School of Computational Science and Engineering, Wallace H. Coulter Department of Biomedical Engineering, Georgia Institute of Technology, Atlanta, Georgia, USA Approved VIEWS 0 https://doi.org/10.5256/f1000research.136230.r212791 The manuscript is well written and presents a useful computational tool for comparison of gene annotations between genome assemblies. I have two minor comments for the Methods section. Variants Do transcripts include ... Continue reading READ ALL The manuscript is well written and presents a useful computational tool for comparison of gene annotations between genome assemblies. I have two minor comments for the Methods section. Variants Do transcripts include UTRs? If yes, the applicability is limited to genomes with annotated UTRs, if no – the term transcript should be defined as such. Clusters In the sentence: “Next, if Liftoff was run with the -copies option to identify extra gene copies in the target genome, we add the extra copies to the same cluster as their closest paralog.” The meaning of the “-copies” option, the difference with the default run, was not described. Is the rationale for developing the new software tool clearly explained? Yes Is the description of the software tool technically sound? Yes Are sufficient details of the code, methods and analysis (if applicable) provided to allow replication of the software development and its use by others? Yes Is sufficient information provided to allow interpretation of the expected output datasets and any results generated using the tool? Yes Are the conclusions about the tool and its performance adequately supported by the findings presented in the article? Yes Competing Interests: No competing interests were disclosed. Reviewer Expertise: Bioinformatics, Genome Analysis I confirm that I have read this submission and believe that I have an appropriate level of expertise to confirm that it is of an acceptable scientific standard. Close READ LESS CITE CITE HOW TO CITE THIS REPORT Borodovsky M. Reviewer Report For: LiftoffTools: a toolkit for comparing gene annotations mapped between genome assemblies [version 2; peer review: 2 approved] . F1000Research 2024, 11 :1230 ( https://doi.org/10.5256/f1000research.136230.r212791 ) The direct URL for this report is: https://f1000research.com/articles/11-1230/v1#referee-response-212791 NOTE: it is important to ensure the information in square brackets after the title is included in all citations of this article. COPY CITATION DETAILS Report a concern Author Response 29 Apr 2024 Alaina Shumate , Biomedical Engineering, Johns Hopkins University, Baltimore, 21218, USA 29 Apr 2024 Author Response Comment 1 Variants Do transcripts include UTRs? If yes, the applicability is limited to genomes with annotated UTRs, if no – the term transcript should be defined as such. ... Continue reading Comment 1 Variants Do transcripts include UTRs? If yes, the applicability is limited to genomes with annotated UTRs, if no – the term transcript should be defined as such. Response 1 The mRNA transcripts are aligned which we derive by concatenating all of the ‘exon’ features in the GFF3 annotation. Some annotations include UTRs in the 5’ or 3’ exons. In these cases, yes, the UTRs are included. Others annotate them separately as their own feature upstream or downstream of exons. In these cases, they are not included. While the full transcript is used to calculate sequence identity, variants are only called within the amino acid sequence, so the module can be applied to genomes with or without annotated UTRs with no effect on the number or types of variants reported. Comment 2 Clusters In the sentence: “Next, if Liftoff was run with the -copies option to identify extra gene copies in the target genome, we add the extra copies to the same cluster as their closest paralog.” The meaning of the “-copies” option, the difference with the default run, was not described. Response 2 I have updated the manuscript to include the text below for clarification: “Next, if Liftoff was run with the -copies option to identify extra gene copies in the target genome, we add the extra copies to the same cluster as their closest paralog. If Liftoff was run without the -copies option, no extra gene copies will be present in the target annotation, and thus the clusters module will only report instances of copy number loss.” Comment 1 Variants Do transcripts include UTRs? If yes, the applicability is limited to genomes with annotated UTRs, if no – the term transcript should be defined as such. Response 1 The mRNA transcripts are aligned which we derive by concatenating all of the ‘exon’ features in the GFF3 annotation. Some annotations include UTRs in the 5’ or 3’ exons. In these cases, yes, the UTRs are included. Others annotate them separately as their own feature upstream or downstream of exons. In these cases, they are not included. While the full transcript is used to calculate sequence identity, variants are only called within the amino acid sequence, so the module can be applied to genomes with or without annotated UTRs with no effect on the number or types of variants reported. Comment 2 Clusters In the sentence: “Next, if Liftoff was run with the -copies option to identify extra gene copies in the target genome, we add the extra copies to the same cluster as their closest paralog.” The meaning of the “-copies” option, the difference with the default run, was not described. Response 2 I have updated the manuscript to include the text below for clarification: “Next, if Liftoff was run with the -copies option to identify extra gene copies in the target genome, we add the extra copies to the same cluster as their closest paralog. If Liftoff was run without the -copies option, no extra gene copies will be present in the target annotation, and thus the clusters module will only report instances of copy number loss.” Competing Interests: No competing interests were disclosed. Close Report a concern Respond or Comment COMMENTS ON THIS REPORT Author Response 29 Apr 2024 Alaina Shumate , Biomedical Engineering, Johns Hopkins University, Baltimore, 21218, USA 29 Apr 2024 Author Response Comment 1 Variants Do transcripts include UTRs? If yes, the applicability is limited to genomes with annotated UTRs, if no – the term transcript should be defined as such. ... Continue reading Comment 1 Variants Do transcripts include UTRs? If yes, the applicability is limited to genomes with annotated UTRs, if no – the term transcript should be defined as such. Response 1 The mRNA transcripts are aligned which we derive by concatenating all of the ‘exon’ features in the GFF3 annotation. Some annotations include UTRs in the 5’ or 3’ exons. In these cases, yes, the UTRs are included. Others annotate them separately as their own feature upstream or downstream of exons. In these cases, they are not included. While the full transcript is used to calculate sequence identity, variants are only called within the amino acid sequence, so the module can be applied to genomes with or without annotated UTRs with no effect on the number or types of variants reported. Comment 2 Clusters In the sentence: “Next, if Liftoff was run with the -copies option to identify extra gene copies in the target genome, we add the extra copies to the same cluster as their closest paralog.” The meaning of the “-copies” option, the difference with the default run, was not described. Response 2 I have updated the manuscript to include the text below for clarification: “Next, if Liftoff was run with the -copies option to identify extra gene copies in the target genome, we add the extra copies to the same cluster as their closest paralog. If Liftoff was run without the -copies option, no extra gene copies will be present in the target annotation, and thus the clusters module will only report instances of copy number loss.” Comment 1 Variants Do transcripts include UTRs? If yes, the applicability is limited to genomes with annotated UTRs, if no – the term transcript should be defined as such. Response 1 The mRNA transcripts are aligned which we derive by concatenating all of the ‘exon’ features in the GFF3 annotation. Some annotations include UTRs in the 5’ or 3’ exons. In these cases, yes, the UTRs are included. Others annotate them separately as their own feature upstream or downstream of exons. In these cases, they are not included. While the full transcript is used to calculate sequence identity, variants are only called within the amino acid sequence, so the module can be applied to genomes with or without annotated UTRs with no effect on the number or types of variants reported. Comment 2 Clusters In the sentence: “Next, if Liftoff was run with the -copies option to identify extra gene copies in the target genome, we add the extra copies to the same cluster as their closest paralog.” The meaning of the “-copies” option, the difference with the default run, was not described. Response 2 I have updated the manuscript to include the text below for clarification: “Next, if Liftoff was run with the -copies option to identify extra gene copies in the target genome, we add the extra copies to the same cluster as their closest paralog. If Liftoff was run without the -copies option, no extra gene copies will be present in the target annotation, and thus the clusters module will only report instances of copy number loss.” Competing Interests: No competing interests were disclosed. Close Report a concern COMMENT ON THIS REPORT Views 0 Cite How to cite this report: Frankish A. Reviewer Report For: LiftoffTools: a toolkit for comparing gene annotations mapped between genome assemblies [version 2; peer review: 2 approved] . F1000Research 2024, 11 :1230 ( https://doi.org/10.5256/f1000research.136230.r154534 ) The direct URL for this report is: https://f1000research.com/articles/11-1230/v1#referee-response-154534 NOTE: it is important to ensure the information in square brackets after the title is included in this citation. Close Copy Citation Details Reviewer Report 01 Dec 2022 Adam Frankish , European Bioinformatics Institute, Wellcome Genome Campus, European Molecular Biology Laboratory, Cambridge, UK Approved with Reservations VIEWS 0 https://doi.org/10.5256/f1000research.136230.r154534 This manuscript describes a set of tools to analyze gene annotation that has been mapped between one genomic sequence and another closely related genomic sequence. The methods described build on the widely adopted Liftoff annotation transfer tool developed by the ... Continue reading READ ALL This manuscript describes a set of tools to analyze gene annotation that has been mapped between one genomic sequence and another closely related genomic sequence. The methods described build on the widely adopted Liftoff annotation transfer tool developed by the same group. The development of LiftoffTools is clearly relevant and timely as we enter an era of rapidly increasing numbers of high quality genome sequences suitable for comparison to species reference genome assemblies that are generally the focus of gene annotation effort. The description of the tools is sound and we were able to run the code with the instructions provided and generate the correct/expected output. The code is written entirely in Python and looks clear and well-organized. There is broadly sufficient information to allow interpretation of the results, although a little more guidance might be useful, for example, adding annotated examples of real data from Variant and Cluster analysis to guide users. Comments: "... as long as the feature IDs in the reference and target annotations are the same. All three modules can be run with the following command " - Is this somewhat inflexible? Not all transfer methods will preserve feature ID identically across different assemblies as they seek to avoid storing two or more features with identical IDs but different properties (sequence/length/etc). Is it possible to accommodate methods that take this approach? It is not clear from the manuscript or the supporting information in https://github.com/agshumate/LiftoffTools/blob/master/README.md how LiftoffTools handles genes that are LoF on genome 1 but functional on genome 2. Can these genes and their 'rescuing' variation be identified? While the list of variant consequences is comprehensive for the annotated CDS, it would be useful to add other LoF consequences such as disruption of core splice site to the analysis. It would also be useful to specifically state the ranking of consequences in the /README.md file for genes with multiple transcript-affecting variants as only the most significant is provided in the variation output file. Similarly, as only one variant is reported, does LiftoffTools identify (and/or flag) corrective variation e.g a second frameshift that compensates for an earlier frameshift and restores the CDS with a small aa change? In the calculation of cluster gain/loss, are haplotypic duplicated pseudogenes considered? i.e. is loss only deletion/absence of the gene or is loss (or gain) of function included as well? An example with real data in /README.md could be helpful. What is reported for variants in genes that are missing or partial on GRCh38 where it is used as a reference? An example with real data in /README.md could be helpful. The CHM13 GFF and FNA (fasta) files appear to have different chromosome names, which threw an error when running the code. Is the rationale for developing the new software tool clearly explained? Yes Is the description of the software tool technically sound? Yes Are sufficient details of the code, methods and analysis (if applicable) provided to allow replication of the software development and its use by others? Yes Is sufficient information provided to allow interpretation of the expected output datasets and any results generated using the tool? Partly Are the conclusions about the tool and its performance adequately supported by the findings presented in the article? Yes Competing Interests: No competing interests were disclosed. Reviewer Expertise: Gene annotation I confirm that I have read this submission and believe that I have an appropriate level of expertise to confirm that it is of an acceptable scientific standard, however I have significant reservations, as outlined above. Close READ LESS CITE CITE HOW TO CITE THIS REPORT Frankish A. Reviewer Report For: LiftoffTools: a toolkit for comparing gene annotations mapped between genome assemblies [version 2; peer review: 2 approved] . F1000Research 2024, 11 :1230 ( https://doi.org/10.5256/f1000research.136230.r154534 ) The direct URL for this report is: https://f1000research.com/articles/11-1230/v1#referee-response-154534 NOTE: it is important to ensure the information in square brackets after the title is included in all citations of this article. COPY CITATION DETAILS Report a concern Author Response 29 Apr 2024 Alaina Shumate , Biomedical Engineering, Johns Hopkins University, Baltimore, 21218, USA 29 Apr 2024 Author Response Comment 1 Is this somewhat inflexible? Not all transfer methods will preserve feature ID identically across different assemblies as they seek to avoid storing two or more features with identical ... Continue reading Comment 1 Is this somewhat inflexible? Not all transfer methods will preserve feature ID identically across different assemblies as they seek to avoid storing two or more features with identical IDs but different properties (sequence/length/etc). Is it possible to accommodate methods that take this approach? Response 1 While it would be great to accommodate all lift-over tools, without the preservation of feature IDs, identifying the reference/target gene equivalents for comparison becomes a non-trivial task. LiftoffTools was specifically designed as a post-processing toolkit for the output of Liftoff , and in our experience, other commonly used tools such as UCSC liftOver do indeed preserve feature IDs. Furthermore, the GFF3 specification states that all feature IDs must be unique. If a transfer method is changing IDs to eliminate duplicates, this is an issue of the reference annotation failing to adhere to the GFF3 specifications and should be addressed prior to mapping annotations. Comment 2 It is not clear from the manuscript or the supporting information in https://github.com/agshumate/LiftoffTools/blob/master/README.md how LiftoffTools handles genes that are LoF on genome 1 but functional on genome 2. Can these genes and their 'rescuing' variation be identified? Response 2 Currently, LiftoffTools does not identify ‘rescuing’ variants. In our particular case, we used the RefSeq annotation as a reference, which requires a valid open reading frame to annotate a coding sequence; therefore, there are no LoF coding sequences annotated in the reference to be mapped. We recognize that this is not true for all reference annotations; many include annotations of coding sequences without a valid open reading frame. There are varying schools of thought on whether this is acceptable, but regardless, we do agree that identifying rescuing or gain of function variants would be useful, and we will consider implementing that feature in the future. We have updated the manuscript to say “the module identifies variants that have a neutral or deleterious effect on the translated amino acid sequences in the target genome.” The README has also been updated. Comment 3 While the list of variant consequences is comprehensive for the annotated CDS, it would be useful to add other LoF consequences such as disruption of core splice site to the analysis. Response 3 We do agree that splice site variants would be useful to include, but we are currently only aligning and looking at variants in the mRNA due to computational limitations. Performing Smith-Waterman alignment on transcript sequences including splice-sites and introns would require significant computational resources for human and other eukaryotic genomes. Even with a very fast implementation of the Smith-Waterman alignment, aligning just the mRNA and amino acid sequences is the computational bottleneck of the LiftoffTools pipeline. While faster alignment methods could alleviate this, they would not have the same accuracy as Smith-Waterman, which we feel is necessary for accurately identifying the position and type of variants. We have edited the manuscript to specifically state that we are aligning mRNA sequences. Comment 4 It would also be useful to specifically state the ranking of consequences in the /README.md file for genes with multiple transcript-affecting variants as only the most significant is provided in the variation output file. Response 4 Thank you for the suggestion. I have updated the README.md accordingly. Comment 5 Similarly, as only one variant is reported, does LiftoffTools identify (and/or flag) corrective variation e.g a second frameshift that compensates for an earlier frameshift and restores the CDS with a small aa change? Response 5 We do not report this explicitly. The intent of the variants module is to provide high level summary information about how many genes were disrupted by variants rather than identifying every variant in every gene. We do however include the amino-acid level sequence identity information, so compensatory frameshifts can be inferred if a sequence is reported to have a frameshift but also retains a high sequence identity to the reference protein. We have added the following text to the manuscript to capture these points. “While there may be multiple variants within a transcript, the intent of this module is to summarize the functional consequences of variation; therefore, if there is more than one variant, we report only the most severe. For example, if a transcript has a synonymous mutation and a frameshift mutation, we output ‘frameshift’ for that transcript as this would be more disruptive to gene function. Combining the sequence identity information with the variant effect can provide further insights into the severity of the variant. For example, a gene with a frameshift near the 3’ end or a gene with a compensatory frameshift nearby will have a high percent identity at the amino acid level and may still retain function.” Comment 6 In the calculation of cluster gain/loss, are haplotypic duplicated pseudogenes considered? i.e. is loss only deletion/absence of the gene or is loss (or gain) of function included as well? An example with real data in /README.md could be helpful. Response 6 This is a good point. Liftoff intentionally avoids annotating extra gene copies in the target genome that are processed pseudogenes by including introns in the initial alignment step. Therefore, when working with the output of Liftoff, it is not something we need to consider. If a different annotation tool was used that does annotate pseudogenes, they will get clustered with their paralogs even if they are not functional. As previously mentioned, LiftoffTools was designed to be used in conjunction with Liftoff, so we have not considered a strategy for removing non-functional pseudogene copies from the clusters. Comment 7 What is reported for variants in genes that are missing or partial on GRCh38 where it is used as a reference? An example with real data in /README.md could be helpful. Response 7 Variants are only reported for genes that are in both GRCh38 and CHM13. We state in the manuscript “ The variants module calculates the sequence identity between mRNA transcripts in the reference genome and the corresponding transcripts in the target genome…” A limitation of lifting over gene annotations is that a partial reference gene will likely also be annotated as partial in the target annotation. There are various lift-over algorithms/strategies; however, they generally rely on converting the start and end coordinates of the gene from reference to target. If the start-end range is only a partial gene, only that part of the gene will be lifted over. In these cases, they will be reported as either a 5’ truncation or a 3’ truncation based on the presence or absence of start and stop codons. Comment 8 The CHM13 GFF and FNA (fasta) files appear to have different chromosome names, which threw an error when running the code. Response 8 Thank you for bringing this to our attention. The link to the fasta file has been replaced to a file with the same chromosome names. Comment 1 Is this somewhat inflexible? Not all transfer methods will preserve feature ID identically across different assemblies as they seek to avoid storing two or more features with identical IDs but different properties (sequence/length/etc). Is it possible to accommodate methods that take this approach? Response 1 While it would be great to accommodate all lift-over tools, without the preservation of feature IDs, identifying the reference/target gene equivalents for comparison becomes a non-trivial task. LiftoffTools was specifically designed as a post-processing toolkit for the output of Liftoff , and in our experience, other commonly used tools such as UCSC liftOver do indeed preserve feature IDs. Furthermore, the GFF3 specification states that all feature IDs must be unique. If a transfer method is changing IDs to eliminate duplicates, this is an issue of the reference annotation failing to adhere to the GFF3 specifications and should be addressed prior to mapping annotations. Comment 2 It is not clear from the manuscript or the supporting information in https://github.com/agshumate/LiftoffTools/blob/master/README.md how LiftoffTools handles genes that are LoF on genome 1 but functional on genome 2. Can these genes and their 'rescuing' variation be identified? Response 2 Currently, LiftoffTools does not identify ‘rescuing’ variants. In our particular case, we used the RefSeq annotation as a reference, which requires a valid open reading frame to annotate a coding sequence; therefore, there are no LoF coding sequences annotated in the reference to be mapped. We recognize that this is not true for all reference annotations; many include annotations of coding sequences without a valid open reading frame. There are varying schools of thought on whether this is acceptable, but regardless, we do agree that identifying rescuing or gain of function variants would be useful, and we will consider implementing that feature in the future. We have updated the manuscript to say “the module identifies variants that have a neutral or deleterious effect on the translated amino acid sequences in the target genome.” The README has also been updated. Comment 3 While the list of variant consequences is comprehensive for the annotated CDS, it would be useful to add other LoF consequences such as disruption of core splice site to the analysis. Response 3 We do agree that splice site variants would be useful to include, but we are currently only aligning and looking at variants in the mRNA due to computational limitations. Performing Smith-Waterman alignment on transcript sequences including splice-sites and introns would require significant computational resources for human and other eukaryotic genomes. Even with a very fast implementation of the Smith-Waterman alignment, aligning just the mRNA and amino acid sequences is the computational bottleneck of the LiftoffTools pipeline. While faster alignment methods could alleviate this, they would not have the same accuracy as Smith-Waterman, which we feel is necessary for accurately identifying the position and type of variants. We have edited the manuscript to specifically state that we are aligning mRNA sequences. Comment 4 It would also be useful to specifically state the ranking of consequences in the /README.md file for genes with multiple transcript-affecting variants as only the most significant is provided in the variation output file. Response 4 Thank you for the suggestion. I have updated the README.md accordingly. Comment 5 Similarly, as only one variant is reported, does LiftoffTools identify (and/or flag) corrective variation e.g a second frameshift that compensates for an earlier frameshift and restores the CDS with a small aa change? Response 5 We do not report this explicitly. The intent of the variants module is to provide high level summary information about how many genes were disrupted by variants rather than identifying every variant in every gene. We do however include the amino-acid level sequence identity information, so compensatory frameshifts can be inferred if a sequence is reported to have a frameshift but also retains a high sequence identity to the reference protein. We have added the following text to the manuscript to capture these points. “While there may be multiple variants within a transcript, the intent of this module is to summarize the functional consequences of variation; therefore, if there is more than one variant, we report only the most severe. For example, if a transcript has a synonymous mutation and a frameshift mutation, we output ‘frameshift’ for that transcript as this would be more disruptive to gene function. Combining the sequence identity information with the variant effect can provide further insights into the severity of the variant. For example, a gene with a frameshift near the 3’ end or a gene with a compensatory frameshift nearby will have a high percent identity at the amino acid level and may still retain function.” Comment 6 In the calculation of cluster gain/loss, are haplotypic duplicated pseudogenes considered? i.e. is loss only deletion/absence of the gene or is loss (or gain) of function included as well? An example with real data in /README.md could be helpful. Response 6 This is a good point. Liftoff intentionally avoids annotating extra gene copies in the target genome that are processed pseudogenes by including introns in the initial alignment step. Therefore, when working with the output of Liftoff, it is not something we need to consider. If a different annotation tool was used that does annotate pseudogenes, they will get clustered with their paralogs even if they are not functional. As previously mentioned, LiftoffTools was designed to be used in conjunction with Liftoff, so we have not considered a strategy for removing non-functional pseudogene copies from the clusters. Comment 7 What is reported for variants in genes that are missing or partial on GRCh38 where it is used as a reference? An example with real data in /README.md could be helpful. Response 7 Variants are only reported for genes that are in both GRCh38 and CHM13. We state in the manuscript “ The variants module calculates the sequence identity between mRNA transcripts in the reference genome and the corresponding transcripts in the target genome…” A limitation of lifting over gene annotations is that a partial reference gene will likely also be annotated as partial in the target annotation. There are various lift-over algorithms/strategies; however, they generally rely on converting the start and end coordinates of the gene from reference to target. If the start-end range is only a partial gene, only that part of the gene will be lifted over. In these cases, they will be reported as either a 5’ truncation or a 3’ truncation based on the presence or absence of start and stop codons. Comment 8 The CHM13 GFF and FNA (fasta) files appear to have different chromosome names, which threw an error when running the code. Response 8 Thank you for bringing this to our attention. The link to the fasta file has been replaced to a file with the same chromosome names. Competing Interests: No competing interests were disclosed. Close Report a concern Respond or Comment COMMENTS ON THIS REPORT Author Response 29 Apr 2024 Alaina Shumate , Biomedical Engineering, Johns Hopkins University, Baltimore, 21218, USA 29 Apr 2024 Author Response Comment 1 Is this somewhat inflexible? Not all transfer methods will preserve feature ID identically across different assemblies as they seek to avoid storing two or more features with identical ... Continue reading Comment 1 Is this somewhat inflexible? Not all transfer methods will preserve feature ID identically across different assemblies as they seek to avoid storing two or more features with identical IDs but different properties (sequence/length/etc). Is it possible to accommodate methods that take this approach? Response 1 While it would be great to accommodate all lift-over tools, without the preservation of feature IDs, identifying the reference/target gene equivalents for comparison becomes a non-trivial task. LiftoffTools was specifically designed as a post-processing toolkit for the output of Liftoff , and in our experience, other commonly used tools such as UCSC liftOver do indeed preserve feature IDs. Furthermore, the GFF3 specification states that all feature IDs must be unique. If a transfer method is changing IDs to eliminate duplicates, this is an issue of the reference annotation failing to adhere to the GFF3 specifications and should be addressed prior to mapping annotations. Comment 2 It is not clear from the manuscript or the supporting information in https://github.com/agshumate/LiftoffTools/blob/master/README.md how LiftoffTools handles genes that are LoF on genome 1 but functional on genome 2. Can these genes and their 'rescuing' variation be identified? Response 2 Currently, LiftoffTools does not identify ‘rescuing’ variants. In our particular case, we used the RefSeq annotation as a reference, which requires a valid open reading frame to annotate a coding sequence; therefore, there are no LoF coding sequences annotated in the reference to be mapped. We recognize that this is not true for all reference annotations; many include annotations of coding sequences without a valid open reading frame. There are varying schools of thought on whether this is acceptable, but regardless, we do agree that identifying rescuing or gain of function variants would be useful, and we will consider implementing that feature in the future. We have updated the manuscript to say “the module identifies variants that have a neutral or deleterious effect on the translated amino acid sequences in the target genome.” The README has also been updated. Comment 3 While the list of variant consequences is comprehensive for the annotated CDS, it would be useful to add other LoF consequences such as disruption of core splice site to the analysis. Response 3 We do agree that splice site variants would be useful to include, but we are currently only aligning and looking at variants in the mRNA due to computational limitations. Performing Smith-Waterman alignment on transcript sequences including splice-sites and introns would require significant computational resources for human and other eukaryotic genomes. Even with a very fast implementation of the Smith-Waterman alignment, aligning just the mRNA and amino acid sequences is the computational bottleneck of the LiftoffTools pipeline. While faster alignment methods could alleviate this, they would not have the same accuracy as Smith-Waterman, which we feel is necessary for accurately identifying the position and type of variants. We have edited the manuscript to specifically state that we are aligning mRNA sequences. Comment 4 It would also be useful to specifically state the ranking of consequences in the /README.md file for genes with multiple transcript-affecting variants as only the most significant is provided in the variation output file. Response 4 Thank you for the suggestion. I have updated the README.md accordingly. Comment 5 Similarly, as only one variant is reported, does LiftoffTools identify (and/or flag) corrective variation e.g a second frameshift that compensates for an earlier frameshift and restores the CDS with a small aa change? Response 5 We do not report this explicitly. The intent of the variants module is to provide high level summary information about how many genes were disrupted by variants rather than identifying every variant in every gene. We do however include the amino-acid level sequence identity information, so compensatory frameshifts can be inferred if a sequence is reported to have a frameshift but also retains a high sequence identity to the reference protein. We have added the following text to the manuscript to capture these points. “While there may be multiple variants within a transcript, the intent of this module is to summarize the functional consequences of variation; therefore, if there is more than one variant, we report only the most severe. For example, if a transcript has a synonymous mutation and a frameshift mutation, we output ‘frameshift’ for that transcript as this would be more disruptive to gene function. Combining the sequence identity information with the variant effect can provide further insights into the severity of the variant. For example, a gene with a frameshift near the 3’ end or a gene with a compensatory frameshift nearby will have a high percent identity at the amino acid level and may still retain function.” Comment 6 In the calculation of cluster gain/loss, are haplotypic duplicated pseudogenes considered? i.e. is loss only deletion/absence of the gene or is loss (or gain) of function included as well? An example with real data in /README.md could be helpful. Response 6 This is a good point. Liftoff intentionally avoids annotating extra gene copies in the target genome that are processed pseudogenes by including introns in the initial alignment step. Therefore, when working with the output of Liftoff, it is not something we need to consider. If a different annotation tool was used that does annotate pseudogenes, they will get clustered with their paralogs even if they are not functional. As previously mentioned, LiftoffTools was designed to be used in conjunction with Liftoff, so we have not considered a strategy for removing non-functional pseudogene copies from the clusters. Comment 7 What is reported for variants in genes that are missing or partial on GRCh38 where it is used as a reference? An example with real data in /README.md could be helpful. Response 7 Variants are only reported for genes that are in both GRCh38 and CHM13. We state in the manuscript “ The variants module calculates the sequence identity between mRNA transcripts in the reference genome and the corresponding transcripts in the target genome…” A limitation of lifting over gene annotations is that a partial reference gene will likely also be annotated as partial in the target annotation. There are various lift-over algorithms/strategies; however, they generally rely on converting the start and end coordinates of the gene from reference to target. If the start-end range is only a partial gene, only that part of the gene will be lifted over. In these cases, they will be reported as either a 5’ truncation or a 3’ truncation based on the presence or absence of start and stop codons. Comment 8 The CHM13 GFF and FNA (fasta) files appear to have different chromosome names, which threw an error when running the code. Response 8 Thank you for bringing this to our attention. The link to the fasta file has been replaced to a file with the same chromosome names. Comment 1 Is this somewhat inflexible? Not all transfer methods will preserve feature ID identically across different assemblies as they seek to avoid storing two or more features with identical IDs but different properties (sequence/length/etc). Is it possible to accommodate methods that take this approach? Response 1 While it would be great to accommodate all lift-over tools, without the preservation of feature IDs, identifying the reference/target gene equivalents for comparison becomes a non-trivial task. LiftoffTools was specifically designed as a post-processing toolkit for the output of Liftoff , and in our experience, other commonly used tools such as UCSC liftOver do indeed preserve feature IDs. Furthermore, the GFF3 specification states that all feature IDs must be unique. If a transfer method is changing IDs to eliminate duplicates, this is an issue of the reference annotation failing to adhere to the GFF3 specifications and should be addressed prior to mapping annotations. Comment 2 It is not clear from the manuscript or the supporting information in https://github.com/agshumate/LiftoffTools/blob/master/README.md how LiftoffTools handles genes that are LoF on genome 1 but functional on genome 2. Can these genes and their 'rescuing' variation be identified? Response 2 Currently, LiftoffTools does not identify ‘rescuing’ variants. In our particular case, we used the RefSeq annotation as a reference, which requires a valid open reading frame to annotate a coding sequence; therefore, there are no LoF coding sequences annotated in the reference to be mapped. We recognize that this is not true for all reference annotations; many include annotations of coding sequences without a valid open reading frame. There are varying schools of thought on whether this is acceptable, but regardless, we do agree that identifying rescuing or gain of function variants would be useful, and we will consider implementing that feature in the future. We have updated the manuscript to say “the module identifies variants that have a neutral or deleterious effect on the translated amino acid sequences in the target genome.” The README has also been updated. Comment 3 While the list of variant consequences is comprehensive for the annotated CDS, it would be useful to add other LoF consequences such as disruption of core splice site to the analysis. Response 3 We do agree that splice site variants would be useful to include, but we are currently only aligning and looking at variants in the mRNA due to computational limitations. Performing Smith-Waterman alignment on transcript sequences including splice-sites and introns would require significant computational resources for human and other eukaryotic genomes. Even with a very fast implementation of the Smith-Waterman alignment, aligning just the mRNA and amino acid sequences is the computational bottleneck of the LiftoffTools pipeline. While faster alignment methods could alleviate this, they would not have the same accuracy as Smith-Waterman, which we feel is necessary for accurately identifying the position and type of variants. We have edited the manuscript to specifically state that we are aligning mRNA sequences. Comment 4 It would also be useful to specifically state the ranking of consequences in the /README.md file for genes with multiple transcript-affecting variants as only the most significant is provided in the variation output file. Response 4 Thank you for the suggestion. I have updated the README.md accordingly. Comment 5 Similarly, as only one variant is reported, does LiftoffTools identify (and/or flag) corrective variation e.g a second frameshift that compensates for an earlier frameshift and restores the CDS with a small aa change? Response 5 We do not report this explicitly. The intent of the variants module is to provide high level summary information about how many genes were disrupted by variants rather than identifying every variant in every gene. We do however include the amino-acid level sequence identity information, so compensatory frameshifts can be inferred if a sequence is reported to have a frameshift but also retains a high sequence identity to the reference protein. We have added the following text to the manuscript to capture these points. “While there may be multiple variants within a transcript, the intent of this module is to summarize the functional consequences of variation; therefore, if there is more than one variant, we report only the most severe. For example, if a transcript has a synonymous mutation and a frameshift mutation, we output ‘frameshift’ for that transcript as this would be more disruptive to gene function. Combining the sequence identity information with the variant effect can provide further insights into the severity of the variant. For example, a gene with a frameshift near the 3’ end or a gene with a compensatory frameshift nearby will have a high percent identity at the amino acid level and may still retain function.” Comment 6 In the calculation of cluster gain/loss, are haplotypic duplicated pseudogenes considered? i.e. is loss only deletion/absence of the gene or is loss (or gain) of function included as well? An example with real data in /README.md could be helpful. Response 6 This is a good point. Liftoff intentionally avoids annotating extra gene copies in the target genome that are processed pseudogenes by including introns in the initial alignment step. Therefore, when working with the output of Liftoff, it is not something we need to consider. If a different annotation tool was used that does annotate pseudogenes, they will get clustered with their paralogs even if they are not functional. As previously mentioned, LiftoffTools was designed to be used in conjunction with Liftoff, so we have not considered a strategy for removing non-functional pseudogene copies from the clusters. Comment 7 What is reported for variants in genes that are missing or partial on GRCh38 where it is used as a reference? An example with real data in /README.md could be helpful. Response 7 Variants are only reported for genes that are in both GRCh38 and CHM13. We state in the manuscript “ The variants module calculates the sequence identity between mRNA transcripts in the reference genome and the corresponding transcripts in the target genome…” A limitation of lifting over gene annotations is that a partial reference gene will likely also be annotated as partial in the target annotation. There are various lift-over algorithms/strategies; however, they generally rely on converting the start and end coordinates of the gene from reference to target. If the start-end range is only a partial gene, only that part of the gene will be lifted over. In these cases, they will be reported as either a 5’ truncation or a 3’ truncation based on the presence or absence of start and stop codons. Comment 8 The CHM13 GFF and FNA (fasta) files appear to have different chromosome names, which threw an error when running the code. Response 8 Thank you for bringing this to our attention. The link to the fasta file has been replaced to a file with the same chromosome names. Competing Interests: No competing interests were disclosed. Close Report a concern COMMENT ON THIS REPORT Comments on this article Comments (0) Version 2 VERSION 2 PUBLISHED 28 Oct 2022 ADD YOUR COMMENT Comment keyboard_arrow_left keyboard_arrow_right Open Peer Review Reviewer Status info_outline Alongside their report, reviewers assign a status to the article: Approved The paper is scientifically sound in its current form and only minor, if any, improvements are suggested Approved with reservations A number of small changes, sometimes more significant revisions are required to address specific details and improve the papers academic merit. Not approved Fundamental flaws in the paper seriously undermine the findings and conclusions Reviewer Reports Invited Reviewers 1 2 Version 2 (revision) 29 Apr 24 read Version 1 28 Oct 22 read read Adam Frankish , European Molecular Biology Laboratory, Cambridge, UK Mark Borodovsky , Georgia Institute of Technology, Atlanta, USA Comments on this article All Comments (0) Add a comment Sign up for content alerts Sign Up You are now signed up to receive this alert Browse by related subjects keyboard_arrow_left Back to all reports Reviewer Report 0 Views copyright © 2024 Frankish A. This is an open access peer review report distributed under the terms of the Creative Commons Attribution License , which permits unrestricted use, distribution, and reproduction in any medium, provided the original work is properly cited. 29 May 2024 | for Version 2 Adam Frankish , European Bioinformatics Institute, Wellcome Genome Campus, European Molecular Biology Laboratory, Cambridge, UK 0 Views copyright © 2024 Frankish A. This is an open access peer review report distributed under the terms of the Creative Commons Attribution License , which permits unrestricted use, distribution, and reproduction in any medium, provided the original work is properly cited. format_quote Cite this report speaker_notes Responses (0) Approved info_outline Alongside their report, reviewers assign a status to the article: Approved The paper is scientifically sound in its current form and only minor, if any, improvements are suggested Approved with reservations A number of small changes, sometimes more significant revisions are required to address specific details and improve the papers academic merit. Not approved Fundamental flaws in the paper seriously undermine the findings and conclusions Thanks to the authors for their clear responses to questions and updates to the manuscript. Competing Interests No competing interests were disclosed. Reviewer Expertise Gene annotation I confirm that I have read this submission and believe that I have an appropriate level of expertise to confirm that it is of an acceptable scientific standard. reply Respond to this report Responses (0) Frankish A. Peer Review Report For: LiftoffTools: a toolkit for comparing gene annotations mapped between genome assemblies [version 2; peer review: 2 approved] . F1000Research 2024, 11 :1230 ( https://doi.org/10.5256/f1000research.164429.r270095) NOTE: it is important to ensure the information in square brackets after the title is included in this citation. The direct URL for this report is: https://f1000research.com/articles/11-1230/v2#referee-response-270095 keyboard_arrow_left Back to all reports Reviewer Report 0 Views copyright © 2023 Borodovsky M. This is an open access peer review report distributed under the terms of the Creative Commons Attribution License , which permits unrestricted use, distribution, and reproduction in any medium, provided the original work is properly cited. 29 Nov 2023 | for Version 1 Mark Borodovsky , School of Computational Science and Engineering, Wallace H. Coulter Department of Biomedical Engineering, Georgia Institute of Technology, Atlanta, Georgia, USA 0 Views copyright © 2023 Borodovsky M. This is an open access peer review report distributed under the terms of the Creative Commons Attribution License , which permits unrestricted use, distribution, and reproduction in any medium, provided the original work is properly cited. format_quote Cite this report speaker_notes Responses (1) Approved info_outline Alongside their report, reviewers assign a status to the article: Approved The paper is scientifically sound in its current form and only minor, if any, improvements are suggested Approved with reservations A number of small changes, sometimes more significant revisions are required to address specific details and improve the papers academic merit. Not approved Fundamental flaws in the paper seriously undermine the findings and conclusions The manuscript is well written and presents a useful computational tool for comparison of gene annotations between genome assemblies. I have two minor comments for the Methods section. Variants Do transcripts include UTRs? If yes, the applicability is limited to genomes with annotated UTRs, if no – the term transcript should be defined as such. Clusters In the sentence: “Next, if Liftoff was run with the -copies option to identify extra gene copies in the target genome, we add the extra copies to the same cluster as their closest paralog.” The meaning of the “-copies” option, the difference with the default run, was not described. Is the rationale for developing the new software tool clearly explained? Yes Is the description of the software tool technically sound? Yes Are sufficient details of the code, methods and analysis (if applicable) provided to allow replication of the software development and its use by others? Yes Is sufficient information provided to allow interpretation of the expected output datasets and any results generated using the tool? Yes Are the conclusions about the tool and its performance adequately supported by the findings presented in the article? Yes Competing Interests No competing interests were disclosed. Reviewer Expertise Bioinformatics, Genome Analysis I confirm that I have read this submission and believe that I have an appropriate level of expertise to confirm that it is of an acceptable scientific standard. reply Respond to this report Responses (1) Author Response 29 Apr 2024 Alaina Shumate, Biomedical Engineering, Johns Hopkins University, Baltimore, 21218, USA Comment 1 Variants Do transcripts include UTRs? If yes, the applicability is limited to genomes with annotated UTRs, if no – the term transcript should be defined as such. Response 1 The mRNA transcripts are aligned which we derive by concatenating all of the ‘exon’ features in the GFF3 annotation. Some annotations include UTRs in the 5’ or 3’ exons. In these cases, yes, the UTRs are included. Others annotate them separately as their own feature upstream or downstream of exons. In these cases, they are not included. While the full transcript is used to calculate sequence identity, variants are only called within the amino acid sequence, so the module can be applied to genomes with or without annotated UTRs with no effect on the number or types of variants reported. Comment 2 Clusters In the sentence: “Next, if Liftoff was run with the -copies option to identify extra gene copies in the target genome, we add the extra copies to the same cluster as their closest paralog.” The meaning of the “-copies” option, the difference with the default run, was not described. Response 2 I have updated the manuscript to include the text below for clarification: “Next, if Liftoff was run with the -copies option to identify extra gene copies in the target genome, we add the extra copies to the same cluster as their closest paralog. If Liftoff was run without the -copies option, no extra gene copies will be present in the target annotation, and thus the clusters module will only report instances of copy number loss.” View more View less Competing Interests No competing interests were disclosed. reply Respond Report a concern Borodovsky M. Peer Review Report For: LiftoffTools: a toolkit for comparing gene annotations mapped between genome assemblies [version 2; peer review: 2 approved] . F1000Research 2024, 11 :1230 ( https://doi.org/10.5256/f1000research.136230.r212791) NOTE: it is important to ensure the information in square brackets after the title is included in this citation. The direct URL for this report is: https://f1000research.com/articles/11-1230/v1#referee-response-212791 keyboard_arrow_left Back to all reports Reviewer Report 0 Views copyright © 2022 Frankish A. This is an open access peer review report distributed under the terms of the Creative Commons Attribution License , which permits unrestricted use, distribution, and reproduction in any medium, provided the original work is properly cited. 01 Dec 2022 | for Version 1 Adam Frankish , European Bioinformatics Institute, Wellcome Genome Campus, European Molecular Biology Laboratory, Cambridge, UK 0 Views copyright © 2022 Frankish A. This is an open access peer review report distributed under the terms of the Creative Commons Attribution License , which permits unrestricted use, distribution, and reproduction in any medium, provided the original work is properly cited. format_quote Cite this report speaker_notes Responses (1) Approved With Reservations info_outline Alongside their report, reviewers assign a status to the article: Approved The paper is scientifically sound in its current form and only minor, if any, improvements are suggested Approved with reservations A number of small changes, sometimes more significant revisions are required to address specific details and improve the papers academic merit. Not approved Fundamental flaws in the paper seriously undermine the findings and conclusions This manuscript describes a set of tools to analyze gene annotation that has been mapped between one genomic sequence and another closely related genomic sequence. The methods described build on the widely adopted Liftoff annotation transfer tool developed by the same group. The development of LiftoffTools is clearly relevant and timely as we enter an era of rapidly increasing numbers of high quality genome sequences suitable for comparison to species reference genome assemblies that are generally the focus of gene annotation effort. The description of the tools is sound and we were able to run the code with the instructions provided and generate the correct/expected output. The code is written entirely in Python and looks clear and well-organized. There is broadly sufficient information to allow interpretation of the results, although a little more guidance might be useful, for example, adding annotated examples of real data from Variant and Cluster analysis to guide users. Comments: "... as long as the feature IDs in the reference and target annotations are the same. All three modules can be run with the following command " - Is this somewhat inflexible? Not all transfer methods will preserve feature ID identically across different assemblies as they seek to avoid storing two or more features with identical IDs but different properties (sequence/length/etc). Is it possible to accommodate methods that take this approach? It is not clear from the manuscript or the supporting information in https://github.com/agshumate/LiftoffTools/blob/master/README.md how LiftoffTools handles genes that are LoF on genome 1 but functional on genome 2. Can these genes and their 'rescuing' variation be identified? While the list of variant consequences is comprehensive for the annotated CDS, it would be useful to add other LoF consequences such as disruption of core splice site to the analysis. It would also be useful to specifically state the ranking of consequences in the /README.md file for genes with multiple transcript-affecting variants as only the most significant is provided in the variation output file. Similarly, as only one variant is reported, does LiftoffTools identify (and/or flag) corrective variation e.g a second frameshift that compensates for an earlier frameshift and restores the CDS with a small aa change? In the calculation of cluster gain/loss, are haplotypic duplicated pseudogenes considered? i.e. is loss only deletion/absence of the gene or is loss (or gain) of function included as well? An example with real data in /README.md could be helpful. What is reported for variants in genes that are missing or partial on GRCh38 where it is used as a reference? An example with real data in /README.md could be helpful. The CHM13 GFF and FNA (fasta) files appear to have different chromosome names, which threw an error when running the code. Is the rationale for developing the new software tool clearly explained? Yes Is the description of the software tool technically sound? Yes Are sufficient details of the code, methods and analysis (if applicable) provided to allow replication of the software development and its use by others? Yes Is sufficient information provided to allow interpretation of the expected output datasets and any results generated using the tool? Partly Are the conclusions about the tool and its performance adequately supported by the findings presented in the article? Yes Competing Interests No competing interests were disclosed. Reviewer Expertise Gene annotation I confirm that I have read this submission and believe that I have an appropriate level of expertise to confirm that it is of an acceptable scientific standard, however I have significant reservations, as outlined above. reply Respond to this report Responses (1) Author Response 29 Apr 2024 Alaina Shumate, Biomedical Engineering, Johns Hopkins University, Baltimore, 21218, USA Comment 1 Is this somewhat inflexible? Not all transfer methods will preserve feature ID identically across different assemblies as they seek to avoid storing two or more features with identical IDs but different properties (sequence/length/etc). Is it possible to accommodate methods that take this approach? Response 1 While it would be great to accommodate all lift-over tools, without the preservation of feature IDs, identifying the reference/target gene equivalents for comparison becomes a non-trivial task. LiftoffTools was specifically designed as a post-processing toolkit for the output of Liftoff , and in our experience, other commonly used tools such as UCSC liftOver do indeed preserve feature IDs. Furthermore, the GFF3 specification states that all feature IDs must be unique. If a transfer method is changing IDs to eliminate duplicates, this is an issue of the reference annotation failing to adhere to the GFF3 specifications and should be addressed prior to mapping annotations. Comment 2 It is not clear from the manuscript or the supporting information in https://github.com/agshumate/LiftoffTools/blob/master/README.md how LiftoffTools handles genes that are LoF on genome 1 but functional on genome 2. Can these genes and their 'rescuing' variation be identified? Response 2 Currently, LiftoffTools does not identify ‘rescuing’ variants. In our particular case, we used the RefSeq annotation as a reference, which requires a valid open reading frame to annotate a coding sequence; therefore, there are no LoF coding sequences annotated in the reference to be mapped. We recognize that this is not true for all reference annotations; many include annotations of coding sequences without a valid open reading frame. There are varying schools of thought on whether this is acceptable, but regardless, we do agree that identifying rescuing or gain of function variants would be useful, and we will consider implementing that feature in the future. We have updated the manuscript to say “the module identifies variants that have a neutral or deleterious effect on the translated amino acid sequences in the target genome.” The README has also been updated. Comment 3 While the list of variant consequences is comprehensive for the annotated CDS, it would be useful to add other LoF consequences such as disruption of core splice site to the analysis. Response 3 We do agree that splice site variants would be useful to include, but we are currently only aligning and looking at variants in the mRNA due to computational limitations. Performing Smith-Waterman alignment on transcript sequences including splice-sites and introns would require significant computational resources for human and other eukaryotic genomes. Even with a very fast implementation of the Smith-Waterman alignment, aligning just the mRNA and amino acid sequences is the computational bottleneck of the LiftoffTools pipeline. While faster alignment methods could alleviate this, they would not have the same accuracy as Smith-Waterman, which we feel is necessary for accurately identifying the position and type of variants. We have edited the manuscript to specifically state that we are aligning mRNA sequences. Comment 4 It would also be useful to specifically state the ranking of consequences in the /README.md file for genes with multiple transcript-affecting variants as only the most significant is provided in the variation output file. Response 4 Thank you for the suggestion. I have updated the README.md accordingly. Comment 5 Similarly, as only one variant is reported, does LiftoffTools identify (and/or flag) corrective variation e.g a second frameshift that compensates for an earlier frameshift and restores the CDS with a small aa change? Response 5 We do not report this explicitly. The intent of the variants module is to provide high level summary information about how many genes were disrupted by variants rather than identifying every variant in every gene. We do however include the amino-acid level sequence identity information, so compensatory frameshifts can be inferred if a sequence is reported to have a frameshift but also retains a high sequence identity to the reference protein. We have added the following text to the manuscript to capture these points. “While there may be multiple variants within a transcript, the intent of this module is to summarize the functional consequences of variation; therefore, if there is more than one variant, we report only the most severe. For example, if a transcript has a synonymous mutation and a frameshift mutation, we output ‘frameshift’ for that transcript as this would be more disruptive to gene function. Combining the sequence identity information with the variant effect can provide further insights into the severity of the variant. For example, a gene with a frameshift near the 3’ end or a gene with a compensatory frameshift nearby will have a high percent identity at the amino acid level and may still retain function.” Comment 6 In the calculation of cluster gain/loss, are haplotypic duplicated pseudogenes considered? i.e. is loss only deletion/absence of the gene or is loss (or gain) of function included as well? An example with real data in /README.md could be helpful. Response 6 This is a good point. Liftoff intentionally avoids annotating extra gene copies in the target genome that are processed pseudogenes by including introns in the initial alignment step. Therefore, when working with the output of Liftoff, it is not something we need to consider. If a different annotation tool was used that does annotate pseudogenes, they will get clustered with their paralogs even if they are not functional. As previously mentioned, LiftoffTools was designed to be used in conjunction with Liftoff, so we have not considered a strategy for removing non-functional pseudogene copies from the clusters. Comment 7 What is reported for variants in genes that are missing or partial on GRCh38 where it is used as a reference? An example with real data in /README.md could be helpful. Response 7 Variants are only reported for genes that are in both GRCh38 and CHM13. We state in the manuscript “ The variants module calculates the sequence identity between mRNA transcripts in the reference genome and the corresponding transcripts in the target genome…” A limitation of lifting over gene annotations is that a partial reference gene will likely also be annotated as partial in the target annotation. There are various lift-over algorithms/strategies; however, they generally rely on converting the start and end coordinates of the gene from reference to target. If the start-end range is only a partial gene, only that part of the gene will be lifted over. In these cases, they will be reported as either a 5’ truncation or a 3’ truncation based on the presence or absence of start and stop codons. Comment 8 The CHM13 GFF and FNA (fasta) files appear to have different chromosome names, which threw an error when running the code. Response 8 Thank you for bringing this to our attention. The link to the fasta file has been replaced to a file with the same chromosome names. View more View less Competing Interests No competing interests were disclosed. reply Respond Report a concern Frankish A. Peer Review Report For: LiftoffTools: a toolkit for comparing gene annotations mapped between genome assemblies [version 2; peer review: 2 approved] . F1000Research 2024, 11 :1230 ( https://doi.org/10.5256/f1000research.136230.r154534) NOTE: it is important to ensure the information in square brackets after the title is included in this citation. The direct URL for this report is: https://f1000research.com/articles/11-1230/v1#referee-response-154534 Alongside their report, reviewers assign a status to the article: Approved - the paper is scientifically sound in its current form and only minor, if any, improvements are suggested Approved with reservations - A number of small changes, sometimes more significant revisions are required to address specific details and improve the papers academic merit. Not approved - fundamental flaws in the paper seriously undermine the findings and conclusions Adjust parameters to alter display View on desktop for interactive features Includes Interactive Elements View on desktop for interactive features Competing Interests Policy Provide sufficient details of any financial or non-financial competing interests to enable users to assess whether your comments might lead a reasonable person to question your impartiality. Consider the following examples, but note that this is not an exhaustive list: Examples of 'Non-Financial Competing Interests' Within the past 4 years, you have held joint grants, published or collaborated with any of the authors of the selected paper. You have a close personal relationship (e.g. parent, spouse, sibling, or domestic partner) with any of the authors. You are a close professional associate of any of the authors (e.g. scientific mentor, recent student). You work at the same institute as any of the authors. You hope/expect to benefit (e.g. favour or employment) as a result of your submission. You are an Editor for the journal in which the article is published. Examples of 'Financial Competing Interests' You expect to receive, or in the past 4 years have received, any of the following from any commercial organisation that may gain financially from your submission: a salary, fees, funding, reimbursements. You expect to receive, or in the past 4 years have received, shared grant support or other funding with any of the authors. You hold, or are currently applying for, any patents or significant stocks/shares relating to the subject matter of the paper you are commenting on. Stay Updated Sign up for content alerts and receive a weekly or monthly email with all newly published articles Register with F1000Research Already registered? Sign in Not now, thanks close PLEASE NOTE If you are an AUTHOR of this article, please check that you signed in with the account associated with this article otherwise we cannot automatically identify your role as an author and your comment will be labelled as a “User Comment”. If you are a REVIEWER of this article, please check that you have signed in with the account associated with this article and then go to your account to submit your report, please do not post your review here. If you do not have access to your original account, please contact us . All commenters must hold a formal affiliation as per our Policies . The information that you give us will be displayed next to your comment. User comments must be in English, comprehensible and relevant to the article under discussion. We reserve the right to remove any comments that we consider to be inappropriate, offensive or otherwise in breach of the User Comment Terms and Conditions . Commenters must not use a comment for personal attacks. When criticisms of the article are based on unpublished data, the data should be made available. I accept the User Comment Terms and Conditions Please confirm that you accept the User Comment Terms and Conditions. Affiliation ✕ refresh Please enter your institution. Note: To add your institution or organisation, start typing the name and then select the correct name from the list. Where applicable, the name will appear in both the original language and in English. Do not paste in the name. If the name does not appear in the drop-down list, we will display the information you have entered. ✕ refresh Country/Region * USA UK Canada China France Germany Afghanistan Aland Islands Albania Algeria American Samoa Andorra Angola Anguilla Antarctica Antigua and Barbuda Argentina Armenia Aruba Australia Austria Azerbaijan Bahamas Bahrain Bangladesh Barbados Belarus Belgium Belize Benin Bermuda Bhutan Bolivia Bosnia and Herzegovina Botswana Bouvet Island Brazil British Indian Ocean Territory British Virgin Islands Brunei Bulgaria Burkina Faso Burundi Cambodia Cameroon Canada Cape Verde Cayman Islands Central African Republic Chad Chile China Christmas Island Cocos (Keeling) Islands Colombia Comoros Congo Cook Islands Costa Rica Cote d'Ivoire Croatia Cuba Cyprus Czech Republic Democratic Republic of the Congo Denmark Djibouti Dominica Dominican Republic Ecuador Egypt El Salvador Equatorial Guinea Eritrea Estonia Ethiopia Falkland Islands Faroe Islands Federated States of Micronesia Fiji Finland France French Guiana French Polynesia French Southern Territories Gabon Georgia Germany Ghana Gibraltar Greece Greenland Grenada Guadeloupe Guam Guatemala Guernsey Guinea Guinea-Bissau Guyana Haiti Heard Island and Mcdonald Islands Holy See (Vatican City State) Honduras Hong Kong Hungary Iceland India Indonesia Iran Iraq Ireland Israel Italy Jamaica Japan Jersey Jordan Kazakhstan Kenya Kiribati Kosovo (Serbia and Montenegro) Kuwait Kyrgyzstan Lao People's Democratic Republic Latvia Lebanon Lesotho Liberia Libya Liechtenstein Lithuania Luxembourg Macao Madagascar Malawi Malaysia Maldives Mali Malta Marshall Islands Martinique Mauritania Mauritius Mayotte Mexico Minor Outlying Islands of the United States Moldova Monaco Mongolia Montenegro Montserrat Morocco Mozambique Myanmar Namibia Nauru Nepal Netherlands Antilles New Caledonia New Zealand Nicaragua Niger Nigeria Niue Norfolk Island North Korea North Macedonia Northern Mariana Islands Norway Oman Pakistan Palau Palestinian Territory Panama Papua New Guinea Paraguay Peru Philippines Pitcairn Poland Portugal Puerto Rico Qatar Reunion Romania Russian Federation Rwanda Saint Helena Saint Kitts and Nevis Saint Lucia Saint Pierre and Miquelon Saint Vincent and the Grenadines Samoa San Marino Sao Tome and Principe Saudi Arabia Senegal Serbia Seychelles Sierra Leone Singapore Slovakia Slovenia Solomon Islands Somalia South Africa South Georgia and the South Sandwich Is South Korea South Sudan Spain Sri Lanka Sudan Suriname Svalbard and Jan Mayen Swaziland Sweden Switzerland Syria Taiwan Tajikistan Tanzania Thailand The Gambia The Netherlands Timor-Leste Togo Tokelau Tonga Trinidad and Tobago Tunisia Turkey Turkmenistan Turks and Caicos Islands Tuvalu UK USA Uganda Ukraine United Arab Emirates United States Virgin Islands Uruguay Uzbekistan Vanuatu Venezuela Vietnam Wallis and Futuna West Bank and Gaza Strip Western Sahara Yemen Zambia Zimbabwe Please select your country/region. You must enter a comment. Competing Interests Please disclose any competing interests that might be construed to influence your judgment of the article's or peer review report's validity or importance. Competing Interests Policy Provide sufficient details of any financial or non-financial competing interests to enable users to assess whether your comments might lead a reasonable person to question your impartiality. Consider the following examples, but note that this is not an exhaustive list: Examples of 'Non-Financial Competing Interests' Within the past 4 years, you have held joint grants, published or collaborated with any of the authors of the selected paper. You have a close personal relationship (e.g. parent, spouse, sibling, or domestic partner) with any of the authors. You are a close professional associate of any of the authors (e.g. scientific mentor, recent student). You work at the same institute as any of the authors. You hope/expect to benefit (e.g. favour or employment) as a result of your submission. You are an Editor for the journal in which the article is published. Examples of 'Financial Competing Interests' You expect to receive, or in the past 4 years have received, any of the following from any commercial organisation that may gain financially from your submission: a salary, fees, funding, reimbursements. You expect to receive, or in the past 4 years have received, shared grant support or other funding with any of the authors. You hold, or are currently applying for, any patents or significant stocks/shares relating to the subject matter of the paper you are commenting on. Please state your competing interests The comment has been saved. An error has occurred. Please try again. Cancel Post var lTitle = "LiftoffTools: a toolkit for comparing gene...".replace("'", ''); var linkedInUrl = "http://www.linkedin.com/shareArticle?url=https://f1000research.com/articles/11-1230/v2" + "&title=" + encodeURIComponent(lTitle) + "&summary=" + encodeURIComponent('Read the article by '); var deliciousUrl = "https://del.icio.us/post?url=https://f1000research.com/articles/11-1230/v2&title=" + encodeURIComponent(lTitle); var redditUrl = "http://reddit.com/submit?url=https://f1000research.com/articles/11-1230/v2" + "&title=" + encodeURIComponent(lTitle); linkedInUrl += encodeURIComponent('Shumate A and Salzberg S'); var offsetTop = /chrome/i.test( navigator.userAgent ) ? 4 : -10; var addthis_config = { ui_offset_top: offsetTop, services_compact : "facebook,twitter,www.linkedin.com,www.mendeley.com,reddit.com", services_expanded : "facebook,twitter,www.linkedin.com,www.mendeley.com,reddit.com", services_custom : [ { name: "LinkedIn", url: linkedInUrl, icon:"/img/icon/at_linkedin.svg" }, { name: "Mendeley", url: "http://www.mendeley.com/import/?url=https://f1000research.com/articles/11-1230/v2/mendeley", icon:"/img/icon/at_mendeley.svg" }, { name: "Reddit", url: redditUrl, icon:"/img/icon/at_reddit.svg" }, ] }; var addthis_share = { url: "https://f1000research.com/articles/11-1230", templates : { twitter : "LiftoffTools: a toolkit for comparing gene annotations mapped.... Shumate A and Salzberg S, published by " + "@F1000Research" + ", https://f1000research.com/articles/11-1230/v2" } }; if (typeof(addthis) != "undefined"){ addthis.addEventListener('addthis.ready', checkCount); addthis.addEventListener('addthis.menu.share', checkCount); } $(".f1r-shares-twitter").attr("href", "https://twitter.com/intent/tweet?text=" + addthis_share.templates.twitter); $(".f1r-shares-facebook").attr("href", "https://www.facebook.com/sharer/sharer.php?u=" + addthis_share.url); $(".f1r-shares-linkedin").attr("href", addthis_config.services_custom[0].url); $(".f1r-shares-reddit").attr("href", addthis_config.services_custom[2].url); $(".f1r-shares-mendelay").attr("href", addthis_config.services_custom[1].url); function checkCount(){ setTimeout(function(){ $(".addthis_button_expanded").each(function(){ var count = $(this).text(); if (count !== "" && count != "0") $(this).removeClass("is-hidden"); else $(this).addClass("is-hidden"); }); }, 1000); } close How to cite this report {{reportCitation}} Cancel Copy Citation Details $(function(){R.ui.buttonDropdowns('.dropdown-for-downloads');}); $(function(){R.ui.toolbarDropdowns('.toolbar-dropdown-for-downloads');}); $.get("/articles/acj/124059/164429") new F1000.Clipboard(); new F1000.ThesaurusTermsDisplay("articles", "article", "164429"); $(document).ready(function() { $( "#frame1" ).on('load', function() { var mydiv = $(this).contents().find("div"); var h = mydiv.height(); console.log(h) }); var tooltipLivingFigure = jQuery(".interactive-living-figure-label .icon-more-info"), titleLivingFigure = tooltipLivingFigure.attr("title"); tooltipLivingFigure.simpletip({ fixed: true, position: ["-115", "30"], baseClass: 'small-tooltip', content:titleLivingFigure + " " }); tooltipLivingFigure.removeAttr("title"); $("body").on("click", ".cite-living-figure", function(e) { e.preventDefault(); var ref = $(this).attr("data-ref"); $(this).closest(".living-figure-list-container").find("#" + ref).fadeIn(200); }); $("body").on("click", ".close-cite-living-figure", function(e) { e.preventDefault(); $(this).closest(".popup-window-wrapper").fadeOut(200); }); $(document).on("mouseup", function(e) { var metricsContainer = $(".article-metrics-popover-wrapper"); if (!metricsContainer.is(e.target) && metricsContainer.has(e.target).length === 0) { $(".article-metrics-close-button").click(); } }); var articleId = $('#articleId').val(); if($("#main-article-count-box").attachArticleMetrics) { $("#main-article-count-box").attachArticleMetrics(articleId, { articleMetricsView: true }); } }); var figshareWidget = $(".new_figshare_widget"); if (figshareWidget.length > 0) { window.figshare.load("f1000", function(Widget) { // Select a tag/tags defined in your page. In this tag we will place the widget. _.map(figshareWidget, function(el){ var widget = new Widget({ articleId: $(el).attr("figshare_articleId") //height:300 // this is the height of the viewer part. [Default: 550] }); widget.initialize(); // initialize the widget widget.mount(el); // mount it in a tag that's on your page // this will save the widget on the global scope for later use from // your JS scripts. This line is optional. //window.widget = widget; }); }); } close Error Close Add Reset F1000.MICROSERVICES.AFFILIATION = ''; $(document).ready(function () { $('.js-affiliations-form').each((index, form) => { new AffiliationForm({ formId: form.id, institutionErrorSelector: '.comment-enter-institution', departmentErrorSelector: '.comment-enter-department', placeSelector: '.js-add-comment-place', stateSelector: '.js-add-comment-state', zipCodeSelector: '.js-add-comment-zipcode', countrySelector: '.js-add-comment-country', countryErrorSelector: '.comment-enter-country', }); }); }); $(document).ready(function () { var reportIds = { "174474": 0, "174475": 0, "270094": 0, "270095": 6, "174473": 0, "174478": 0, "174479": 0, "174476": 0, "174477": 0, "174482": 0, "171282": 0, "171283": 0, "174480": 0, "171280": 0, "174481": 0, "171281": 0, "171286": 0, "171287": 0, "171284": 0, "171285": 0, "171288": 0, "156572": 0, "154534": 41, "154535": 0, "154536": 0, "154537": 0, "164270": 0, "164268": 0, "164269": 0, "212787": 0, "212786": 0, "212791": 33, "212790": 0, "154548": 0, "212789": 0, "212788": 0, "212794": 0, "212793": 0, "212792": 0, "167370": 0, "167371": 0, "167374": 0, "167375": 0, "167372": 0, "167373": 0, "167378": 0, "167379": 0, "167376": 0, "167377": 0, "212828": 0, "172902": 0, "172903": 0, "172906": 0, "172907": 0, "172904": 0, "172905": 0, "172910": 0, "172911": 0, "172908": 0, "172909": 0, }; $(".referee-response-container,.js-referee-report").each(function(index, el) { var reportId = $(el).attr("data-reportid"), reportCount = reportIds[reportId] || 0; $(el).find(".comments-count-container,.js-referee-report-views").html(reportCount); }); var uuidInput = $("#article_uuid"), oldUUId = uuidInput.val(), newUUId = "0b8d11f0-9931-408e-862c-a218a54e1570"; uuidInput.val(newUUId); $("a[href*='article_uuid=']").each(function(index, el) { var newHref = $(el).attr("href").replace(oldUUId, newUUId); $(el).attr("href", newHref); }); }); An innovative open access publishing platform offering rapid publication and open peer review, whilst supporting data deposition and sharing. Browse Gateways Collections How it Works Contact For Developers Cookie Notice Privacy Notice RSS Submit Your Research Follow us © 2012-2026 F1000 Research Ltd. ISSN 2046-1402 | Legal | Partner of Research4Life • CrossRef • ORCID • FAIRSharing R.templateTests.simpleTemplate = R.template(' $text $text $text $text $text '); R.templateTests.runTests(); var F1000platform = new F1000.Platform({ name: "f1000research", displayName: "F1000Research", hostName: "f1000research.com", id: "1", editorialEmail: "[email protected]", infoEmail: "[email protected]", usePmcStats: true }); $(function(){R.ui.dropdowns('.dropdown-for-authors, .dropdown-for-about, .dropdown-for-myresearch');}); // $(function(){R.ui.dropdowns('.dropdown-for-referees');}); $(document).ready(function () { if ($(".cookie-warning").is(":visible")) { $(".sticky").css("margin-bottom", "35px"); $(".devices").addClass("devices-and-cookie-warning"); } $(".cookie-warning .close-button").click(function (e) { $(".devices").removeClass("devices-and-cookie-warning"); $(".sticky").css("margin-bottom", "0"); }); $("#tweeter-feed .tweet-message").each(function (i, message) { var self = $(message); self.html(linkify(self.html())); }); $(".partner").on("mouseenter mouseleave", function() { $(this).find(".gray-scale, .colour").toggleClass("is-hidden"); }); }); Sign In Remember me Forgotten your password? Sign In Cancel Email or password not correct. Please try again Please wait... $(function(){ // Note: All the setup needs to run against a name attribute and *not* the id due the clonish // nature of facebox... $("a[id=googleSignInButton]").click(function(event){ event.preventDefault(); $("input[id=oAuthSystem]").val("GOOGLE"); $("form[id=oAuthForm]").submit(); }); $("a[id=facebookSignInButton]").click(function(event){ event.preventDefault(); $("input[id=oAuthSystem]").val("FACEBOOK"); $("form[id=oAuthForm]").submit(); }); $("a[id=orcidSignInButton]").click(function(event){ event.preventDefault(); $("input[id=oAuthSystem]").val("ORCID"); $("form[id=oAuthForm]").submit(); }); }); If you've forgotten your password, please enter your email address below and we'll send you instructions on how to reset your password. The email address should be the one you originally registered with F1000. Email address not valid, please try again You registered with F1000 via Google, so we cannot reset your password. To sign in, please click here . If you still need help with your Google account password, please click here . You registered with F1000 via Facebook, so we cannot reset your password. To sign in, please click here . If you still need help with your Facebook account password, please click here . Code not correct, please try again Reset password Cancel Email us for further assistance. Server error, please try again. If your email address is registered with us, we will email you instructions to reset your password. If you think you should have received this email but it has not arrived, please check your spam filters and/or contact for further assistance. Please wait... Register $(document).ready(function () { signIn.createSignInAsRow($("#sign-in-form-gfb-popup")); $(".target-field").each(function () { var uris = $(this).val().split("/"); if (uris.pop() === "login") { $(this).val(uris.toString().replace(",","/")); } }); });

Text is read by the "Ask this paper" AI Q&A widget below. Extraction quality varies by source — PMC NXML preserves structure cleanly, OA-HTML may include some navigation residue, and OA-PDF can have broken hyphenation. The publisher copy (via DOI) is the canonical version.

My notes (saved in your browser only)

Ask this paper AI returns verbatim quotes from the full text · source: preprint-html

Answers must be backed by verbatim quotes from this paper's full text. Hallucinated quotes are dropped automatically; if no verbatim passage answers the question, we say so. How this works

Citation neighborhood (no data yet)

We don't have any in-corpus citations linked to this paper yet. This is a recent paper (2024) — citers typically take a year or two to land, and the OpenAlex reference graph may still be filling in.

Source provenance

europepmc
last seen: 2026-05-20T01:45:00.602351+00:00