164 radius =
gRandom->Gaus(AvalancheRadius, 0.025);
165 if (radius > AvalancheRadius / 2.0 && radius < AvalancheRadius * 2.0 && radius > 0.0)
170 radius = AvalancheRadius;
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,
214 cerr <<
"WARNING: BmnSiProfModule::AddRealPointFullOne(): Point (" << x <<
" : " << y <<
" : " << z
215 <<
") is out of the readout plane or inside a dead zone\n";
280 Double_t RadiusInZones = radius / Pitch;
291 Double_t var_level = ClusterDistortion;
295 if (NStripsInLayer == 0)
298 Double_t CenterZonePos =
StripLayers[layer_num].ConvertPointToStripPosition(xcoord, ycoord);
300 if (CenterZonePos < 0.0 || CenterZonePos >= NStripsInLayer)
306 Double_t LeftZonePos = CenterZonePos - RadiusInZones;
307 Double_t RightZonePos = CenterZonePos + RadiusInZones;
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) {
336 h = RightZonePos - LeftZonePos;
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;
358 h = ((
Int_t)LeftZonePos + 1) - LeftZonePos;
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;
383 xp = LeftZonePos +
dist;
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;
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;
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;
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;
450 if (NOutLeftBins > 0.0) {
454 Double_t Energy = (signal * Gain) * (S / SCluster);
455 Energy += rand.
Gaus(0.0, var_level * Energy);
462 for (
Int_t i = 1;
i < NOutLeftBins; ++
i) {
467 Energy = (signal * Gain) * (S / SCluster);
468 Energy += rand.
Gaus(0.0, var_level * Energy);
478 if (NOutRightBins > 0.0) {
480 for (
Int_t i = hist_index;
i < hist_index + NOutRightBins - 1; ++
i) {
485 Double_t Energy = (signal * Gain) * (S / SCluster);
486 Energy += rand.
Gaus(0.0, var_level * Energy);
495 Double_t last = first + (OutRightBorder - (
Int_t)OutRightBorder);
497 Double_t Energy = (signal * Gain) * (S / SCluster);
498 Energy += rand.
Gaus(0.0, var_level * Energy);
505 TF1* gausFitFunction = 0;
508#ifdef DRAW_REAL_CLUSTER_HISTOGRAMS
513 hist.
Fit(
"gaus", fit_params);
515 if (gausFitFunction) {
541 for (
Int_t ilayer = 0; ilayer < n_strip_layers; ++ilayer) {
546 for (
Int_t ilayer = 0; ilayer < n_strip_layers; ++ilayer) {
548 for (
Int_t jlayer = ilayer + 1; jlayer < n_strip_layers; ++jlayer) {
557 if (
Abs(iAngleRad - jAngleRad) < 0.01)
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) {
575 if (
Abs(iAngleRad) >= 0.01 &&
Abs(jAngleRad) >= 0.01) {
580 xcoord = (jB - iB) / (
Tan(i_PiOver2MinusAngleRad) -
Tan(j_PiOver2MinusAngleRad));
581 ycoord =
Tan(i_PiOver2MinusAngleRad) * xcoord + iB;
584 if (
Abs(iAngleRad) < 0.01) {
587 xcoord =
StripLayers[ilayer].GetXLeftStripBorderPoint()
590 xcoord =
StripLayers[ilayer].GetXRightStripBorderPoint()
595 ycoord =
Tan(j_PiOver2MinusAngleRad) * xcoord + jB;
598 if (
Abs(jAngleRad) < 0.01) {
601 xcoord =
StripLayers[jlayer].GetXLeftStripBorderPoint()
604 xcoord =
StripLayers[jlayer].GetXRightStripBorderPoint()
609 ycoord =
Tan(i_PiOver2MinusAngleRad) * xcoord + iB;
614 if (
StripLayers[ilayer].IsPointInsideStripLayer(xcoord, ycoord)
615 &&
StripLayers[jlayer].IsPointInsideStripLayer(xcoord, ycoord))
622 Double_t AngleIntersecRad =
Abs(iAngleRad - jAngleRad);
631 Double_t xcoord_err = xerr1 + xerr2;
636 Double_t ycoord_err = yerr1 + yerr2;
647 intersection_match.
AddLink(iStripMatch);
648 intersection_match.
AddLink(jStripMatch);
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);
663 StripLayers[ilayer].GetStripHitTotalSignal(i_strip_hit));
665 StripLayers[jlayer].GetStripHitTotalSignal(j_strip_hit));
695 Int_t ilayer = layerA_index;
696 Int_t jlayer = layerB_index;
704 if (
Abs(iAngleRad - jAngleRad) < 0.01)
710 Double_t iStripHitPos = strip_pos_layerA;
711 Double_t jStripHitPos = strip_pos_layerB;
716 if (
Abs(iAngleRad) >= 0.01 &&
Abs(jAngleRad) >= 0.01) {
721 xcoord = (jB - iB) / (
Tan(i_PiOver2MinusAngleRad) -
Tan(j_PiOver2MinusAngleRad));
722 ycoord =
Tan(i_PiOver2MinusAngleRad) * xcoord + iB;
725 if (
Abs(iAngleRad) < 0.01) {
735 ycoord =
Tan(j_PiOver2MinusAngleRad) * xcoord + jB;
738 if (
Abs(jAngleRad) < 0.01) {
748 ycoord =
Tan(i_PiOver2MinusAngleRad) * xcoord + iB;
756 if (
StripLayers[ilayer].IsPointInsideStripLayer(xcoord, ycoord)
757 &&
StripLayers[jlayer].IsPointInsideStripLayer(xcoord, ycoord))