10#include "BmnNdetDigi.h"
11#include "BmnNdetDigit.h"
12#include "BmnNdetGeo.h"
13#include "BmnNdetPoint.h"
14#include "BmnNdetSurfacePoint.h"
15#include "FairLogger.h"
16#include "TTreeFormula.h"
18#include <TStopwatch.h>
23 fIsExp ? fDoMatchMC = false : fDoMatchMC =
true;
24 fIsGlobal = isGlobalCoordinates;
25 LOG(detail) << Form(
"BmnNdetReconstructor: isExp %i; isGlobal %i", fIsExp, fIsGlobal);
30 fRecoCutsFile = reco_cuts_file;
32 LOG(detail) << Form(
"BmnNdetReconstructor: Reco cuts %s", fRecoCutsFile.Data());
46 fpFairRootMgr = FairRootManager::Instance();
49 fArrayOfDigits = (TClonesArray*)fpFairRootMgr->GetObject(
"NdetDigi");
50 if (!fArrayOfDigits) {
51 LOG(error) <<
"BmnNdetReconstructor::Init(): branch with Digits not found! Task will be deactivated";
56 fArrayOfDigits = (TClonesArray*)fpFairRootMgr->GetObject(
"NdetDigit");
57 if (!fArrayOfDigits) {
58 LOG(error) <<
"BmnNdetReconstructor::Init(): branch with Digits not found! Task will be deactivated";
63 fArrayOfPoints = (TClonesArray*)fpFairRootMgr->GetObject(
"NdetPoint");
64 if (!fArrayOfPoints) {
65 LOG(error) <<
"BmnNdetReconstructor::Init(): branch with NdetPoints not found! Task will be deactivated";
70 fArrayOfSurfacePoints = (TClonesArray*)fpFairRootMgr->GetObject(
"NdetSurfacePoint");
71 if (!fArrayOfSurfacePoints) {
73 <<
"BmnNdetReconstructor::Init(): branch with NdetSurfacePoint not found! Task will be deactivated";
77 fpFairRootMgr->Register(
"NdetSurfacePoint",
"NDET", fArrayOfSurfacePoints, kTRUE);
81 fBmnNdetEvent->
reset();
83 fpFairRootMgr->RegisterAny(
"NdetEvent", fBmnNdetEvent, kTRUE);
84 fpFairRootMgr->Register(
"NdetEvent",
"NDET", fBmnNdetEvent, kFALSE);
86 LOG(debug) <<
"Ndet Reconstructor ready";
92 namespace po = boost::program_options;
94 TString dir = getenv(
"VMCWORKDIR");
95 TString path = dir +
"/parameters/ndet/";
103 po::options_description desc(
"Options");
104 desc.add_options()(
"VERSION.id", po::value<float>(&version),
105 "version identificator")(
"COMMENT.str", po::value<std::string>(&comment),
"comment")(
106 "EXPERIMENT.cut", po::value<std::string>(&cutExp),
107 "cut for Experimental data")(
"SIMULATION.cut", po::value<std::string>(&cutSim),
"cut for Simulated data");
110 po::variables_map vm;
111 std::ifstream config_file((path + fRecoCutsFile).Data(), std::ifstream::in);
112 if (!config_file.is_open()) {
113 LOG(error) << Form(
"BmnNdetReconstructor : Loading Cuts from file: %s - file open error!",
114 fRecoCutsFile.Data());
117 LOG(debug) << Form(
"BmnNdetReconstructor : Loading Cuts from file: %s", fRecoCutsFile.Data());
118 po::store(po::parse_config_file(config_file, desc), vm);
122 fSelectionString = (fIsExp) ? cutExp : cutSim;
136 fpFairRootMgr->SetUseFairLinks(kTRUE);
139 fBmnNdetEvent->
reset();
140 auto digiVector = GetSelectedDigiVector(fSelectionString);
141 for (
auto it : digiVector) {
145 auto pos = posMap.find(address);
146 if (pos == posMap.end()) {
147 LOG(debug2) << Form(
"BmnNdetReconstructor : Exec. Digi address %d not found in geometry. Skipping",
149 if (FairLogger::GetLogger()->IsLogNeeded(fair::Severity::debug2))
155 this_cell->SetPosition(pos->second.first);
156 this_cell->SetPositionError(pos->second.second);
159 fBmnNdetEvent->
AddCell(this_cell);
162 if (!fIsExp && fDoMatchMC)
166 fworkTime += sw.RealTime();
167 fpFairRootMgr->SetUseFairLinks(kFALSE);
170std::vector<TObject*> BmnNdetReconstructor::GetSelectedDigiVector(TString formulaString)
172 TTree* temp_tree =
new TTree(
"temp_tree",
"temp_tree");
173 TString temp_br_name = (fIsExp) ?
"NdetDigi" :
"NdetDigit";
174 fSelectedDigiVector.clear();
178 temp_tree->Branch(temp_br_name.Data(), &ptr);
179 for (
int i = 0;
i < fArrayOfDigits->GetEntriesFast();
i++) {
185 temp_tree->Branch(temp_br_name.Data(), &ptr);
186 for (
int i = 0;
i < fArrayOfDigits->GetEntriesFast();
i++) {
192 TTreeFormula* formula =
new TTreeFormula(
"TTreeformula", formulaString.Data(), temp_tree);
193 if (!formula || formula->GetNdim() == 0)
194 LOG(error) << Form(
"BmnNdetReconstructor::GetSelectedDigiVector. Bad cuts. Check formula %s from file %s",
195 formulaString.Data(), fRecoCutsFile.Data());
197 TObject* ThisDigi =
nullptr;
198 temp_tree->SetBranchAddress(temp_br_name.Data(), &ThisDigi);
199 for (
int i = 0;
i < temp_tree->GetEntries();
i++) {
200 temp_tree->GetEntry(
i);
202 if (formula->EvalInstance() > 0)
203 fSelectedDigiVector.push_back(fArrayOfDigits->At(
i));
207 return fSelectedDigiVector;
210void BmnNdetReconstructor::MatchMCTracks()
213 fpFairRootMgr->SetUseFairLinks(kTRUE);
217 for (
int ice = 0, nce = cells->GetEntriesFast(); ice < nce; ++ice) {
218 auto* cell =
static_cast<BmnNdetCell*
>(cells->At(ice));
223 for (
int iPt = 0, nPt = fArrayOfPoints->GetEntriesFast(); iPt < nPt; ++iPt) {
224 auto* point =
static_cast<BmnNdetPoint*
>(fArrayOfPoints->At(iPt));
227 if (point->GetAddress() != cell->GetAddress())
230 for (
auto link : point->GetLinks()) {
231 link.SetWeight(point->GetEnergyLoss());
234 LOG(debug) << Form(
"BmnNdetReconstructor::MatchMCTracks. Matched MC point and MC track. Updated cell with "
235 "address %d. Now it has %d links",
236 cell->GetAddress(), cell->GetNLinks());
241 fpFairRootMgr->SetUseFairLinks(kFALSE);
249 resultTree->Branch(
"NdetEvent", &fBmnNdetEvent);
251 resultTree->Branch(
"NdetSurfacePoint", &fArrayOfSurfacePoints);
257 printf(
"Work time of BmnNdetReconstructor: %4.2f sec.\n", fworkTime);
uint32_t GetAddress() const
const auto & GetPositionMap() const
BmnStatus ReadGeometryFromGeoManager(bool getGlobalPosition=true)
void SetAddress(uint32_t address)
void SetSignal(double signal)
void SetTime(double time)
Data class for Bmn Ndet digital signal processing.
virtual void Print(const Option_t *opt="")
Class for Bmn Ndet data container in event.
TClonesArray * GetModifiableCells()
Modifiable interface to the cells set.
void reset()
Zero all fields.
void AddCell(BmnNdetCell *cell)
Add a cell to the event.
virtual InitStatus Init()
BmnNdetReconstructor(bool isExp, bool isGlobalCoordinates)
virtual void Exec(Option_t *opt)
void SetRecoCutsFile(TString reco_cuts_file)
virtual void OnlineWrite(const std::unique_ptr< TTree > &resultTree)
Write task resul to tree.