17#include <FairEventHeader.h>
18#include <FairMCEventHeader.h>
19#include <FairPrimaryGenerator.h>
20#include <FairRunAna.h>
21#include <FairRunSim.h>
24#include <TClonesArray.h>
25#include <TGeoManager.h>
26#include <TGeoMatrix.h>
27#include <TGeoVolume.h>
60 LOG(warning) <<
"MVD-Sensor initialized without technical data. Assuming default sensor.";
62 LOG(warning) <<
"MVD-Sensor initialized without geometry data. Must be added manually before using this class.";
64 LOG(warning) <<
"MVD-Sensor initialized without valid start time. Must be added manually before using this class.";
71 Int_t sensorNr,
Int_t volumeId, Double_t sensorStartTime)
117 LOG(debug1) <<
"-I- nodeName is " << nodeName;
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");
129 Double_t
first[3], last[3];
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";
136 Double_t* tempCoordinate;
139 Double_t pre[3], past[3], global[3];
140 Double_t local[3] = {0, 0, 0};
146 for (
Int_t i = 0; i < 3; i++) {
147 tempCoordinate[i] = tempCoordinate[i] +
epsilon[i];
151 LOG(debug2) <<
"shifted pixel 0,0 to: " << past[0] <<
", " << past[1] <<
" at z = " << past[2];
153 LOG(debug2) <<
"shifted local center to: " << global[0] <<
", " << global[1] <<
" at z = " << global[2];
163 for (
Int_t i = 0; i < 3; i++) {
179 TClonesArray* dataArray;
186 for (
Int_t i = 0; i < nPlugin; i++) {
200 for (
Int_t i = 0; i < nPlugin - 1; i++) {
217 LOG(debug) <<
"No Plugins on this Sensor ";
218 pluginFirst =
nullptr;
231 LOG(info) <<
"Set debug mode on Plugin " <<
fPluginArray->GetEntriesFast() - 1 <<
" at sensor " << GetName();
251 FairRunSim* run = FairRunSim::Instance();
252 FairRunAna* ana = FairRunAna::Instance();
254 FairEventHeader*
event = run->GetEventHeader();
258 FairEventHeader*
event = ana->GetEventHeader();
272 for (
Int_t i = 1; i < nPlugin; i++) {
284 if (nPlugin > nPluginMax) { Fatal(GetName(),
" Error - Called non-existing plugin"); }
291 FairRunSim* run = FairRunSim::Instance();
292 FairPrimaryGenerator* gen = run->GetPrimaryGenerator();
293 FairMCEventHeader*
event = gen->GetEvent();
301 if (nPlugin < maxPlugin) {
306 for (UInt_t i = 1; i <= nPlugin; i++) {
313 LOG(info) <<
"nPlugin to large";
321 FairRunSim* run = FairRunSim::Instance();
322 FairPrimaryGenerator* gen = run->GetPrimaryGenerator();
323 FairMCEventHeader*
event = gen->GetEvent();
331 if (nPlugin <= maxPlugin) {
336 for (UInt_t i = nPlugin + 1; i < maxPlugin; i++) {
344 LOG(info) <<
"nPlugin to large";
369 if (tempArray) {
return tempArray->GetEntriesFast() - 1; }
371 LOG(fatal) <<
"undefined plugin called";
384 LOG(warning) <<
"CbmMvdSensor::GetOutputBuffer: Warning - Use of method depreciated.";
392 if (nPlugin >= (UInt_t)
fPluginArray->GetEntriesFast())
return 0;
400 if (nPlugin >= (UInt_t)
fPluginArray->GetEntriesFast())
return -1;
449 Double_t
x = (pixelNumberX + 0.5) *
fSensorData->GetPixelPitchX();
450 Double_t
y = (pixelNumberY + 0.5) *
fSensorData->GetPixelPitchY();
485 Double_t timeInUnitsOfFrames = timeSinceStart /
fSensorData->GetIntegrationTime();
488 Double_t timeSinceStartOfTheFrame = timeInUnitsOfFrames - (
Int_t) timeInUnitsOfFrames;
493 return (
Int_t)(timeInUnitsOfFrames + (pixelNumberY < rowUnderReadout));
505 Double_t delay =
fSensorData->ComputeHitDelay(diodeCharge);
506 Double_t jitter =
fSensorData->ComputeHitJitter(diodeCharge);
508 return hitMCTime + delay + jitter;
514 Double_t endOfAnalogChannelDeadTime = hitMCTime +
fSensorData->ComputeHitDeadTime(diodeCharge);
515 Int_t frameNumberAtEndOfDeadTime =
GetFrameNumber(endOfAnalogChannelDeadTime, pixelNumberY);
521 return endOfDeadTime;
538 Double_t timeInUnitsOfFrames = timeSinceStart /
fSensorData->GetIntegrationTime();
540 Int_t nextFrame = (
Int_t)(timeInUnitsOfFrames + 1);
542 Double_t roTime = nextFrame *
fSensorData->GetIntegrationTime();
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;
560 ss <<
" --------------------------------------------------------" << std::endl;
561 ss <<
" Technical information: " << std::endl;
563 ss <<
" , MC Id " <<
fVolumeId << std::endl;
564 ss <<
"---------------------------------------------------------" << std::endl;
574 for (
Int_t i = 0; i < nPlugin; i++) {
ClassImp(CbmConverterManager)
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 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 fTempCoordinate[3]
UInt_t GetNumberOfHistograms(UInt_t nPlugin)
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)
void ExecTo(UInt_t nPlugin)
void SendInputToPlugin(Int_t nPlugin, TObject *input)
CbmMvdSensorDataSheet * fSensorData
TClonesArray * GetOutputBuffer() const
virtual void Print(Option_t *opt="") const
Double_t fcurrentEventTime
void LocalToPixel(Double_t *local, Int_t &pixelNumberX, Int_t &pixelNumberY)
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)
TGeoHMatrix * fRecoMatrix
void ExecFrom(UInt_t nPlugin)
Double_t ComputeIndecatedAnalogTime(Double_t hitMCTime, Float_t diodeCharge)
CbmMvdSensor()
includes from C
Double_t GetReadoutTime(Double_t absoluteTime) const
Double_t GetFrameEndTime(Int_t frameNumber)
Double_t fSensorPosition[3]
std::string ToString() const
void TopToPixel(Double_t *lab, Int_t &pixelNumberX, Int_t &pixelNumberY)
TClonesArray * GetOutputArray(Int_t nPlugin) const
TGeoHMatrix * fAlignmentCorr