157 Double_t AvalancheRadius = 0.05;
159 Double_t radius = AvalancheRadius;
165 radius = gRandom->Gaus(AvalancheRadius, 0.025);
166 if (radius > AvalancheRadius / 2.0 && radius < AvalancheRadius * 2.0 && radius > 0.0)
171 radius = AvalancheRadius;
177 Int_t n_strip_layers = StripLayers.size();
178 vector<StripCluster> cluster_layers(n_strip_layers,
StripCluster());
180 for (Int_t ilayer = 0; ilayer < n_strip_layers; ++ilayer) {
181 if (!StripLayers[ilayer].IsPointInsideStripLayer(x, y))
183 cluster_layers[ilayer] =
MakeCluster(ilayer, x, y, signal, radius);
188 for (Int_t ilayer = 0; ilayer < n_strip_layers; ++ilayer) {
189 for (
size_t ielement = 0; ielement < cluster_layers[ilayer].Strips.size(); ++ielement) {
190 Int_t strip_num = cluster_layers[ilayer].Strips.at(ielement);
191 Double_t strip_signal = cluster_layers[ilayer].Signals.at(ielement);
192 StripLayers[ilayer].AddStripSignal(strip_num, strip_signal);
198 for (Int_t ilayer = 0; ilayer < n_strip_layers; ++ilayer) {
199 for (
size_t ielement = 0; ielement < cluster_layers[ilayer].Strips.size(); ++ielement) {
200 Int_t strip_num = cluster_layers[ilayer].Strips.at(ielement);
201 Double_t strip_signal = cluster_layers[ilayer].Signals.at(ielement);
202 StripLayers[ilayer].AddLinkToStripMatch(strip_num, strip_signal / cluster_layers[ilayer].TotalSignal,
208 RealPointsX.push_back(x);
209 RealPointsY.push_back(y);
210 RealPointsMC.push_back(refID);
215 cerr <<
"WARNING: BmnSiBTModule::AddRealPointFullOne(): Point (" << x <<
" : " << y <<
" : " << z
216 <<
") is out of the readout plane or inside a dead zone\n";
270 Double_t ClusterDistortion = 0.0;
279 Double_t Pitch = StripLayers[layer_num].GetPitch();
281 Double_t RadiusInZones = radius / Pitch;
282 Double_t
Sigma = RadiusInZones / 3.33;
284 TF1 gausF(
"gausF",
"gaus", -4 *
Sigma, 4 *
Sigma);
285 gausF.SetParameter(0, 1.0);
286 gausF.SetParameter(1, 0.0);
287 gausF.SetParameter(2,
Sigma);
289 Double_t SCluster = gausF.Integral(-4 *
Sigma, 4 *
Sigma);
292 Double_t var_level = ClusterDistortion;
294 Int_t NStripsInLayer = StripLayers[layer_num].GetNStrips();
296 if (NStripsInLayer == 0)
299 Double_t CenterZonePos = StripLayers[layer_num].ConvertPointToStripPosition(xcoord, ycoord);
301 if (CenterZonePos < 0.0 || CenterZonePos >= NStripsInLayer)
304 gausF.SetParameter(1, CenterZonePos);
305 Double_t total_signal = 0.0;
307 Double_t LeftZonePos = CenterZonePos - RadiusInZones;
308 Double_t RightZonePos = CenterZonePos + RadiusInZones;
309 Double_t OutLeftBorder = 0.0;
310 Double_t OutRightBorder = 0.0;
312 if (LeftZonePos < 0.0) {
313 OutLeftBorder = LeftZonePos;
316 if (RightZonePos < 0.0) {
317 OutRightBorder = RightZonePos;
320 if (LeftZonePos >= NStripsInLayer) {
321 OutLeftBorder = LeftZonePos;
322 LeftZonePos = NStripsInLayer - 0.001;
324 if (RightZonePos >= NStripsInLayer) {
325 OutRightBorder = RightZonePos;
326 RightZonePos = NStripsInLayer - 0.001;
333 if ((Int_t)LeftZonePos == (Int_t)RightZonePos) {
335 Int_t NumCurrentZone = (Int_t)LeftZonePos;
337 h = RightZonePos - LeftZonePos;
341 Double_t xp = LeftZonePos +
dist;
342 Double_t S = gausF.Integral(xp, xp + h);
343 Double_t Energy = (signal * Gain) * (S / SCluster);
344 Energy += rand.Gaus(0.0, var_level * Energy);
348 if (NumCurrentZone >= 0 && NumCurrentZone < NStripsInLayer && Energy > 0.0) {
349 cluster.
AddStrip(NumCurrentZone, Energy);
350 total_signal += Energy;
357 Int_t NumCurrentZone = (Int_t)LeftZonePos;
359 h = ((Int_t)LeftZonePos + 1) - LeftZonePos;
363 Double_t xp = LeftZonePos +
dist;
364 Double_t S = gausF.Integral(xp, xp + h);
365 Double_t Energy = (signal * Gain) * (S / SCluster);
366 Energy += rand.Gaus(0.0, var_level * Energy);
370 if (NumCurrentZone >= 0 && NumCurrentZone < NStripsInLayer && Energy > 0.0) {
371 cluster.
AddStrip(NumCurrentZone, Energy);
372 total_signal += Energy;
378 for (Int_t
i = (Int_t)LeftZonePos + 1;
i < (Int_t)RightZonePos; ++
i) {
384 xp = LeftZonePos +
dist;
385 S = gausF.Integral(xp, xp + h);
386 Energy = (signal * Gain) * (S / SCluster);
387 Energy += rand.Gaus(0.0, var_level * Energy);
391 if (NumCurrentZone >= 0 && NumCurrentZone < NStripsInLayer && Energy > 0.0) {
392 cluster.
AddStrip(NumCurrentZone, Energy);
393 total_signal += Energy;
399 NumCurrentZone = (Int_t)RightZonePos;
401 h = RightZonePos - (Int_t)RightZonePos;
405 xp = LeftZonePos +
dist;
406 S = gausF.Integral(xp, xp + h);
407 Energy = (signal * Gain) * (S / SCluster);
408 Energy += rand.Gaus(0.0, var_level * Energy);
412 if (NumCurrentZone >= 0 && NumCurrentZone < NStripsInLayer && Energy > 0.0) {
413 cluster.
AddStrip(NumCurrentZone, Energy);
414 total_signal += Energy;
425 Double_t mean_fit_pos = 0.0;
427 Int_t NOutLeftBins = 0;
428 Int_t NOutRightBins = 0;
429 if (OutLeftBorder != 0.0) {
430 NOutLeftBins = (Int_t)(
fabs(OutLeftBorder)) + 1;
432 if (OutRightBorder != 0.0) {
433 NOutRightBins = (Int_t)(OutRightBorder - RightZonePos) + 1;
436 Int_t begin_strip_num = cluster.
Strips.at(0);
438 Int_t nstrips = last_strip_num - begin_strip_num + 1;
440 TH1F hist(
"hist_for_fit",
"hist_for_fit", nstrips + NOutLeftBins + NOutRightBins, begin_strip_num - NOutLeftBins,
441 last_strip_num + 1 + NOutRightBins);
442 Int_t hist_index = 0;
445 Double_t value = cluster.
Signals.at(
i);
446 hist.SetBinContent(hist_index + 1 + NOutLeftBins, value);
451 if (NOutLeftBins > 0.0) {
452 Double_t first = OutLeftBorder;
453 Double_t last = (Int_t)OutLeftBorder;
454 Double_t S = gausF.Integral(first, last);
455 Double_t Energy = (signal * Gain) * (S / SCluster);
456 Energy += rand.Gaus(0.0, var_level * Energy);
459 Double_t value = Energy;
460 hist.SetBinContent(1, value);
463 for (Int_t
i = 1;
i < NOutLeftBins; ++
i) {
465 first = (Int_t)OutLeftBorder +
dist;
467 S = gausF.Integral(first, last);
468 Energy = (signal * Gain) * (S / SCluster);
469 Energy += rand.Gaus(0.0, var_level * Energy);
473 hist.SetBinContent(1 +
i, value);
479 if (NOutRightBins > 0.0) {
481 for (Int_t
i = hist_index;
i < hist_index + NOutRightBins - 1; ++
i) {
483 Double_t first = NStripsInLayer +
dist;
484 Double_t last = first + h;
485 Double_t S = gausF.Integral(first, last);
486 Double_t Energy = (signal * Gain) * (S / SCluster);
487 Energy += rand.Gaus(0.0, var_level * Energy);
490 Double_t value = Energy;
491 hist.SetBinContent(1 +
i, value);
495 Double_t first = (Int_t)OutRightBorder;
496 Double_t last = first + (OutRightBorder - (Int_t)OutRightBorder);
497 Double_t S = gausF.Integral(first, last);
498 Double_t Energy = (signal * Gain) * (S / SCluster);
499 Energy += rand.Gaus(0.0, var_level * Energy);
502 Double_t value = Energy;
503 hist.SetBinContent(hist_index + NOutRightBins, value);
506 TF1* gausFitFunction = 0;
507 TString fit_params =
"WQ0";
509#ifdef DRAW_REAL_CLUSTER_HISTOGRAMS
514 hist.Fit(
"gaus", fit_params);
515 gausFitFunction = hist.GetFunction(
"gaus");
516 if (gausFitFunction) {
517 mean_fit_pos = gausFitFunction->GetParameter(1);
519 mean_fit_pos = hist.GetMean();
522 mean_fit_pos = hist.GetMean();
539 Int_t n_strip_layers = StripLayers.size();
542 for (Int_t ilayer = 0; ilayer < n_strip_layers; ++ilayer) {
543 StripLayers[ilayer].FindClustersAndStripHits();
547 for (Int_t ilayer = 0; ilayer < n_strip_layers; ++ilayer) {
549 for (Int_t jlayer = ilayer + 1; jlayer < n_strip_layers; ++jlayer) {
552 if (StripLayers[ilayer].GetType() == StripLayers[jlayer].GetType())
555 Double_t iAngleRad = StripLayers[ilayer].GetAngleRad();
556 Double_t jAngleRad = StripLayers[jlayer].GetAngleRad();
558 if (Abs(iAngleRad - jAngleRad) < 0.01)
561 Double_t i_PiOver2MinusAngleRad = PiOver2() - iAngleRad;
562 Double_t j_PiOver2MinusAngleRad = PiOver2() - jAngleRad;
564 for (Int_t i_strip_hit = 0; i_strip_hit < StripLayers[ilayer].GetNStripHits(); ++i_strip_hit) {
565 for (Int_t j_strip_hit = 0; j_strip_hit < StripLayers[jlayer].GetNStripHits(); ++j_strip_hit) {
567 Double_t iStripHitPos = StripLayers[ilayer].GetStripHitPos(i_strip_hit);
568 Double_t jStripHitPos = StripLayers[jlayer].GetStripHitPos(j_strip_hit);
570 Double_t iStripHitError = StripLayers[ilayer].GetStripHitError(i_strip_hit);
571 Double_t jStripHitError = StripLayers[jlayer].GetStripHitError(j_strip_hit);
576 if (Abs(iAngleRad) >= 0.01 && Abs(jAngleRad) >= 0.01) {
578 Double_t iB = StripLayers[ilayer].CalculateStripEquationB(iStripHitPos);
579 Double_t jB = StripLayers[jlayer].CalculateStripEquationB(jStripHitPos);
581 xcoord = (jB - iB) / (Tan(i_PiOver2MinusAngleRad) - Tan(j_PiOver2MinusAngleRad));
582 ycoord = Tan(i_PiOver2MinusAngleRad) * xcoord + iB;
585 if (Abs(iAngleRad) < 0.01) {
587 if (StripLayers[ilayer].GetStripNumberingOrder() ==
LeftToRight) {
588 xcoord = StripLayers[ilayer].GetXLeftStripBorderPoint()
589 + iStripHitPos * StripLayers[ilayer].GetPitch();
591 xcoord = StripLayers[ilayer].GetXRightStripBorderPoint()
592 - iStripHitPos * StripLayers[ilayer].GetPitch();
595 Double_t jB = StripLayers[jlayer].CalculateStripEquationB(jStripHitPos);
596 ycoord = Tan(j_PiOver2MinusAngleRad) * xcoord + jB;
599 if (Abs(jAngleRad) < 0.01) {
601 if (StripLayers[jlayer].GetStripNumberingOrder() ==
LeftToRight) {
602 xcoord = StripLayers[jlayer].GetXLeftStripBorderPoint()
603 + jStripHitPos * StripLayers[jlayer].GetPitch();
605 xcoord = StripLayers[jlayer].GetXRightStripBorderPoint()
606 - jStripHitPos * StripLayers[jlayer].GetPitch();
609 Double_t iB = StripLayers[ilayer].CalculateStripEquationB(iStripHitPos);
610 ycoord = Tan(i_PiOver2MinusAngleRad) * xcoord + iB;
615 if (StripLayers[ilayer].IsPointInsideStripLayer(xcoord, ycoord)
616 && StripLayers[jlayer].IsPointInsideStripLayer(xcoord, ycoord))
619 IntersectionPointsX.push_back(xcoord);
620 IntersectionPointsY.push_back(ycoord);
623 Double_t AngleIntersecRad = Abs(iAngleRad - jAngleRad);
626 Double_t RhombSide1 = (iStripHitError * StripLayers[ilayer].GetPitch()) / Sin(AngleIntersecRad);
627 Double_t RhombSide2 = (jStripHitError * StripLayers[jlayer].GetPitch()) / Sin(AngleIntersecRad);
630 Double_t xerr1 = Sin(Abs(jAngleRad)) * RhombSide1;
631 Double_t xerr2 = Sin(Abs(iAngleRad)) * RhombSide2;
632 Double_t xcoord_err = xerr1 + xerr2;
635 Double_t yerr1 = Cos(Abs(jAngleRad)) * RhombSide1;
636 Double_t yerr2 = Cos(Abs(iAngleRad)) * RhombSide2;
637 Double_t ycoord_err = yerr1 + yerr2;
639 IntersectionPointsXErrors.push_back(xcoord_err);
640 IntersectionPointsYErrors.push_back(ycoord_err);
644 BmnMatch iStripMatch = StripLayers[ilayer].GetStripMatch((Int_t)iStripHitPos);
645 BmnMatch jStripMatch = StripLayers[jlayer].GetStripMatch((Int_t)jStripHitPos);
648 intersection_match.
AddLink(iStripMatch);
649 intersection_match.
AddLink(jStripMatch);
651 IntersectionPointMatches.push_back(intersection_match);
656 Int_t iLayerClusterSize = StripLayers[ilayer].GetStripHitClusterSize(i_strip_hit);
657 Int_t jLayerClusterSize = StripLayers[jlayer].GetStripHitClusterSize(j_strip_hit);
660 Double_t iLayerStripPosition = StripLayers[ilayer].ConvertPointToStripPosition(xcoord, ycoord);
661 Double_t jLayerStripPosition = StripLayers[jlayer].ConvertPointToStripPosition(xcoord, ycoord);
663 IntersectionPoints_LowerLayerStripTotalSignal.push_back(
664 StripLayers[ilayer].GetStripHitTotalSignal(i_strip_hit));
665 IntersectionPoints_UpperLayerStripTotalSignal.push_back(
666 StripLayers[jlayer].GetStripHitTotalSignal(j_strip_hit));
669 IntersectionPoints_LowerLayerClusterSize.push_back(iLayerClusterSize);
670 IntersectionPoints_UpperLayerClusterSize.push_back(jLayerClusterSize);
671 IntersectionPoints_LowerLayerStripPosition.push_back(iLayerStripPosition);
672 IntersectionPoints_UpperLayerStripPosition.push_back(jLayerStripPosition);
674 IntersectionPoints_LowerLayerClusterSize.push_back(jLayerClusterSize);
675 IntersectionPoints_UpperLayerClusterSize.push_back(iLayerClusterSize);
676 IntersectionPoints_LowerLayerStripPosition.push_back(jLayerStripPosition);
677 IntersectionPoints_UpperLayerStripPosition.push_back(iLayerStripPosition);
690 Double_t strip_pos_layerA,
691 Double_t strip_pos_layerB,
696 Int_t ilayer = layerA_index;
697 Int_t jlayer = layerB_index;
699 if (StripLayers[ilayer].GetType() == StripLayers[jlayer].GetType())
702 Double_t iAngleRad = StripLayers[ilayer].GetAngleRad();
703 Double_t jAngleRad = StripLayers[jlayer].GetAngleRad();
705 if (Abs(iAngleRad - jAngleRad) < 0.01)
708 Double_t i_PiOver2MinusAngleRad = PiOver2() - iAngleRad;
709 Double_t j_PiOver2MinusAngleRad = PiOver2() - jAngleRad;
711 Double_t iStripHitPos = strip_pos_layerA;
712 Double_t jStripHitPos = strip_pos_layerB;
717 if (Abs(iAngleRad) >= 0.01 && Abs(jAngleRad) >= 0.01) {
719 Double_t iB = StripLayers[ilayer].CalculateStripEquationB(iStripHitPos);
720 Double_t jB = StripLayers[jlayer].CalculateStripEquationB(jStripHitPos);
722 xcoord = (jB - iB) / (Tan(i_PiOver2MinusAngleRad) - Tan(j_PiOver2MinusAngleRad));
723 ycoord = Tan(i_PiOver2MinusAngleRad) * xcoord + iB;
726 if (Abs(iAngleRad) < 0.01) {
728 if (StripLayers[ilayer].GetStripNumberingOrder() ==
LeftToRight) {
729 xcoord = StripLayers[ilayer].GetXLeftStripBorderPoint() + iStripHitPos * StripLayers[ilayer].GetPitch();
732 StripLayers[ilayer].GetXRightStripBorderPoint() - iStripHitPos * StripLayers[ilayer].GetPitch();
735 Double_t jB = StripLayers[jlayer].CalculateStripEquationB(jStripHitPos);
736 ycoord = Tan(j_PiOver2MinusAngleRad) * xcoord + jB;
739 if (Abs(jAngleRad) < 0.01) {
741 if (StripLayers[jlayer].GetStripNumberingOrder() ==
LeftToRight) {
742 xcoord = StripLayers[jlayer].GetXLeftStripBorderPoint() + jStripHitPos * StripLayers[jlayer].GetPitch();
745 StripLayers[jlayer].GetXRightStripBorderPoint() - jStripHitPos * StripLayers[jlayer].GetPitch();
748 Double_t iB = StripLayers[ilayer].CalculateStripEquationB(iStripHitPos);
749 ycoord = Tan(i_PiOver2MinusAngleRad) * xcoord + iB;
757 if (StripLayers[ilayer].IsPointInsideStripLayer(xcoord, ycoord)
758 && StripLayers[jlayer].IsPointInsideStripLayer(xcoord, ycoord))