BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
BmnZdcDigiProducer.cxx
Go to the documentation of this file.
1/*************************************************************************************
2 *
3 * BmnZdcDigiProducer
4 * Class to create digital data taken from BmnZdc detector
5 *
6 * Author: Elena Litvinenko
7 * e-mail: litvin@nf.jinr.ru
8 * Version: 18-11-2015
9 *
10 ************************************************************************************/
11
12#include "BmnZdcDigiProducer.h"
13
14#include "BmnZdcDigi.h"
15#include "BmnZdcPoint.h"
16#include "FairRootManager.h"
17#include "FairRun.h"
18#include "FairRunAna.h"
19#include "FairRuntimeDb.h"
20#include "TClonesArray.h"
21#include "TFile.h"
22#include "TROOT.h"
23#include "TVectorT.h"
24
25#include <iostream>
26
27// ----- Default constructor -------------------------------------------
29 : FairTask(name)
30{
31 fPointArray = 0;
32 fDigiArray = 0;
33 fGeoPar = 0;
34 fHistZdcEn = 0;
35 fELossZdcValue = NULL;
36 fELossZdcHisto = NULL;
37}
38// -------------------------------------------------------------------------
39
40// ----- Destructor ----------------------------------------------------
42// -------------------------------------------------------------------------
43
44// -------------------------------------------------------------------------
46{
47 cout << "-I- BmnZdcDigiProducer: SetParContainers started..." << endl;
48
49 // Get run and runtime database
50 FairRunAna* run = FairRunAna::Instance();
51 if (!run)
52 Fatal("FairMuchDigitize::SetParContainers", "No analysis run");
53
54 FairRuntimeDb* rtdb = run->GetRuntimeDb();
55 if (!rtdb)
56 Fatal("FairMuchDigitize::SetParContainers", "No runtime database");
57
58 cout << "-I- BmnZdcDigiProducer: SetParContainers continued..." << endl;
59
60 rtdb->activateParIo(rtdb->getFirstInput());
61 // fGeoPar=( BmnZdcGeoPar*) rtdb->getContainer("BmnZdcGeoPar");
62 fGeoPar = (BmnZdcGeoPar*)gROOT->FindObject("BmnZdcGeoPar");
63 fGeoPar->print();
64
65 cout << "-I- BmnZdcDigiProducer: SetParContainers finished." << endl;
66}
67
68// -------------------------------------------------------------------------
69// ----- Public method Init --------------------------------------------
71{
72
73 cout << "-I- BmnZdcDigiProducer: Init started..." << endl;
74
75 // Get RootManager
76 FairRootManager* ioman = FairRootManager::Instance();
77 if (!ioman) {
78 cout << "-E- BmnZdcDigiProducer::Init: "
79 << "RootManager not instantiated!" << endl;
80 return kFATAL;
81 }
82
83 // Get input array
84 fPointArray = (TClonesArray*)ioman->GetObject("ZdcPoint");
85 if (!fPointArray) {
86 cout << "-W- BmnZdcDigiProducer::Init: "
87 << "No ZdcPoint array!" << endl;
88 return kERROR;
89 }
90
91 // Create and register output array
92 fDigiArray = new TClonesArray("BmnZdcDigi");
93 ioman->Register("ZdcDigi", "Zdc", fDigiArray, kTRUE);
94
95 fELossZdcValue = new TClonesArray("TParameter<double>");
96 ioman->Register("ELossZdcValue", "Zdc", fELossZdcValue, kTRUE);
97
98 fELossZdcHisto = new TClonesArray("TVectorT<float>");
99 ioman->Register("ELossZdcHisto", "Zdc", fELossZdcHisto, kTRUE);
100
102 fDigiScheme->Init(fGeoPar, 0, 2);
103
104 cout << "-I- BmnZdcDigiProducer: Intialization successfull" << endl;
105
106 return kSUCCESS;
107}
108// -------------------------------------------------------------------------
110{
111 Int_t nx, ny /*, nz*/;
112 Double_t dx, dy /*, dz*/;
113
114 // BmnZdcDigiScheme *fDigiScheme = BmnZdcDigiScheme::Instance();
115 // fDigiScheme->GetZdcDimensions (nx,ny,nz);
116 // fDigiScheme->GetVolDxDyDz (pDigiID,dx, dy, dz);
117 nx = 10;
118 ny = 10;
119 dx = 75;
120 dy = 75; // dz=1010; // mm
121
122 Int_t Nx = nx + 2;
123 Double_t Dx = dx * Nx / 2;
124 Int_t Ny = ny + 2;
125 Double_t Dy = dy * Ny / 2;
126
127 fHistZdcEn = new TH2F("HistZdcEn", "HistZdcEnergy", Nx, -Dx, Dx, Ny, -Dy, Dy);
128
129 if (!fHistZdcEn)
130 cout << "-E- BmnZdcDigiProducer: HistZdcEn Histogram not created !!" << endl;
131 else {
132 FairRootManager* ioman = FairRootManager::Instance();
133 fHistZdcEn->SetDirectory((TFile*)ioman->GetOutFile());
134 fHistZdcEn->Write();
135 }
136}
137
138// ----- Public method Exec --------------------------------------------
140{
141
142 // #define EDEBUG
143#ifdef EDEBUG
144 static Int_t lEDEBUGcounter = 0;
145 cout << "EDEBUG-- BmnZdcDigiProducer::Exec() started... " << endl;
146 ;
147#endif
148
149 if (!fDigiArray)
150 Fatal("Exec", "No DigiArray");
151
152 fDigiArray->Clear();
153
155
156 if (!pDigiScheme)
157 Fatal("BmnZdcDigiProducer::Exec", "No DigiScheme");
158
159 Int_t module_groupID, modID, chanID;
160 BmnZdcDigiId_t digiID;
161
162 BmnZdcPoint* point = NULL;
163
164 map<BmnZdcDigiId_t, Float_t> fDigiIdEnergy;
165 fDigiIdEnergy.clear();
166 map<BmnZdcDigiId_t, Float_t>::const_iterator p;
167
168 Int_t nPoints = fPointArray->GetEntriesFast();
169 Double_t e1 = 0;
170
171 if (fHistZdcEn) {
172 fHistZdcEn->Reset();
173 }
174 TH2F* hist1 = fHistZdcEn;
175
176 // Bool_t flag_of_not_created=1;
177
178 for (Int_t iPoint = 0; iPoint < nPoints; iPoint++) {
179
180 point = (BmnZdcPoint*)fPointArray->At(iPoint);
181
182 // Int_t pMMcopy=1;
183 digiID = pDigiScheme->GetDigiIdFromVolumeData(point->GetDetectorID(), point->GetCopyMother());
184
185 if ((digiID[0] != -1) && (digiID[1] != -1)) {
186
187 if (!fHistZdcEn) {
188
189 CreateHistograms(&digiID);
190
191 hist1 = fHistZdcEn;
192 }
193
194 if (fDigiIdEnergy.find(digiID) == fDigiIdEnergy.end())
195 fDigiIdEnergy[digiID] = point->GetEnergyLoss();
196 else
197 fDigiIdEnergy[digiID] += point->GetEnergyLoss();
198
199 e1 += point->GetEnergyLoss();
200 hist1->Fill(point->GetX() * 10, point->GetY() * 10, point->GetEnergyLoss()); // in mm
201#ifdef EDEBUG
202 if (lEDEBUGcounter < 20) {
203 cout << "EDEBUG-- BmnZdcDigiProducer::Exec: point : ";
204 point->Print("");
205 lEDEBUGcounter++;
206 }
207#endif
208
209 }
210#ifdef EDEBUG
211 else
212 {
213 if (lEDEBUGcounter < 100) {
214 cout << "EDEBUG-- BmnZdcDigiProducer::Exec: Boundary point? : ";
215 point->Print("");
216 lEDEBUGcounter++;
217 }
218 }
219#endif
220 }
221
222 TClonesArray& clref1 = *fELossZdcValue;
223 new (clref1[0]) TParameter<double>("ELossZdc", e1);
224
225 if (fHistZdcEn) {
226 TClonesArray& clref1e = *fELossZdcHisto;
227 new (clref1e[0]) TVectorT<float>(fHistZdcEn->GetSize(), fHistZdcEn->GetArray());
228 }
229
230 Float_t eloss = 0;
231
232 for (p = fDigiIdEnergy.begin(); p != fDigiIdEnergy.end(); ++p) {
233
234 pDigiScheme->SplitDigiID((*p).first, module_groupID, modID, chanID);
235
236 if ((module_groupID != -1) && (chanID != -1)) {
237 eloss = (*p).second;
238 /*BmnZdcDigi* digi = */ AddHit(module_groupID, modID, chanID, eloss);
239#ifdef EDEBUG
240 if (lEDEBUGcounter < 50) {
241 cout << "EDEBUG-- BmnZdcDigiProducer::Exec: " << module_groupID << " " << chanID << " " << (*p).second
242 << " " << lEDEBUGcounter << endl;
243 lEDEBUGcounter++;
244 }
245#endif
246 }
247 }
248
249#undef EDEBUG
250}
251// -------------------------------------------------------------------------
252
253// ----- Private method AddDigi --------------------------------------------
254BmnZdcDigi* BmnZdcDigiProducer::AddHit(Int_t module_groupID, Int_t modID, Int_t chanID, Float_t energy)
255{
256 TClonesArray& clref = *fDigiArray;
257 Int_t size = clref.GetEntriesFast();
258 BmnZdcDigi* result = new (clref[size]) BmnZdcDigi(module_groupID, modID, chanID, (Double_t)energy);
259 // result->Print();
260 return result;
261}
262// ----
int Int_t
float Float_t
double Double_t
constexpr Bool_t kTRUE
const char Option_t
void Fatal(const char *location, const char *msgfmt,...)
#define gROOT
BmnZdcDigi * AddHit(Int_t module_groupID, Int_t modID, Int_t chanID, Float_t energy)
TClonesArray * fELossZdcValue
void CreateHistograms(BmnZdcDigiId_t *pDigiID)
TClonesArray * fELossZdcHisto
~BmnZdcDigiProducer()
Destructor.
BmnZdcGeoPar * fGeoPar
Input geometry parameters container.
BmnZdcDigiProducer(const char *name="BmnZdc Digi Producer")
Default constructor.
virtual void Exec(Option_t *opt)
Virtual method Exec.
TClonesArray * fPointArray
Input array of BmnZdcPoints.
TClonesArray * fDigiArray
Output array of BmnZdcDigi.
virtual InitStatus Init()
Virtual method Init.
virtual void SetParContainers()
TH2F * fHistZdcEn
Output Histograms of X-Y energy map.
Bool_t Init(BmnZdcGeoPar *geoPar, BmnZdcDigiPar *digiPar, Int_t pVerbose=0)
void SplitDigiID(BmnZdcDigiId_t digiID, Int_t &module_groupID, Int_t &modID, Int_t &chanID)
BmnZdcDigiId_t GetDigiIdFromVolumeData(Int_t pMcVolumeNumber, Int_t pMotherMotherCopyNumber)
static BmnZdcDigiScheme * Instance()
virtual void Print(const Option_t *opt) const
Output to screen.
Short_t GetCopyMother() const
Definition BmnZdcPoint.h:58
virtual Int_t Fill(const char *namex, const char *namey, Double_t w)
Int_t GetEntriesFast() const
std::vector< Int_t > BmnZdcDigiId_t