MAISNet: a multi-species integrated graph neural network for acetylcholinesterase inhibitor screening.
The 4 matches · 1 of them tie a paragraph to a whole file, not to given lines: a weak match, whose lines are not tinted
- [1] § 2 Materials and methods › 2.5 Evaluation methods ↔ main.py, lines 249–336 · score 0.67 · Matthews correlation coefficient, receiver operating characteristic, curve, MCC, precision, AUC
- [2] § 3 Experiments and results › 3.1 Experimental settings ↔ main.py, lines 164–206 · score 0.67 · ReduceLROnPlateau, weight decay, scheduler, Adam, epochs, linear
- [3] § 2 Materials and methods › 2.1 Datasets ↔ src/models/random_forest.py, lines 10–60 · score 0.56 · rotatable bonds, acceptors, donors, properties, SMILES, molecules
- [4] § 2 Materials and methods › 2.4 Interaction prediction › 2.4.1 Feature fusion ↔ src/models/attention.py, the whole file · a weak match · score 0.51 · ligand features, cross attention, query, protein features, linear, model
Paper
Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
Python · 339 lines · 11 KB · no license · 2 matches
- import torch
- import torch.nn as nn
- import torch.nn.functional as F
- import torch.optim as optim
- import pandas as pd
- import numpy as np
- from sklearn.model_selection import train_test_split
- from sklearn.metrics import classification_report
- from sklearn.metrics import matthews_corrcoef, roc_auc_score, average_precision_score
- from src.data import create_dataloader
- from scipy import stats
- from src.models import ClassificationModel
- class FocalLoss(nn.Module):
- def __init__(self, alpha=None, gamma=2.0, reduction='mean'):
- super(FocalLoss, self).__init__()
- self.gamma = gamma
- self.reduction = reduction
- self.alpha = alpha
- if alpha is not None:
- self.alpha = torch.tensor(alpha)
- def forward(self, inputs, targets):
- ce_loss = F.cross_entropy(inputs, targets, reduction='none', weight=self.alpha)
- pt = torch.exp(-ce_loss)
- focal_loss = ((1 - pt) ** self.gamma) * ce_loss
- if self.reduction == 'mean':
- return focal_loss.mean()
- elif self.reduction == 'sum':
- return focal_loss.sum()
- else:
- return focal_loss
- def train(model, train_loader, optimizer, criterion, device):
- """训练一个epoch
- Args:
- model: 模型
- train_loader: 训练数据加载器
- optimizer: 优化器
- criterion: 损失函数
- device: 设备
- Returns:
- tuple: (平均损失, 准确率)
- """
- model.train()
- total_loss = 0
- correct = 0
- total = 0
- for protein_data, ligand_data, labels in train_loader:
- protein_data = protein_data.to(device)
- ligand_data = ligand_data.to(device)
- labels = labels.to(device)
- optimizer.zero_grad()
- outputs = model(protein_data, ligand_data)
- loss = criterion(outputs, labels)
- loss.backward()
- # 添加梯度裁剪,最大范数设为1.0
- torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
- optimizer.step()
- total_loss += loss.item()
- _, predicted = outputs.max(1)
- total += labels.size(0)
- correct += predicted.eq(labels).sum().item()
- accuracy = 100. * correct / total
- avg_loss = total_loss / len(train_loader)
- return avg_loss, accuracy
- def evaluate(model, val_loader, criterion, device):
- """评估模型
- Args:
- model: 模型
- val_loader: 验证数据加载器
- criterion: 损失函数
- device: 设备
- Returns:
- tuple: (准确率, 平均损失, 所有预测结果, 所有真实标签)
- """
- model.eval()
- total_loss = 0
- correct = 0
- total = 0
- all_predictions = []
- all_labels = []
- with torch.no_grad():
- for protein_data, ligand_data, labels in val_loader:
- protein_data = protein_data.to(device)
- ligand_data = ligand_data.to(device)
- labels = labels.to(device)
- outputs = model(protein_data, ligand_data)
- loss = criterion(outputs, labels)
- total_loss += loss.item()
- _, predicted = outputs.max(1)
- total += labels.size(0)
- correct += predicted.eq(labels).sum().item()
- all_predictions.append(predicted)
- all_labels.append(labels)
- # 将列表转换为张量
- all_predictions = torch.cat(all_predictions)
- all_labels = torch.cat(all_labels)
- accuracy = 100. * correct / total
- avg_loss = total_loss / len(val_loader)
- return accuracy, avg_loss, all_predictions, all_labels
- def main():
- # 设置设备
- device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
- print(f"Using device: {device}")
- # 加载并平衡数据
- from src.data.negative_sampling import generate_balanced_dataset
- print("\n准备数据集...")
- df = pd.read_csv('combined_data.csv')
- balanced_df = generate_balanced_dataset(df)
- # 划分数据集 (8:1:1)
- train_val_df, test_df = train_test_split(balanced_df, test_size=0.1, random_state=42)
- train_df, val_df = train_test_split(train_val_df, test_size=0.111, random_state=42)
- print(f"\n数据集大小:")
- print(f"训练集: {len(train_df)}")
- print(f"验证集: {len(val_df)}")
- print(f"测试集: {len(test_df)}")
- # 计算类别权重
- train_labels = train_df['flag'].values
- num_samples = len(train_labels)
- num_classes = 2
- class_counts = np.bincount(train_labels)
- class_weights = num_samples / (num_classes * class_counts)
- class_weights = torch.FloatTensor(class_weights).to(device)
- print("\n类别权重:")
- for i, weight in enumerate(class_weights):
- print(f"Class {i}: {weight:.4f}")
- # 创建数据加载器
- train_loader = create_dataloader(train_df, batch_size=32)
- val_loader = create_dataloader(val_df, batch_size=32)
- test_loader = create_dataloader(test_df, batch_size=32)
- # 初始化模型
- model = ClassificationModel(hidden_dim=64, output_dim=2).to(device)
- # 使用Focal Loss,添加类别权重
- criterion = FocalLoss(alpha=class_weights, gamma=2.0)
- optimizer = optim.Adam(model.parameters(), lr=0.0005, weight_decay=1e-5)
- # 创建预热调度器和主调度器
- from torch.optim.lr_scheduler import LinearLR, SequentialLR
- # 预热调度器:从0.1倍学习率开始,在10个epoch内线性增加到原始学习率
- warmup_epochs = 10
- warmup_scheduler = LinearLR(
- optimizer,
- start_factor=0.1, # 初始学习率为原始学习率的0.1倍
- end_factor=1.0, # 最终达到原始学习率
- total_iters=warmup_epochs
- )
- # 主调度器:使用ReduceLROnPlateau
- main_scheduler = optim.lr_scheduler.ReduceLROnPlateau(
- optimizer, mode='max', factor=0.7, patience=5
- )
- # 组合两个调度器
- scheduler = SequentialLR(
- optimizer,
- schedulers=[warmup_scheduler, main_scheduler],
- milestones=[warmup_epochs]
- )
- # 训练设置
- num_epochs = 100
- best_accuracy = 0
- # 用于记录训练过程的列表
- train_losses, train_accs = [], []
- val_losses, val_accs = [], []
- print("\n" + "="*70)
- print(f"{'Epoch':^10}{'Train Loss':^15}{'Train Acc':^15}{'Val Loss':^15}{'Val Acc':^15}")
- print("="*70)
- for epoch in range(num_epochs):
- # 训练
- train_loss, train_acc = train(model, train_loader, optimizer, criterion, device)
- # 验证
- val_acc, val_loss, predictions, labels = evaluate(model, val_loader, criterion, device)
- # 记录数据
- train_losses.append(train_loss)
- train_accs.append(train_acc)
- val_losses.append(val_loss)
- val_accs.append(val_acc)
- # 更新学习率
- if epoch < warmup_epochs:
- # 在预热阶段,直接步进
- warmup_scheduler.step()
- else:
- # 预热后,使用验证集准确率来调整学习率
- main_scheduler.step(val_acc)
- # 打印当前学习率
- current_lr = optimizer.param_groups[0]['lr']
- # 打印训练信息
- print(f"{epoch+1:^10d}{train_loss:^15.4f}{train_acc/100:^15.4f}{val_loss:^15.4f}{val_acc/100:^15.4f}")
- # 如果验证准确率提高,保存模型
- if val_acc > best_accuracy:
- best_accuracy = val_acc
- torch.save(model.state_dict(), 'best_model.pt')
- print(f"{'★ Model saved! Best accuracy: {:.4f}'.format(best_accuracy/100):^70}")
- if (epoch + 1) % 10 == 0:
- print("-"*70)
- print("="*70)
- # 加载最佳模型进行测试
- model.load_state_dict(torch.load('best_model.pt'))
- model.eval()
- test_acc, test_loss, predictions, labels = evaluate(model, test_loader, criterion, device)
- print(f"\n测试集损失: {test_loss:.4f}")
- print(f"测试集准确率: {test_acc/100:.4f}")
- # 打印评估报告
- predictions = predictions.cpu().numpy()
- labels = labels.cpu().numpy()
- print("\n分类评估报告:")
- print(classification_report(labels, predictions))
- # 计算MCC
- mcc = matthews_corrcoef(labels, predictions)
- print(f"\nMatthews Correlation Coefficient (MCC): {mcc:.4f}")
- # 获取预测概率
- model.eval()
- all_probs = []
- all_labels = []
- with torch.no_grad():
- for protein_data, ligand_data, labels in test_loader:
- protein_data = protein_data.to(device)
- ligand_data = ligand_data.to(device)
- outputs = model(protein_data, ligand_data)
- probs = torch.softmax(outputs, dim=1)
- all_probs.extend(probs[:, 1].cpu().numpy())
- all_labels.extend(labels.numpy())
- # 计算AUROC
- auroc = roc_auc_score(all_labels, all_probs)
- print(f"Area Under the ROC Curve (AUROC): {auroc:.4f}")
- # 计算AUPRC
- auprc = average_precision_score(all_labels, all_probs)
- print(f"Area Under the Precision-Recall Curve (AUPRC): {auprc:.4f}")
- # 绘制并保存训练过程图
- import matplotlib.pyplot as plt
- # 1. 损失曲线
- plt.figure(figsize=(10, 6))
- plt.plot(train_losses, label='Training Loss')
- plt.plot(val_losses, label='Validation Loss')
- plt.xlabel('Epoch')
- plt.ylabel('Loss')
- plt.title('Loss During Training')
- plt.legend()
- plt.grid(True)
- plt.savefig('loss_curve.png')
- plt.close()
- # 2. 准确率曲线
- plt.figure(figsize=(10, 6))
- plt.plot([acc/100 for acc in train_accs], label='Training Accuracy')
- plt.plot([acc/100 for acc in val_accs], label='Validation Accuracy')
- plt.xlabel('Epoch')
- plt.ylabel('Accuracy')
- plt.title('Accuracy During Training')
- plt.legend()
- plt.grid(True)
- plt.savefig('accuracy_curve.png')
- plt.close()
- # 3. ROC曲线
- from sklearn.metrics import roc_curve, auc
- # 获取预测概率
- model.eval()
- all_probs = []
- all_labels = []
- with torch.no_grad():
- for protein_data, ligand_data, labels in test_loader:
- protein_data = protein_data.to(device)
- ligand_data = ligand_data.to(device)
- outputs = model(protein_data, ligand_data)
- probs = torch.softmax(outputs, dim=1)
- all_probs.extend(probs[:, 1].cpu().numpy())
- all_labels.extend(labels.numpy())
- # 计算ROC
- fpr, tpr, _ = roc_curve(all_labels, all_probs)
- roc_auc = auc(fpr, tpr)
- # 绘制ROC曲线
- plt.figure(figsize=(10, 6))
- plt.plot(fpr, tpr, label=f'ROC Curve (AUC = {roc_auc:.3f})')
- plt.plot([0, 1], [0, 1], 'k--')
- plt.xlim([0.0, 1.0])
- plt.ylim([0.0, 1.05])
- plt.xlabel('False Positive Rate')
- plt.ylabel('True Positive Rate')
- plt.title('Receiver Operating Characteristic (ROC) Curve')
- plt.legend(loc="lower right")
- plt.grid(True)
- plt.savefig('roc_curve.png')
- plt.close()
- if __name__ == "__main__":
- main()
main.py at commit 905c9c1, no license · at the source
Overview
- Department of Artificial Intelligence, College of Computer Science and Technology, Changchun University, Changchun 130022, China
- College of Computer Science and Technology, Jilin University, Changchun 130000, China
- Information Security and Management Undergraduate School of Artificial Intelligence, Shenzhen Polytechnic University, Nanshan District, Shenzhen, Guangdong Province, 518000, China
Abstract
Motivation: Global population aging has led to a rapid increase in neurodegenerative disorders such as Alzheimer’s disease (AD). Although existing drugs can temporarily alleviate symptoms, none have been proven to delay or prevent disease progression. Acetylcholinesterase inhibitors (AChEIs) have been shown to mitigate AD symptoms, yet traditional AChEI screening approaches remain time-consuming and inefficient.
Results: To address this limitation, we developed multi-species AChEI screening network (MAISNet), an AChEI screening framework based on acetylcholinesterase (AChE) data from six species. In MAISNet, inhibitor molecules were represented as SMILES-derived molecular graphs, whereas AChE protein structures were encoded as residue contact maps. Multi-scale molecular and protein features were extracted using the sample and aggregate (GraphSAGE) network and the graph attention network, respectively, and were subsequently fused through a bidirectional cross-attention mechanism. The integrated representations were then processed by a multilayer perceptron (MLP) to inhibitor classification. On both internal and external validation sets, MAISNet consistently outperformed five baseline models. Furthermore, we applied MAISNet to screen existing small molecules, and Methyl 2-[(3S)-3–(1, 2, 3, 4, 5, 6, 7, 8-octahydro-2-naphthyl)-
Availability and implementation: Code that supports the reported results can be found at: https://
Reproduced under the paper's license (CC BY), from the paper cited above.
Repository
Its files are read in the Code ↔ Paper reader above, with 4 matches between paragraphs and lines of code.
liangshengjie111/MAISNet
905c9c1c632bee03981923fe589da749cc0476a7, 26 November 2025Availability: 1 check, the latest on 28 September 2026: the link answers
- 28 September 2026: the link answers
32 files
- main.py, Python, 339 lines, 2 matches
- src/
.ipynb_checkpoints/ , Python, 1 line__init__-checkpoint.py - src/
__init__.py , Python, 1 line - src/
data/ , Python, 4 lines.ipynb_checkpoints/ __init__-checkpoint.py - src/
data/ , Python, 248 lines.ipynb_checkpoints/ data_processing-checkpoi nt.py - src/
data/ , Python, 27 lines.ipynb_checkpoints/ dataloader-checkpoint.py - src/
data/ , Python, 92 lines.ipynb_checkpoints/ negative_sampling-checkp oint.py - src/
data/ , Python, 4 lines__init__.py - src/
data/ , Python, 248 linesdata_processing.py - src/
data/ , Python, 27 linesdataloader.py - src/
data/ , Python, 92 linesnegative_sampling.py - src/
models/ , Python, 318 lines.ipynb_checkpoints/ ablation_study-checkpoin t.py - src/
models/ , Python, 69 lines.ipynb_checkpoints/ attention-checkpoint.py - src/
models/ , Python, 50 lines.ipynb_checkpoints/ classification-checkpoin t.py - src/
models/ , Python, 294 lines.ipynb_checkpoints/ cnn_3d-checkpoint.py - src/
models/ , Python, 304 lines.ipynb_checkpoints/ experiment-checkpoint.py - src/
models/ , Python, 260 lines.ipynb_checkpoints/ gcn-checkpoint.py - src/
models/ , Python, 104 lines.ipynb_checkpoints/ gnn-checkpoint.py - src/
models/ , Python, 231 lines.ipynb_checkpoints/ random_forest-checkpoint .py - src/
models/ , Python, 5 lines__init__.py - src/
models/ , Python, 318 linesablation_study.py - src/
models/ , Python, 69 lines, 1 matchattention.py - src/
models/ , Python, 50 linesclassification.py - src/
models/ , Python, 294 linescnn_3d.py - src/
models/ , Python, 304 linesexperiment.py - src/
models/ , Python, 260 linesgcn.py - src/
models/ , Python, 104 linesgnn.py - src/
models/ , Python, 231 lines, 1 matchrandom_forest.py - src/
utils/ , Python, 23 lines.ipynb_checkpoints/ constants-checkpoint.py - src/
utils/ , Python, 1 line__init__.py - src/
utils/ , Python, 23 linesconstants.py - README.md, Text, 48 lines
Availability and implementation
Code that supports the reported results can be found at: https://
Reproduced under the paper's license (CC BY), from the paper cited above.
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 31 scripts, each with its path and the digest of its content;
- 4 matches between paragraphs of the paper and lines of the code (method lexical-v1);
- neither the text of the paper nor the code itself.
Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.
Data
No dataset and no data link were found in the paper.
Versions
The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.
Version 1, 28 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 4 authors, 7 MeSH terms, 1 funder, 23 references.
Cite
This paper
Shao, D., Liang, S., Xiong, Y., & Liang, G. (2026). MAISNet: a multi-species integrated graph neural network for acetylcholinesterase inhibitor screening. Bioinformatics (Oxford, England), 42(4), btag153. https://
BibTeX
@article{shao2026maisnet
author = {Shao, Dan and Liang, Shengjie and Xiong, Yucong and Liang, Guangmin},
title = {{MAISNet: a multi-species integrated graph neural network for acetylcholinesterase inhibitor screening}},
journal = {Bioinformatics (Oxford, England)},
year = {2026},
month = apr,
volume = {42},
number = {4},
pages = {btag153},
publisher = {Oxford University Press},
issn = {1367-4803},
doi = {10.1093/
url = {https://
pmid = {41984821},
pmcid = {PMC13110007}
}
RIS
TY - JOUR
AU - Shao, Dan
AU - Liang, Shengjie
AU - Xiong, Yucong
AU - Liang, Guangmin
TI - MAISNet: a multi-species integrated graph neural network for acetylcholinesterase inhibitor screening
T2 - Bioinformatics (Oxford, England)
J2 - Bioinformatics
PY - 2026
DA - 2026/
VL - 42
IS - 4
SP - btag153
SN - 1367-4803
PB - Oxford University Press
DO - 10.1093/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1093/
"type": "article-journal",
"title": "MAISNet: a multi-species integrated graph neural network for acetylcholinesterase inhibitor screening",
"container-title": "Bioinformatics (Oxford, England)",
"author": [
{
"family": "Shao",
"given": "Dan"
},
{
"family": "Liang",
"given": "Shengjie"
},
{
"family": "Xiong",
"given": "Yucong"
},
{
"family": "Liang",
"given": "Guangmin"
}
],
"container-title-short":
"volume": "42",
"issue": "4",
"page": "btag153",
"DOI": "10.1093/
"PMID": "41984821",
"PMCID": "PMC13110007",
"ISSN": "1367-4803",
"publisher": "Oxford University Press",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
4,
1
]
]
}
}
The tracing map gets a citation of its own once an author has validated it and it has a DOI.
Similar papers
The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.
- [1] doi:10.1038/s41586-026-10670-w [code]
- Zero-shot design of drug-binding proteins via neural iterative selection-expansion.Journal: NatureIn common: RDKit, PyTorch Geometric, PyTorch, 5 other tools, 1 reference
- [2] doi:10.34133/csbj.0184 [code]
- Cross-Species Multitask Learning with Molecular and ADME Descriptors for Liver Microsomal Metabolic Stability.Journal: Computational and structural biotechnology journalIn common: RDKit, PyTorch Geometric, PyTorch, 4 other tools, 1 reference
- [3] doi:10.1371/journal.pone.0345854 [code]
- Shedding light on neural learning to rank models for anticancer drug prioritization.Journal: PloS oneIn common: RDKit, PyTorch Geometric, PyTorch, 5 other tools
- [4] doi:10.1093/nar/gkag706 [code]
- scDifformer: diffusion-based post-training for virtual cell modeling across large-scale single-cell data.Journal: Nucleic acids researchIn common: RDKit, PyTorch Geometric, PyTorch, 5 other tools
- [5] doi:10.1038/s41598-026-53415-5 [code]
- Computational design and immunoinformatics validation of a T cell multi-epitope vaccine targeting glioblastoma stem cells.Journal: Scientific reportsIn common: RDKit, PyTorch Geometric, PyTorch, 5 other tools
- [6] doi:10.1038/s41586-026-10391-0 [code]
- Cell-type-targeted mitochondrial transplantation rescues cell degeneration.Journal: NatureIn common: RDKit, PyTorch Geometric, PyTorch, 5 other tools
- [7] doi:10.3390/ijms27156614 [code]
- Candidalysin Inhibits &
lt;i& gt;Porphyromonas gingivalis& lt;/ i& gt; Lipoprotein-Induced IL-1β Production in BV-2 Microglia via Hydrophobic Microbial Interactions. Journal: International journal of molecular sciencesIn common: RDKit, PyTorch Geometric, PyTorch, 5 other tools - [8] doi:10.3390/ph19081319 [code]
- DeepBBB: A Data-Composition-Aware Graph Screening Workflow for BBB-Focused CNS Library Construction and Prospective PAMPA-BBB Evaluation.Journal: Pharmaceuticals (Basel, Switzerland)In common: RDKit, PyTorch Geometric, PyTorch, 4 other tools, clinical / translational
- [9] doi:10.34133/csbj.0036 [code]
- HYG-mol: An Interpretable Multimodal Hypergraph Framework for Molecular Property Prediction.Journal: Computational and structural biotechnology journalIn common: RDKit, PyTorch Geometric, PyTorch, 4 other tools
- [10] doi:10.1016/j.apsb.2026.05.021 [code]
- Design, preclinical evaluation, and multicenter phase 1 clinical study of HZ-A-018 for relapsed or refractory central nervous system lymphoma.Journal: Acta pharmaceutica Sinica. BIn common: RDKit, PyTorch Geometric, PyTorch, 3 other tools, clinical / translational
Contribute
The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.
Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 1 repository of the authors' code, each at its verified commit and with its license, 31 scripts, and 4 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:a35905faf4ed4102…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
Request its removal
To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).
Discussion, reproductions, activity
Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.
Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
