CbmRoot
Loading...
Searching...
No Matches
CbmMvdSensor.cxx
Go to the documentation of this file.
1/* Copyright (C) 2011-2021 Institut fuer Kernphysik, Goethe-Universitaet Frankfurt, Frankfurt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Michael Deveaux, Philipp Sitzmann [committer] */
4
5// -------------------------------------------------------------------------
6// ----- CbmMvdSensor source file -----
7// ----- Created 31/01/11 by M. Deveaux -----
8// -------------------------------------------------------------------------
9
10#include "CbmMvdSensor.h"
11
12#include "CbmMvdAddress.h"
13#include "CbmMvdSensorBuffer.h"
14#include "CbmMvdSensorPlugin.h"
15#include "CbmMvdSensorTask.h"
16
17#include <FairEventHeader.h>
18#include <FairMCEventHeader.h>
19#include <FairPrimaryGenerator.h>
20#include <FairRunAna.h>
21#include <FairRunSim.h>
22#include <Logger.h>
23
24#include <TClonesArray.h>
25#include <TGeoManager.h>
26#include <TGeoMatrix.h>
27#include <TGeoVolume.h>
28
29
31#include <ostream> // for operator<<, stringstream, basic_ostream
32
33// ----- Default constructor -------------------------------------------
35 : TNamed()
36 , fStationNr(-1)
37 , fSensorNr(0)
38 , fVolumeId(-1)
39 , fDigiPlugin(-1)
40 , fHitPlugin(-1)
41 , fDigiLen(-1)
42 , fClusterPlugin(-1)
43 , fAddress(0)
44 , fVolName("")
45 , fNodeName("")
47 , epsilon()
48 , fShape(nullptr)
49 , fMCMatrix(nullptr)
50 , fRecoMatrix(nullptr)
51 , fAlignmentCorr(nullptr)
55 , fSensorMap()
56 , fPluginArray(new TObjArray(1))
58 , initialized(kFALSE)
59{
60 LOG(warning) << "MVD-Sensor initialized without technical data. Assuming default sensor.";
61
62 LOG(warning) << "MVD-Sensor initialized without geometry data. Must be added manually before using this class.";
63
64 LOG(warning) << "MVD-Sensor initialized without valid start time. Must be added manually before using this class.";
65}
66// -------------------------------------------------------------------------
67
68
69// ----- Standard constructor ------------------------------------------
70CbmMvdSensor::CbmMvdSensor(const char* name, CbmMvdSensorDataSheet* dataSheet, TString volName, TString nodeName,
71 Int_t sensorNr, Int_t volumeId, Double_t sensorStartTime)
72 : TNamed(name, "")
73 , fStationNr(-1)
74 , fSensorNr(sensorNr)
75 , fVolumeId(volumeId)
76 , fDigiPlugin(-1)
77 , fHitPlugin(-1)
78 , fDigiLen(-1)
79 , fClusterPlugin(-1)
80 , fAddress(CbmMvdAddress::GetAddressFromSensorNrAndPixelXY(sensorNr, 0, 0))
81 , fVolName(volName)
82 , fNodeName(nodeName)
84 , epsilon()
85 , fShape(nullptr)
86 , fMCMatrix(nullptr)
87 , fRecoMatrix(nullptr)
88 , fAlignmentCorr(nullptr)
91 , fSensorData(dataSheet)
92 , fSensorMap()
93 , fPluginArray(new TObjArray(1))
94 , fSensorStartTime(sensorStartTime)
95 , initialized(kFALSE)
96{
97}
98// -------------------------------------------------------------------------
99
100
101// ----- Destructor ----------------------------------------------------
103// -------Setters -----------------------------------------------------
104
105void CbmMvdSensor::SetAlignment(TGeoHMatrix* alignmentMatrix)
106{
107
108 if (fAlignmentCorr) { delete fAlignmentCorr; };
109 fAlignmentCorr = (TGeoHMatrix*) alignmentMatrix->Clone(fNodeName + "_AlignmentData");
110}
111
112
113// -------Initialization tools -----------------------------------------------------
115{
116
117 LOG(debug1) << "-I- nodeName is " << nodeName;
118
119 if (fMCMatrix) { delete fMCMatrix; }; //delete local copy of the position information
120
121 TGeoVolume* volume;
122 gGeoManager->cd(nodeName);
123 volume = gGeoManager->GetCurrentVolume();
124 LOG(debug2) << "At volume: " << volume->GetName();
125 fShape = (TGeoBBox*) volume->GetShape();
126 fMCMatrix = (TGeoHMatrix*) (gGeoManager->GetCurrentMatrix())->Clone(nodeName + "_MC_Matrix");
127 fMCMatrix->SetName(nodeName + "_MC_Matrix");
128
129 Double_t first[3], last[3];
130 PixelToLocal(0, 0, first);
131 PixelToLocal(fSensorData->GetNPixelsX(), fSensorData->GetNPixelsY(), last);
132 LOG(debug2) << "pixel 0,0 at: " << first[0] << ", " << first[1] << " Local";
133 LOG(debug2) << "pixel " << fSensorData->GetNPixelsX() << " " << fSensorData->GetNPixelsY() << " at: " << last[0]
134 << ", " << last[1] << " Local";
135
136 Double_t* tempCoordinate;
137
138 if (!fRecoMatrix) {
139 Double_t pre[3], past[3], global[3];
140 Double_t local[3] = {0, 0, 0};
141 //The initial guess on the reconstructed position is that the MC-position is correct
142 //Short cut to misalignment, add a small error
143 fRecoMatrix = (TGeoHMatrix*) fMCMatrix->Clone(nodeName + "_Reco_Matrix");
144 PixelToTop(0, 0, pre);
145 tempCoordinate = fRecoMatrix->GetTranslation();
146 for (Int_t i = 0; i < 3; i++) {
147 tempCoordinate[i] = tempCoordinate[i] + epsilon[i];
148 }
149 fRecoMatrix->SetTranslation(tempCoordinate);
150 PixelToTop(0, 0, past);
151 LOG(debug2) << "shifted pixel 0,0 to: " << past[0] << ", " << past[1] << " at z = " << past[2];
152 LocalToTop(local, global);
153 LOG(debug2) << "shifted local center to: " << global[0] << ", " << global[1] << " at z = " << global[2];
154 }
155 else {
156 tempCoordinate = fRecoMatrix->GetTranslation();
157 }
158 if (!fAlignmentCorr) {
159 //If no knowledge on the reco matrix is available there is plausibly no correction data.
160 fAlignmentCorr = new TGeoHMatrix(nodeName + "_AlignmentData");
161 }
162
163 for (Int_t i = 0; i < 3; i++) {
164 fSensorPosition[i] = tempCoordinate[i];
165 }
166}
167
168//-------------------------------------------------------------------
169
170//-------------------------------------------------------------------
172{
173
175
176 Int_t nPlugin = fPluginArray->GetEntriesFast();
177
178
179 TClonesArray* dataArray;
180
181 CbmMvdSensorTask* gentask;
182 CbmMvdSensorBuffer* genBuffer;
183
184 CbmMvdSensorPlugin *pluginFirst, *pluginNext;
185
186 for (Int_t i = 0; i < nPlugin; i++) {
187 pluginFirst = (CbmMvdSensorPlugin*) fPluginArray->At(i);
188 if (pluginFirst->GetPluginType() == buffer) {
189 genBuffer = (CbmMvdSensorBuffer*) fPluginArray->At(i);
190 genBuffer->InitBuffer(this);
191 }
192 if (pluginFirst->GetPluginType() == task) {
193 gentask = (CbmMvdSensorTask*) fPluginArray->At(i);
194 gentask->InitTask(this);
195 }
196 }
197 //Link data chain
198 if (nPlugin > 1) {
199
200 for (Int_t i = 0; i < nPlugin - 1; i++) {
201
202 pluginFirst = (CbmMvdSensorPlugin*) fPluginArray->At(i);
203 pluginNext = (CbmMvdSensorPlugin*) fPluginArray->At(i + 1);
204
205 //Rules: The output array of the previous plugin is input of the next
206 dataArray = pluginFirst->GetOutputArray();
207 pluginNext->SetInputArray(dataArray);
208
209 //The plugin knows its precessor and sucessor to communicate
210 pluginFirst->SetNextPlugin(pluginNext);
211 pluginNext->SetPreviousPlugin(pluginFirst);
212 }
213 }
214
215
216 if (nPlugin == 0) {
217 LOG(debug) << "No Plugins on this Sensor ";
218 pluginFirst = nullptr;
219 }
220 initialized = kTRUE;
221}
222// -------------------------------------------------------------------------
223
224// -------------------------------------------------------------------------
226{
227 //if(fDetectorID == 1537)
228 {
229 CbmMvdSensorPlugin* pluginLast;
230 pluginLast = (CbmMvdSensorPlugin*) fPluginArray->At(fPluginArray->GetEntriesFast() - 1);
231 LOG(info) << "Set debug mode on Plugin " << fPluginArray->GetEntriesFast() - 1 << " at sensor " << GetName();
232 pluginLast->ShowDebugHistos();
233 }
234}
235// -------------------------------------------------------------------------
236
237// -------------------------------------------------------------------------
238
239void CbmMvdSensor::SendInputToPlugin(Int_t nPlugin, TObject* input)
240{
241 CbmMvdSensorPlugin* digitask;
242 digitask = (CbmMvdSensorPlugin*) fPluginArray->At(nPlugin);
243 digitask->SetInput(input);
244}
245
246// -------------------------------------------------------------------------
247
249{
250
251 FairRunSim* run = FairRunSim::Instance();
252 FairRunAna* ana = FairRunAna::Instance();
253 if (run) {
254 FairEventHeader* event = run->GetEventHeader();
255 fcurrentEventTime = event->GetEventTime();
256 }
257 if (ana) {
258 FairEventHeader* event = ana->GetEventHeader();
259 fcurrentEventTime = event->GetEventTime();
260 }
261
262
263 CbmMvdSensorPlugin* plugin;
264 Int_t nPlugin = fPluginArray->GetEntriesFast();
265
266 plugin = (CbmMvdSensorPlugin*) fPluginArray->At(0);
267
268 plugin->ExecChain();
269
270 if (plugin->PluginReady()) {
271
272 for (Int_t i = 1; i < nPlugin; i++) {
273
274 plugin = (CbmMvdSensorPlugin*) fPluginArray->At(i);
275 plugin->ExecChain();
276 }
277 }
278}
279// -------------------------------------------------------------------------
280
281void CbmMvdSensor::Exec(UInt_t nPlugin)
282{
283 UInt_t nPluginMax = fPluginArray->GetEntriesFast();
284 if (nPlugin > nPluginMax) { Fatal(GetName(), " Error - Called non-existing plugin"); }
285 CbmMvdSensorPlugin* plugin = (CbmMvdSensorPlugin*) fPluginArray->At(nPlugin);
286 plugin->Exec();
287}
288// -------------------------------------------------------------------------
289void CbmMvdSensor::ExecTo(UInt_t nPlugin)
290{
291 FairRunSim* run = FairRunSim::Instance();
292 FairPrimaryGenerator* gen = run->GetPrimaryGenerator();
293 FairMCEventHeader* event = gen->GetEvent();
294
295 fcurrentEventTime = event->GetT();
296
297 CbmMvdSensorPlugin* plugin;
298 UInt_t maxPlugin = fPluginArray->GetEntriesFast();
299
300 plugin = (CbmMvdSensorPlugin*) fPluginArray->At(0);
301 if (nPlugin < maxPlugin) {
302 plugin->ExecChain();
303
304 if (plugin->PluginReady()) {
305
306 for (UInt_t i = 1; i <= nPlugin; i++) {
307 plugin = (CbmMvdSensorPlugin*) fPluginArray->At(i);
308 plugin->ExecChain();
309 }
310 }
311 }
312 else {
313 LOG(info) << "nPlugin to large";
314 }
315}
316
317
318// -------------------------------------------------------------------------
319void CbmMvdSensor::ExecFrom(UInt_t nPlugin)
320{
321 FairRunSim* run = FairRunSim::Instance();
322 FairPrimaryGenerator* gen = run->GetPrimaryGenerator();
323 FairMCEventHeader* event = gen->GetEvent();
324
325 fcurrentEventTime = event->GetT();
326
327 CbmMvdSensorPlugin* plugin;
328 UInt_t maxPlugin = fPluginArray->GetEntriesFast();
329
330 plugin = (CbmMvdSensorPlugin*) fPluginArray->At(nPlugin);
331 if (nPlugin <= maxPlugin) {
332 plugin->ExecChain();
333 //LOG(info) << "is plugin ready? "<< plugin->PluginReady() << " on sensor "<< this->GetName();
334 if (plugin->PluginReady()) {
335 //LOG(info) << "exec chain on sensor "<< this->GetName();
336 for (UInt_t i = nPlugin + 1; i < maxPlugin; i++) {
337 //LOG(info) << "exec plugin " << i << " on sensor "<< this->GetName();
338 plugin = (CbmMvdSensorPlugin*) fPluginArray->At(i);
339 plugin->ExecChain();
340 }
341 }
342 }
343 else {
344 LOG(info) << "nPlugin to large";
345 }
346}
347
348// -------------------------------------------------------------------------
349
350TClonesArray* CbmMvdSensor::GetOutputArray(Int_t nPlugin) const
351{
352
353 CbmMvdSensorPlugin* plugin = (CbmMvdSensorPlugin*) fPluginArray->At(nPlugin);
354 return plugin->GetOutputArray();
355}
356
357
358// -------------------------------------------------------------------------
359TClonesArray* CbmMvdSensor::GetMatchArray(Int_t nPlugin) const
360{
361
362 CbmMvdSensorPlugin* plugin = (CbmMvdSensorPlugin*) fPluginArray->At(nPlugin);
363 return plugin->GetMatchArray();
364}
365// -------------------------------------------------------------------------
367{
368 TClonesArray* tempArray = GetOutputArray(nPlugin); // make sure that the arrays are filled
369 if (tempArray) { return tempArray->GetEntriesFast() - 1; }
370 else {
371 LOG(fatal) << "undefined plugin called";
372 return -1;
373 }
374}
375// -------------------------------------------------------------------------
376
377
378// -------------------------------------------------------------------------
379TClonesArray* CbmMvdSensor::GetOutputBuffer() const
380{
381
382
384 LOG(warning) << "CbmMvdSensor::GetOutputBuffer: Warning - Use of method depreciated.";
385 return (plugin->GetOutputArray());
386}
387// -------------------------------------------------------------------------
388
389TH1* CbmMvdSensor::GetHistogram(UInt_t nPlugin, UInt_t nHisto)
390{
391 if (!fPluginArray) return 0;
392 if (nPlugin >= (UInt_t) fPluginArray->GetEntriesFast()) return 0;
393 CbmMvdSensorPlugin* myPlugin = (CbmMvdSensorPlugin*) fPluginArray->At(nPlugin);
394 return myPlugin->GetHistogram(nHisto);
395}
396
398{
399 if (!fPluginArray) return -1;
400 if (nPlugin >= (UInt_t) fPluginArray->GetEntriesFast()) return -1;
401 return ((CbmMvdSensorPlugin*) fPluginArray->At(nPlugin))->GetMaxHistoNumber();
402}
403
404
405// ----- Coordinate Transformations --------------------------------
406
407void CbmMvdSensor::LocalToTop(Double_t* local, Double_t* lab) { fMCMatrix->LocalToMaster(local, lab); };
408// -------------------------------------------------------------------------
409
410
411// -------------------------------------------------------------------------
412void CbmMvdSensor::TopToLocal(Double_t* lab, Double_t* local)
413{
414 fMCMatrix->MasterToLocal(lab, local);
415 //LOG(info) << "local 0 nach TopToLocal " << local[0];
416 //LOG(info) << "local 1 nach TopToLocal " << local[1];
417};
418// -------------------------------------------------------------------------
419
420
421// -------------------------------------------------------------------------
422void CbmMvdSensor::LocalToPixel(Double_t* local, Int_t& pixelNumberX, Int_t& pixelNumberY)
423{
424
425 //Compute position of the frame relativ to the border of the matrix
426 //which contains the pixel (0/0)
427 Double_t x = local[0] + (fSensorData->GetPixelSignX() * GetDX());
428 //LOG(info) << "From " << local[0] << " to Double_t x " << x;
429 Double_t y = local[1] + (fSensorData->GetPixelSignY() * GetDY());
430 //LOG(info) << "From " << local[1] << " to Double_t y " << y;
431 //Compute the number of the pixel hit.
432 //Note: substract 0.5 to move from border to center of pixel
433 pixelNumberX = Int_t(x / fSensorData->GetPixelPitchX() - 0.5);
434 //if (pixelNumberX < 0) LOG(info)<< "pixelNumberX = " << pixelNumberX << " on Sensor " << this->GetName();
435 pixelNumberY = Int_t(y / fSensorData->GetPixelPitchY() - 0.5);
436 //if (pixelNumberY < 0) LOG(info) << "pixelNumberY = " << pixelNumberY << " on Sensor " << this->GetName();
437};
438// -------------------------------------------------------------------------
439
440
441// -------------------------------------------------------------------------
442void CbmMvdSensor::PixelToLocal(Int_t pixelNumberX, Int_t pixelNumberY, Double_t* local)
443{
444
445 //Compute distance from border of the pixel matrix
446 //Ignore the direction of pixel numbering so far
447 //By definiton (x,y) is in the center of the pixel
448
449 Double_t x = (pixelNumberX + 0.5) * fSensorData->GetPixelPitchX();
450 Double_t y = (pixelNumberY + 0.5) * fSensorData->GetPixelPitchY();
451
452 //Perform coordinate transformation from border of matrix to center of volume
453 local[0] = x - fSensorData->GetPixelSignX() * GetDX();
454 local[1] = y - fSensorData->GetPixelSignY() * GetDY();
455
456 local[2] = 0; //per definition always at the sensor surface;
457};
458// -------------------------------------------------------------------------
459
460
461// -------------------------------------------------------------------------
462void CbmMvdSensor::PixelToTop(Int_t pixelNumberX, Int_t pixelNumberY, Double_t* lab)
463{
464 PixelToLocal(pixelNumberX, pixelNumberY, fTempCoordinate);
466};
467// -------------------------------------------------------------------------
468
469
470void CbmMvdSensor::TopToPixel(Double_t* lab, Int_t& pixelNumberX, Int_t& pixelNumberY)
471{
473 LocalToPixel(fTempCoordinate, pixelNumberX, pixelNumberY);
474};
475// -------------------------------------------------------------------------
476
477
478// -------------------------------------------------------------------------
479Int_t CbmMvdSensor::GetFrameNumber(Double_t absoluteTime, Int_t pixelNumberY) const
480{
481
482
483 Double_t timeSinceStart = absoluteTime - fSensorStartTime;
484
485 Double_t timeInUnitsOfFrames = timeSinceStart / fSensorData->GetIntegrationTime();
486
487 // Get time substracting the full frames (140.3 -> 0.3)
488 Double_t timeSinceStartOfTheFrame = timeInUnitsOfFrames - (Int_t) timeInUnitsOfFrames;
489
490 Int_t rowUnderReadout = Int_t(fSensorData->GetNPixelsY() * timeSinceStartOfTheFrame);
491
492
493 return (Int_t)(timeInUnitsOfFrames + (pixelNumberY < rowUnderReadout));
494 //
495 /* This statement is equivalent to:
496 if (pixelNumberY<rowUnderReadout) {return timeInUnitsOfFrames;}
497 else {return timeInUnitsOfFrames+1;}
498 */
499}
500// -------------------------------------------------------------------------
501
502Double_t CbmMvdSensor::ComputeIndecatedAnalogTime(Double_t hitMCTime, Float_t diodeCharge)
503{
504
505 Double_t delay = fSensorData->ComputeHitDelay(diodeCharge);
506 Double_t jitter = fSensorData->ComputeHitJitter(diodeCharge);
507
508 return hitMCTime + delay + jitter;
509}
510
511Double_t CbmMvdSensor::ComputeEndOfBusyTime(Double_t hitMCTime, Float_t diodeCharge, Int_t pixelNumberY)
512{
513
514 Double_t endOfAnalogChannelDeadTime = hitMCTime + fSensorData->ComputeHitDeadTime(diodeCharge);
515 Int_t frameNumberAtEndOfDeadTime = GetFrameNumber(endOfAnalogChannelDeadTime, pixelNumberY);
516 Double_t endOfDeadTime = GetFrameEndTime(frameNumberAtEndOfDeadTime);
517 /* Anticipated condition for end of deadtime:
518 * Analog electronics must be below threshold AND HEREAFTER a new frame must have started.
519 * Neglected: Tail of the falling edge of the analog pulse is artificially cut.
520 */
521 return endOfDeadTime;
522}
523
524// -------------------------------------------------------------------------
526{
527
528 return fSensorStartTime + frameNumber * fSensorData->GetIntegrationTime();
529}
530
531// -------------------------------------------------------------------------
532Double_t CbmMvdSensor::GetReadoutTime(Double_t absoluteTime) const
533{
534
535
536 Double_t timeSinceStart = absoluteTime - fSensorStartTime;
537
538 Double_t timeInUnitsOfFrames = timeSinceStart / fSensorData->GetIntegrationTime();
539
540 Int_t nextFrame = (Int_t)(timeInUnitsOfFrames + 1);
541
542 Double_t roTime = nextFrame * fSensorData->GetIntegrationTime();
543
544 return roTime;
545}
546// -------------------------------------------------------------------------
547
548
549void CbmMvdSensor::Print(Option_t* /*opt*/) const { LOG(info) << ToString(); }
550
551// ----- Public method Print -------------------------------------------
552std::string CbmMvdSensor::ToString() const
553{
554 std::stringstream ss;
555 ss << " --- " << GetName() << ", sensor name" << fVolName << std::endl;
556 ss << " MC - ID: " << fVolumeId << std::endl;
557 ss << "---------------------------------------------------------" << std::endl;
558 ss << " Position information: " << std::endl;
559 fRecoMatrix->Print();
560 ss << " --------------------------------------------------------" << std::endl;
561 ss << " Technical information: " << std::endl;
562 ss << fSensorData->ToString();
563 ss << " , MC Id " << fVolumeId << std::endl;
564 ss << "---------------------------------------------------------" << std::endl;
565 return ss.str();
566}
567// -------------------------------------------------------------------------
568
569//-----------------------------------------------------------------------
571{
572 CbmMvdSensorPlugin* plugin;
573 Int_t nPlugin = fPluginArray->GetEntriesFast();
574 for (Int_t i = 0; i < nPlugin; i++) {
575 plugin = (CbmMvdSensorPlugin*) fPluginArray->At(i);
576 plugin->Finish();
577 }
578}
579// -------------------------------------------------------------------------
580
581
ClassImp(CbmConverterManager)
Double_t lab[3]
bool first
float Float_t
int Int_t
Functions to encode or decode the address field of MVD data.
virtual void InitBuffer(CbmMvdSensor *mySensor)
virtual void SetNextPlugin(CbmMvdSensorPlugin *plugin)
virtual TClonesArray * GetOutputArray()
virtual TH1 * GetHistogram(UInt_t number)
virtual MvdSensorPluginType GetPluginType()=0
virtual void SetInput(TObject *)
virtual TClonesArray * GetMatchArray()
virtual void SetInputArray(TClonesArray *)
virtual void ExecChain()
virtual void SetPreviousPlugin(CbmMvdSensorPlugin *plugin)
virtual void InitTask(CbmMvdSensor *mySensor)
Int_t GetOutputArrayLen(Int_t nPlugin) const
TClonesArray * GetMatchArray(Int_t nPlugin) const
void LocalToTop(Double_t *local, Double_t *lab)
Int_t GetFrameNumber(Double_t absoluteTime, Int_t pixelNumberY=0) const
void TopToLocal(Double_t *lab, Double_t *local)
void PixelToTop(Int_t pixelNumberX, Int_t pixelNumberY, Double_t *lab)
void SetAlignment(TGeoHMatrix *alignmentMatrix)
Double_t GetDX() const
Double_t fTempCoordinate[3]
UInt_t GetNumberOfHistograms(UInt_t nPlugin)
uint32_t fAddress
TH1 * GetHistogram(UInt_t nPlugin, UInt_t nHisto)
void PixelToLocal(Int_t pixelNumberX, Int_t pixelNumberY, Double_t *local)
void ReadSensorGeometry(TString nodeName)
Double_t GetFrameStartTime(Int_t frameNumber)
Double_t GetDY() const
void ExecTo(UInt_t nPlugin)
TString fVolName
void SendInputToPlugin(Int_t nPlugin, TObject *input)
CbmMvdSensorDataSheet * fSensorData
TObjArray * fPluginArray
Bool_t initialized
TClonesArray * GetOutputBuffer() const
virtual void Print(Option_t *opt="") const
Double_t fcurrentEventTime
void LocalToPixel(Double_t *local, Int_t &pixelNumberX, Int_t &pixelNumberY)
TString fNodeName
void Exec(UInt_t nPlugin)
std::map< Int_t, Int_t > fSensorMap
Double_t fSensorStartTime
Double_t ComputeEndOfBusyTime(Double_t hitMCTime, Float_t diodeCharge, Int_t pixelNumberY)
void ShowDebugHistos()
TGeoHMatrix * fRecoMatrix
void ExecFrom(UInt_t nPlugin)
Double_t ComputeIndecatedAnalogTime(Double_t hitMCTime, Float_t diodeCharge)
Float_t epsilon[3]
CbmMvdSensor()
includes from C
Double_t GetReadoutTime(Double_t absoluteTime) const
Double_t GetFrameEndTime(Int_t frameNumber)
Double_t fSensorPosition[3]
TGeoHMatrix * fMCMatrix
TGeoBBox * fShape
virtual ~CbmMvdSensor()
std::string ToString() const
void TopToPixel(Double_t *lab, Int_t &pixelNumberX, Int_t &pixelNumberY)
TClonesArray * GetOutputArray(Int_t nPlugin) const
Int_t fClusterPlugin
TGeoHMatrix * fAlignmentCorr