171 Double_t x_vec_from_in_to_mid = vector_coeff_mid * px;
172 Double_t y_vec_from_in_to_mid = vector_coeff_mid * py;
176 Double_t x_mid = x + x_vec_from_in_to_mid;
177 Double_t y_mid = y + y_vec_from_in_to_mid;
194 radius =
gRandom->Gaus(AvalancheRadius, 0.05);
195 if (radius > AvalancheRadius / 2.0 && radius < AvalancheRadius * 2.0 && radius > 0.0)
200 radius = AvalancheRadius;
207 vector<StripCluster> cluster_layers(n_strip_layers,
StripCluster());
209 for (
Int_t ilayer = 0; ilayer < n_strip_layers; ++ilayer) {
210 if (!
StripLayers[ilayer].IsPointInsideStripLayer(x_mid, y_mid))
212 cluster_layers[ilayer] =
MakeCluster(ilayer, x_mid, y_mid, signal, radius);
217 for (
Int_t ilayer = 0; ilayer < n_strip_layers; ++ilayer) {
218 for (
size_t ielement = 0; ielement < cluster_layers[ilayer].Strips.size(); ++ielement) {
219 Int_t strip_num = cluster_layers[ilayer].Strips.at(ielement);
220 Double_t strip_signal = cluster_layers[ilayer].Signals.at(ielement);
222 StripLayers[ilayer].AddStripSignal(strip_num, strip_signal);
228 for (
Int_t ilayer = 0; ilayer < n_strip_layers; ++ilayer) {
229 for (
size_t ielement = 0; ielement < cluster_layers[ilayer].Strips.size(); ++ielement) {
230 Int_t strip_num = cluster_layers[ilayer].Strips.at(ielement);
231 Double_t strip_signal = cluster_layers[ilayer].Signals.at(ielement);
233 StripLayers[ilayer].AddLinkToStripMatch(strip_num, strip_signal / cluster_layers[ilayer].TotalSignal,
246 cerr <<
"WARNING: BmnCSCModule::AddRealPointFullOne(): Point (" << x <<
" : " << y <<
" : " << z
247 <<
") is out of the readout plane or inside a dead zone\n";
312 Double_t RadiusInZones = radius / Pitch;
323 Double_t var_level = ClusterDistortion;
327 if (NStripsInLayer == 0)
330 Double_t CenterZonePos =
StripLayers[layer_num].ConvertPointToStripPosition(xcoord, ycoord);
332 if (CenterZonePos < 0.0 || CenterZonePos >= NStripsInLayer)
338 Double_t LeftZonePos = CenterZonePos - RadiusInZones;
339 Double_t RightZonePos = CenterZonePos + RadiusInZones;
343 if (LeftZonePos < 0.0) {
344 OutLeftBorder = LeftZonePos;
347 if (RightZonePos < 0.0) {
348 OutRightBorder = RightZonePos;
351 if (LeftZonePos >= NStripsInLayer) {
352 OutLeftBorder = LeftZonePos;
353 LeftZonePos = NStripsInLayer - 0.001;
355 if (RightZonePos >= NStripsInLayer) {
356 OutRightBorder = RightZonePos;
357 RightZonePos = NStripsInLayer - 0.001;
364 if ((
Int_t)LeftZonePos == (
Int_t)RightZonePos) {
368 h = RightZonePos - LeftZonePos;
374 Double_t Energy = (signal * Gain) * (S / SCluster);
375 Energy += rand.
Gaus(0.0, var_level * Energy);
379 if (NumCurrentZone >= 0 && NumCurrentZone < NStripsInLayer && Energy > 0.0) {
380 cluster.
AddStrip(NumCurrentZone, Energy);
381 total_signal += Energy;
390 h = ((
Int_t)LeftZonePos + 1) - LeftZonePos;
396 Double_t Energy = (signal * Gain) * (S / SCluster);
397 Energy += rand.
Gaus(0.0, var_level * Energy);
401 if (NumCurrentZone >= 0 && NumCurrentZone < NStripsInLayer && Energy > 0.0) {
402 cluster.
AddStrip(NumCurrentZone, Energy);
403 total_signal += Energy;
415 xp = LeftZonePos +
dist;
417 Energy = (signal * Gain) * (S / SCluster);
418 Energy += rand.
Gaus(0.0, var_level * Energy);
422 if (NumCurrentZone >= 0 && NumCurrentZone < NStripsInLayer && Energy > 0.0) {
423 cluster.
AddStrip(NumCurrentZone, Energy);
424 total_signal += Energy;
430 NumCurrentZone = (
Int_t)RightZonePos;
432 h = RightZonePos - (
Int_t)RightZonePos;
436 xp = LeftZonePos +
dist;
438 Energy = (signal * Gain) * (S / SCluster);
439 Energy += rand.
Gaus(0.0, var_level * Energy);
443 if (NumCurrentZone >= 0 && NumCurrentZone < NStripsInLayer && Energy > 0.0) {
444 cluster.
AddStrip(NumCurrentZone, Energy);
445 total_signal += Energy;
458 Int_t NOutLeftBins = 0;
459 Int_t NOutRightBins = 0;
460 if (OutLeftBorder != 0.0) {
461 NOutLeftBins = (
Int_t)(
fabs(OutLeftBorder)) + 1;
463 if (OutRightBorder != 0.0) {
464 NOutRightBins = (
Int_t)(OutRightBorder - RightZonePos) + 1;
469 Int_t nstrips = last_strip_num - begin_strip_num + 1;
471 TH1F hist(
"hist_for_fit",
"hist_for_fit", nstrips + NOutLeftBins + NOutRightBins, begin_strip_num - NOutLeftBins,
472 last_strip_num + 1 + NOutRightBins);
473 Int_t hist_index = 0;
482 if (NOutLeftBins > 0.0) {
486 Double_t Energy = (signal * Gain) * (S / SCluster);
487 Energy += rand.
Gaus(0.0, var_level * Energy);
494 for (
Int_t i = 1;
i < NOutLeftBins; ++
i) {
499 Energy = (signal * Gain) * (S / SCluster);
500 Energy += rand.
Gaus(0.0, var_level * Energy);
510 if (NOutRightBins > 0.0) {
512 for (
Int_t i = hist_index;
i < hist_index + NOutRightBins - 1; ++
i) {
517 Double_t Energy = (signal * Gain) * (S / SCluster);
518 Energy += rand.
Gaus(0.0, var_level * Energy);
527 Double_t last = first + (OutRightBorder - (
Int_t)OutRightBorder);
529 Double_t Energy = (signal * Gain) * (S / SCluster);
530 Energy += rand.
Gaus(0.0, var_level * Energy);
537 TF1* gausFitFunction = 0;
540#ifdef DRAW_REAL_CLUSTER_HISTOGRAMS
545 hist.
Fit(
"gaus", fit_params);
547 if (gausFitFunction) {
574 for (
Int_t ilayer = 0; ilayer < n_strip_layers; ++ilayer) {
579 map<Int_t, Bool_t> UsageStatus_LowerClusters;
580 map<Int_t, Bool_t> UsageStatus_UpperClusters;
583 for (
Int_t ilayer = 0; ilayer < n_strip_layers; ++ilayer) {
584 for (
Int_t i_strip_hit = 0; i_strip_hit <
StripLayers[ilayer].GetNStripHits(); ++i_strip_hit) {
587 UsageStatus_LowerClusters[cluster.
GetUniqueID()] =
false;
590 UsageStatus_UpperClusters[cluster.
GetUniqueID()] =
false;
595 for (
Int_t ilayer = 0; ilayer < n_strip_layers; ++ilayer) {
596 for (
Int_t jlayer = ilayer + 1; jlayer < n_strip_layers; ++jlayer) {
605 if (
Abs(iAngleRad - jAngleRad) < 0.01)
611 for (
Int_t i_strip_hit = 0; i_strip_hit <
StripLayers[ilayer].GetNStripHits(); ++i_strip_hit) {
612 for (
Int_t j_strip_hit = 0; j_strip_hit <
StripLayers[jlayer].GetNStripHits(); ++j_strip_hit) {
623 if (
Abs(iAngleRad) >= 0.01 &&
Abs(jAngleRad) >= 0.01) {
628 xcoord = (jB - iB) / (
Tan(i_PiOver2MinusAngleRad) -
Tan(j_PiOver2MinusAngleRad));
629 ycoord =
Tan(i_PiOver2MinusAngleRad) * xcoord + iB;
632 if (
Abs(iAngleRad) < 0.01) {
635 xcoord =
StripLayers[ilayer].GetXLeftStripBorderPoint()
638 xcoord =
StripLayers[ilayer].GetXRightStripBorderPoint()
643 ycoord =
Tan(j_PiOver2MinusAngleRad) * xcoord + jB;
646 if (
Abs(jAngleRad) < 0.01) {
649 xcoord =
StripLayers[jlayer].GetXLeftStripBorderPoint()
652 xcoord =
StripLayers[jlayer].GetXRightStripBorderPoint()
657 ycoord =
Tan(i_PiOver2MinusAngleRad) * xcoord + iB;
662 if (
StripLayers[ilayer].IsPointInsideStripLayer(xcoord, ycoord)
663 &&
StripLayers[jlayer].IsPointInsideStripLayer(xcoord, ycoord))
670 Double_t AngleIntersecRad =
Abs(iAngleRad - jAngleRad);
679 Double_t xcoord_err = xerr1 + xerr2;
684 Double_t ycoord_err = yerr1 + yerr2;
695 intersection_match.
AddLink(iStripMatch);
696 intersection_match.
AddLink(jStripMatch);
707 BmnMatch intersection_digit_num_match;
708 intersection_digit_num_match.
AddLink(iStripDigitNumberMatch);
709 intersection_digit_num_match.
AddLink(jStripDigitNumberMatch);
716 Int_t iLayerClusterSize =
StripLayers[ilayer].GetStripHitClusterSize(i_strip_hit);
717 Int_t jLayerClusterSize =
StripLayers[jlayer].GetStripHitClusterSize(j_strip_hit);
720 Double_t iLayerStripPosition =
StripLayers[ilayer].ConvertPointToStripPosition(xcoord, ycoord);
721 Double_t jLayerStripPosition =
StripLayers[jlayer].ConvertPointToStripPosition(xcoord, ycoord);
729 StripLayers[ilayer].GetStripHitTotalSignal(i_strip_hit));
731 StripLayers[jlayer].GetStripHitTotalSignal(j_strip_hit));
734 UsageStatus_LowerClusters
735 [
StripLayers[ilayer].GetStripClusters()[i_strip_hit].GetUniqueID()] =
true;
736 UsageStatus_UpperClusters
737 [
StripLayers[jlayer].GetStripClusters()[j_strip_hit].GetUniqueID()] =
true;
744 StripLayers[jlayer].GetStripHitTotalSignal(j_strip_hit));
746 StripLayers[ilayer].GetStripHitTotalSignal(i_strip_hit));
749 UsageStatus_LowerClusters
750 [
StripLayers[jlayer].GetStripClusters()[j_strip_hit].GetUniqueID()] =
true;
751 UsageStatus_UpperClusters
752 [
StripLayers[ilayer].GetStripClusters()[i_strip_hit].GetUniqueID()] =
true;
765 for (
auto it : UsageStatus_LowerClusters) {
769 if (it.second ==
false) {
771 for (
Int_t ilayer = 0; ilayer < n_strip_layers; ++ilayer) {
776 for (
size_t icluster = 0; icluster <
StripLayers[ilayer].GetStripClusters().size(); ++icluster) {
786 xcoord =
StripLayers[ilayer].GetXLeftStripBorderPoint()
789 xcoord =
StripLayers[ilayer].GetXRightStripBorderPoint()
817 StripLayers[ilayer].ConvertPointToStripPosition(xcoord, ycoord));
846 Int_t ilayer = layerA_index;
847 Int_t jlayer = layerB_index;
855 if (
Abs(iAngleRad - jAngleRad) < 0.01)
861 Double_t iStripHitPos = strip_pos_layerA;
862 Double_t jStripHitPos = strip_pos_layerB;
867 if (
Abs(iAngleRad) >= 0.01 &&
Abs(jAngleRad) >= 0.01) {
872 xcoord = (jB - iB) / (
Tan(i_PiOver2MinusAngleRad) -
Tan(j_PiOver2MinusAngleRad));
873 ycoord =
Tan(i_PiOver2MinusAngleRad) * xcoord + iB;
876 if (
Abs(iAngleRad) < 0.01) {
886 ycoord =
Tan(j_PiOver2MinusAngleRad) * xcoord + jB;
889 if (
Abs(jAngleRad) < 0.01) {
899 ycoord =
Tan(i_PiOver2MinusAngleRad) * xcoord + iB;
907 if (
StripLayers[ilayer].IsPointInsideStripLayer(xcoord, ycoord)
908 &&
StripLayers[jlayer].IsPointInsideStripLayer(xcoord, ycoord))