Skip to content

Commit 66fc54b

Browse files
committed
Adding initial CUL notes and improved dataflows that can adjust offsets from the start.
1 parent 21770e1 commit 66fc54b

2 files changed

Lines changed: 114 additions & 8 deletions

File tree

src/dataflows/cul.md

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
# Cambridge University Library
2+
## Dataflows for some of CUL's digital preservation services
3+
4+
<div class="caution" label="DRAFTY CONTENT WARNING!">This page is nowhere near complete, and may never be so!</div>
5+
6+
## Introduction
7+
8+
This page uses Dataflow diagrams to explore some of the digital services at [Cambridge University Library](https://www.lib.cam.ac.uk/) (CUL).
9+
10+
For more information about digital preservation at CUL, see
11+
12+
...pointers to general DigiPres @ CUL places
13+
14+
## Overview
15+
16+
...relationship between Transfer Service and the preservation service
17+
18+
## The Transfer Service
19+
20+
...detail about the transfer service ANJ will link to current homepage.
21+
22+
```dataflow
23+
dataflow 1.0
24+
title "CUL Transfer Service"
25+
zoom 0.7
26+
height 600
27+
28+
data arc "Archives"
29+
data sup "Supplemental Material"
30+
data leg "Legacy Material" red
31+
data photo "Photographs of Legacy Carriers" blue
32+
data sip "SIP" black
33+
"""Transfer composed of a folder and a metadata folder, named according to item identifiers, holding the data, photographs and log+hash manifest"""
34+
35+
place mysmedia "Mystery Media"
36+
place shelf "Transfer Lab Shelf"
37+
place adele "ADELE Workstation"
38+
place camera "Camera"
39+
place db "Transfer Service Data Tracker"
40+
place fred "FRED Workstation"
41+
place tomjr "TOM Junior Workstation"
42+
place pam "PAM Workstation"
43+
place mac "Mac Laptop"
44+
45+
46+
"""
47+
Group Assessment Record set up in ArchiveSpace.
48+
Within this collection, digital material has been found.
49+
The archivist may make an individual assessment for an individual carrier
50+
Identifiers written down, media type, metadata on the Assessment Record.
51+
Move from Archival Stacks to Digital Carrier Boxes e.g. Hawking as it's own box, one for each collection.
52+
Order up a box, bring it to the lab.
53+
54+
Unique ID minted by archivist.
55+
56+
Archivist can use PAM to process carriers, keep or not.
57+
PAM will disk image for appraisal, but will be deleted.
58+
Individual assessment record created.
59+
Pass to Transfer service.
60+
61+
If it's non-sensitive, transfer to IT dept. eWaste contractor.
62+
If sensitive, forensically wiped and shredded.
63+
64+
RClone to S3
65+
"""
66+
67+
start leg@mysmedia [0,2]
68+
"""This is material found on various carriers within the library collections."""
69+
70+
move leg@mysmedia leg@shelf "Media\nAccepted"
71+
"""If a data owner can be identified, the media can be accepted by the service for transfer. The media is then connected to the workstation."""
72+
73+
start rec@db
74+
"""An record is created for this item in the Transfer Service Data Tracker. This created the ID that will be used to track the item, and acts as the digital asset register for this service."""
75+
76+
derive rec@db id@db "Copy ID"
77+
move id@db id@adele "Use ID"
78+
transform id@adele sip@adele "SIP Folder Created"
79+
80+
move leg@shelf leg@adele "Media\nConnected" [0,1]
81+
82+
start photo@camera [0,-1]
83+
move photo@camera photo@adele "Transfer Photograph"
84+
85+
86+
derive leg@adele content@adele "Copy Content"@N [0,1]
87+
"""Make a disk image or logical copy"""
88+
89+
""""""
90+
91+
92+
```
93+
94+
95+
96+
```js
97+
import { renderDataflows } from "./dataflows.js";
98+
renderDataflows();
99+
```

src/dataflows/dataflows.js

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ function pushCopyEvent(lines, stations, item, event, sx, sy, tx, ty){
5050
const markerAt = event.markerAt || 0.5;
5151
const markerPos = event.markerPos || "W";
5252
const dir = Math.sign(ty-sy);
53+
console.log("OPY", event);
5354
lines[item].nodes.push({
5455
"coords": [sx+1,sy]
5556
},
@@ -128,10 +129,8 @@ export function generateTubeMapData(df, wf) {
128129
}
129130
});
130131
} else if( event.type == "merge" ) {
131-
/* WARNING! This is not implemented correctly!?
132-
Currently attempts to merge two different data items in difference places in a single event,
133-
which does not really make sense I think. It should only operate on data in the same place
134-
and create one/delete others.*/
132+
/* This describes the idea of transferring data and merging it into another larger data set in a single event.
133+
This might be more accurately a copy/move followed by a 'combine' event, but it useful as it is.*/
135134
const sources = getTargets(df, event, 'source');
136135
var targets = getTargets(df, event);
137136
sources.forEach( (source) => {
@@ -194,14 +193,16 @@ export function generateTubeMapData(df, wf) {
194193
'item': source,
195194
'description': event.description
196195
}
197-
setupEntitiesForEvent(lines, stations, item, source_event );
196+
const parentShiftCoords = event.shiftCoords|| [0,0];
197+
setupEntitiesForEvent(lines, stations, item, source_event, parentShiftCoords );
198198
const y = source.index * ds;
199199
lines[source.item].nodes.push({
200200
"coords": [t1,y],
201201
"name": source.place.name,
202-
"labelPos": "W"
202+
"labelPos": "W",
203+
"shiftCoords": parentShiftCoords
203204
},{
204-
"coords": [t1+1,y]
205+
"coords": [t1+1,y],
205206
});
206207
// End this item as these are just start-point markers
207208
//lines[source.item].terminated = t1;
@@ -256,7 +257,9 @@ export function generateTubeMapData(df, wf) {
256257
Object.keys(lines).forEach( (item ) => {
257258
const prev = lines[item].nodes.at(-1);
258259
if( prev && prev.coords && prev.coords[0] < t2 && lines[item].terminated == undefined ) {
259-
lines[item].nodes.push( {"coords": [t2, prev.coords[1]]} );
260+
lines[item].nodes.push( {
261+
"coords": [t2, prev.coords[1]],
262+
} );
260263
}
261264
});
262265
// Increment the timer:
@@ -380,6 +383,10 @@ export function parseDataflow(text) {
380383
if( l[0] == "delete") {
381384
event.marker = 'interchange';
382385
}
386+
// Parse offset if any:
387+
if( l[2] ) {
388+
event.shiftCoords = JSON.parse(l[2])
389+
}
383390
} else if( l[0] == "place") {
384391
const place = {
385392
id: l[1],

0 commit comments

Comments
 (0)