CbmRoot
Loading...
Searching...
No Matches
CbmMvdDetector.cxx
Go to the documentation of this file.
1/* Copyright (C) 2014-2021 Institut fuer Kernphysik, Goethe-Universitaet Frankfurt, Frankfurt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Philipp Sitzmann [committer] */
4
5// -------------------------------------------------------------------------
6// ----- CbmMvdDetector source file -----
7// ----- Created 31/01/11 by M. Deveaux -----
8// -------------------------------------------------------------------------
9
10#include "CbmMvdDetector.h"
11
12#include "CbmMvdAddress.h"
13#include "CbmMvdGeoHandler.h" // for CbmMvdGeoHandler
14#include "CbmMvdHelper.h" // for CbmMvdSensorTyp
15#include "CbmMvdSensor.h" // for CbmMvdSensor
16#include "CbmMvdSensorPlugin.h" // for CbmMvdSensorPlugin, MvdSensorPluginType
17#include "CbmMvdSensorTask.h" // for CbmMvdSensorTask
18
19#include <Logger.h> // for LOG, Logger
20
21#include <Rtypes.h> // for TGenericClassInfo
22#include <TClonesArray.h> // for TClonesArray
23#include <TH1.h> // for Histograms (only base class is used)
24#include <TNamed.h> // for TNamed
25#include <TObjArray.h> // for TObjArray
26#include <TRandom.h> // for TRandom, gRandom
27#include <TString.h> // for TString, operator==, operator<<
28
29//_____________________________________________________________________________
31
33
34//_____________________________________________________________________________
36{
37 if (fInstance)
38 return fInstance;
39 else {
40 fInstance = new CbmMvdDetector("A");
41 CbmMvdGeoHandler* mvdHandler = new CbmMvdGeoHandler();
42 mvdHandler->SetSensorTyp(fSensorTyp);
43 LOG(info) << "SensorType";
44 mvdHandler->Init();
45 LOG(info) << "Init";
46 mvdHandler->Fill();
47 LOG(info) << "Filled";
48 mvdHandler->PrintGeoParameter();
49 return fInstance;
50 }
51}
52
53// ----- Default constructor -------------------------------------------
55 : TNamed()
56 , fSensorArray(nullptr)
57 , fSensorMap()
58 , fPluginCount(0)
59 , foutput(nullptr)
60 , foutputHits(nullptr)
61 , foutputDigis(nullptr)
62 , foutputCluster(nullptr)
63 , //khun
64 foutputDigiMatchs(nullptr)
65 , foutputHitMatchs(nullptr)
66 , fcurrentEvent(nullptr)
67 , fepsilon()
68 , fDigiPlugin(-1)
69 , fHitPlugin(-1)
70 , fClusterPlugin(-1)
71 , fSensorArrayFilled(kFALSE)
72 , initialized(kFALSE)
73 , fFinished(kFALSE)
74 , fName("")
75 , fParameter(nullptr)
76{
77
78 Fatal(GetName(), " - Do not use standard constructor");
79}
80// -------------------------------------------------------------------------
81
82
83// ----- Standard constructor ------------------------------------------
85 : TNamed()
86 , fSensorArray(new TClonesArray("CbmMvdSensor", 10))
87 , fSensorMap()
88 , fPluginCount(0)
89 , foutput(nullptr)
90 , foutputHits(nullptr)
91 , foutputDigis(nullptr)
92 , foutputCluster(nullptr)
93 , //khun
94 foutputDigiMatchs(nullptr)
95 , foutputHitMatchs(nullptr)
96 , fcurrentEvent(nullptr)
97 , fepsilon()
98 , fDigiPlugin(-1)
99 , fHitPlugin(-1)
100 , fClusterPlugin(-1)
101 , fSensorArrayFilled(kFALSE)
102 , initialized(kFALSE)
103 , fFinished(kFALSE)
104 , fName(name)
105 , fParameter(nullptr)
106{
107
108 if (fInstance) {
109 Fatal(GetName(), " - Error, singleton does already exist.");
110 }
111 else {
112 fInstance = this;
113 };
114 fepsilon[0] = fepsilon[1] = fepsilon[2] = 0;
115 fName = name;
116}
117// -------------------------------------------------------------------------
118
119
120// ----- Destructor ----------------------------------------------------
122//-----------------------------------------------------------------------
123
124// -------Setters -----------------------------------------------------
125
126void CbmMvdDetector::AddSensor(TString clearName, TString fullName, TString nodeName, CbmMvdSensorDataSheet* sensorData,
127 Int_t sensorNr, Int_t volumeId, Double_t sensorStartTime, Int_t stationNr)
128{
134
135 TString myname;
136
137 if (fSensorArrayFilled) {
138 Fatal(GetName(), " - Error, must add all sensors before adding plugins.");
139 }
140
141
142 Int_t nSensors = fSensorArray->GetEntriesFast();
143
144 myname = clearName;
145 myname += nSensors;
146
147 new ((*fSensorArray)[nSensors])
148 CbmMvdSensor(myname, sensorData, fullName, nodeName, sensorNr, volumeId, sensorStartTime);
149 //CbmMvdSensor(const char* name, CbmMvdSensorDataSheet* dataSheet, TString volName,
150 //TString nodeName, Int_t stationNr, Int_t volumeId, Double_t sensorStartTime);
151
152 CbmMvdSensor* sensor = (CbmMvdSensor*) fSensorArray->At(nSensors);
153 sensor->SetDataSheet(sensorData);
154 sensor->SetStation(stationNr);
155
156 // FIXME: replace the sensorNr with a proper hardware address here (at the moment using the "07/2025" legacy
157 // address definition, which stores the global sensorNr to bits 4-12).
158 uint32_t address = CbmMvdAddress::GetAddressFromSensorNrAndPixelXY(sensorNr, 0, 0);
159 sensor->SetAddress(address);
160
161 // Add sensor to SensorMap
162 fSensorMap[address] = sensor;
163
164 // FIXME: Should misalignment be applied here?
165 Float_t misalignment[3], randArray[3];
166 // TRandom3* rand = new TRandom3(0);
167 gRandom->RndmArray(3, randArray);
168 misalignment[0] = ((2 * randArray[0]) - 1) * fepsilon[0];
169 misalignment[1] = ((2 * randArray[0]) - 1) * fepsilon[1];
170 misalignment[2] = ((2 * randArray[0]) - 1) * fepsilon[2];
171 sensor->SetMisalignment(misalignment);
172 LOG(debug1) << "new sensor " << myname << " to detector added at station: " << stationNr;
173}
174
175// ----------------------------------------------------------------------
176
178{
179 // Detects the position of a plugin with a given Plugin-ID (set in the plugin implementation constructor) in the plugin-array of the sensors
180
181
182 if (!fSensorArrayFilled) {
183 LOG(warning)
184 << "CbmMvdDetector::DetectPlugin: You tried to access sensor plugins while the detector is not initialized yet.";
185 return -1;
186 }
187 CbmMvdSensor* sensor = GetSensor(0);
188 TObjArray* pluginArray = sensor->GetPluginArray();
189
190 Int_t nPlugin = pluginArray->GetEntries();
191 for (Int_t i = 0; i < nPlugin; i++) {
192 CbmMvdSensorPlugin* plugin = (CbmMvdSensorPlugin*) pluginArray->At(i);
193 // LOG(info) <<"CbmMvdDetector::DetectPlugin: PlugInID = " << plugin->GetPluginIDNumber() << " Position: "<< i;
194 if (pluginID == plugin->GetPluginIDNumber()) {
195 return i;
196 }
197 }
198
199
200 return -1;
201}
202
203//-----------------------------------------------------------------------
205{
206
212
213
214 if (!initialized) {
215 foutput = new TClonesArray("CbmMvdPoint", 1000);
216 fcurrentEvent = new TClonesArray("CbmMvdPoint", 1000);
217 foutputDigis = new TClonesArray("CbmMvdDigi", 1000);
218 foutputDigiMatchs = new TClonesArray("CbmMatch", 1000);
219 foutputHits = new TClonesArray("CbmMvdHit", 1000);
220 foutputCluster = new TClonesArray("CbmMvdCluster", 1000); //khun
221 }
222
223 Int_t nSensors = fSensorArray->GetEntriesFast();
224 if (nSensors <= 0) LOG(fatal) << "CbmMvdDetector could not load Sensors from Geometry!";
225 CbmMvdSensor* sensor;
226
227 for (Int_t j = 0; j < nSensors; j++) {
228
229 sensor = (CbmMvdSensor*) fSensorArray->At(j);
230 LOG(debug1) << "Init Sensor " << sensor->GetName();
231 sensor->Init();
232 }
233
234 initialized = kTRUE;
235}
236//-----------------------------------------------------------------------
237
238//-----------------------------------------------------------------------
240{
241
242 Int_t nSensors = fSensorArray->GetEntriesFast();
243 CbmMvdSensor* sensor;
244
245 for (Int_t j = 0; j < nSensors; j++) {
246 sensor = (CbmMvdSensor*) fSensorArray->At(j);
247 sensor->ShowDebugHistos();
248 }
249}
250//-----------------------------------------------------------------------
251
252//-----------------------------------------------------------------------
253void CbmMvdDetector::SendInputToSensorPlugin(uint32_t detectorId, Int_t nPlugin, TObject* input)
254{
255 fSensorMap.at(detectorId)->SendInputToPlugin(nPlugin, input);
256}
257//-----------------------------------------------------------------------
258
259//-----------------------------------------------------------------------
261{
267
268 foutput->Clear();
269 fcurrentEvent->Clear();
270 foutputDigis->Clear();
271 foutputDigiMatchs->Clear();
272 foutputHits->Clear();
273 foutputCluster->Clear(); //khun
274
275 Int_t nSensors = fSensorArray->GetEntriesFast();
276 CbmMvdSensor* sensor;
277 for (Int_t i = 0; i < nSensors; i++) {
278 sensor = (CbmMvdSensor*) fSensorArray->At(i);
279 //LOG(info) << "Send Chain to " << sensor->GetName() << endl;
280 sensor->ExecChain();
281 //LOG(info) << "finished Chain at "<< sensor->GetName() <<endl<< endl;
282 };
283}
284
285//-----------------------------------------------------------------------
286
287
288//-----------------------------------------------------------------------
289void CbmMvdDetector::Exec(UInt_t nLevel)
290{
296
297 foutput->Clear();
298 fcurrentEvent->Clear();
299 foutputDigis->Clear();
300 foutputDigiMatchs->Clear();
301 foutputHits->Clear();
302 foutputCluster->Clear(); //khun
303 Int_t nSensors = fSensorArray->GetEntriesFast();
304 CbmMvdSensor* sensor;
305 for (Int_t i = 0; i < nSensors; i++) {
306 sensor = (CbmMvdSensor*) fSensorArray->At(i);
307 sensor->Exec(nLevel);
308 }
309}
310
311//-----------------------------------------------------------------------
312
313//-----------------------------------------------------------------------
314
315void CbmMvdDetector::ExecFrom(UInt_t nLevel)
316{
317
323 foutput->Clear();
324 fcurrentEvent->Clear();
325 foutputDigis->Clear();
326 foutputDigiMatchs->Clear();
327 foutputHits->Clear();
328 foutputCluster->Clear(); //khun
329
330 Int_t nSensors = fSensorArray->GetEntriesFast();
331 CbmMvdSensor* sensor;
332 for (Int_t i = 0; i < nSensors; i++) {
333 sensor = (CbmMvdSensor*) fSensorArray->At(i);
334 sensor->ExecFrom(nLevel);
335 }
336}
337//-----------------------------------------------------------------------
338
339void CbmMvdDetector::GetOutputArray(Int_t nPlugin, TClonesArray* outputArray)
340{
341 Int_t nSensors = fSensorArray->GetEntriesFast();
342 CbmMvdSensor* sensor;
343 TClonesArray* tmpArray;
344
345
346 for (Int_t i = 0; i < nSensors; i++) {
347 sensor = (CbmMvdSensor*) fSensorArray->At(i);
348 tmpArray = sensor->GetOutputArray(nPlugin);
349 Int_t length = tmpArray->GetEntriesFast();
350 //LOG(info)<< "CbmMvdDetector::GetOutputArray - Length = " << length;
351 if (length >= 0) {
352 outputArray->AbsorbObjects(tmpArray);
353 }
354 }
355}
356
357//-----------------------------------------------------------------------
358void CbmMvdDetector::GetMatchArray(Int_t nPlugin, TClonesArray* matchArray)
359{
360 Int_t nSensors = fSensorArray->GetEntriesFast();
361 CbmMvdSensor* sensor;
362 TClonesArray* tmpArray;
363
364
365 for (Int_t i = 0; i < nSensors; i++) {
366 sensor = (CbmMvdSensor*) fSensorArray->At(i);
367 tmpArray = sensor->GetMatchArray(nPlugin);
368 Int_t length = tmpArray->GetEntriesFast();
369
370 if (length >= 0) {
371 matchArray->AbsorbObjects(tmpArray);
372 }
373 }
374}
375
376//-----------------------------------------------------------------------
377
379{
380
381 if (!fSensorArray) return -1;
382
383 CbmMvdSensor* sensor = (CbmMvdSensor*) fSensorArray->At(0);
384
385 if (sensor->GetPluginArraySize() < nPlugin) return -1;
386
387 //CbmMvdSensorPlugin* plugin= (CbmMvdSensorPlugin*)sensor->GetPluginArray()->At(nPlugin);
388
389 return sensor->GetNumberOfHistograms(nPlugin);
390};
391
392
393//-----------------------------------------------------------------------
394TH1* CbmMvdDetector::GetHistogram(UInt_t nPlugin, UInt_t nHistogram)
395{
396 if (!fSensorArray) return 0;
397
398 CbmMvdSensor* sensor = (CbmMvdSensor*) fSensorArray->At(0);
399
400 if (sensor->GetPluginArraySize() < nPlugin) return 0;
401 if (nHistogram >= sensor->GetNumberOfHistograms(nPlugin)) return 0;
402
403 TH1* mySummedHistogram = (TH1*) ((sensor->GetHistogram(nPlugin, nHistogram))->Clone());
404
405 for (Int_t i = 1; i < fSensorArray->GetEntriesFast(); i++) { // Read histograms from all sensors and add them up.
406 sensor = (CbmMvdSensor*) fSensorArray->At(i);
407 mySummedHistogram->Add((TH1*) sensor->GetHistogram(nPlugin, nHistogram));
408 }
409
410 return mySummedHistogram;
411}
412
413//-----------------------------------------------------------------------
414TH1* CbmMvdDetector::GetHistogram(UInt_t /*nLevel*/, UInt_t /*nHistogramNumber*/, UInt_t /*sensorInSensorArrayNumber*/)
415{
416 return 0;
417}
418
419//-----------------------------------------------------------------------
421{
422 if (!fFinished) {
423 Int_t nSensors = fSensorArray->GetEntriesFast();
424 CbmMvdSensor* sensor;
425 for (Int_t i = 0; i < nSensors; i++) {
426 sensor = (CbmMvdSensor*) fSensorArray->At(i);
427 sensor->Finish();
428 }
429 fFinished = kTRUE;
430 }
431}
432//-----------------------------------------------------------------------
433
ClassImp(CbmConverterManager)
Helper class to extract information from the GeoManager. Addapted from TrdGeoHandler byFlorian Uhlig ...
CbmMvdSensorTyp
Definition CbmMvdHelper.h:8
float Float_t
int Int_t
static uint32_t GetAddressFromSensorNrAndPixelXY(int32_t sensorNr, int32_t sensorY, int32_t sensorX)
virtual ~CbmMvdDetector()
TH1 * GetHistogram(UInt_t nPlugin, UInt_t nHistogramNumber)
TClonesArray * foutputDigis
void AddSensor(TString clearName, TString fullName, TString nodeName, CbmMvdSensorDataSheet *sensorData, Int_t sensorNr, Int_t volumeId, Double_t sensorStartTime, Int_t stationNr)
void ExecFrom(UInt_t nLevel)
UInt_t GetMaxHistoNumber(UInt_t nPlugin)
static CbmMvdDetector * Instance()
std::map< uint32_t, CbmMvdSensor * > fSensorMap
A map of CbmMvdSensor to its hardware address.
Int_t DetectPlugin(Int_t pluginID)
CbmMvdStationPar * fParameter
TClonesArray * foutputHitMatchs
CbmMvdSensor * GetSensor(Int_t nSensor)
Float_t fepsilon[3]
static CbmMvdDetector * fInstance
static CbmMvdSensorTyp fSensorTyp
TClonesArray * foutputCluster
void SendInputToSensorPlugin(uint32_t sensorAddress, Int_t nPlugin, TObject *input)
TClonesArray * fcurrentEvent
void GetOutputArray(Int_t nPlugin, TClonesArray *outputArray)
TClonesArray * foutputDigiMatchs
void GetMatchArray(Int_t nPlugin, TClonesArray *matchArray)
Bool_t fSensorArrayFilled
void Exec(UInt_t nLevel)
TClonesArray * fSensorArray
TClonesArray * foutput
TClonesArray * foutputHits
void Init(Bool_t isSimulation=kFALSE, Int_t mcbmFlag=0)
void SetSensorTyp(CbmMvdSensorTyp typ)
virtual Int_t GetPluginIDNumber()
TClonesArray * GetMatchArray(Int_t nPlugin) const
UInt_t GetNumberOfHistograms(UInt_t nPlugin)
void SetMisalignment(Float_t misalignment[3])
TH1 * GetHistogram(UInt_t nPlugin, UInt_t nHisto)
void SetDataSheet(CbmMvdSensorDataSheet *sheet)
void SetStation(Int_t StationNumber)
TObjArray * GetPluginArray()
void SetAddress(uint32_t address)
Sets a hardware address of the sensor.
UInt_t GetPluginArraySize()
void Exec(UInt_t nPlugin)
void ShowDebugHistos()
void ExecFrom(UInt_t nPlugin)
TClonesArray * GetOutputArray(Int_t nPlugin) const