156 Double_t AvalancheRadius = 0.05;
158 Double_t radius = AvalancheRadius;
164 radius = gRandom->Gaus(AvalancheRadius, 0.025);
165 if (radius > AvalancheRadius / 2.0 && radius < AvalancheRadius * 2.0 && radius > 0.0)
170 radius = AvalancheRadius;
176 Int_t n_strip_layers = StripLayers.size();
177 vector<StripCluster> cluster_layers(n_strip_layers,
StripCluster());
179 for (Int_t ilayer = 0; ilayer < n_strip_layers; ++ilayer) {
180 if (!StripLayers[ilayer].IsPointInsideStripLayer(x, y))
182 cluster_layers[ilayer] =
MakeCluster(ilayer, x, y, signal, radius);
187 for (Int_t ilayer = 0; ilayer < n_strip_layers; ++ilayer) {
188 for (
size_t ielement = 0; ielement < cluster_layers[ilayer].Strips.size(); ++ielement) {
189 Int_t strip_num = cluster_layers[ilayer].Strips.at(ielement);
190 Double_t strip_signal = cluster_layers[ilayer].Signals.at(ielement);
191 StripLayers[ilayer].AddStripSignal(strip_num, strip_signal);
197 for (Int_t ilayer = 0; ilayer < n_strip_layers; ++ilayer) {
198 for (
size_t ielement = 0; ielement < cluster_layers[ilayer].Strips.size(); ++ielement) {
199 Int_t strip_num = cluster_layers[ilayer].Strips.at(ielement);
200 Double_t strip_signal = cluster_layers[ilayer].Signals.at(ielement);
201 StripLayers[ilayer].AddLinkToStripMatch(strip_num, strip_signal / cluster_layers[ilayer].TotalSignal,
207 RealPointsX.push_back(x);
208 RealPointsY.push_back(y);
209 RealPointsMC.push_back(refID);
214 cerr <<
"WARNING: BmnSiProfModule::AddRealPointFullOne(): Point (" << x <<
" : " << y <<
" : " << z
215 <<
") is out of the readout plane or inside a dead zone\n";
269 Double_t ClusterDistortion = 0.0;
278 Double_t Pitch = StripLayers[layer_num].GetPitch();
280 Double_t RadiusInZones = radius / Pitch;
281 Double_t
Sigma = RadiusInZones / 3.33;
283 TF1 gausF(
"gausF",
"gaus", -4 *
Sigma, 4 *
Sigma);
284 gausF.SetParameter(0, 1.0);
285 gausF.SetParameter(1, 0.0);
286 gausF.SetParameter(2,
Sigma);
288 Double_t SCluster = gausF.Integral(-4 *
Sigma, 4 *
Sigma);
291 Double_t var_level = ClusterDistortion;
293 Int_t NStripsInLayer = StripLayers[layer_num].GetNStrips();
295 if (NStripsInLayer == 0)
298 Double_t CenterZonePos = StripLayers[layer_num].ConvertPointToStripPosition(xcoord, ycoord);
300 if (CenterZonePos < 0.0 || CenterZonePos >= NStripsInLayer)
303 gausF.SetParameter(1, CenterZonePos);
304 Double_t total_signal = 0.0;
306 Double_t LeftZonePos = CenterZonePos - RadiusInZones;
307 Double_t RightZonePos = CenterZonePos + RadiusInZones;
308 Double_t OutLeftBorder = 0.0;
309 Double_t OutRightBorder = 0.0;
311 if (LeftZonePos < 0.0) {
312 OutLeftBorder = LeftZonePos;
315 if (RightZonePos < 0.0) {
316 OutRightBorder = RightZonePos;
319 if (LeftZonePos >= NStripsInLayer) {
320 OutLeftBorder = LeftZonePos;
321 LeftZonePos = NStripsInLayer - 0.001;
323 if (RightZonePos >= NStripsInLayer) {
324 OutRightBorder = RightZonePos;
325 RightZonePos = NStripsInLayer - 0.001;
332 if ((Int_t)LeftZonePos == (Int_t)RightZonePos) {
334 Int_t NumCurrentZone = (Int_t)LeftZonePos;
336 h = RightZonePos - LeftZonePos;
340 Double_t xp = LeftZonePos +
dist;
341 Double_t S = gausF.Integral(xp, xp + h);
342 Double_t Energy = (signal * Gain) * (S / SCluster);
343 Energy += rand.Gaus(0.0, var_level * Energy);
347 if (NumCurrentZone >= 0 && NumCurrentZone < NStripsInLayer && Energy > 0.0) {
348 cluster.
AddStrip(NumCurrentZone, Energy);
349 total_signal += Energy;
356 Int_t NumCurrentZone = (Int_t)LeftZonePos;
358 h = ((Int_t)LeftZonePos + 1) - LeftZonePos;
362 Double_t xp = LeftZonePos +
dist;
363 Double_t S = gausF.Integral(xp, xp + h);
364 Double_t Energy = (signal * Gain) * (S / SCluster);
365 Energy += rand.Gaus(0.0, var_level * Energy);
369 if (NumCurrentZone >= 0 && NumCurrentZone < NStripsInLayer && Energy > 0.0) {
370 cluster.
AddStrip(NumCurrentZone, Energy);
371 total_signal += Energy;
377 for (Int_t
i = (Int_t)LeftZonePos + 1;
i < (Int_t)RightZonePos; ++
i) {
383 xp = LeftZonePos +
dist;
384 S = gausF.Integral(xp, xp + h);
385 Energy = (signal * Gain) * (S / SCluster);
386 Energy += rand.Gaus(0.0, var_level * Energy);
390 if (NumCurrentZone >= 0 && NumCurrentZone < NStripsInLayer && Energy > 0.0) {
391 cluster.
AddStrip(NumCurrentZone, Energy);
392 total_signal += Energy;
398 NumCurrentZone = (Int_t)RightZonePos;
400 h = RightZonePos - (Int_t)RightZonePos;
404 xp = LeftZonePos +
dist;
405 S = gausF.Integral(xp, xp + h);
406 Energy = (signal * Gain) * (S / SCluster);
407 Energy += rand.Gaus(0.0, var_level * Energy);
411 if (NumCurrentZone >= 0 && NumCurrentZone < NStripsInLayer && Energy > 0.0) {
412 cluster.
AddStrip(NumCurrentZone, Energy);
413 total_signal += Energy;
424 Double_t mean_fit_pos = 0.0;
426 Int_t NOutLeftBins = 0;
427 Int_t NOutRightBins = 0;
428 if (OutLeftBorder != 0.0) {
429 NOutLeftBins = (Int_t)(
fabs(OutLeftBorder)) + 1;
431 if (OutRightBorder != 0.0) {
432 NOutRightBins = (Int_t)(OutRightBorder - RightZonePos) + 1;
435 Int_t begin_strip_num = cluster.
Strips.at(0);
437 Int_t nstrips = last_strip_num - begin_strip_num + 1;
439 TH1F hist(
"hist_for_fit",
"hist_for_fit", nstrips + NOutLeftBins + NOutRightBins, begin_strip_num - NOutLeftBins,
440 last_strip_num + 1 + NOutRightBins);
441 Int_t hist_index = 0;
444 Double_t value = cluster.
Signals.at(
i);
445 hist.SetBinContent(hist_index + 1 + NOutLeftBins, value);
450 if (NOutLeftBins > 0.0) {
451 Double_t first = OutLeftBorder;
452 Double_t last = (Int_t)OutLeftBorder;
453 Double_t S = gausF.Integral(first, last);
454 Double_t Energy = (signal * Gain) * (S / SCluster);
455 Energy += rand.Gaus(0.0, var_level * Energy);
458 Double_t value = Energy;
459 hist.SetBinContent(1, value);
462 for (Int_t
i = 1;
i < NOutLeftBins; ++
i) {
464 first = (Int_t)OutLeftBorder +
dist;
466 S = gausF.Integral(first, last);
467 Energy = (signal * Gain) * (S / SCluster);
468 Energy += rand.Gaus(0.0, var_level * Energy);
472 hist.SetBinContent(1 +
i, value);
478 if (NOutRightBins > 0.0) {
480 for (Int_t
i = hist_index;
i < hist_index + NOutRightBins - 1; ++
i) {
482 Double_t first = NStripsInLayer +
dist;
483 Double_t last = first + h;
484 Double_t S = gausF.Integral(first, last);
485 Double_t Energy = (signal * Gain) * (S / SCluster);
486 Energy += rand.Gaus(0.0, var_level * Energy);
489 Double_t value = Energy;
490 hist.SetBinContent(1 +
i, value);
494 Double_t first = (Int_t)OutRightBorder;
495 Double_t last = first + (OutRightBorder - (Int_t)OutRightBorder);
496 Double_t S = gausF.Integral(first, last);
497 Double_t Energy = (signal * Gain) * (S / SCluster);
498 Energy += rand.Gaus(0.0, var_level * Energy);
501 Double_t value = Energy;
502 hist.SetBinContent(hist_index + NOutRightBins, value);
505 TF1* gausFitFunction = 0;
506 TString fit_params =
"WQ0";
508#ifdef DRAW_REAL_CLUSTER_HISTOGRAMS
513 hist.Fit(
"gaus", fit_params);
514 gausFitFunction = hist.GetFunction(
"gaus");
515 if (gausFitFunction) {
516 mean_fit_pos = gausFitFunction->GetParameter(1);
518 mean_fit_pos = hist.GetMean();
521 mean_fit_pos = hist.GetMean();
538 Int_t n_strip_layers = StripLayers.size();
541 for (Int_t ilayer = 0; ilayer < n_strip_layers; ++ilayer) {
542 StripLayers[ilayer].FindClustersAndStripHits();
546 for (Int_t ilayer = 0; ilayer < n_strip_layers; ++ilayer) {
548 for (Int_t jlayer = ilayer + 1; jlayer < n_strip_layers; ++jlayer) {
551 if (StripLayers[ilayer].GetType() == StripLayers[jlayer].GetType())
554 Double_t iAngleRad = StripLayers[ilayer].GetAngleRad();
555 Double_t jAngleRad = StripLayers[jlayer].GetAngleRad();
557 if (Abs(iAngleRad - jAngleRad) < 0.01)
560 Double_t i_PiOver2MinusAngleRad = PiOver2() - iAngleRad;
561 Double_t j_PiOver2MinusAngleRad = PiOver2() - jAngleRad;
563 for (Int_t i_strip_hit = 0; i_strip_hit < StripLayers[ilayer].GetNStripHits(); ++i_strip_hit) {
564 for (Int_t j_strip_hit = 0; j_strip_hit < StripLayers[jlayer].GetNStripHits(); ++j_strip_hit) {
566 Double_t iStripHitPos = StripLayers[ilayer].GetStripHitPos(i_strip_hit);
567 Double_t jStripHitPos = StripLayers[jlayer].GetStripHitPos(j_strip_hit);
569 Double_t iStripHitError = StripLayers[ilayer].GetStripHitError(i_strip_hit);
570 Double_t jStripHitError = StripLayers[jlayer].GetStripHitError(j_strip_hit);
575 if (Abs(iAngleRad) >= 0.01 && Abs(jAngleRad) >= 0.01) {
577 Double_t iB = StripLayers[ilayer].CalculateStripEquationB(iStripHitPos);
578 Double_t jB = StripLayers[jlayer].CalculateStripEquationB(jStripHitPos);
580 xcoord = (jB - iB) / (Tan(i_PiOver2MinusAngleRad) - Tan(j_PiOver2MinusAngleRad));
581 ycoord = Tan(i_PiOver2MinusAngleRad) * xcoord + iB;
584 if (Abs(iAngleRad) < 0.01) {
586 if (StripLayers[ilayer].GetStripNumberingOrder() ==
LeftToRight) {
587 xcoord = StripLayers[ilayer].GetXLeftStripBorderPoint()
588 + iStripHitPos * StripLayers[ilayer].GetPitch();
590 xcoord = StripLayers[ilayer].GetXRightStripBorderPoint()
591 - iStripHitPos * StripLayers[ilayer].GetPitch();
594 Double_t jB = StripLayers[jlayer].CalculateStripEquationB(jStripHitPos);
595 ycoord = Tan(j_PiOver2MinusAngleRad) * xcoord + jB;
598 if (Abs(jAngleRad) < 0.01) {
600 if (StripLayers[jlayer].GetStripNumberingOrder() ==
LeftToRight) {
601 xcoord = StripLayers[jlayer].GetXLeftStripBorderPoint()
602 + jStripHitPos * StripLayers[jlayer].GetPitch();
604 xcoord = StripLayers[jlayer].GetXRightStripBorderPoint()
605 - jStripHitPos * StripLayers[jlayer].GetPitch();
608 Double_t iB = StripLayers[ilayer].CalculateStripEquationB(iStripHitPos);
609 ycoord = Tan(i_PiOver2MinusAngleRad) * xcoord + iB;
614 if (StripLayers[ilayer].IsPointInsideStripLayer(xcoord, ycoord)
615 && StripLayers[jlayer].IsPointInsideStripLayer(xcoord, ycoord))
618 IntersectionPointsX.push_back(xcoord);
619 IntersectionPointsY.push_back(ycoord);
622 Double_t AngleIntersecRad = Abs(iAngleRad - jAngleRad);
625 Double_t RhombSide1 = (iStripHitError * StripLayers[ilayer].GetPitch()) / Sin(AngleIntersecRad);
626 Double_t RhombSide2 = (jStripHitError * StripLayers[jlayer].GetPitch()) / Sin(AngleIntersecRad);
629 Double_t xerr1 = Sin(Abs(jAngleRad)) * RhombSide1;
630 Double_t xerr2 = Sin(Abs(iAngleRad)) * RhombSide2;
631 Double_t xcoord_err = xerr1 + xerr2;
634 Double_t yerr1 = Cos(Abs(jAngleRad)) * RhombSide1;
635 Double_t yerr2 = Cos(Abs(iAngleRad)) * RhombSide2;
636 Double_t ycoord_err = yerr1 + yerr2;
638 IntersectionPointsXErrors.push_back(xcoord_err);
639 IntersectionPointsYErrors.push_back(ycoord_err);
643 BmnMatch iStripMatch = StripLayers[ilayer].GetStripMatch((Int_t)iStripHitPos);
644 BmnMatch jStripMatch = StripLayers[jlayer].GetStripMatch((Int_t)jStripHitPos);
647 intersection_match.
AddLink(iStripMatch);
648 intersection_match.
AddLink(jStripMatch);
650 IntersectionPointMatches.push_back(intersection_match);
655 Int_t iLayerClusterSize = StripLayers[ilayer].GetStripHitClusterSize(i_strip_hit);
656 Int_t jLayerClusterSize = StripLayers[jlayer].GetStripHitClusterSize(j_strip_hit);
659 Double_t iLayerStripPosition = StripLayers[ilayer].ConvertPointToStripPosition(xcoord, ycoord);
660 Double_t jLayerStripPosition = StripLayers[jlayer].ConvertPointToStripPosition(xcoord, ycoord);
662 IntersectionPoints_LowerLayerStripTotalSignal.push_back(
663 StripLayers[ilayer].GetStripHitTotalSignal(i_strip_hit));
664 IntersectionPoints_UpperLayerStripTotalSignal.push_back(
665 StripLayers[jlayer].GetStripHitTotalSignal(j_strip_hit));
668 IntersectionPoints_LowerLayerClusterSize.push_back(iLayerClusterSize);
669 IntersectionPoints_UpperLayerClusterSize.push_back(jLayerClusterSize);
670 IntersectionPoints_LowerLayerStripPosition.push_back(iLayerStripPosition);
671 IntersectionPoints_UpperLayerStripPosition.push_back(jLayerStripPosition);
673 IntersectionPoints_LowerLayerClusterSize.push_back(jLayerClusterSize);
674 IntersectionPoints_UpperLayerClusterSize.push_back(iLayerClusterSize);
675 IntersectionPoints_LowerLayerStripPosition.push_back(jLayerStripPosition);
676 IntersectionPoints_UpperLayerStripPosition.push_back(iLayerStripPosition);
689 Double_t strip_pos_layerA,
690 Double_t strip_pos_layerB,
695 Int_t ilayer = layerA_index;
696 Int_t jlayer = layerB_index;
698 if (StripLayers[ilayer].GetType() == StripLayers[jlayer].GetType())
701 Double_t iAngleRad = StripLayers[ilayer].GetAngleRad();
702 Double_t jAngleRad = StripLayers[jlayer].GetAngleRad();
704 if (Abs(iAngleRad - jAngleRad) < 0.01)
707 Double_t i_PiOver2MinusAngleRad = PiOver2() - iAngleRad;
708 Double_t j_PiOver2MinusAngleRad = PiOver2() - jAngleRad;
710 Double_t iStripHitPos = strip_pos_layerA;
711 Double_t jStripHitPos = strip_pos_layerB;
716 if (Abs(iAngleRad) >= 0.01 && Abs(jAngleRad) >= 0.01) {
718 Double_t iB = StripLayers[ilayer].CalculateStripEquationB(iStripHitPos);
719 Double_t jB = StripLayers[jlayer].CalculateStripEquationB(jStripHitPos);
721 xcoord = (jB - iB) / (Tan(i_PiOver2MinusAngleRad) - Tan(j_PiOver2MinusAngleRad));
722 ycoord = Tan(i_PiOver2MinusAngleRad) * xcoord + iB;
725 if (Abs(iAngleRad) < 0.01) {
727 if (StripLayers[ilayer].GetStripNumberingOrder() ==
LeftToRight) {
728 xcoord = StripLayers[ilayer].GetXLeftStripBorderPoint() + iStripHitPos * StripLayers[ilayer].GetPitch();
731 StripLayers[ilayer].GetXRightStripBorderPoint() - iStripHitPos * StripLayers[ilayer].GetPitch();
734 Double_t jB = StripLayers[jlayer].CalculateStripEquationB(jStripHitPos);
735 ycoord = Tan(j_PiOver2MinusAngleRad) * xcoord + jB;
738 if (Abs(jAngleRad) < 0.01) {
740 if (StripLayers[jlayer].GetStripNumberingOrder() ==
LeftToRight) {
741 xcoord = StripLayers[jlayer].GetXLeftStripBorderPoint() + jStripHitPos * StripLayers[jlayer].GetPitch();
744 StripLayers[jlayer].GetXRightStripBorderPoint() - jStripHitPos * StripLayers[jlayer].GetPitch();
747 Double_t iB = StripLayers[ilayer].CalculateStripEquationB(iStripHitPos);
748 ycoord = Tan(i_PiOver2MinusAngleRad) * xcoord + iB;
756 if (StripLayers[ilayer].IsPointInsideStripLayer(xcoord, ycoord)
757 && StripLayers[jlayer].IsPointInsideStripLayer(xcoord, ycoord))