Welcome to ProCel, a web app to work with object-centric event logs (OCELs). ProCel's main features are
- Importing OCELs (OCEL 2.0
sqlite
format)
The project consists of
- A backend running on Python 3.10, mostly using FastAPI, pandas, pm4py, pydantic and pint,
- A frontend based on React / Next.js, using React Bootstrap elements.
Docker support will be added shortly.
Backend: using pypoetry
, when inside /src/backend
, dependencies can be installed with
poetry install
Frontend: using npm
, when inside /src/frontend
, dependencies can be installed with
npm install
Backend and frontend are started using the following two commands in separate terminals:
python main.py
npm run dev
After starting, the app can be accessed at http://localhost:3000. To get started, try loading one of the event logs listed on the start page.
src/backend
:api
: FastAPI config, API modelsocel
: OCEL 2.0 Wrapper class, attributes & utilsutil
: Misc util functionsvisualization
: Mostly used for evaluation (+OCPN rendering)
src/frontend
:components
: React componentspages
: React page components & main apppublic
: Imagessrc
: reusable TypeScript functions & type definitionssrc/api/generated
: API handlers & types generated byopenapi-ts
data
:event_logs
: Example OCELs
User inputs made in the frontend are automatically passed to the API and saved in the Session
object.
This way, sessions are preserved when refreshing.
Sessions are identified via a UUID and saved in the browser's localStorage
.
The inputs (called AppState
) include
- object type colors
- object type classes (Handling units / resources)
FastAPI generates an openapi.json
file following the OpenAPI standard.
When the backend is running, API docs can be accessed at http://localhost:3000/docs/rapidoc.
All types passed along the API are defined in the backend using pydantic
models.
pydantic
handles validation and serialization of these data structures.
API routes defined in src/backend/index.py
are automatically passed a current Session
and OCELWrapper
instance.
The current OCEL is further used in custom validators of ModelWithOcel
subclasses.
This way, when sending an emission rule it is automatically checked whether an attribute name that is used exists in the OCEL.
When using only parts of the implementation, run
from api.model.with_ocel import ocel_ctx
ocel_ctx.set(ocel)
to make the validators access a current OCEL instance via a context variable.
The frontend accesses the API via code generated by the openapi-ts
package.
When making changes to the backend, run npx openapi-ts
in src/frontend
with the backend running to re-generate.
Author: Raimund Hensen
This project has been developed for my master's thesis at the Chair of Process and Data Science (PADS) at RWTH Aachen University under the supervision of Nina Graves and Prof. Wil van der Aalst.
see license document.