BmnRoot
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
13#include <iostream>
14#include "TClonesArray.h"
15#include "TFile.h"
16
17#include "FairRootManager.h"
18#include "FairRun.h"
19#include "FairRunAna.h"
20#include "FairRuntimeDb.h"
21
22#include "BmnZdcDigiProducer.h"
23#include "BmnZdcDigi.h"
24#include "BmnZdcPoint.h"
25
26#include "TROOT.h"
27#include "TVectorT.h"
28
29
30// ----- Default constructor -------------------------------------------
32 FairTask(name) {
33 fPointArray=0;
34 fDigiArray=0;
35 fGeoPar=0;
36 fHistZdcEn=0;
37 fELossZdcValue = NULL;
38 fELossZdcHisto = NULL;
39}
40// -------------------------------------------------------------------------
41
42// ----- Destructor ----------------------------------------------------
44// -------------------------------------------------------------------------
45
46// -------------------------------------------------------------------------
47void BmnZdcDigiProducer::SetParContainers()
48{
49 cout << "-I- BmnZdcDigiProducer: SetParContainers started..." << endl;
50
51 // Get run and runtime database
52 FairRunAna* run = FairRunAna::Instance();
53 if ( ! run ) Fatal("FairMuchDigitize::SetParContainers", "No analysis run");
54
55 FairRuntimeDb* rtdb = run->GetRuntimeDb();
56 if ( ! rtdb ) 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}
109// -------------------------------------------------------------------------
111{
112 Int_t nx,ny/*, nz*/;
113 Double_t dx, dy/*, dz*/;
114
115 //BmnZdcDigiScheme *fDigiScheme = BmnZdcDigiScheme::Instance();
116 // fDigiScheme->GetZdcDimensions (nx,ny,nz);
117 // fDigiScheme->GetVolDxDyDz (pDigiID,dx, dy, dz);
118 nx = 10 ; ny = 10 ; dx = 75; dy = 75;// dz=1010; // mm
119
120 Int_t Nx=nx+2;
121 Double_t Dx=dx*Nx/2;
122 Int_t Ny=ny+2;
123 Double_t Dy=dy*Ny/2;
124
125 fHistZdcEn = new TH2F ("HistZdcEn","HistZdcEnergy",Nx,-Dx,Dx,Ny,-Dy,Dy);
126
127 if (!fHistZdcEn)
128 cout << "-E- BmnZdcDigiProducer: HistZdcEn Histogram not created !!" << endl;
129 else {
130 FairRootManager* ioman = FairRootManager::Instance();
131 fHistZdcEn->SetDirectory((TFile*)ioman->GetOutFile());
132 fHistZdcEn->Write();
133}
134
135}
136
137// ----- Public method Exec --------------------------------------------
138void BmnZdcDigiProducer::Exec(Option_t* opt) {
139
140
141 //#define EDEBUG
142#ifdef EDEBUG
143 static Int_t lEDEBUGcounter=0;
144 cout << "EDEBUG-- BmnZdcDigiProducer::Exec() started... " << endl;;
145#endif
146
147 if ( ! fDigiArray ) Fatal("Exec", "No DigiArray");
148
149 fDigiArray->Clear();
150
152
153 if (!pDigiScheme)
154 Fatal("BmnZdcDigiProducer::Exec", "No DigiScheme");
155
156 Int_t module_groupID, modID, chanID;
157 BmnZdcDigiId_t digiID;
158
159 BmnZdcPoint* point = NULL;
160
161 map<BmnZdcDigiId_t, Float_t> fDigiIdEnergy;
162 fDigiIdEnergy.clear();
163 map<BmnZdcDigiId_t, Float_t>::const_iterator p;
164
165 Int_t nPoints = fPointArray->GetEntriesFast();
166 Double_t e1=0;
167
168 if (fHistZdcEn) {
169 fHistZdcEn->Reset();
170 }
171 TH2F* hist1=fHistZdcEn;
172
173 //Bool_t flag_of_not_created=1;
174
175 for (Int_t iPoint=0; iPoint<nPoints; iPoint++) {
176
177 point = (BmnZdcPoint*) fPointArray->At(iPoint);
178
179 //Int_t pMMcopy=1;
180 digiID = pDigiScheme->GetDigiIdFromVolumeData (point->GetDetectorID(), point->GetCopyMother());
181
182 if ((digiID[0]!=-1)&&(digiID[1]!=-1)) {
183
184
185 if (!fHistZdcEn) {
186
187 CreateHistograms(&digiID);
188
189 hist1=fHistZdcEn;
190 }
191
192 if (fDigiIdEnergy.find(digiID)==fDigiIdEnergy.end())
193 fDigiIdEnergy[digiID] = point->GetEnergyLoss();
194 else
195 fDigiIdEnergy[digiID] += point->GetEnergyLoss();
196
197 e1 += point->GetEnergyLoss();
198 hist1->Fill(point->GetX()*10,point->GetY()*10,point->GetEnergyLoss()); // in mm
199#ifdef EDEBUG
200 if (lEDEBUGcounter<20) {
201 cout << "EDEBUG-- BmnZdcDigiProducer::Exec: point : "; point->Print("");
202 lEDEBUGcounter++;
203 }
204#endif
205
206 }
207#ifdef EDEBUG
208 else {
209 if (lEDEBUGcounter<100) {
210 cout << "EDEBUG-- BmnZdcDigiProducer::Exec: Boundary point? : "; point->Print("");
211 lEDEBUGcounter++;
212 }
213 }
214#endif
215 }
216
217 TClonesArray& clref1 = *fELossZdcValue;
218 new(clref1[0]) TParameter<double>("ELossZdc",e1);
219
220 if (fHistZdcEn) {
221 TClonesArray& clref1e = *fELossZdcHisto;
222 new(clref1e[0]) TVectorT<float>(fHistZdcEn->GetSize(),fHistZdcEn->GetArray());
223 }
224
225 Float_t eloss=0;
226
227 for(p=fDigiIdEnergy.begin(); p!=fDigiIdEnergy.end(); ++p) {
228
229 pDigiScheme->SplitDigiID((*p).first, module_groupID, modID, chanID);
230
231
232 if ((module_groupID!=-1)&&(chanID!=-1)) {
233 eloss = (*p).second;
234 /*BmnZdcDigi* digi = */AddHit(module_groupID, modID, chanID, eloss);
235#ifdef EDEBUG
236 if (lEDEBUGcounter<50) {
237 cout << "EDEBUG-- BmnZdcDigiProducer::Exec: "<< module_groupID<< " " << chanID << " " <<
238 (*p).second << " " << lEDEBUGcounter << endl;
239 lEDEBUGcounter++;
240 }
241#endif
242 }
243
244 }
245
246#undef EDEBUG
247}
248// -------------------------------------------------------------------------
249
250
251// ----- Private method AddDigi --------------------------------------------
252BmnZdcDigi* BmnZdcDigiProducer::AddHit(Int_t module_groupID, Int_t modID, Int_t chanID,Float_t energy)
253{
254 TClonesArray& clref = *fDigiArray;
255 Int_t size = clref.GetEntriesFast();
256 BmnZdcDigi* result = new(clref[size]) BmnZdcDigi(module_groupID,modID,chanID,(Double_t)energy);
257 // result->Print();
258 return result;
259}
260// ----
BmnZdcDigi * AddHit(Int_t module_groupID, Int_t modID, Int_t chanID, Float_t energy)
void CreateHistograms(BmnZdcDigiId_t *pDigiID)
BmnZdcDigiProducer(const char *name="BmnZdc Digi Producer")
virtual void Exec(Option_t *opt)
virtual InitStatus Init()
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
Short_t GetCopyMother() const
Definition BmnZdcPoint.h:56
std::vector< Int_t > BmnZdcDigiId_t
-clang-format