BmnRoot
Loading...
Searching...
No Matches
BmnH3LTripleFinder.cxx
Go to the documentation of this file.
1
4 : fEventCounter(0)
5 , fKalman(nullptr)
6 , fParticleTriple(nullptr)
7{
8 fVertex = nullptr;
9}
10
12{
13 // delete fDetector;
14}
15
16void BmnH3LTripleFinder::Analysis()
17{
18 TLorentzVector lPos1, lPos2, lNeg;
19 Double_t VPX = fVertex->GetX();
20 Double_t VPY = fVertex->GetY();
21 Double_t VPZ = fVertex->GetZ();
22 Double_t dVPXsq = fVertex->GetCovariance(0, 0);
23 Double_t dVPYsq = fVertex->GetCovariance(1, 1);
24
25 vector<FairTrackParam> parInVPPos1;
26 vector<FairTrackParam> parInVPPos2;
27 vector<FairTrackParam> parInVPNeg;
28 vector<Double_t> m2Pos1_400;
29 vector<Double_t> m2Pos1_700;
30 vector<Double_t> m2Pos2_400;
31 vector<Double_t> m2Pos2_700;
32 vector<Double_t> chi2NDFPos1;
33 vector<Double_t> chi2NDFPos2;
34 vector<Double_t> chi2NDFNeg;
35 vector<Int_t> nHitsPos1;
36 vector<Int_t> nHitsPos2;
37 vector<Double_t> dedxPos1;
38 vector<Double_t> dedxPos2;
39 vector<Int_t> nGemHitsNeg;
40 vector<Int_t> nGemHitsPos1;
41 vector<Int_t> nGemHitsPos2;
42 vector<Int_t> nFsdHitsNeg;
43 vector<Int_t> nFsdHitsPos1;
44 vector<Int_t> nFsdHitsPos2;
45
46 // cout << FairRunAna::Instance()->GetField()->GetBy(0, 0, 124) << endl;
47 // cout << FairRunAna::Instance()->GetGeoFile() << endl;
48
49 // if (fStsTracks->GetEntriesFast() > 100) return; //skip too huge events FIXME!!!
50
51 for (Int_t i = 0; i < fStsTracks->GetEntriesFast(); i++) {
52 CbmStsTrack* tr = (CbmStsTrack*)fStsTracks->UncheckedAt(i);
53
54 // if (tr->GetNStsHits() < 4) continue;
55 Int_t nGEM = 0;
56 Int_t nFSD = 0;
57 GetNHits(tr, nGEM, nFSD);
58
59 Float_t mom = 1.0 / tr->GetParamFirst()->GetQp();
60
61 // pi-minus mom: from -0.6 to 0
62 // He3 mom: from +0.5 to ...
63
64 Int_t pdg = 0;
65 if (mom < 0.0)
66 pdg = fPDG3;
67 else if (mom > 0.0)
68 pdg = fPDG2;
69
70 // if (pdg == fPDG1 && nGEM < 3) continue;
71
72 FairTrackParam par = *(tr->GetParamFirst());
73 // cout << " BEFORE: " << 1.0 / par->GetQp() << endl;
74 if (fKalman->TGeoTrackPropagate(&par, VPZ, pdg, nullptr, nullptr) == kBMNERROR)
75 continue;
76 // cout << " AFTER: " << 1.0 / par->GetQp() << endl;
77
78 Double_t m2Tof400 = 0.0;
79 Double_t m2Tof700 = 0.0;
80 for (Int_t j = 0; j < fGlobTracks->GetEntriesFast(); j++) {
81 BmnGlobalTrack* gl = (BmnGlobalTrack*)fGlobTracks->UncheckedAt(j);
82 if (gl->GetGemTrackIndex() == i) {
83 m2Tof400 = gl->GetMass2(1);
84 m2Tof700 = gl->GetMass2(2);
85 break;
86 }
87 }
88
89 if (pdg == fPDG3) {
90 parInVPNeg.push_back(par);
91 chi2NDFNeg.push_back(tr->GetChi2() / tr->GetNDF());
92 nGemHitsNeg.push_back(nGEM);
93 nFsdHitsNeg.push_back(nFSD);
94 }
95
96 else
97 {
98 if (m2Tof400 > 2 || m2Tof700 > 2) {
99 parInVPPos1.push_back(par);
100 // cout << gl << endl;
101 m2Pos1_400.push_back(m2Tof400);
102 m2Pos1_700.push_back(m2Tof700);
103 chi2NDFPos1.push_back(tr->GetChi2() / tr->GetNDF());
104 nHitsPos1.push_back(tr->GetNStsHits());
105 dedxPos1.push_back(GetdEdx(tr));
106 nGemHitsPos1.push_back(nGEM);
107 nFsdHitsPos1.push_back(nFSD);
108 }
109
110 else
111 {
112 parInVPPos2.push_back(par);
113 // cout << gl << endl;
114 m2Pos2_400.push_back(m2Tof400);
115 m2Pos2_700.push_back(m2Tof700);
116 chi2NDFPos2.push_back(tr->GetChi2() / tr->GetNDF());
117 nHitsPos2.push_back(tr->GetNStsHits());
118 dedxPos2.push_back(GetdEdx(tr));
119 nGemHitsPos2.push_back(nGEM);
120 nFsdHitsPos2.push_back(nFSD);
121 }
122 }
123
124 // cout << endl;
125 // cout << "VPZ = " << Vpz << endl;
126 // par.Print();
127 }
128
129 // cout << "size1 = " << parInVPPos.size() << " " << "size2 = " << parInVPNeg.size() << endl;
130
131 // for (FairTrackParam par1 : parInVPPos) {
132 // for (FairTrackParam par2 : parInVPNeg) {
133 for (Int_t i = 0; i < (Int_t)parInVPPos1.size(); ++i) {
134 for (Int_t j = 0; j < (Int_t)parInVPPos2.size(); ++j) {
135 for (Int_t k = 0; k < (Int_t)parInVPNeg.size(); ++k) {
136
137 FairTrackParam VP1 = parInVPPos1[i];
138 FairTrackParam VP2 = parInVPPos2[j];
139 FairTrackParam VP3 = parInVPNeg[k];
140 FairTrackParam V01 = parInVPPos1[i];
141 FairTrackParam V02 = parInVPPos2[j];
142 FairTrackParam V03 = parInVPNeg[k];
143
144 Double_t V0Z = FindV0ByVirtualPlanes(&V01, &V02, &V03, VPZ, 25.0);
145 // if (V0Z > 30 || V0Z < -1) continue;
146
147 if (fKalman->TGeoTrackPropagate(&V01, V0Z, fPDG1, nullptr, nullptr, kTRUE) == kBMNERROR)
148 continue;
149 if (fKalman->TGeoTrackPropagate(&V02, V0Z, fPDG2, nullptr, nullptr, kTRUE) == kBMNERROR)
150 continue;
151 if (fKalman->TGeoTrackPropagate(&V03, V0Z, fPDG3, nullptr, nullptr, kTRUE) == kBMNERROR)
152 continue;
153
154 Double_t V0X1 = V01.GetX();
155 Double_t V0X2 = V02.GetX();
156 Double_t V0X3 = V03.GetX();
157 Double_t V0Y1 = V01.GetY();
158 Double_t V0Y2 = V02.GetY();
159 Double_t V0Y3 = V03.GetY();
160 Double_t VPX1 = VP1.GetX();
161 Double_t VPX2 = VP2.GetX();
162 Double_t VPX3 = VP3.GetX();
163 Double_t VPY1 = VP1.GetY();
164 Double_t VPY2 = VP2.GetY();
165 Double_t VPY3 = VP3.GetY();
166
167 Double_t dV0X1sq = V01.GetCovariance(0, 0);
168 Double_t dV0Y1sq = V01.GetCovariance(1, 1);
169 Double_t dV0X2sq = V02.GetCovariance(0, 0);
170 Double_t dV0Y2sq = V02.GetCovariance(1, 1);
171 Double_t dV0X3sq = V03.GetCovariance(0, 0);
172 Double_t dV0Y3sq = V03.GetCovariance(1, 1);
173 Double_t dVPX1sq = VP1.GetCovariance(0, 0);
174 Double_t dVPY1sq = VP1.GetCovariance(1, 1);
175 Double_t dVPX2sq = VP2.GetCovariance(0, 0);
176 Double_t dVPY2sq = VP2.GetCovariance(1, 1);
177 Double_t dVPX3sq = VP3.GetCovariance(0, 0);
178 Double_t dVPY3sq = VP3.GetCovariance(1, 1);
179
180 Double_t DCA12 = Sqrt(Sq(V0X2 - V0X1) + Sq(V0Y2 - V0Y1));
181 Double_t DCA13 = Sqrt(Sq(V0X3 - V0X1) + Sq(V0Y3 - V0Y1));
182 Double_t DCA23 = Sqrt(Sq(V0X3 - V0X2) + Sq(V0Y3 - V0Y2));
183 Double_t DCA123 = (DCA12 + DCA13 + DCA23) / 3.0;
184
185 Double_t dDCA12 =
186 1.0 / DCA12 * Sqrt(Sq(V0X2 - V0X1) * (dV0X1sq + dV0X2sq) + Sq(V0Y2 - V0Y1) * (dV0Y1sq + dV0Y2sq));
187 Double_t dDCA13 =
188 1.0 / DCA13 * Sqrt(Sq(V0X3 - V0X1) * (dV0X1sq + dV0X3sq) + Sq(V0Y3 - V0Y1) * (dV0Y1sq + dV0Y3sq));
189 Double_t dDCA23 =
190 1.0 / DCA23 * Sqrt(Sq(V0X3 - V0X2) * (dV0X2sq + dV0X3sq) + Sq(V0Y3 - V0Y2) * (dV0Y2sq + dV0Y3sq));
191 Double_t dDCA123 = Sqrt(Sq(dDCA12) + Sq(dDCA13) + Sq(dDCA23));
192
193 Double_t DCA1 = Sqrt(Sq(VPX1 - VPX) + Sq(VPY1 - VPY));
194 Double_t dDCA1 =
195 1.0 / DCA1 * Sqrt(Sq(VPX1 - VPX) * (dVPX1sq + dVPXsq) + Sq(VPY1 - VPY) * (dVPY1sq + dVPYsq));
196 Double_t DCA2 = Sqrt(Sq(VPX2 - VPX) + Sq(VPY2 - VPY));
197 Double_t dDCA2 =
198 1.0 / DCA2 * Sqrt(Sq(VPX2 - VPX) * (dVPX2sq + dVPXsq) + Sq(VPY2 - VPY) * (dVPY2sq + dVPYsq));
199 Double_t DCA3 = Sqrt(Sq(VPX3 - VPX) + Sq(VPY3 - VPY));
200 Double_t dDCA3 =
201 1.0 / DCA3 * Sqrt(Sq(VPX3 - VPX) * (dVPX3sq + dVPXsq) + Sq(VPY3 - VPY) * (dVPY3sq + dVPYsq));
202
203 Double_t V0X = (V0X1 + V0X2 + V0X3) / 3.0;
204 Double_t V0Y = (V0Y1 + V0Y2 + V0Y3) / 3.0;
205 Double_t path = Sqrt(Sq(V0X - VPX) + Sq(V0Y - VPY) + Sq(V0Z - VPZ));
206
207 BmnParticleTriple partTriple;
208
209 // put mass2 for positive particle in field beta (let it be)
210 // for nevative one put -100, we don't need PID for pion
211 partTriple.SetMass400Triple(m2Pos1_400[i], m2Pos2_400[j], -100);
212 partTriple.SetMass700Triple(m2Pos1_700[i], m2Pos2_700[j], -100);
213 partTriple.SetChi2Triple(chi2NDFPos1[i], chi2NDFPos2[j], chi2NDFNeg[k]);
214
215 partTriple.SetV0Z(V0Z);
216 partTriple.SetV0X(V0X);
217 partTriple.SetV0Y(V0Y);
218
219 partTriple.SetDCA1(DCA1);
220 partTriple.SetDCA2(DCA2);
221 partTriple.SetDCA3(DCA3);
222 partTriple.SetDCA123(DCA123);
223 partTriple.SetdDCA1(dDCA1);
224 partTriple.SetdDCA2(dDCA2);
225 partTriple.SetdDCA3(dDCA3);
226 partTriple.SetdDCA123(dDCA123);
227 partTriple.SetPath(path);
228
229 vector<Int_t> nHits1 = {nFsdHitsPos1[i], nGemHitsPos1[i]};
230 vector<Int_t> nHits2 = {nFsdHitsPos2[j], nGemHitsPos2[j]};
231 vector<Int_t> nHits3 = {nFsdHitsNeg[k], nGemHitsNeg[k]};
232 partTriple.SetNHitsTriple(nHits1, nHits2, nHits3);
233
234 // Track params. are redefined
235 Double_t Tx1, Ty1, Tx2, Ty2, Tx3, Ty3;
236 Double_t A1, A2, A3;
237
238 // TVector2 armenPodol;
239
240 Tx1 = V01.GetTx();
241 Ty1 = V01.GetTy();
242 Tx2 = V02.GetTx();
243 Ty2 = V02.GetTy();
244 Tx3 = V03.GetTx();
245 Ty3 = V03.GetTy();
246
247 Float_t p1 = 1. / V01.GetQp();
248 Float_t p2 = 1. / V02.GetQp();
249 Float_t p3 = 1. / V03.GetQp();
250 partTriple.SetMomTriple(p1, p2, p3 /*_p1, _p2*/);
251 partTriple.SetEtaTriple(-100, -100, -100 /*_eta1, _eta2*/);
252
253 // armenPodol = ArmenterosPodol(V01, V02);
254
255 A1 = 1. / Sqrt(Tx1 * Tx1 + Ty1 * Ty1 + 1);
256 lPos1.SetXYZM(Tx1 * A1 * p1, Ty1 * A1 * p1, A1 * p1, fMassD);
257
258 A2 = 1. / Sqrt(Tx2 * Tx2 + Ty2 * Ty2 + 1);
259 lPos2.SetXYZM(Tx2 * A2 * p2, Ty2 * A2 * p2, A2 * p2, fMassP);
260
261 p3 *= -1.; // Since in the calculations pos. mom. values should be used
262
263 A3 = 1. / Sqrt(Tx3 * Tx3 + Ty3 * Ty3 + 1);
264 lNeg.SetXYZM(Tx3 * A3 * p3, Ty3 * A3 * p3, p3 * A3, fMassPi);
265
266 partTriple.SetAlpha1(dedxPos1[i]);
267 partTriple.SetAlpha2(dedxPos2[j]); // just use free space for dEdX
268 // partTriple.SetPtPodol(armenPodol.Y());
269 partTriple.SetInvMass(TLorentzVector((lPos1 + lPos2 + lNeg)).Mag());
270
271 // Part to be used when estimating omega ... (dca0 needed), 0 means a primary particle to be decayed...
272 partTriple.SetTxTriple(Tx1, Tx2, Tx3);
273 partTriple.SetTyTriple(Ty1, Ty2, Ty3);
274
275 Double_t PzPart1 = Abs(p1) * A1;
276 Double_t PzPart2 = Abs(p2) * A2;
277 Double_t PzPart3 = Abs(p3) * A3;
278
279 Double_t PzPart0 = PzPart1 + PzPart2 + PzPart3;
280 Double_t PxPart0 = PzPart1 * Tx1 + PzPart2 * Tx2 + PzPart3 * Tx3;
281 Double_t PyPart0 = PzPart1 * Ty1 + PzPart2 * Ty2 + PzPart3 * Ty3;
282
283 Double_t TxPart0 = PxPart0 / PzPart0;
284 Double_t TyPart0 = PyPart0 / PzPart0;
285
286 Double_t xPart0 = TxPart0 * (VPZ - V0Z) + V0X;
287 Double_t yPart0 = TyPart0 * (VPZ - V0Z) + V0Y;
288
289 Double_t dca0 = Sqrt(Sq(xPart0 - VPX) + Sq(yPart0 - VPY));
290
291 partTriple.SetDCA0(dca0);
292
293 new ((*fParticleTriple)[fParticleTriple->GetEntriesFast()]) BmnParticleTriple(partTriple);
294 }
295 }
296 }
297}
298// -------------------------------------------------------------------
299
301{
302 cout << "\nBmnH3LTripleFinder::Init()" << endl;
303
304 FairRootManager* ioman = FairRootManager::Instance();
305
306 fStsTracks = (TClonesArray*)ioman->GetObject("StsVector");
307 fGlobTracks = (TClonesArray*)ioman->GetObject("BmnGlobalTrack");
308 fStsHits = (TClonesArray*)ioman->GetObject("StsHit");
309 fVertex = (CbmVertex*)ioman->GetObject("PrimaryVertex.");
310 fUpperClusters = (TClonesArray*)ioman->GetObject("BmnGemUpperCluster");
311 fLowerClusters = (TClonesArray*)ioman->GetObject("BmnGemLowerCluster");
312
313 fParticleTriple = new TClonesArray("BmnParticleTriple");
314 ioman->Register("par", "H3L", fParticleTriple, kTRUE);
315
316 fKalman = new BmnKalmanFilter();
317
318 return kSUCCESS;
319}
320
321// -------------------------------------------------------------------
322
323void BmnH3LTripleFinder::Exec(Option_t* option)
324{
325 fParticleTriple->Delete();
326
327 fEventCounter++;
328
329 // if (fEventCounter % 100 == 0)
330 cout << "Event# " << fEventCounter << endl;
331
332 if (fVertex->GetNTracks() < 2)
333 return;
334 // if (fVertex->GetX() < -1.0 || fVertex->GetX() > +1.5) return;
335 // if (fVertex->GetY() < -1.0 || fVertex->GetY() > +1.2) return;
336 // if (fVertex->GetZ() < -0.5 || fVertex->GetZ() > +0.5) return;
337
338 Analysis();
339}
340// -------------------------------------------------------------------
341
343{
344 delete fKalman;
345 // delete fMagField;
346 cout << "\n-I- [BmnH3LTripleFinder::Finish] " << endl;
347}
348
349Double_t BmnH3LTripleFinder::FindV0ByVirtualPlanes(FairTrackParam* par1,
350 FairTrackParam* par2,
351 FairTrackParam* par3,
352 Double_t z_0,
353 Double_t range)
354{
355 const Int_t nPlanes = 15; // FIXME
356
357 while (range >= 0.1) {
358 Double_t zMax = z_0 + range;
359 Double_t zMin = z_0 - range;
360 Double_t zStep = (zMax - zMin) / nPlanes;
361
362 Double_t minDist = 1000.0;
363 Double_t minZ = -1000.0;
364
365 for (Int_t iPlane = 0; iPlane < nPlanes; ++iPlane) {
366 Double_t z = zMax - iPlane * zStep;
367 BmnStatus stat1 = fKalman->TGeoTrackPropagate(par1, z, fPDG1, nullptr, nullptr, kTRUE);
368 BmnStatus stat2 = fKalman->TGeoTrackPropagate(par2, z, fPDG2, nullptr, nullptr, kTRUE);
369 BmnStatus stat3 = fKalman->TGeoTrackPropagate(par3, z, fPDG3, nullptr, nullptr, kTRUE);
370
371 if (stat1 == kBMNERROR || stat2 == kBMNERROR || stat3 == kBMNERROR)
372 return DBL_MAX;
373
374 Double_t d12 = Sqrt(Sq(par1->GetX() - par2->GetX()) + Sq(par1->GetY() - par2->GetY()));
375 Double_t d13 = Sqrt(Sq(par1->GetX() - par3->GetX()) + Sq(par1->GetY() - par3->GetY()));
376 Double_t d23 = Sqrt(Sq(par2->GetX() - par3->GetX()) + Sq(par2->GetY() - par3->GetY()));
377 Double_t d123 = Sqrt(Sq(d23) + Sq(d12) + Sq(d13));
378
379 if (d123 < minDist) {
380 minDist = d123;
381 minZ = z;
382 }
383 }
384
385 z_0 = minZ;
386 range *= 0.5;
387 }
388 return z_0;
389}
390
391Double_t BmnH3LTripleFinder::GetdEdx(CbmStsTrack* tr)
392{
393 set<Double_t> signalsUpp;
394 // set<Double_t> signalsLow;
395 for (Int_t hitIdx = 0; hitIdx < tr->GetNStsHits(); ++hitIdx) {
396 CbmStsHit* hit = (CbmStsHit*)fStsHits->At(tr->GetStsHitIndex(hitIdx));
397
398 if (hit->GetSystemId() != kGEM)
399 continue;
400
401 StripCluster* upp = (StripCluster*)fUpperClusters->At(hit->fDigiB % 1000000);
402 // StripCluster low = lowClusters[hit.fDigiF % 1000000];
403
404 signalsUpp.insert(upp->TotalSignal);
405 // signalsLow.insert(low.TotalSignal);
406 }
407
408 Int_t nGemHits = signalsUpp.size();
409 if (nGemHits < 3)
410 return 0;
411
412 Int_t shift = (nGemHits == 3) ? 2
413 : (nGemHits == 4) ? 2
414 : (nGemHits == 5) ? 3
415 : (nGemHits == 6) ? 4
416 : (nGemHits == 7) ? 4
417 : 0;
418
419 auto itUpp = signalsUpp.begin();
420 // auto itLow = signalsLow.begin();
421
422 // Double_t totSigLow = 0.0;
423 Double_t totSigUpp = 0.0;
424 for (Int_t i = 0; i < nGemHits - shift; ++i) {
425 totSigUpp += (*itUpp);
426 // totSigLow += (*itLow);
427 itUpp++;
428 // itLow++;
429 }
430
431 // totSigLow /= (nGemHits - shift);
432 totSigUpp /= (nGemHits - shift);
433 return totSigUpp;
434}
435
436void BmnH3LTripleFinder::GetNHits(CbmStsTrack* tr, Int_t& nGEM, Int_t& nFSD)
437{
438 nGEM = 0;
439 nFSD = 0;
440 for (Int_t hitIdx = 0; hitIdx < tr->GetNStsHits(); ++hitIdx) {
441 CbmStsHit* hit = (CbmStsHit*)fStsHits->At(tr->GetStsHitIndex(hitIdx));
442
443 if (hit->GetSystemId() == kGEM)
444 nGEM++;
445 else if (hit->GetSystemId() == kSILICON)
446 nFSD++;
447 }
448}
449
ClassImp(BmnH3LTripleFinder)
int i
Definition P4_F32vec4.h:22
@ kSILICON
@ kGEM
BmnStatus
Definition BmnEnums.h:24
@ kBMNERROR
Definition BmnEnums.h:26
Double_t GetMass2(Int_t tofID)
Int_t GetGemTrackIndex() const
virtual void Exec(Option_t *option)
virtual InitStatus Init()
BmnStatus TGeoTrackPropagate(FairTrackParam *par, Double_t zOut, Int_t pdg, vector< Double_t > *F, Double_t *length, Bool_t isField)
void SetPath(Double_t val)
void SetAlpha2(Double_t val)
void SetDCA1(Double_t val)
void SetdDCA123(Double_t val)
void SetEtaTriple(Double_t val1, Double_t val2, Double_t val3)
void SetDCA2(Double_t val)
void SetMass700Triple(Double_t val1, Double_t val2, Double_t val3)
void SetDCA0(Double_t val)
void SetDCA123(Double_t val)
void SetTyTriple(Double_t val1, Double_t val2, Double_t val3)
void SetAlpha1(Double_t val)
void SetV0Y(Double_t val)
void SetdDCA3(Double_t val)
void SetTxTriple(Double_t val1, Double_t val2, Double_t val3)
void SetV0X(Double_t val)
void SetNHitsTriple(vector< Int_t > part1, vector< Int_t > part2, vector< Int_t > part3)
void SetDCA3(Double_t val)
void SetMass400Triple(Double_t val1, Double_t val2, Double_t val3)
void SetChi2Triple(Double_t val1, Double_t val2, Double_t val3)
void SetInvMass(Double_t val)
void SetV0Z(Double_t val)
void SetdDCA2(Double_t val)
void SetMomTriple(Double_t val1, Double_t val2, Double_t val3)
void SetdDCA1(Double_t val)
Int_t fDigiB
Definition CbmStsHit.h:93
Int_t GetSystemId() const
Definition CbmStsHit.h:64
Int_t GetNStsHits() const
Definition CbmStsTrack.h:60
Double_t GetChi2() const
Definition CbmStsTrack.h:66
Int_t GetStsHitIndex(Int_t iHit) const
Definition CbmStsTrack.h:62
FairTrackParam * GetParamFirst()
Definition CbmStsTrack.h:69
Int_t GetNDF() const
Definition CbmStsTrack.h:67
Double_t GetZ() const
Definition CbmVertex.h:60
Double_t GetX() const
Definition CbmVertex.h:58
Int_t GetNTracks() const
Definition CbmVertex.h:63
Double_t GetCovariance(Int_t i, Int_t j) const
Double_t GetY() const
Definition CbmVertex.h:59
Double_t TotalSignal