Loading app/src/components/RightPanel/ChromatinViewportConfigurationPanel.tsx +25 −13 Original line number Diff line number Diff line Loading @@ -129,7 +129,7 @@ export function ChromatinViewportConfigurationPanel(props: { }); const densityDataOptions = data.data .filter(d => d.type == "sparse-1d-data-text" || d.type == "sparse-1d-data-numerical") .filter(d => d.type == "sparse-1d-data-text" || d.type == "sparse-1d-data-numerical" || d.type == 'bed-annotation') .map(d => { return { key: isoDataID.unwrap(d.id), Loading Loading @@ -355,17 +355,29 @@ export function ChromatinViewportConfigurationPanel(props: { const [isSingleColorCalloutVisible, setIsSingleColorCalloutVisible] = useState<boolean>(false); const setColorMappingData = (event: React.FormEvent<IComboBox>, option?: IComboBoxOption) => { // if (option) { // const selectedDataId: number = option.key as number; console.log('color mapping change', configuration.selectedDatum); if (option && configuration.selectedDatum != null) { console.log('before', configuration.data[configuration.selectedDatum].mapValues); // updateConfiguration({ // ...configuration, // mapValues: { // ...configuration.mapValues, // id: selectedDataId, // }, // }); // } const selectedDataId: number = option.key as number; const newData = configuration.data; newData[configuration.selectedDatum] = { ...newData[configuration.selectedDatum], colorMappingMode: '1d-density', mapValues: { ...newData[configuration.selectedDatum].mapValues, id: selectedDataId, } }; updateConfiguration({ ...configuration, data: newData }); console.log('after', configuration.data[configuration.selectedDatum].mapValues) } }; const setSasaConfiguration = (sasaConfiguration: { method: "constant" | "generated", probeSize: number, accuracy: number, individual: boolean }) => { Loading Loading @@ -633,8 +645,8 @@ export function ChromatinViewportConfigurationPanel(props: { {configuration.selectedDatum != null && configuration.data.length > configuration.selectedDatum && (<Slider label="Radius" min={configuration.data[configuration.selectedDatum].radiusRange.min} max={configuration.data[configuration.selectedDatum].radiusRange.max} min={0.0} max={configuration.data[configuration.selectedDatum].radiusRange.max * 2.0} step={(configuration.data[configuration.selectedDatum].radiusRange.max - configuration.data[configuration.selectedDatum].radiusRange.min) / 100.0} value={toNumber(configuration.data[configuration.selectedDatum].radius)} showValue={false} Loading app/src/components/viewports/ChromatinViewport.tsx +62 −3 Original line number Diff line number Diff line Loading @@ -239,15 +239,20 @@ export function ChromatinViewport(props: { const newColors = new Array(configuration.data.length); for (const [configurationDatumIndex, configurationDatum] of configuration.data.entries()) { const datum = data.data.find(d => d.id === configurationDatum.id)?.values as Positions3D; const datum: Data | undefined = data.data.find(d => d.id === configurationDatum.id); if (!datum) { continue; } const datumPositions = datum.values as Positions3D; const chromatinPart = viewport.getChromatinPartByDataId(configurationDatumIndex); let dataMarkers = null; if (!datum || !chromatinPart) { if (!datumPositions || !chromatinPart) { continue; } const positions = datum.positions; const positions = datumPositions.positions; const binsAmount = chromatinPart.getBinsPositions().length; Loading Loading @@ -302,6 +307,60 @@ export function ChromatinViewport(props: { const colorScale = chroma.scale(['#fcfdfd', '#010a4e']); newColors[configurationDatumIndex] = chromatinPart.cacheColorArray(mapScaleToChromatin(chromatinPart, globalSasaValues, colorScale)); } else if (configurationDatum.colorMappingMode == "1d-density") { const data1d: Array<{ chromosome: string, from: number, to: number }> | null = data.data.find(d => d.id == isoDataID.wrap(configurationDatum.mapValues.id))?.values as Sparse1DTextData | Sparse1DNumericData | null; if (!data1d || !(datum.type == '3d-positions')) { return; } const datumTyped = datum as BinPositionsData; const countPerBin: Array<number> = new Array(binsAmount).fill(0); const chromosomeData1d = [...data1d.map(v => {return { ...v }})]; const res = datumTyped.basePairsResolution; const connectivity = datumTyped.values.connectivity; if (connectivity) { const indexes = []; for(let i = 0; i < connectivity.length; i++) { if (connectivity[i] === 0) indexes.push(i); } for(const [i, offset] of indexes.entries()) { const underChrosome = chromosomeData1d.filter(c => parseInt(c.chromosome) === i + 1); for (const v of underChrosome) { v.from += offset * res; v.to += offset * res; } } } for (let binIndex = 0; binIndex < binsAmount; binIndex++) { for (const datum of chromosomeData1d) { if (datum.from <= (binIndex + 1) * res && datum.to >= binIndex * res) { countPerBin[binIndex] += 1; } } } const logCountPerBin = countPerBin.map(v => Math.log(v) + 1); const colorScale = chroma.scale(['#fcfdfd', '#010a4e']); newColors[configurationDatumIndex] = chromatinPart.cacheColorArray(mapScaleToChromatin(chromatinPart, logCountPerBin, colorScale)); } else if (configurationDatum.colorMappingMode == "linear-order") { const colorScale = chroma.scale(['#0d1a29', '#133250', '#1e4c7b', '#3868a7', '#658ac6', '#88a0c9', '#aab6ca', '#d3d6da']); const numbers = [...Array(binsAmount).keys()]; console.log(numbers); newColors[configurationDatumIndex] = chromatinPart.cacheColorArray(mapScaleToChromatin(chromatinPart, numbers, colorScale)); } } Loading libs/graphics/src/shaders/2d/distance_map.wgsl +8 −5 Original line number Diff line number Diff line Loading @@ -180,18 +180,21 @@ fn main_fragment( // finalColor = mix(colors[2], colors[3], (newWeight - 0.66) / 0.33); // } let colors = array<vec3<f32>, 4>( let colors = array<vec3<f32>, 5>( vec3<f32>(0.17254901960784313725490196078431, 0.10980392156862745098039215686275, 0.30980392156862745098039215686275), vec3<f32>(0.29411764705882352941176470588235, 0.45882352941176470588235294117647, 0.62745098039215686274509803921569), vec3<f32>(1.0), vec3<f32>(0.4078431372549019607843137254902, 0.4078431372549019607843137254902, 0.31372549019607843137254901960784), vec3<f32>(0.15294117647058823529411764705882, 0.15294117647058823529411764705882, 0.0078431372549019607843137254902), ); if (newWeight < 0.50) { finalColor = mix(colors[0], colors[1], newWeight / 0.50); if (newWeight < 0.25) { finalColor = mix(colors[0], colors[1], newWeight / 0.25); } else if (newWeight < 0.50) { finalColor = mix(colors[1], colors[2], (newWeight - 0.25) / 0.25); } else if (newWeight < 0.75) { finalColor = mix(colors[1], colors[2], (newWeight - 0.50) / 0.25); finalColor = mix(colors[2], colors[3], (newWeight - 0.50) / 0.25); } else { finalColor = mix(colors[2], colors[3], (newWeight - 0.75) / 0.25); finalColor = mix(colors[3], colors[4], (newWeight - 0.75) / 0.25); } return FragmentOutput( Loading libs/graphics/src/shaders/postprocess/ssao.wgsl +1 −1 Original line number Diff line number Diff line Loading @@ -66,7 +66,7 @@ main(@builtin(global_invocation_id) GlobalInvocationID let TBN = mat3x3<f32>(tangent, bitangent, viewSpaceNormal); var occlusion = 0.0; let numberOfSamples = 4; let numberOfSamples = 32; for (var i = 0; i < numberOfSamples; i = i + 1) { // get sample position var samplePos = TBN * globals.noiseSamples[i].xyz; // from tangent to view-space Loading Loading
app/src/components/RightPanel/ChromatinViewportConfigurationPanel.tsx +25 −13 Original line number Diff line number Diff line Loading @@ -129,7 +129,7 @@ export function ChromatinViewportConfigurationPanel(props: { }); const densityDataOptions = data.data .filter(d => d.type == "sparse-1d-data-text" || d.type == "sparse-1d-data-numerical") .filter(d => d.type == "sparse-1d-data-text" || d.type == "sparse-1d-data-numerical" || d.type == 'bed-annotation') .map(d => { return { key: isoDataID.unwrap(d.id), Loading Loading @@ -355,17 +355,29 @@ export function ChromatinViewportConfigurationPanel(props: { const [isSingleColorCalloutVisible, setIsSingleColorCalloutVisible] = useState<boolean>(false); const setColorMappingData = (event: React.FormEvent<IComboBox>, option?: IComboBoxOption) => { // if (option) { // const selectedDataId: number = option.key as number; console.log('color mapping change', configuration.selectedDatum); if (option && configuration.selectedDatum != null) { console.log('before', configuration.data[configuration.selectedDatum].mapValues); // updateConfiguration({ // ...configuration, // mapValues: { // ...configuration.mapValues, // id: selectedDataId, // }, // }); // } const selectedDataId: number = option.key as number; const newData = configuration.data; newData[configuration.selectedDatum] = { ...newData[configuration.selectedDatum], colorMappingMode: '1d-density', mapValues: { ...newData[configuration.selectedDatum].mapValues, id: selectedDataId, } }; updateConfiguration({ ...configuration, data: newData }); console.log('after', configuration.data[configuration.selectedDatum].mapValues) } }; const setSasaConfiguration = (sasaConfiguration: { method: "constant" | "generated", probeSize: number, accuracy: number, individual: boolean }) => { Loading Loading @@ -633,8 +645,8 @@ export function ChromatinViewportConfigurationPanel(props: { {configuration.selectedDatum != null && configuration.data.length > configuration.selectedDatum && (<Slider label="Radius" min={configuration.data[configuration.selectedDatum].radiusRange.min} max={configuration.data[configuration.selectedDatum].radiusRange.max} min={0.0} max={configuration.data[configuration.selectedDatum].radiusRange.max * 2.0} step={(configuration.data[configuration.selectedDatum].radiusRange.max - configuration.data[configuration.selectedDatum].radiusRange.min) / 100.0} value={toNumber(configuration.data[configuration.selectedDatum].radius)} showValue={false} Loading
app/src/components/viewports/ChromatinViewport.tsx +62 −3 Original line number Diff line number Diff line Loading @@ -239,15 +239,20 @@ export function ChromatinViewport(props: { const newColors = new Array(configuration.data.length); for (const [configurationDatumIndex, configurationDatum] of configuration.data.entries()) { const datum = data.data.find(d => d.id === configurationDatum.id)?.values as Positions3D; const datum: Data | undefined = data.data.find(d => d.id === configurationDatum.id); if (!datum) { continue; } const datumPositions = datum.values as Positions3D; const chromatinPart = viewport.getChromatinPartByDataId(configurationDatumIndex); let dataMarkers = null; if (!datum || !chromatinPart) { if (!datumPositions || !chromatinPart) { continue; } const positions = datum.positions; const positions = datumPositions.positions; const binsAmount = chromatinPart.getBinsPositions().length; Loading Loading @@ -302,6 +307,60 @@ export function ChromatinViewport(props: { const colorScale = chroma.scale(['#fcfdfd', '#010a4e']); newColors[configurationDatumIndex] = chromatinPart.cacheColorArray(mapScaleToChromatin(chromatinPart, globalSasaValues, colorScale)); } else if (configurationDatum.colorMappingMode == "1d-density") { const data1d: Array<{ chromosome: string, from: number, to: number }> | null = data.data.find(d => d.id == isoDataID.wrap(configurationDatum.mapValues.id))?.values as Sparse1DTextData | Sparse1DNumericData | null; if (!data1d || !(datum.type == '3d-positions')) { return; } const datumTyped = datum as BinPositionsData; const countPerBin: Array<number> = new Array(binsAmount).fill(0); const chromosomeData1d = [...data1d.map(v => {return { ...v }})]; const res = datumTyped.basePairsResolution; const connectivity = datumTyped.values.connectivity; if (connectivity) { const indexes = []; for(let i = 0; i < connectivity.length; i++) { if (connectivity[i] === 0) indexes.push(i); } for(const [i, offset] of indexes.entries()) { const underChrosome = chromosomeData1d.filter(c => parseInt(c.chromosome) === i + 1); for (const v of underChrosome) { v.from += offset * res; v.to += offset * res; } } } for (let binIndex = 0; binIndex < binsAmount; binIndex++) { for (const datum of chromosomeData1d) { if (datum.from <= (binIndex + 1) * res && datum.to >= binIndex * res) { countPerBin[binIndex] += 1; } } } const logCountPerBin = countPerBin.map(v => Math.log(v) + 1); const colorScale = chroma.scale(['#fcfdfd', '#010a4e']); newColors[configurationDatumIndex] = chromatinPart.cacheColorArray(mapScaleToChromatin(chromatinPart, logCountPerBin, colorScale)); } else if (configurationDatum.colorMappingMode == "linear-order") { const colorScale = chroma.scale(['#0d1a29', '#133250', '#1e4c7b', '#3868a7', '#658ac6', '#88a0c9', '#aab6ca', '#d3d6da']); const numbers = [...Array(binsAmount).keys()]; console.log(numbers); newColors[configurationDatumIndex] = chromatinPart.cacheColorArray(mapScaleToChromatin(chromatinPart, numbers, colorScale)); } } Loading
libs/graphics/src/shaders/2d/distance_map.wgsl +8 −5 Original line number Diff line number Diff line Loading @@ -180,18 +180,21 @@ fn main_fragment( // finalColor = mix(colors[2], colors[3], (newWeight - 0.66) / 0.33); // } let colors = array<vec3<f32>, 4>( let colors = array<vec3<f32>, 5>( vec3<f32>(0.17254901960784313725490196078431, 0.10980392156862745098039215686275, 0.30980392156862745098039215686275), vec3<f32>(0.29411764705882352941176470588235, 0.45882352941176470588235294117647, 0.62745098039215686274509803921569), vec3<f32>(1.0), vec3<f32>(0.4078431372549019607843137254902, 0.4078431372549019607843137254902, 0.31372549019607843137254901960784), vec3<f32>(0.15294117647058823529411764705882, 0.15294117647058823529411764705882, 0.0078431372549019607843137254902), ); if (newWeight < 0.50) { finalColor = mix(colors[0], colors[1], newWeight / 0.50); if (newWeight < 0.25) { finalColor = mix(colors[0], colors[1], newWeight / 0.25); } else if (newWeight < 0.50) { finalColor = mix(colors[1], colors[2], (newWeight - 0.25) / 0.25); } else if (newWeight < 0.75) { finalColor = mix(colors[1], colors[2], (newWeight - 0.50) / 0.25); finalColor = mix(colors[2], colors[3], (newWeight - 0.50) / 0.25); } else { finalColor = mix(colors[2], colors[3], (newWeight - 0.75) / 0.25); finalColor = mix(colors[3], colors[4], (newWeight - 0.75) / 0.25); } return FragmentOutput( Loading
libs/graphics/src/shaders/postprocess/ssao.wgsl +1 −1 Original line number Diff line number Diff line Loading @@ -66,7 +66,7 @@ main(@builtin(global_invocation_id) GlobalInvocationID let TBN = mat3x3<f32>(tangent, bitangent, viewSpaceNormal); var occlusion = 0.0; let numberOfSamples = 4; let numberOfSamples = 32; for (var i = 0; i < numberOfSamples; i = i + 1) { // get sample position var samplePos = TBN * globals.noiseSamples[i].xyz; // from tangent to view-space Loading