Newer
Older
# For SPMT commissioning (based on SNiPER)
The software was intentionally designed to separate the data input and analysis tools.
Similar to JUNO Offline, two main structures exist: one is named **`algorithm`**, and the other is named **`tool`**. Each of these structures has its own set of rules for definition.
1. **`algorithm`** can accept the input **arguments** and input **data** (only `ROOT` data can be accepted now). The **data** is input as a list written in a text file, **arguments** can be delivered to the **`algorithm`** by setting in the python script. Besides, the **`algorithm`** can call analysis **`tool`** to process the data.
2. **`tool`** contains the true analysis algorithm
## Create your own algorithm
Create an algorithm named `ExampleAlg` in `./Analysis`
```bash=
cd Analysis
mkdir ExampleAlg
cd ExampleAlg
mkdir src
mkdir python
mkdir python/ExampleAlg
touch CMakeLists.txt
```
In `python/ExampleAlg/__init__.py`
```python=
import Sniper as sn
sn.loadDll("libExampleAlg.so")
```
In `CMakeLists.txt`
```cmake=
PKG(ExampleAlg
DEPENDS
AnaTool
)
```
An `**algorithm**` is defined as a `c++ class` like
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// Similar to JUNO Offline, this line will register the algorithm
DECLARE_ALGORITHM(ExampleAlg);
// The *Alg class must inherit from AlgBase
class ExampleAlg : public AlgBase {
public:
// necessary
ExampleAlg(const string&);
virtual ~ExampleAlg();
// initialize, execute, finalize will be called automatically
bool initialize();
bool execute();
bool finalize();
// ...
private:
Params m_paras;
vector<Anatool*> m_tools;
//SPMTMap *m_spmtMap;
// ...
};
// The constructor of AlgBase must be called
ExampleAlg::ExampleAlg(const string &name) : AlgBase(name) {
// ...
}
```
More detail can be found in `./Analysis/CommissioningAlg/`.
## Create your own analsis tool
Similar to `ExampleAlg`, the folders, CMakeLists.txt and \_\_init\_\_.py should be created
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
DECLARE_TOOL(ExampleTool);
class ExampleTool : public AnaTool, public ToolBase {
public:
ExampleTool(const string&);
virtual ~ExampleTool();
bool configure(string, const SPMTMap*);
bool analyze(const Params&);
bool output();
private:
// ...
};
ExampleTool::ExampleTool(const string &name) : ToolBase(name) {}
bool ExampleTool::configure(string outputDir, const SPMTMap *map) {
// initialization
return true;
}
bool ExampleTool::analyze(const Params& paras) {
// output gcu ID
LogInfo << paras.get("GCU_ID") << endl;
return true;
}
bool ExampleTool::output() {
m_canvas->cd();
m_hist->Draw();
m_canvas->SaveAs("dir.pdf");
}
```
More detail can be found in `./Analysis/NoiseAnaTool/`
## How to compile
```bash=
source setup.sh
./build.sh
```
## How to add your own algorithm or tool
If the algorithm named `ExampleAlg` was created in `./Analysis`, the folder's name should be add in the `./Analysis/CMakeLists.txt` as
```cmake=
add_subdirectory(ExampleAlg)
```