# 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

```c++=
// 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

A `**tool**` is defined as a `c++ class` too.

```c++=
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)
```