# Cell Throughput Prediction
:::warning
後來覺得預測UE的throughput對於換手沒有幫助,所以預測Cell的throughput來為UE選擇最佳的基地台
:::
## [QP Cell Data](https://gerrit.o-ran-sc.org/r/gitweb?p=ric-app/qp.git;a=blob;f=qp/cell.json.gz;h=bfe57366cbe82b79d824a7e46998b29aa943c2db;hb=48aa41171b8ca141df1f14341ea0ec2fde745af5)

## [SIM E2 Data (including cell data and ue data)](https://github.com/o-ran-sc/sim-e2-interface-data)

throughput_y is the throughput of Cell
throughput_x is the throughput of UE
pdcpBytesDl and availPrbDl has high correlation with throughput of Cell, so we can use these two parameters as input of prediction
# Data Analysis - RIC Test Simulated Data
###### tags: `Independent Study`
:::success
- Goal:
This analysis is use the data generated in o-ran open source code.
The goal is to find the parameters used to know what can affecct UE throughput. The following is a list of data that will be analyzed :
- Data analyisis:
- 1. AD Vaildation Data
- 2. SIM E2 Data (including cell data and ue data)
- 3. AD UE Data
- 4. AD UE Anomaly Prediction Data
- Note:
- 1. **不知道AD的UE Report是在什麼環境下量測的,而且只有UE的Report,沒有Cell的資料(QP那邊的資料和AD的時間不同,不能拿來跑統計)**
- 2. **QP的Cell Report有設定RIC Test的參數**
- 3. **SIM E2 Data是假設在一輛車子移動的狀況,其他行人沒有移動的狀況下量測的**
- 4. **這裡所謂的Correlation是線性相關,也許資料之間有非線性相關,但是在Near-RT RIC少於1秒處理的狀況下,使用非線性的預測會很耗時,所以我認為如果要做thorughput的預測,必須使用linear regression**
- Conclusion:
- 1. **[AD目前的Anomaly Detection似乎不準確,和標好的資料相比,相同的數據正確的比例只有35% ](https://drive.google.com/file/d/1As1evb4_UuTmUQSg6loy7l8fh1XZeJRS/view?usp=sharing)** (Anomaly_x為validation data , Anomaly_y為經過目前AD xApp演算法後的輸出)
- 2. **無法知道這四種資料是在什麼設定下測量的,有的throughput和rsrp rsrq rssinr較有關 (>0.4),有的較無關(~0.1),而rsrp rsrq rssinr在不同的資料中相關係數也不同,有的比較高,有的比較低,不太好決定到底能不能是影響throguhput重大的參數**
- 3. **availPrbDl 應該也和當作throughput有關,但是在SIM E2的分析中availPrbDl 越大 throughput卻更小,不符合假設,待觀察**
- 4. **目前暫定以prb_usage, pdcpBytesDl, rsrp, rsrq, rssinr, Anomaly與UE Throughput有關**
:::
:::warning
Ref:
[Collinearity ](https://medium.com/future-vision/collinearity-what-it-means-why-its-bad-and-how-does-it-affect-other-models-94e1db984168)
:::
[TOC]
## 假設
假設下列變數與throughput呈現相關
- 1. RSRP (正相關)
- 理由: RSRP 為 UE 量測 Downlink Reference Signals (DRS) 的平均訊號強度,而DRS 為基地台在下行訊號中,於固定 RB (Resource Block) 上傳送的訊號,訊號強度越大就可以帶著更多的訊息,所以throughput也越大
- 2. RSRQ (正相關)
- 理由: RSRQ 為 從屬基地台的訊號強度與 從屬基地台的訊號強度加干擾 的比例值,如果干擾越少(RSRQ越大),表示能傳達到的訊息也越多,所以throughput也越大
- 3. RSSINR (正相關)
- 理由: RSSINR 為 頻寬內的參考信號功率與干擾功率的比值,反映當前道路的狀況,如果道路狀況越佳,表示能傳達到的訊息也越多,所以throughput也越大
- 4. prb_usage (正相關)
- 理由: prb_usage 為 實體層定義的最小資訊的訊號單位,如果我們在便利商店有越多的櫃台可以結帳(prb_usage越多),那throughput也當然就越大
- 5. pdcpBytesDl (正相關)
- 理由: PDCP layer 負責header壓縮與解壓縮, 資料加密/解密, 以及資料完整性保護,將重組/排序封包為原本的資料 (data) 格, 而 pdcpBytesDl 為 PDCP layer 中整個cell處理的Bytes量,如果處理的Bytes越多,資料傳輸得更快,那throughput也就越大
- 6. PrbAvailDl (正相關)
- 理由: 實體層中能夠提供的PRB數量,如果能夠提供的越多,就能傳輸更多訊息,那throughput也就越大
- 7. Anomaly (負相關)
- 理由: 在 AD xApp裡面,如果 預測結果是 Anomaly 則標示出小於threshold的參數(rsrp, rsrq, rssinr,, throughput, prb_usage),照這樣看是負相關沒錯,不過使用的isolation forest只是區分出和正常資料不一樣的資料,所以Anomaly也可以表示高於threshold,但這邊就以xApp的程式為參考
## 探討方式 – 資料蒐集與分析工具
分析資料 & 來源:
- 1. AD Vaildation Data - https://gerrit.o-ran-sc.org/r/gitweb?p=ric-app/ad.git;a=blob;f=ad/valid.csv;h=6f09a6729b2d3c3459fe637f474800995ad69680;hb=4674f4ac8cbb4f1ca549f6acf32555d9d14c28cb
- 2. SIM E2 Data (including cell data and ue data) - https://github.com/o-ran-sc/sim-e2-interface-data
- 3. AD UE Data - https://gerrit.o-ran-sc.org/r/gitweb?p=ric-app/ad.git;a=blob;f=ad/ue.json.gz;h=0deb1bd27e939494c802181eb84c1a930c33ac2e;hb=4674f4ac8cbb4f1ca549f6acf32555d9d14c28cb
- 4. AD UE Anomaly Prediction Data - Prediction Result of AD UE Data
自變項:
- 1. RSRP
- 2. RSRQ
- 3. RSSINR
- 4. prb_usage
- 5. pdcpBytesDl
- 6. PrbAvailDl
- 7. Anomaly
依變項: UE Downlink Throughput
分析工具: 相關係數分析
## Data PreProcess Concept
The Process:
- 0. Convert to Dataframe if the data is not in Dataframe data type
- 1. Drop the data who are not useful for the prediction(UEID, Category, & Timestamp)
- 2. Extract numerical data
- 3. Drop observations having nan values
- 4. Drop observations having collinearity and have less correlation with UE throughput
- 5. Drop duplicate data
## AD Vaildation Data
### Stap 1 - Data PreProcess
```python=
import pandas as pd
import numpy as np
class PREPROCESS(object):
r""" This PREPROCESS class takes raw data and apply prepocessing on to that.
Parameters
----------
data: pandas dataframe
input dataset to process in pandas dataframe
Attributes
----------
data: DataFrame
DataFrame that has processed data
temp: list
list of attributes to drop
"""
def __init__(self, data):
"""
Columns that are not useful for the prediction will be dropped(UEID, Category, & Timestamp)
"""
self.temp = None
self.data = data
def variation(self):
""" drop the constant parameters """
if len(self.data) > 1:
self.data = self.data.loc[:, self.data.apply(pd.Series.nunique) != 1]
def numerical_data(self):
""" Filters only numeric data types """
numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
self.data = self.data.select_dtypes(include=numerics)
def drop_na(self):
""" drop observations having nan values """
self.data = self.data.dropna(axis=0)
def process(self):
"""
Calls the modules for the data preprocessing like dropping columns, normalization etc.,
"""
temp_1 = ['du-id', 'measTimeStampRf', 'targetTput', 'nrCellIdentity']
for col in self.data.columns:
if 'nb' in col:
temp_1.append(col)
if set(temp_1).issubset(self.data.columns):
self.temp_1 = self.data[temp_1]
self.data = self.data.drop(temp_1, axis=1)
self.numerical_data()
self.drop_na()
self.variation()
#self.data.drop_duplicates()
return self.data
```
### Step 2 - Read & Process Data
```python=
df = pd.read_csv('valid.csv')
df_ad_valid=df
df_ad_valid_process = PREPROCESS(df_ad_valid)
```
### Outcome 1
```python=
df_ad_valid_process.process().drop_duplicates().corr().style.background_gradient(cmap='coolwarm')
```

- 0. drop neighbor cell's information(rsrp rssinr rsrq) since I don't know how does the environment was set, and actually I does do the correlation with throughput but the correlation doesn't more than 0.2
- 1. throughput here is ue's throughput ( I guess is DRB.UEThpDl in RIC Test, Many commands in the oran source code mentions that we just predict downlink so far ).
- 2. we could see rsrp and rssinr has high correlation 0.98, means that they have collinearity which implies one of it is redundant, so I will remove it and remove duplicate data to calcuate the correlation again...
### Outcome 2
```python=
df_ad_valid_process.process().drop('rssinr',axis=1).drop_duplicates().corr().style.background_gradient(cmap='coolwarm')
```

- 1. The result shows that prb_usage and anomaly may be thoughput's important independent variables
## SIM E2 Data (including cell data and ue data)
### Step 0.1 - Explode the json & Save as csv file (SIM UE Data)
```python=
jsonToTable_iter = 8 # iterative time (approximately)
def explode(df):
for col in df.columns:
if isinstance(df.iloc[0][col], list):
df = df.explode(col)
d = df[col].apply(pd.Series)
df[d.columns] = d
df = df.drop(col, axis=1)
return df
def jsonToTable(df):
df.index = range(len(df))
cols = [col for col in df.columns if isinstance(df.iloc[0][col], dict) or isinstance(df.iloc[0][col], list)]
if len(cols) == 0:
return df
for col in cols:
d = explode(pd.DataFrame(df[col], columns=[col]))
d = d.dropna(axis=1, how='all')
df = pd.concat([df, d], axis=1)
df = df.drop(col, axis=1).dropna()
print(df)
global jsonToTable_iter
if jsonToTable_iter >= 1 :
jsonToTable_iter = jsonToTable_iter - 1
return jsonToTable(df)
else:
return df
df = pd.read_json('./MeasReports-20201112-101011.json.gz', lines=True)
df = df[['ueMeasReport']] # delete the null space
df = jsonToTable(df)
df.to_csv('MeasReport_ue.csv')
```
- 1. I do this here is because I can't combine them as a csv file directly, so I extrace them and combine them.
### Step 0.2 - Extract Cell Data

### Step 0.3 - Explode the json & Save as csv file (SIM Cell Data)
```python=
jsonToTable_iter = 8 # iterative time (approximately)
def explode(df):
for col in df.columns:
if isinstance(df.iloc[0][col], list):
df = df.explode(col)
d = df[col].apply(pd.Series)
df[d.columns] = d
df = df.drop(col, axis=1)
return df
def jsonToTable(df):
df.index = range(len(df))
cols = [col for col in df.columns if isinstance(df.iloc[0][col], dict) or isinstance(df.iloc[0][col], list)]
if len(cols) == 0:
return df
for col in cols:
d = explode(pd.DataFrame(df[col], columns=[col]))
d = d.dropna(axis=1, how='all')
df = pd.concat([df, d], axis=1)
df = df.drop(col, axis=1).dropna()
print(df)
global jsonToTable_iter
if jsonToTable_iter >= 1 :
jsonToTable_iter = jsonToTable_iter - 1
return jsonToTable(df)
else:
return df
df = jsonToTable(df)
df.to_csv('MeasReport_cell.csv')
```
### Step 0.4 - Merge UE & Cell Data
```python=
df = pd.read_json('./Meas_cell.json', lines=True)
df_cell = pd.read_csv('./MeasReport_cell.csv')
df_ue = pd.read_csv('./MeasReport_ue.csv')
merge_df= pd.merge(df_ue, df_cell, on = ['measTimeStampRf','nrCellIdentity'])
merge_df.to_csv('merge_ue_cell.csv')
```
### Step 1 - Data Preprocess
```python=
import pandas as pd
import numpy as np
class PREPROCESS(object):
r""" This PREPROCESS class takes raw data and apply prepocessing on to that.
Parameters
----------
data: pandas dataframe
input dataset to process in pandas dataframe
Attributes
----------
data: DataFrame
DataFrame that has processed data
temp: list
list of attributes to drop
"""
def __init__(self, data):
"""
Columns that are not useful for the prediction will be dropped(UEID, Category, & Timestamp)
"""
self.temp = None
self.data = data
def variation(self):
""" drop the constant parameters """
if len(self.data) > 1:
self.data = self.data.loc[:, self.data.apply(pd.Series.nunique) != 1]
def numerical_data(self):
""" Filters only numeric data types """
numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
self.data = self.data.select_dtypes(include=numerics)
def drop_na(self):
""" drop observations having nan values """
self.data = self.data.dropna(axis=0)
def process(self):
"""
Calls the modules for the data preprocessing like dropping columns, normalization etc.,
"""
temp_1 = ['Unnamed: 0_x',
'du-id_x',
'measTimeStampRf',
'ue-id',
'nrCellIdentity',
'targetTput']
for col in self.data.columns:
if 'nb' in col:
temp_1.append(col)
if set(temp_1).issubset(self.data.columns):
self.temp_1 = self.data[temp_1]
self.data = self.data.drop(temp_1, axis=1)
temp_2 = ['Unnamed: 0_y','du-id_y']
if set(temp_2).issubset(self.data.columns):
self.temp_2 = self.data[temp_2]
self.data = self.data.drop(temp_2, axis=1)
temp_3 = ['pdcpBytesUl','availPrbUl']
if set(temp_3).issubset(self.data.columns):
self.temp_3 = self.data[temp_3]
self.data = self.data.drop(temp_3, axis=1)
temp_4 = ['rsrp.1','rssinr.1']
if set(temp_4).issubset(self.data.columns):
self.temp_4 = self.data[temp_4]
self.data = self.data.drop(temp_4, axis=1)
self.numerical_data()
self.drop_na()
self.variation()
return self.data
```
### Step 2 - Read Merge Data and Process it
```python=
df = pd.read_csv('merge_ue_cell.csv')
merge_df = df
merge_df_processed = PREPROCESS(merge_df)
```
### Outcome 1
```python=
merge_df_processed.process().drop('throughput_y',axis=1).drop_duplicates().corr().style.background_gradient(cmap='coolwarm')
```

- 1. Maybe the pdcpBytesDl and availPrbDl can be considered to be independant variables of throughput
## AD UE Data
### Step 0 - Explode the json & Save as csv file (AD UE Data)
```python=
jsonToTable_iter = 8 # iterative time (approximately)
def explode(df):
for col in df.columns:
if isinstance(df.iloc[0][col], list) and col != 'neighbourCellList':
df = df.explode(col)
d = df[col].apply(pd.Series)
if col in list(range(5)):
d.columns = d.columns + '_' + str(col)
elif 'nbCellRfReport_' in col:
d.columns = d.columns + '_nb_' + col[-1]
df[d.columns] = d
df = df.drop(col, axis=1)
return df
def jsonToTable(df):
df.index = range(len(df))
cols = [col for col in df.columns if isinstance(df.iloc[0][col], dict) or isinstance(df.iloc[0][col], list)]
if len(cols) == 0:
return df
for col in cols:
d = explode(pd.DataFrame(df[col], columns=[col]))
d = d.dropna(axis=1, how='all')
df = pd.concat([df, d], axis=1)
df = df.drop(col, axis=1).dropna()
print(df)
global jsonToTable_iter
if jsonToTable_iter >= 1 :
jsonToTable_iter = jsonToTable_iter - 1
return jsonToTable(df)
else:
return df
df = pd.read_json('./ue.json.gz', lines=True)
df = df[['ueMeasReport']] # delete the null space
df_ad = jsonToTable(df)
df_ad.to_csv('ad_ue_report.csv')
```
### Step 1 - Data PreProcess
```python=
import pandas as pd
import numpy as np
class PREPROCESS(object):
r""" This PREPROCESS class takes raw data and apply prepocessing on to that.
Parameters
----------
data: pandas dataframe
input dataset to process in pandas dataframe
Attributes
----------
data: DataFrame
DataFrame that has processed data
temp: list
list of attributes to drop
"""
def __init__(self, data):
"""
Columns that are not useful for the prediction will be dropped(UEID, Category, & Timestamp)
"""
self.temp = None
self.data = data
def variation(self):
""" drop the constant parameters """
if len(self.data) > 1:
self.data = self.data.loc[:, self.data.apply(pd.Series.nunique) != 1]
def numerical_data(self):
""" Filters only numeric data types """
numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
self.data = self.data.select_dtypes(include=numerics)
def drop_na(self):
""" drop observations having nan values """
self.data = self.data.dropna(axis=0)
def process(self):
"""
Calls the modules for the data preprocessing like dropping columns, normalization etc.,
"""
temp_ad = ['du-id', 'measTimeStampRf', 'ue-id', 'nrCellIdentity', 'targetTput']
for col in self.data.columns:
if 'nb' in col:
temp_ad.append(col)
if set(temp_ad).issubset(self.data.columns):
self.temp_ad = self.data[temp_ad]
self.data = self.data.drop(temp_ad, axis=1)
#print(self.temp_ad)
self.numerical_data()
self.drop_na()
self.variation()
return self.data
```
### Step 2 - Read Merge Data and Process it
```python=
df = pd.read_csv('ad_ue_report.csv')
ad_ue_report = df
ad_ue_report_df = PREPROCESS(ad_ue_report)
ad_data = ad_ue_report_df.process().drop_duplicates()
```
### Outcome 1
```python=
ad_data.corr().style.background_gradient(cmap='coolwarm')
```

- 1. throughput here is UE's throughput
- 2. rssinr has collinerity with rsrp, so I dropped it.
### Outcome 2
```python=
ad_data_1 = ad_data.drop('rssinr',axis=1).drop_duplicates()
ad_data_1.corr().style.background_gradient(cmap='coolwarm')
```

## AD Anomaly Prediction Data
### Step 0 - Modify the source code of ad main.py
```python=
'''
Ken
'''
ad_predict_df = pd.DataFrame()
def predict_anomaly(self, df):
pred = ad_predict(df)
df['Anomaly'] = pred
df['Degradation'] = ''
val = None
'''
Ken
'''
global ad_predict_df
ad_predict_df.append(df)
ad_predict_df.to_csv('./ad_pred.csv')
```
### Stap 1 - Data PreProcess
```python=
import pandas as pd
import numpy as np
class PREPROCESS(object):
r""" This PREPROCESS class takes raw data and apply prepocessing on to that.
Parameters
----------
data: pandas dataframe
input dataset to process in pandas dataframe
Attributes
----------
data: DataFrame
DataFrame that has processed data
temp: list
list of attributes to drop
"""
def __init__(self, data):
"""
Columns that are not useful for the prediction will be dropped(UEID, Category, & Timestamp)
"""
self.temp = None
self.data = data
def variation(self):
""" drop the constant parameters """
if len(self.data) > 1:
self.data = self.data.loc[:, self.data.apply(pd.Series.nunique) != 1]
def numerical_data(self):
""" Filters only numeric data types """
numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
self.data = self.data.select_dtypes(include=numerics)
def drop_na(self):
""" drop observations having nan values """
self.data = self.data.dropna(axis=1)
def process(self):
"""
Calls the modules for the data preprocessing like dropping columns, normalization etc.,
"""
temp_1 = ['Unnamed: 0','du-id', 'measTimeStampRf', 'targetTput', 'nrCellIdentity']
for col in self.data.columns:
if 'nb' in col:
temp_1.append(col)
if set(temp_1).issubset(self.data.columns):
self.temp_1 = self.data[temp_1]
self.data = self.data.drop(temp_1, axis=1)
self.numerical_data()
self.drop_na()
self.variation()
#self.data.drop_duplicates()
return self.data
```
### Step 2 - Read & Process Data
```python=
ad_pred_csv = pd.read_csv('predict_outcome_df.csv')
ad_pred_df = PREPROCESS(ad_pred_csv)
```
### Outcome 1
```python=
ad_pred_df.process().drop_duplicates().corr().style.background_gradient(cmap='coolwarm')
```

- 1. rsrp and rssinr has collinearity, while rssinr has more stronger correlation with throughput, so rsrp was dropped.
### Outcome 2
```python=
ad_pred_df.process().drop('rsrp',axis=1).drop_duplicates().corr().style.background_gradient(cmap='coolwarm')
```

- 1. Anomaly has positive correlation with throughput is very weird.
## 結果
### AD Validation

### SIM E2

### AD UE Report

### AD UE Anomaly Prediction

## 結論
- 證實假設:
- 正相關
- RSRP : 與throughput呈現 無相關(<0.1) 或 低相關(0.1~0.4) 或 中度相關 (0.4~0.7)
- RSRQ : 與throughput呈現 無相關(<0.1) 或 低相關(0.1~0.4) 或 中度相關 (0.4~0.7)
- RSSINR: 與throughput呈現 無相關(<0.1) 或 低相關(0.1~0.4) 或 中度相關 (0.4~0.7)
- prb_usage: 與throughput呈現 中度相關 (0.4~0.7) 或 高度相關 (>0.7)
- pdcpBytesDl: 與throughput呈現 低相關(0.1~0.4)
- 負相關
- Anomaly: 與throughput呈現 中度相關 (0.4~0.7)
- 推翻假設:
- 正相關 變 負相關
- PrbAvailDl: 與throughput呈現 低相關(0.1~0.4)
- 研究結果:
- 1. RSRP RSRQ RSSINR 與 throughput關係不穩定 ?
- 2. PrbAvailDl應該要與throughput呈現正相關才對 ?
- 3. AD目前的Anomaly Prediction不準確,和標好的資料相比,相同的數據正確的比例只有35%,所以可以在AD UE Anomaly Prediction的係數表看到,Anomaly的值是和throughput呈現正相關...
暫定以 prb_usage, pdcpBytesDl, rsrp, rsrq, rssinr, Anomaly作為throughput的預測
## Apendix - QP RIC Test Configuration
```json=
{"metadata":{"simulator":
{"PRODUCT":"VIAVI RIC Test","VERSION":"v0.9-beta2-bigfile.7991-b49c9b56",
"BOOT":"2021-07-02T12:16:51.881578","CPUINFO":"4 x model name\t: unknown",
"KERNEL":"Linux version 4.4.0 #1 SMP Sun Jan 10 15:06:54 PST 2016","PROJECT":"e2-sim"}
,"configuration":{"_posted on":"2021-07-02T13:06:41.802397",
"global":{"workers":3,"dusim_gui":"","connection_points":[]},
"CTSM":{"cell_model":[{"du-id":1001,"nrCellIdentity":1,"maxPrbDl":273,"maxPrbUl":273}
,{"du-id":1002,"nrCellIdentity":2,"maxPrbDl":273,"maxPrbUl":273}],
"ue_groups":[{"ueModelConfig":{"du-id":1000,"ueModelConfigList":
[{"nrCellIdentity":0,"servingCellRfReport":{"distance":"500"},
"neighbourCellList":[{"nbCellIdentity":0,"nbCellRfReport.distance":"13300"},
{"nbCellIdentity":1,"nbCellRfReport.distance":"500"}]}]}},
{"ueModelConfig":{"du-id":1000,"ueModelConfigList"
:[{"nrCellIdentity":0,"servingCellRfReport"
:{"rsrq":"50,60,70","rsrp":"50,60,70","rssinr":"50,60,70"},
"neighbourCellList":[{"nbCellIdentity":1,
"nbCellRfReport":{"rsrq":"50,60,70","rsrp":"50,60,70","rssinr":"50,60,70"}}
,{"nbCellIdentity":2,"nbCellRfReport":
{"rsrq":"50,60,70","rsrp":"50,60,70","rssinr":"50,60,70"}}]}]}}]},
"Simulation":{"cells":{"number":13,"neighbours":5,"antenna_height":10,
"distribution":{"type":"diagram","distance":1000,"diagram":"
c6\n a1~~~~\n c7 ~~~~~~ c5\n
~~~~~a1\n c8 c1\n a2-------·
\n c2¦ ¦c4\n b1‾‾‾‾‾‾‾‾| ¦
a3\n c9|T.Station|c3 ¦ c13 a3\n |_________b1
¦\n c10¦ ¦c12\n ·--------a2\n
c11","Street width":20},
"layers":[{"name":"B2","frequency":1900,
"power":3,"maxPrbDl":120,"maxPrbUl":120},
{"name":"B13","frequency":700,"power":-1,
"maxPrbDl":91,"maxPrbUl":91},
{"name":"N77","frequency":3600,"power":20,
"maxPrbDl":273,"maxPrbUl":273}]},
"type2_ues":[{"global-id":"Pedestrian-{n}",
"Description":"Slow UEs using 250 Mbps,
most around cell 1","targetTput":0.25,
"handover":"RSRP (threshold=5)",
"mobility":{"type":"short range","speed":0.5,
"roundtrip":"return",
"distribution":[{"ues":10,"locations":
"c1/B2,c1/B2,c1/B2,c2/B2,c3/B2,c4/B2,c5/B2,
c6/B2,c7/B13"}]}},{"global-id":"Car-{n}",
"Description":"A car driving North from cell 1",
"targetTput":0.75,"handover":"RSRP (threshold=5)",
"mobility":{"type":"Manhattan","speed":20,
"roundtrip":"teleport","distribution":
[{"ues":1,"locations":"c1/B13"}],
"path":"NNWSEES..."}},{"global-id":
"Train passenger {n}","Description":
"Passengers trains arriving from the East,
then scattering from the Train Station","targetTput":0.30000000000000004,"handover":"RSRP (threshold=5)",
"mobility":{"type":"Manhattan","speed":10,"roundtrip":"teleport","distribution":[{"ues":3,"locations":"a3"}],"path":"WW..."}}
,{"global-id":"Waiting passenger {n}","Description":"Passengers waiting for their train in the Train Station","targetTput":0.1,"
handover":"RSRP (threshold=5)","mobility":{"type":"building","distribution":[{"ues":10,"locations":"b1"}]}}],"buildings"
:{"rf_degradation":{"rsrp_rsqr_loss":20,"rssinr_loss":10},"types":[{"height":20,"floors":4},{"height":50,"floors":10}]}},
"System":{"report_ms":10,"generate_ms":10,"batch_mode":true,"batch_length":2000,"tcp_hostport":"127.0.0.1:3001",
"RIC_address":"127.0.0.1:36422","Send_simulation_data":false,"PLMN_id":"001f01","gNB_id":"12345c"},
"Models":{"cell_models":[{"du-id":1001,"nrCellIdentity":"c1/B2",
"nrCellIdentity5G":4096,"maxPrbDl":120,"maxPrbUl":120,"frequency":1900,
"power":3,"xyz":"0,0,10"},{"du-id":1001,"nrCellIdentity":"c1/B13",
"nrCellIdentity5G":4097,"maxPrbDl":91,"maxPrbUl":91,"frequency":700,
"power":-1,"xyz":"0,0,10"},{"du-id":1001,"nrCellIdentity":"c1/N77",
"nrCellIdentity5G":4098,"maxPrbDl":273,"maxPrbUl":273,"frequency":3600,
"power":20,"xyz":"0,0,10"},{"du-id":1002,"nrCellIdentity":"c2/B2","nrCellIdent
ity5G":8192,"maxPrbDl":120,"maxPrbUl":120,"frequency":1900,"power":3,"xyz":"-832,-55
,10"},{"du-id":1002,"nrCellIdentity":"c2/B13","nrCellIdentity5G":8193,"maxPrbDl":91,"m
axPrbUl":91,"frequency":700,"power":-1,"xyz":"-832,-555,10"},{"du-id":1002,"nrCellIdentity":
"c2/N77","nrCellIdentity5G":8194,"maxPrbDl":273,"maxPrbUl":273,"frequency":3600,"power":20,"xyz":"-832,-555,10"},
{"du-id":1003,"nrCellIdentity":"c3/B2","nrCellIdentity5G":12288,"maxPrbDl":120,"maxPrbUl":120,"frequency":1900
,"power":3,"xyz":"-139,-1109,10"},{"du-id":1003,"nrCellIdentity":"c3/B13","nrCellIdentity5G":12289,"maxPrbDl":91,
"maxPrbUl":91,"frequency":700,"power":-1,"xyz":"-139,-1109,10"},{"du-id":1003,"nrCellIdentity":"c3/N77",
"nrCellIdentity5G":12290,"maxPrbDl":273,"maxPrbUl":273,"frequency":3600,"power":20,"xyz":"-139,-1109,10"},
{"du-id":1004,"nrCellIdentity":"c4/B2","nrCellIdentity5G":16384,"maxPrbDl":120,"maxPrbUl":120,"frequency":1900,"power":3,"
xyz":"832,-555,10"},{"du-id":1004,"nrCellIdentity":"c4/B13","nrCellIdentity5G":16385,"maxPrbDl":91,"maxPrbUl":91,
"frequency":700,"power":-1,"xyz":"832,-555,10"},{"du-id":1004,"nrCellIdentity":"c4/N77","nrCellIdentity5G":16386,"maxPrbDl":273
,"maxPrbUl":273,"frequency":3600,"power":20,"xyz":"832,-555,10"},{"du-id":1005,"nrCellIdentity":"c5/B2",
"nrCellIdentity5G":20480,"maxPrbDl":120,"maxPrbUl":120,"frequency":1900,"power":3,"xyz":"832,555,10"},
{"du-id":1005,"nrCellIdentity":"c5/B13","nrCellIdentity5G":20481,"maxPrbDl":91,"maxPrbUl":91,
"frequency":700,"power":-1,"xyz":"832,555,10"},{"du-id":1005,"nrCellIdentity":"c5/N77","nrCellIdentity5G":20482,"
maxPrbDl":273,"maxPrbUl":273,"frequency":3600,"power":20,"xyz":"832,555,10"},{"du-id":1006,"nrCellIdentity":"c6/B2","nrCellIdentity5G":24576,"maxPrbDl":120,"maxPrbUl":120,
"frequency":1900,"power":3,"xyz":"0,1109,10"},{"du-id":1006,"nrCellIdentity":"c6/B13","nrCellIdentity5G":24577,"maxPrbDl":91,"maxPrbUl":91,"frequency":700,"power":-1,"xyz":"0,1109,10"}
,{"du-id":1006,"nrCellIdentity":"c6/N77","nrCellIdentity5G":24578,"maxPrbDl":273,"maxPrbUl":273,"frequency":3600,"power":20,"xyz":"0,1109,10"},{"du-id":1007,"nrCellIdentity":"c7/B2",
"nrCellIdentity5G":28672,"maxPrbDl":120,"maxPrbUl":120,"frequency":1900,"power":3,"xyz":"-832,555,10"},{"du-id":1007,"nrCellIdentity":"c7/B13","nrCellIdentity5G":28673,"maxPrbDl":91,
"maxPrbUl":91,"frequency":700,"power":-1,"xyz":"-832,555,10"},{"du-id":1007,"nrCellIdentity":"c7/N77","nrCellIdentity5G":28674,"maxPrbDl":273,"maxPrbUl":273,"frequency":3600,"power":20,
"xyz":"-832,555,10"},{"du-id":1008,"nrCellIdentity":"c8/B2","nrCellIdentity5G":32768,"maxPrbDl":120,"maxPrbUl":120,"frequency":1900,"power":3,"xyz":"-1664,0,10"},{"du-id":1008,
"nrCellIdentity":"c8/B13","nrCellIdentity5G":32769,"maxPrbDl":91,"maxPrbUl":91,"frequency":700,"power":-1,"xyz":"-1664,0,10"},{"du-id":1008,"nrCellIdentity":"c8/N77"
,"nrCellIdentity5G":32770,"maxPrbDl":273,"maxPrbUl":273,"frequency":3600,"power":20,"xyz":"-1664,0,10"},{"du-id":1009,"nrCellIdentity":"c9/B2","nrCellIdentity5G":36864,"maxPrbDl":120,
"maxPrbUl":120,"frequency":1900,"power":3,"xyz":"-1941,-1109,10"},{"du-id":1009,"nrCellIdentity":"c9/B13","nrCellIdentity5G":36865,"maxPrbDl":91,"maxPrbUl":91,"frequency":700,"power":-1,
"xyz":"-1941,-1109,10"},{"du-id":1009,"nrCellIdentity":"c9/N77","nrCellIdentity5G":36866,"maxPrbDl":273,"maxPrbUl":273,"frequency":3600,"power":20,"xyz":"-1941,-1109,10"},{"du-id":1010,
"nrCellIdentity":"c10/B2","nrCellIdentity5G":40960,"maxPrbDl":120,"maxPrbUl":120,"frequency":1900,"power":3,"xyz":"-1109,-1664,10"},{"du-id":1010,"nrCellIdentity":"c10/B13",
"nrCellIdentity5G":40961,"maxPrbDl":91,"maxPrbUl":91,"frequency":700,"power":-1,"xyz":"-1109,-1664,10"},{"du-id":1010,"nrCellIdentity":"c10/N77","nrCellIdentity5G":40962,"maxPrbDl":273
"maxPrbUl":273,"frequency":3600,"power":20,"xyz":"-1109,-1664,10"},{"du-id":1011,"nrCellIdentity":"c11/B2","nrCellIdentity5G":45056,"maxPrbDl":120,"maxPrbUl":120,"frequency":1900,
"power":3,"xyz":"0,-2219,10"},{"du-id":1011,"nrCellIdentity":"c11/B13","nrCellIdentity5G":45057,"maxPrbDl":91,"maxPrbUl":91,"frequency":700,"power":-1,"xyz":"0,-2219,10"},
{"du-id":1011,"nrCellIdentity":"c11/N77","nrCellIdentity5G":45058,"maxPrbDl":273,"maxPrbUl":273,"frequency":3600,"power":20,"xyz":"0,-2219,10"},{"du-id":1012,"nrCellIdentity":"c12/B2",
"nrCellIdentity5G":49152,"maxPrbDl":120,"maxPrbUl":120,"frequency":1900,"power":3,"xyz":"832,-1664,10"},{"du-id":1012,"nrCellIdentity":"c12/B13","nrCellIdentity5G":49153,
"maxPrbDl":91,"maxPrbUl":91,"frequency":700,"power":-1,"xyz":"832,-1664,10"},{"du-id":1012,"nrCellIdentity":"c12/N77","nrCellIdentity5G":49154,"maxPrbDl":273,"maxPrbUl":273,
"frequency":3600,"power":20,"xyz":"832,-1664,10"},{"du-id":1013,"nrCellIdentity":"c13/B2","nrCellIdentity5G":53248,"maxPrbDl":120,"maxPrbUl":120,"frequency":1900,"power":3,
"xyz":"1664,-1109,10"},{"du-id":1013,"nrCellIdentity":"c13/B13","nrCellIdentity5G":53249,"maxPrbDl":91,"maxPrbUl":91,"frequency":700,"power":-1,"xyz":"1664,-1109,10"}
{"du-id":1013,"nrCellIdentity":"c13/N77","nrCellIdentity5G":53250,"maxPrbDl":273,"maxPrbUl":273,"frequency":3600,"power":20,"xyz":"1664,-1109,10"}],"type2_groups":[
{"du-id":1004,"ueModelConfigList":[{"ue-id":"Pedestrian-1","nrCellIdentity":"c4/B2","targetTput":0.25,"xyz":"731,-72","waypoints":"731,-72;731,1038","path":"",
"speed":0.5,"roundtrip":"return","handover":"RSRP (threshold=5)"},{"ue-id":"Pedestrian-3","nrCellIdentity":"c4/B2","targetTput":0.25,"xyz":"1470,315","waypoints"
"1470,315;1470,-795","path":"","speed":0.5,"roundtrip":"return","handover":"RSRP (threshold=5)"},{"ue-id":"Pedestrian-7","nrCellIdentity":"c4/B2",
"targetTput":0.25,"xyz":"1593,-31","waypoints":"1593,-31;1593,1079","path":"","speed":0.5,"roundtrip":"return","handover":"RSRP (threshold=5)"},{
"
ue-id":"Pedestrian-10","nrCellIdentity":"c4/B2","targetTput":0.25,"xyz":"1775,325","waypoints":"1775,325;1775,-785","path":"","speed":0.5,"roundtr
ip":"return","handover":"RSRP (threshold=5)"}]},{"du-id":1005,"ueModelConfigList":[{"ue-id":"Pedestrian-2","nrCellIdentity":"c5/B2","targetTput":0.25,"xyz":"120
8,284","waypoints":"1208,284;1208,-826","path":"","speed":0.5,"roundtrip":"return","handover":"RSRP (threshold=5)"}]},
{"du-id":1003,"ueModelConfigList":[{"ue-id":"Pedestrian-4","nrCellIdentity":"c3/B2","targetTput":0.25,"xyz":"-1019,-783","waypoints":"-1019,-783;-1296,-1892",
"path":"","speed":0.5,"roundtrip":"return","handover":"RSRP (threshold=5)"},{"ue-id":"Waiting passenger 4","nrCellIdentity":"c3/B2","targetTput":0.1,"xyz":"-435,-857","waypoints":"","
path":"","speed":0,"roundtrip":"return","handover":"RSRP (threshold=5)"}]},{"du-id":1002,"ueModelConfigList":[{"ue-id":"Pedestrian-5","nrCellIdentity":"c2/B2","targetTput":0.25,"xyz":
"-748,-481","waypoints":"-748,-481;-55,-1035","path":"","speed":0.5,"roundtrip":"return","handover":"RSRP (threshold=5)"},{"ue-id":"Pedestrian-8","nrCellIdentity":"c2/B2","targetTput"
:0.25,"xyz":"-503,-607","waypoints":"-503,-607;190,-1161","path":"","speed":0.5,"roundtrip":"return","handover":"RSRP (threshold=5)"},{"ue-id":"Pedestrian-9","nrCellIdentity":"c2/B2",
"targetTput":0.25,"xyz":"111,-404","waypoints":"111,-404;943,-959","path":"","speed":0.5,"roundtrip":"return","handover":"RSRP (threshold=5)"},{"ue-id":"Waiting passenger 2","nrCellIde
ntity":"c2/B2","targetTput":0.1,"xyz":"-726,-1130,5","waypoints":"","path":"","speed":0,"roundtrip":"return","handover":"RSRP (threshold=5)"},{"ue-id":"Waiting passenger 3","nrCellIden
tity":"c2/N77","targetTput":0.1,"xyz":"-691,-973,5","waypoints":"","path":"","speed":0,"roundtrip":"return","handover":"RSRP (threshold=5)"},{"ue-id":"Waiting passenger 5","nrCellIdent
ity":"c2/B2","targetTput":0.1,"xyz":"-899,-942","waypoints":"","path":"","speed":0,"roundtrip":"return","handover":"RSRP (threshold=5)"},{"ue-id":"Waiting passenger 7","nrCellIdentity":"
c2/N77","targetTput":0.1,"xyz":"-973,-1060,15","waypoints":"","path":"","speed":0,"roundtrip":"return","handover":"RSRP (threshold=5)"},{"ue-id":"Waiting passenger 8","nrCellIdentity":"c2/B2","targetTput":0.1,
"
xyz":"-1093,-886,15","waypoints":"","path":"","speed":0,"roundtrip":"return","handover":"RSRP (threshold=5)"}]},{"du-id":1007,"ueModelConfigList":[{"ue-id":"Pedestrian-6","nrCellIdentity":"c7/B13","targetTput":
0.25,"xyz":"-393,-382","waypoints":"-393,-382;439,173","path":"","speed":0.5,"roundtrip":"return","handover":"RSRP (threshold=5)"}]},{"du-id":1001,"ueModelConfigList":[{"ue-id":"Car-1","nrCellIdentity":"c1/B13"
,"targetTput":0.75,"xyz":"-567,827","waypoints":"","path":"NNWSEES...","speed":20,"roundtrip":"teleport","handover":"RSRP (threshold=5)"}]},{"du-id":1013,"ueModelConfigList":[{"ue-id":"Train passenger 1",
"nrCellIdentity":"c13/B13","targetTput":0.30000000000000004,"xyz":"2330,-977","waypoints":"","path":"WW...","speed":10,"roundtrip":"teleport","handover":"RSRP (threshold=5)"},{"ue-id":"Train passenger 2",
nrCellIdentity":"c13/B2","targetTput":0.30000000000000004,"xyz":"2347,-1103","waypoints":"","path":"WW...","speed":10,"roundtrip":"teleport","handover":"RSRP (threshold=5)"},{"ue-id":"Train passenger 3",
"nrCellIdentity":"c13/N77","targetTput":0.30000000000000004,"xyz":"2307,-898","waypoints":"","path":"WW...","speed":10,"roundtrip":"teleport","handover":"RSRP (threshold=5)"}]},{"du-id":1010,
"ueModelConfigList":[{"ue-id":"Waiting passenger 1","nrCellIdentity":"c10/N77","targetTput":0.1,"xyz":"-851,-1232,15","waypoints":"","path":"","speed":0,"roundtrip":"return","handover":"RSRP (threshold=5)"}
{"ue-id":"Waiting passenger 6","nrCellIdentity":"c10/B2","targetTput":0.1,"xyz":"-1095,-1160,5","waypoints":"","path":"","speed":0,"roundtrip":"return","handover":"RSRP (threshold=5)"}
,{"ue-id":"Waiting passenger 9","nrCellIdentity":"c10/N77","targetTput":0.1,"xyz":"-1353,-1312,10","waypoints":"","path":"","speed":0,"roundtrip":"return","handover":"RSRP (threshold=5)"}
,{"ue-id":"Waiting passenger 10","nrCellIdentity":"c10/N77","targetTput":0.1,"xyz":"-1372,-1359","waypoints":"","path":"","speed":0,"roundtrip":"return","handover":"RSRP (threshold=5)"}]}],
"areas":[{"name":"a1","points":"-277,277;416,832"},{"name":"a2","points":"-555,-1941;693,-277"},{"name":"a3","points":"2219,-1109;2357,-832"},{"name":"b1","points":"-1664,-1387;-277,-832,20"},
{"name":"b1#f1","points":"-1664,-1387;-277,-832,5"},{"name":"b1#f2","points":"-1664,-1387,5;-277,-832,10"},{"name":"b1#f3","points":"-1664,-1387,10;-277,-832,15"},{"name":"b1#f4",
"points":"-1664,-1387,15;-277,-832,20"}],"meta":{"last_seed":"0x7db2"}},"Reports":{"logging":"info","full_reporting":true,"include_internal":true,"api_issues":"fix","counts_max_seconds":3},
"Anomalies":[{"anomaly_name":"Intermittent Throughput issue in cell 1","degradation":{"type":"throughput","value":80},"delay":10,"duration":3,"affected_areas":"","affected_cells":"",
"affected_ues":"Car*, Pedes*"},{"anomaly_name":"Radio problem in a1 area (except for cell 7)","degradation":{"type":"radio","rsrp":20,"rsrq":20,"rssinr":20},"delay":8,"duration":2,
"affected_areas":"","affected_cells":"","affected_ues":"Train*"},{"anomaly_name":"Intermittent issues for cars in both areas","degradation":{"type":"radio","rsrp":20,"rsrq":20,"rssinr":20}
,"delay":10,"duration":3,"affected_areas":"","affected_cells":"","affected_ues":"Waiting*"}],"E2 Load":{"total_CUs":1,"DUs_per_CU":3,"Cells_per_DU":15,"UEs_per_Cell":32,"UE_groups"
:[{"name":"High","period":10,"ues":10},{"name":"Medium","period":60000,"ues":30},{"name":"Low","period":900000,"ues":30},{"name":"ReportEveryHour","period":3600000,"ues":10}]}},
"numbers":{"UEs":416,"cells":13,"CUs":1,"DUs":3},"tags":["radio anomaly","throughput anomaly","buildings","degradation"],"Throughput Anomaly":[{"anomaly_name":"Intermittent Throughput issue in cell 1",
"degradation":{"type":"throughput","value":80},"delay":10,"duration":3,"affected_areas":"","affected_cells":"","affected_ues":"Car*, Pedes*"}],"Radio Anomaly":[{"anomaly_name":"Radio problem in a1 area
(except for cell 7)","degradation":{"type":"radio","rsrp":20,"rsrq":20,"rssinr":20},"delay":8,"duration":2,"affected_areas":"","affected_cells":"","affected_ues":"Train*"},{"anomaly_name":"Intermittent
issues for cars in both areas","degradation":{"type":"radio","rsrp":20,"rsrq":20,"rssinr":20},"delay":10,"duration":3,"affected_areas":"","affected_cells":"","affected_ues":"Waiting*"}]}}
'''
```