7#include "TClonesArray.h"
9#include "TGeoManager.h"
16#include "CbmDaqBuffer.h"
17#include "CbmMCBuffer.h"
18#include "FairRootManager.h"
19#include "FairRunAna.h"
20#include "FairRuntimeDb.h"
29#include "CbmStsPoint.h"
49using std::setprecision;
55 : FairTask(
"StsDigitize", 1)
73 , fPairCreationEnergy(0.)
81 , fFChannelPointsMap()
82 , fBChannelPointsMap()
102 fDigiMatches->Delete();
112void CbmStsDigitizeTb::DigitizePoint(
const CbmStsPoint* point, Int_t& nFront, Int_t& nBack)
119 Double_t xPoint = 0.5 * (point->
GetXOut() + point->
GetXIn());
120 Double_t yPoint = 0.5 * (point->
GetYOut() + point->
GetYIn());
121 Double_t zPoint = 0.5 * (point->
GetZOut() + point->
GetZIn());
122 gGeoManager->FindNode(xPoint, yPoint, zPoint);
123 TGeoNode* curNode = gGeoManager->GetCurrentNode();
133 LOG(debug) << fName <<
": node " << fDigiScheme->
GetCurrentPath() <<
" not found in digi scheme!";
134 LOG(debug2) <<
"\t" <<
"MCPoint information:";
143 Double_t lTraj = TMath::Sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ);
144 Int_t nSteps = Int_t(lTraj / fStepSize) + 1;
147 Double_t charge = point->GetEnergyLoss() / fPairCreationEnergy;
148 Double_t stepCharge = charge / (nSteps + 1);
151 map<Int_t, Double_t> frontSignals;
152 map<Int_t, Double_t> backSignals;
158 Double_t xPair = point->
GetXIn();
159 Double_t yPair = point->
GetYIn();
160 Double_t zPair = point->
GetZIn();
161 for (Int_t iStep = 0; iStep <= nSteps; iStep++) {
163 frontSignals[iFChan] += stepCharge;
165 backSignals[iBChan] += stepCharge;
166 xPair += deltaX / Double_t(nSteps);
167 yPair += deltaY / Double_t(nSteps);
168 zPair += deltaZ / Double_t(nSteps);
172 map<Int_t, Double_t>::iterator it;
173 for (it = frontSignals.begin(); it != frontSignals.end(); it++) {
174 if ((*it).second < fThreshold)
177 if ((*it).second >= fQMax)
178 iAdc = fNAdcChannels - 1;
180 iAdc = Int_t((*it).second / fQMax) * fNAdcChannels;
187 CbmDaqBuffer::Instance()->InsertData(digi);
192 for (it = backSignals.begin(); it != backSignals.end(); it++) {
193 if ((*it).second < fThreshold)
196 if ((*it).second >= fQMax)
197 iAdc = fNAdcChannels - 1;
199 iAdc = Int_t((*it).second / fQMax) * fNAdcChannels;
206 CbmDaqBuffer::Instance()->InsertData(digi);
210 LOG(debug1) << fName <<
": point ( " << fixed << setprecision(4) << xPoint <<
", " << yPoint <<
", " << zPoint
211 <<
") cm, t = " << setprecision(3) << point->GetTime() <<
" ns, digis: " << nFront <<
" front, "
217InitStatus CbmStsDigitizeTb::Init()
221 if (!(CbmMCBuffer::Instance() && CbmDaqBuffer::Instance())) {
222 LOG(fatal) <<
"No MCBuffer or DaqBuffer present!";
227 fPairCreationEnergy = 3.68e-9;
230 fNAdcChannels = 1 << (fNAdcBits + 1);
236 if (!fDigiScheme->
Init(fGeoPar, fDigiPar)) {
237 LOG(error) <<
"Error in building STS digitisation scheme";
241 if (fVerbose == 1 || fVerbose == 2)
242 fDigiScheme->
Print(kFALSE);
243 else if (fVerbose > 2)
244 fDigiScheme->
Print(kTRUE);
245 cout <<
"-I- " << fName <<
"::Init: "
246 <<
"STS digitisation scheme succesfully initialised" << endl;
248 <<
", Channels: " << fDigiScheme->
GetNChannels() << endl;
266 Double_t tStart = -1.;
267 Double_t tStop = -1.;
273 DigitizePoint(point, nDigiF, nDigiB);
277 if (!(nDigiF + nDigiB))
281 fNDigisFront += nDigiF;
282 fNDigisBack += nDigiB;
283 tStop = point->GetTime();
288 point =
dynamic_cast<const CbmStsPoint*
>(CbmMCBuffer::Instance()->GetNextPoint(
kGEM));
292 LOG(info) << fName <<
": " << fixed << setprecision(4) << fTimer.RealTime() <<
" s, " << nPoints
293 <<
" points (outside: " << nOut <<
"), " << nDigiAll <<
" digis";
295 LOG(info) <<
", time " << setprecision(3) << tStart <<
" ns to " << tStop <<
" ns";
299 fTime += fTimer.RealTime();
306void CbmStsDigitizeTb::SetParContainers()
310 FairRunAna*
run = FairRunAna::Instance();
312 Fatal(
"SetParContainers",
"No analysis run");
314 FairRuntimeDb* db =
run->GetRuntimeDb();
316 Fatal(
"SetParContainers",
"No runtime database");
319 fGeoPar = (
CbmGeoStsPar*)db->getContainer(
"CbmGeoStsPar");
322 fDigiPar = (
CbmStsDigiPar*)db->getContainer(
"CbmStsDigiPar");
327InitStatus CbmStsDigitizeTb::ReInit()
331 fDigiScheme->
Clear();
334 if (fDigiScheme->
Init(fGeoPar, fDigiPar)) {
343void CbmStsDigitizeTb::Reset()
346 fNDigis = fNMulti = 0;
347 fFChannelPointsMap.clear();
348 fBChannelPointsMap.clear();
354 fDigiMatches->Delete();
359void CbmStsDigitizeTb::Finish()
364 LOG(info) <<
"============================================================";
365 LOG(info) <<
"===== " << fName <<
": Run summary ";
366 LOG(info) <<
"===== ";
367 LOG(info) <<
"===== Events processed : " << setw(8) << fNEvents;
369 LOG(info) <<
"===== Real time per event : " << setw(8) << setprecision(4) << fTime / fNEvents <<
" s";
370 LOG(info) <<
"===== StsPoints per event : " << setw(8) << setprecision(2) << fNPoints / fNEvents;
371 LOG(info) <<
"===== Outside hits per event : " << setw(8) << setprecision(2) << fNOutside / fNEvents <<
" = "
372 << setw(6) << setprecision(2) << fNOutside / fNPoints * 100. <<
" %";
373 LOG(info) <<
"===== Front digis per point : " << setw(8) << setprecision(2)
374 << fNDigisFront / (fNPoints - fNOutside);
375 LOG(info) <<
"===== Back digis per point : " << setw(8) << setprecision(2)
376 << fNDigisBack / (fNPoints - fNOutside);
377 LOG(info) <<
"============================================================";
BmnSsdDigitizeParameters * fDigiPar
Digitisation parameters.
void Print(Bool_t kLong=kFALSE)
static CbmStsDigiScheme * Instance(int version=1)
Bool_t IsNewGeometry() const
CbmStsSensor * GetSensorByName(TString sensorName)
virtual ~CbmStsDigitizeTb()
virtual void Exec(Option_t *opt)
Int_t GetFrontChannel(Double_t x, Double_t y, Double_t z, Double_t &dPitch)
Int_t GetBackChannel(Double_t x, Double_t y, Double_t z, Double_t &dPitch)
Int_t GetSectorNr() const
Int_t GetStationNr() const