Public
Edited
May 22, 2023
Paused
1 fork
Insert cell
Insert cell
classTable = data.data
Insert cell
data = {
const results = {
data: [],
error: [],
log: []
}
for (const rub of allDataWithVectors/*.filter(c => c.reg === 7)*/) {
const carbChain = chainData.results.find(d => d.carb.carbIndex === rub.reg)
const carbVol = carbVolumes.find(d => d.carbIndex === rub.reg)
let partners = new Array(10).fill(null)
const inChain = carbChain.s.chains.flat().includes(rub.tag) ? 1 : 0
const vecs = []
let above, below
let distAbove, distBelow = null
let nc = null
let lc = null
let innerChain = 0
const twists = [
null, null
]
const bends = [
null, null
]
if (inChain) {
const chain = carbChain.s.chains.find(d => d.includes(rub.tag))
const leadChain = leadingVector.find(c => c.chain.includes(rub.tag))
innerChain = innerChainData.find(d => d.chain.includes(rub.tag)) ? 1 : 0
chain.forEach((tag, i) => {
partners[i] = tag
const rp = allDataWithVectors.find(d => d.tag === tag)
if (!rp) {
console.log(tag)
}
const rpPos = math.matrix([rp.x, rp.y, rp.z])
const rubPos = math.matrix([rub.x, rub.y, rub.z])
const dVec = math.subtract(rpPos, rubPos)
const dot = math.multiply(dVec, rub.vec)
vecs.push([tag, dot, rpPos, rubPos, dVec])
})
above = vecs.filter(d => d[1] > 0)
above.sort((a, b) => a[1] - b[1])
if (above.length > 0 ) {
distAbove = above[0][1]
const rubAbove = allDataWithVectors.find(d => d.tag === above[0][0])
twists[0] = calcTwist(rub, rubAbove, leadChain)
bends[0] = calcBends(rub, rubAbove)
}
below = vecs.filter(d => d[1] < 0)
below.sort((a, b) => math.abs(a[1]) - math.abs(b[1]))
if (below.length > 0 ) {
distBelow = below[0][1]
const rubBelow = allDataWithVectors.find(d => d.tag === below[0][0])
twists[1] = calcTwist(rub, rubBelow, leadChain)
bends[1] = calcBends(rub, rubBelow)
}

const neighborChains = angles
.results
.filter(d => d.chainId1 === leadChain.chainId || d.chainId2 === leadChain.chainId)
.sort((a, b) => b.dist - a.dist)
if (neighborChains.length > 0) {
nc = neighborChains[0].dist
}


}
results.data.push([
rub.tag,
carbChain.carb.carbIndex,
carbChain.carb.volume,
carbChain.carb.concentration,
carbChain.carb.innerConcentration,
!carbVol.tagsInside.includes(rub.tag) ? 1 : 0,
inChain,
innerChain,
...partners,
distAbove,
distBelow,
nc,
...twists,
...bends
])
}
return results
}
Insert cell
calcBends = (rub1, rub2) => {
const tmpBend = math.dot(rub1.vec, rub2.vec)
return tmpBend > 0 ? tmpBend : math.dot(rub1.vec, math.dotMultiply(rub2.vec, -1))
}
Insert cell
calcTwist = (rub1, rub2, leadChain) => {
const narot1Raw = calcNarot(rub1, leadChain.leadVector)
const narot2Raw = calcNarot(rub2, leadChain.leadVector)

const narot1Sym = narot1Raw < 0 ? (360 + (narot1Raw % 360) ) % 90 : (narot1Raw%360) % 90
const narot2Sym = narot2Raw < 0 ? (360 + (narot2Raw % 360) ) % 90 : (narot2Raw%360) % 90

const dAngle = narot1Sym - narot2Sym
return dAngle > 45 ? 90 - dAngle : (dAngle < -45 ? 90 + dAngle : dAngle)
}
Insert cell
calcNarot = (r, chain) => {
return math.dot(chain, r.vec) > 0 ? r.narot : -r.narot
}
Insert cell
allDataWithVectors
Insert cell
angles
.results
.filter(d => d.chainId1 === 219 || d.chainId2 === 219)
//
Insert cell
Insert cell
Insert cell
import {leadingVector, angles } from '90aab28d3875d5e5'//Chain stats
Insert cell
import { innerChainData } from 'a34d77dd765f3fa3'
Insert cell
math = require("mathjs@7.6.0")
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more