Skip to content

Commit

Permalink
#407 Properly turn on/off inspiration fragments when using the next/p…
Browse files Browse the repository at this point in the history
…revious arrows (bug of #384)
  • Loading branch information
Adriána Kohanová committed Oct 14, 2020
1 parent 0eb143a commit 6d4b9a4
Show file tree
Hide file tree
Showing 4 changed files with 148 additions and 13 deletions.
13 changes: 12 additions & 1 deletion js/components/datasets/datasetMoleculeList.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ import { debounce } from 'lodash';
import { InspirationDialog } from './inspirationDialog';
import { CrossReferenceDialog } from './crossReferenceDialog';
import { AlertModal } from '../common/Modal/AlertModal';
import { hideAllSelectedMolecules } from '../preview/molecule/redux/dispatchActions';
import { selectJoinedMoleculeList } from '../preview/molecule/redux/selectors';

const useStyles = makeStyles(theme => ({
container: {
Expand Down Expand Up @@ -226,6 +228,9 @@ export const DatasetMoleculeList = memo(
const filterRef = useRef();
let joinedMoleculeLists = moleculeLists[datasetID] || [];

const getJoinedMoleculeList = useSelector(state => selectJoinedMoleculeList(state));
const inspirationMoleculeDataList = useSelector(state => state.datasetsReducers.inspirationMoleculeDataList);

const disableUserInteraction = useDisableUserInteraction();

// TODO Reset Infinity scroll
Expand Down Expand Up @@ -280,6 +285,11 @@ export const DatasetMoleculeList = memo(
surface: removeDatasetSurface
};

const removeOfAllSelectedTypesOfInspirations = () => {
var molecules = [...getJoinedMoleculeList, ...inspirationMoleculeDataList];
dispatch(hideAllSelectedMolecules(stage, molecules));
};

const removeOfAllSelectedTypes = () => {
ligandList?.forEach(moleculeID => {
const foundedMolecule = joinedMoleculeLists?.find(mol => mol.id === moleculeID);
Expand Down Expand Up @@ -456,7 +466,7 @@ export const DatasetMoleculeList = memo(
<Tooltip
title={`${filterProperties[attr].minValue}-${filterProperties[attr].maxValue} ${
filterProperties[attr].order === 1 ? '\u2191' : '\u2193'
}`}
}`}
placement="top"
>
<Chip size="small" label={attr} className={classes.propertyChip} />
Expand Down Expand Up @@ -610,6 +620,7 @@ export const DatasetMoleculeList = memo(
previousItemData={index > 0 && array[index - 1]}
nextItemData={index < array?.length && array[index + 1]}
removeOfAllSelectedTypes={removeOfAllSelectedTypes}
removeOfAllSelectedTypesOfInspirations={removeOfAllSelectedTypesOfInspirations}
/>
))}
</InfiniteScroll>
Expand Down
115 changes: 111 additions & 4 deletions js/components/datasets/datasetMoleculeView.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,21 @@ import {
clickOnInspirations,
getDatasetMoleculeID
} from './redux/dispatchActions';
import {
addVector,
addHitProtein,
addComplex,
addSurface,
addLigand,
addDensity
} from '../preview/molecule/redux/dispatchActions';
import { base_url } from '../routes/constants';
import { api } from '../../utils/api';
import { isAnyInspirationTurnedOn, getFilteredDatasetMoleculeList } from './redux/selectors';
import {
isAnyInspirationTurnedOn,
isAnyInspirationTurnedOnByType,
getFilteredDatasetMoleculeList
} from './redux/selectors';
import {
appendMoleculeToCompoundsOfDatasetToBuy,
removeMoleculeFromCompoundsOfDatasetToBuy,
Expand All @@ -35,6 +47,7 @@ import {
import { centerOnLigandByMoleculeID } from '../../reducers/ngl/dispatchActions';
import { ArrowDownward, ArrowUpward, MyLocation } from '@material-ui/icons';
import { isNumber, isString } from 'lodash';
import { loadInspirationMoleculesDataList } from './redux/dispatchActions';

const useStyles = makeStyles(theme => ({
container: {
Expand Down Expand Up @@ -245,15 +258,16 @@ export const DatasetMoleculeView = memo(
index,
previousItemData,
nextItemData,
removeOfAllSelectedTypes
removeOfAllSelectedTypes,
removeOfAllSelectedTypesOfInspirations
}) => {
const selectedAll = useRef(false);
const currentID = (data && data.id) || undefined;
const classes = useStyles();
const ref = useRef(null);

const dispatch = useDispatch();
const compoundsToBuyList = useSelector(state => state.datasetsReducers.compoundsToBuyDatasetMap[datasetID]);

const ligandList = useSelector(state => state.datasetsReducers.ligandLists[datasetID]);
const proteinList = useSelector(state => state.datasetsReducers.proteinLists[datasetID]);
const complexList = useSelector(state => state.datasetsReducers.complexLists[datasetID]);
Expand All @@ -264,6 +278,14 @@ export const DatasetMoleculeView = memo(
const isAnyInspirationOn = useSelector(state =>
isAnyInspirationTurnedOn(state, (data && data.computed_inspirations) || [])
);

const proteinListMolecule = useSelector(state => state.selectionReducers.proteinList);
const complexListMolecule = useSelector(state => state.selectionReducers.complexList);
const fragmentDisplayListMolecule = useSelector(state => state.selectionReducers.fragmentDisplayList);
const surfaceListMolecule = useSelector(state => state.selectionReducers.surfaceList);
const densityListMolecule = useSelector(state => state.selectionReducers.densityList);
const vectorOnListMolecule = useSelector(state => state.selectionReducers.vectorOnList);

const filteredDatasetMoleculeList = useSelector(state => getFilteredDatasetMoleculeList(state, datasetID));

const [image, setImage] = useState(img_data_init);
Expand Down Expand Up @@ -477,6 +499,60 @@ export const DatasetMoleculeView = memo(
return cssClass;
};

const moveSelectedMoleculeInspirationsSettings = (
newItemData,
ligands,
proteins,
complexis,
surfaces,
densities,
vectors
) => (dispatch, getState) => {
const state = getState();
const molecules = state.datasetsReducers.inspirationMoleculeDataList;
if (newItemData && molecules) {
let computed_inspirations = (data && data.computed_inspirations) || [];
let isAnyInspirationLigandOn = isAnyInspirationTurnedOnByType(computed_inspirations, ligands);
let isAnyInspirationProteinOn = isAnyInspirationTurnedOnByType(computed_inspirations, proteins);
let isAnyInspirationComplexOn = isAnyInspirationTurnedOnByType(computed_inspirations, complexis);
let isAnyInspirationSurfaceOn = isAnyInspirationTurnedOnByType(computed_inspirations, surfaces);
let isAnyInspirationDensityOn = isAnyInspirationTurnedOnByType(computed_inspirations, densities);
let isAnyInspirationVectorOn = isAnyInspirationTurnedOnByType(computed_inspirations, vectors);

if (
isAnyInspirationLigandOn ||
isAnyInspirationProteinOn ||
isAnyInspirationComplexOn ||
isAnyInspirationSurfaceOn ||
isAnyInspirationDensityOn ||
isAnyInspirationVectorOn
) {
molecules.forEach(molecule => {
if (molecule) {
if (isAnyInspirationLigandOn) {
dispatch(addLigand(stage, molecule, colourToggle));
}
if (isAnyInspirationProteinOn) {
dispatch(addHitProtein(stage, molecule, colourToggle));
}
if (isAnyInspirationComplexOn) {
dispatch(addComplex(stage, molecule, colourToggle));
}
if (isAnyInspirationSurfaceOn) {
dispatch(addSurface(stage, molecule, colourToggle));
}
if (isAnyInspirationDensityOn) {
dispatch(addDensity(stage, molecule, colourToggle));
}
if (isAnyInspirationVectorOn) {
dispatch(addVector(stage, molecule, colourToggle));
}
}
});
}
}
};

const moveSelectedMoleculeSettings = (newItemData, datasetIdOfMolecule) => {
if (newItemData) {
if (isLigandOn) {
Expand All @@ -496,19 +572,50 @@ export const DatasetMoleculeView = memo(

const handleClickOnDownArrow = () => {
removeOfAllSelectedTypes();
removeOfAllSelectedTypesOfInspirations();

const nextItem = (nextItemData.hasOwnProperty('molecule') && nextItemData.molecule) || nextItemData;
const nextDatasetID = (nextItemData.hasOwnProperty('datasetID') && nextItemData.datasetID) || datasetID;
moveSelectedMoleculeSettings(nextItem, nextDatasetID);

dispatch(loadInspirationMoleculesDataList(nextItem.computed_inspirations)).then(() => {
dispatch(
moveSelectedMoleculeInspirationsSettings(
nextItem,
fragmentDisplayListMolecule,
proteinListMolecule,
complexListMolecule,
surfaceListMolecule,
densityListMolecule,
vectorOnListMolecule
)
);
});
};

const handleClickOnUpArrow = () => {
removeOfAllSelectedTypes();
removeOfAllSelectedTypesOfInspirations();

const previousItem =
(previousItemData.hasOwnProperty('molecule') && previousItemData.molecule) || previousItemData;
const previousDatasetID =
(previousItemData.hasOwnProperty('datasetID') && previousItemData.datasetID) || datasetID;

moveSelectedMoleculeSettings(previousItem, previousDatasetID);

dispatch(loadInspirationMoleculesDataList(previousItem.computed_inspirations)).then(() => {
dispatch(
moveSelectedMoleculeInspirationsSettings(
previousItem,
fragmentDisplayListMolecule,
proteinListMolecule,
complexListMolecule,
surfaceListMolecule,
densityListMolecule,
vectorOnListMolecule
)
);
});
};

const moleculeTitle = data && data.name;
Expand Down
32 changes: 24 additions & 8 deletions js/components/datasets/redux/selectors.js
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,18 @@ export const isAnyInspirationTurnedOn = createSelector(
}
);

export const isAnyInspirationTurnedOnByType = (inspirations, data) => {
let typeLists = new Set(data);
let hasInspirationType = false;
inspirations.forEach(moleculeID => {
if (typeLists.has(moleculeID)) {
hasInspirationType = true;
return hasInspirationType;
}
});
return hasInspirationType;
};

export const getFilteredDatasetMoleculeList = createSelector(
(_, datasetID) => datasetID,
filterDatasetMap,
Expand Down Expand Up @@ -254,20 +266,24 @@ export const getFilteredDatasetMoleculeList = createSelector(
for (let prioAttr of sortedAttributes) {
const order = filterProperties[prioAttr].order;

const scoreValueOfA = Object.keys(a.numerical_scores).find(key => key === prioAttr) && a.numerical_scores[prioAttr];
scoreValueOfA = scoreValueOfA || (Object.keys(a.text_scores).find(key => key === prioAttr) && a.text_scores[prioAttr]);
const scoreValueOfB = Object.keys(b.numerical_scores).find(key => key === prioAttr) && b.numerical_scores[prioAttr];
scoreValueOfB = scoreValueOfB || (Object.keys(b.text_scores).find(key => key === prioAttr) && b.text_scores[prioAttr]);
const scoreValueOfA =
Object.keys(a.numerical_scores).find(key => key === prioAttr) && a.numerical_scores[prioAttr];
scoreValueOfA =
scoreValueOfA || (Object.keys(a.text_scores).find(key => key === prioAttr) && a.text_scores[prioAttr]);
const scoreValueOfB =
Object.keys(b.numerical_scores).find(key => key === prioAttr) && b.numerical_scores[prioAttr];
scoreValueOfB =
scoreValueOfB || (Object.keys(b.text_scores).find(key => key === prioAttr) && b.text_scores[prioAttr]);

if (scoreValueOfA === "Y") {
if (scoreValueOfA === 'Y') {
scoreValueOfA = 1;
} else if (scoreValueOfA === "N") {
} else if (scoreValueOfA === 'N') {
scoreValueOfA = 0;
}

if (scoreValueOfB === "Y") {
if (scoreValueOfB === 'Y') {
scoreValueOfB = 1;
} else if (scoreValueOfB === "N") {
} else if (scoreValueOfB === 'N') {
scoreValueOfB = 0;
}

Expand Down
1 change: 1 addition & 0 deletions js/components/preview/molecule/redux/selectors.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ export const selectJoinedMoleculeList = createSelector(
cachedDataArray.forEach(r => joinedMoleculeLists.push(Object.assign({ site: site }, r)));
});
}

return joinedMoleculeLists;
}
);

0 comments on commit 6d4b9a4

Please sign in to comment.