165 radius =
gRandom->Gaus(AvalancheRadius, 0.025);
166 if (radius > AvalancheRadius / 2.0 && radius < AvalancheRadius * 2.0 && radius > 0.0)
171 radius = AvalancheRadius;
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,
215 cerr <<
"WARNING: BmnSiBTModule::AddRealPointFullOne(): Point (" << x <<
" : " << y <<
" : " << z
216 <<
") is out of the readout plane or inside a dead zone\n";
281 Double_t RadiusInZones = radius / Pitch;
292 Double_t var_level = ClusterDistortion;
296 if (NStripsInLayer == 0)
299 Double_t CenterZonePos =
StripLayers[layer_num].ConvertPointToStripPosition(xcoord, ycoord);
301 if (CenterZonePos < 0.0 || CenterZonePos >= NStripsInLayer)
307 Double_t LeftZonePos = CenterZonePos - RadiusInZones;
308 Double_t RightZonePos = CenterZonePos + RadiusInZones;
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) {
337 h = RightZonePos - LeftZonePos;
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;
359 h = ((
Int_t)LeftZonePos + 1) - LeftZonePos;
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;
384 xp = LeftZonePos +
dist;
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;
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;
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;
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;
451 if (NOutLeftBins > 0.0) {
455 Double_t Energy = (signal * Gain) * (S / SCluster);
456 Energy += rand.
Gaus(0.0, var_level * Energy);
463 for (
Int_t i = 1;
i < NOutLeftBins; ++
i) {
468 Energy = (signal * Gain) * (S / SCluster);
469 Energy += rand.
Gaus(0.0, var_level * Energy);
479 if (NOutRightBins > 0.0) {
481 for (
Int_t i = hist_index;
i < hist_index + NOutRightBins - 1; ++
i) {
486 Double_t Energy = (signal * Gain) * (S / SCluster);
487 Energy += rand.
Gaus(0.0, var_level * Energy);
496 Double_t last = first + (OutRightBorder - (
Int_t)OutRightBorder);
498 Double_t Energy = (signal * Gain) * (S / SCluster);
499 Energy += rand.
Gaus(0.0, var_level * Energy);
506 TF1* gausFitFunction = 0;
509#ifdef DRAW_REAL_CLUSTER_HISTOGRAMS
514 hist.
Fit(
"gaus", fit_params);
516 if (gausFitFunction) {
542 for (
Int_t ilayer = 0; ilayer < n_strip_layers; ++ilayer) {
547 for (
Int_t ilayer = 0; ilayer < n_strip_layers; ++ilayer) {
549 for (
Int_t jlayer = ilayer + 1; jlayer < n_strip_layers; ++jlayer) {
558 if (
Abs(iAngleRad - jAngleRad) < 0.01)
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) {
576 if (
Abs(iAngleRad) >= 0.01 &&
Abs(jAngleRad) >= 0.01) {
581 xcoord = (jB - iB) / (
Tan(i_PiOver2MinusAngleRad) -
Tan(j_PiOver2MinusAngleRad));
582 ycoord =
Tan(i_PiOver2MinusAngleRad) * xcoord + iB;
585 if (
Abs(iAngleRad) < 0.01) {
588 xcoord =
StripLayers[ilayer].GetXLeftStripBorderPoint()
591 xcoord =
StripLayers[ilayer].GetXRightStripBorderPoint()
596 ycoord =
Tan(j_PiOver2MinusAngleRad) * xcoord + jB;
599 if (
Abs(jAngleRad) < 0.01) {
602 xcoord =
StripLayers[jlayer].GetXLeftStripBorderPoint()
605 xcoord =
StripLayers[jlayer].GetXRightStripBorderPoint()
610 ycoord =
Tan(i_PiOver2MinusAngleRad) * xcoord + iB;
615 if (
StripLayers[ilayer].IsPointInsideStripLayer(xcoord, ycoord)
616 &&
StripLayers[jlayer].IsPointInsideStripLayer(xcoord, ycoord))
623 Double_t AngleIntersecRad =
Abs(iAngleRad - jAngleRad);
632 Double_t xcoord_err = xerr1 + xerr2;
637 Double_t ycoord_err = yerr1 + yerr2;
648 intersection_match.
AddLink(iStripMatch);
649 intersection_match.
AddLink(jStripMatch);
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);
664 StripLayers[ilayer].GetStripHitTotalSignal(i_strip_hit));
666 StripLayers[jlayer].GetStripHitTotalSignal(j_strip_hit));
696 Int_t ilayer = layerA_index;
697 Int_t jlayer = layerB_index;
705 if (
Abs(iAngleRad - jAngleRad) < 0.01)
711 Double_t iStripHitPos = strip_pos_layerA;
712 Double_t jStripHitPos = strip_pos_layerB;
717 if (
Abs(iAngleRad) >= 0.01 &&
Abs(jAngleRad) >= 0.01) {
722 xcoord = (jB - iB) / (
Tan(i_PiOver2MinusAngleRad) -
Tan(j_PiOver2MinusAngleRad));
723 ycoord =
Tan(i_PiOver2MinusAngleRad) * xcoord + iB;
726 if (
Abs(iAngleRad) < 0.01) {
736 ycoord =
Tan(j_PiOver2MinusAngleRad) * xcoord + jB;
739 if (
Abs(jAngleRad) < 0.01) {
749 ycoord =
Tan(i_PiOver2MinusAngleRad) * xcoord + iB;
757 if (
StripLayers[ilayer].IsPointInsideStripLayer(xcoord, ycoord)
758 &&
StripLayers[jlayer].IsPointInsideStripLayer(xcoord, ycoord))