1function [classResT, jobRespT, jobResTArvTS] = parseTranRespT(fileArv, fileDep)
2% [CLASSREST, JOBRESPT, JOBRESTARVTS] = PARSETRANRESPT(FILEARV, FILEDEP)
4% Copyright (c) 2012-2026, Imperial College London
7load(fileArv,
'jobArvTS',
'jobArvClassID',
'jobArvID');
8load(fileDep,
'jobDepTS',
'jobDepClassID',
'jobDepID');
9%% compute job residence times at the station
10jobIDs = unique([jobArvID;jobDepID]);
11% We count the total number of observed
visits. Jobs not departed
do not
12% complete the visit and are therefore not counted.
13jobRespT = cell(length(jobIDs),1);
14jobArvClass = cell(length(jobIDs),1);
15jobResTArvTS = cell(length(jobIDs),1); % arrival timestamp associated to jobResT entry
16jobLogData = [jobDepTS, jobDepID, -ones(size(jobDepTS)), jobDepClassID; jobArvTS, jobArvID, ones(size(jobArvTS)), jobArvClassID];
17jobLogData = sortrows(jobLogData,2); % sorted by job ID
19ptrJob=zeros(length(jobIDs),1);
21for j=2:size(jobLogData,1)
22 if jobLogData(j,2)>jobLogData(j-1,2) % change of job ID
23 ptrJob(1+jobLogData(j,2))=j;
26ptrJob(end+1)=length(jobLogData)+1;
30 jobData = jobLogData(ptrJob(1+
id):(ptrJob(1+
id+1)-1),[1,3]);
31 jobClassData{1+
id} = jobLogData(ptrJob(1+
id):(ptrJob(1+id+1)-1),4);
32 %
if ~isempty(jobClassData{1+
id})
35 jobData = sortrows(jobData,1);
36 firstTS=find(jobData(:,2)>0,1,
'first'); % ts of first arrival
37 lastTS=find(jobData(:,2)<0,1,
'last'); % ts of last departure
38 jobData=jobData(firstTS:lastTS,1);
39 jobClassData{1+
id}=jobClassData{1+
id}(firstTS:lastTS,1);
40 if length(jobData(2:2:end)) == length(jobData(1:2:end))
41 jobResTArvTS{1+id}=jobData(1:2:end); % unclear what happens in
case of dropping
42 jobRespT{1+
id}=jobData(2:2:end)-jobData(1:2:end); % unclear what happens in
case of dropping
43 jobArvClass{1+
id} = jobClassData{1+
id}(1:2:end);
45 jobResTArvTS{1+
id}=jobData(1:2:end-1); % unclear what happens in
case of dropping
46 jobRespT{1+
id}=jobData(2:2:end-1)-jobData(1:2:end-1); % unclear what happens in
case of dropping
47 jobArvClass{1+
id} = jobClassData{1+
id}(1:2:end-1);
50 jobResTArvTS{1+
id}=min(jobData(:,1));
51 jobRespT{1+
id}=max(jobData(:,1))-min(jobData(:,1));
52 jobArvClass{1+
id} = jobClassData{1+
id}(1);
60%% compute per-
class residence times at the station
61ID2Class = unique([jobDepID,jobDepClassID],
'rows');
62for c=unique(ID2Class(:,2))
'
64 jobsInClass = ID2Class(find(ID2Class(:,2)==c),1);
65 for j = jobsInClass(:)'
66 jobsInClassArvClass = jobArvClass{1+j};
67 jobsInClassRespT = jobRespT{1+j};
68 if isempty(classResT{c})
69 classResT{c} = jobsInClassRespT(jobsInClassArvClass==c);
71 classResT{c} = [classResT{c}; jobsInClassRespT(jobsInClassArvClass==c)];