139 Double_t px, Double_t py, Double_t pz, Double_t signal, Int_t refID) {
142 Double_t z_dist_mid = ModuleThickness*0.5;
143 Double_t vector_coeff_mid =
fabs(z_dist_mid/pz);
145 Double_t x_vec_from_in_to_mid = vector_coeff_mid*px;
146 Double_t y_vec_from_in_to_mid = vector_coeff_mid*py;
150 Double_t x_mid = x + x_vec_from_in_to_mid;
151 Double_t y_mid = y + y_vec_from_in_to_mid;
157 if(signal <= 0.0) signal = 1e-16;
159 Double_t AvalancheRadius = 0.25;
161 Double_t radius = AvalancheRadius;
162 if(radius <= 0.0)
return false;
166 radius = gRandom->Gaus(AvalancheRadius, 0.05);
167 if(radius > AvalancheRadius/2.0 && radius < AvalancheRadius*2.0 && radius > 0.0)
break;
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_mid, y_mid) )
continue;
182 cluster_layers[ilayer] =
MakeCluster(ilayer, x_mid, y_mid, 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)
190 Int_t strip_num = cluster_layers[ilayer].Strips.at(ielement);
191 Double_t strip_signal = cluster_layers[ilayer].Signals.at(ielement);
193 StripLayers[ilayer].AddStripSignal(strip_num, strip_signal);
199 for(Int_t ilayer = 0; ilayer < n_strip_layers; ++ilayer) {
200 for(
size_t ielement = 0; ielement < cluster_layers[ilayer].Strips.size(); ++ielement) {
201 Int_t strip_num = cluster_layers[ilayer].Strips.at(ielement);
202 Double_t strip_signal = cluster_layers[ilayer].Signals.at(ielement);
204 StripLayers[ilayer].AddLinkToStripMatch(strip_num, strip_signal/cluster_layers[ilayer].TotalSignal, refID);
209 RealPointsX.push_back(x);
210 RealPointsY.push_back(y);
211 RealPointsMC.push_back(refID);
216 if(Verbosity) cerr <<
"WARNING: BmnCSCModule::AddRealPointFullOne(): Point (" << x <<
" : " << y <<
" : " << z <<
") is out of the readout plane or inside a dead zone\n";
256 Double_t ClusterDistortion = 0.0;
262 if(radius <= 0.0)
return cluster;
264 Double_t Pitch = StripLayers[layer_num].GetPitch();
266 Double_t RadiusInZones = radius/Pitch;
267 Double_t
Sigma = RadiusInZones/3.33;
269 TF1 gausF(
"gausF",
"gaus", -4*
Sigma, 4*
Sigma);
270 gausF.SetParameter(0, 1.0);
271 gausF.SetParameter(1, 0.0);
272 gausF.SetParameter(2,
Sigma);
274 Double_t SCluster = gausF.Integral(-4*
Sigma, 4*
Sigma);
277 Double_t var_level = ClusterDistortion;
279 Int_t NStripsInLayer = StripLayers[layer_num].GetNStrips();
281 if(NStripsInLayer == 0)
return cluster;
283 Double_t CenterZonePos = StripLayers[layer_num].ConvertPointToStripPosition(xcoord, ycoord);
285 if( CenterZonePos < 0.0 || CenterZonePos >= NStripsInLayer )
return cluster;
288 gausF.SetParameter(1, CenterZonePos);
289 Double_t total_signal = 0.0;
291 Double_t LeftZonePos = CenterZonePos - RadiusInZones;
292 Double_t RightZonePos = CenterZonePos + RadiusInZones;
293 Double_t OutLeftBorder = 0.0;
294 Double_t OutRightBorder = 0.0;
296 if(LeftZonePos < 0.0) {
297 OutLeftBorder = LeftZonePos;
300 if(RightZonePos < 0.0) {
301 OutRightBorder = RightZonePos;
304 if(LeftZonePos >= NStripsInLayer) {
305 OutLeftBorder = LeftZonePos;
306 LeftZonePos = NStripsInLayer - 0.001;
308 if(RightZonePos >= NStripsInLayer) {
309 OutRightBorder = RightZonePos;
310 RightZonePos = NStripsInLayer - 0.001;
317 if((Int_t)LeftZonePos == (Int_t)RightZonePos) {
319 Int_t NumCurrentZone = (Int_t) LeftZonePos;
321 h = RightZonePos - LeftZonePos;
324 Double_t xp = LeftZonePos +
dist;
325 Double_t S = gausF.Integral(xp, xp+h);
326 Double_t Energy = (signal*Gain)*(S/SCluster);
327 Energy += rand.Gaus(0.0, var_level*Energy);
328 if(Energy < 0.0) Energy = 0.0;
330 if(NumCurrentZone >=0 && NumCurrentZone < NStripsInLayer && Energy > 0.0) {
331 cluster.
AddStrip(NumCurrentZone, Energy);
332 total_signal += Energy;
340 Int_t NumCurrentZone = (Int_t) LeftZonePos;
342 h = ((Int_t)LeftZonePos + 1) - LeftZonePos;
345 Double_t xp = LeftZonePos +
dist;
346 Double_t S = gausF.Integral(xp, xp+h);
347 Double_t Energy = (signal*Gain)*(S/SCluster);
348 Energy += rand.Gaus(0.0, var_level*Energy);
349 if(Energy < 0.0) Energy = 0.0;
351 if(NumCurrentZone >= 0 && NumCurrentZone < NStripsInLayer && Energy > 0.0) {
352 cluster.
AddStrip(NumCurrentZone, Energy);
353 total_signal += Energy;
359 for(Int_t
i = (Int_t)LeftZonePos + 1;
i < (Int_t)RightZonePos; ++
i) {
365 xp = LeftZonePos +
dist;
366 S = gausF.Integral(xp, xp+h);
367 Energy = (signal*Gain)*(S/SCluster);
368 Energy += rand.Gaus(0.0, var_level*Energy);
369 if(Energy < 0.0) Energy = 0.0;
371 if(NumCurrentZone >=0 && NumCurrentZone < NStripsInLayer && Energy > 0.0) {
372 cluster.
AddStrip(NumCurrentZone, Energy);
373 total_signal += Energy;
379 NumCurrentZone = (Int_t)RightZonePos;
381 h = RightZonePos - (Int_t)RightZonePos;
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);
388 if(Energy < 0.0) Energy = 0.0;
390 if(NumCurrentZone >=0 && NumCurrentZone < NStripsInLayer && Energy > 0.0) {
391 cluster.
AddStrip(NumCurrentZone, Energy);
392 total_signal += Energy;
403 Double_t mean_fit_pos = 0.0;
405 Int_t NOutLeftBins = 0;
406 Int_t NOutRightBins = 0;
407 if(OutLeftBorder != 0.0) {
408 NOutLeftBins = (Int_t)(
fabs(OutLeftBorder)) + 1;
410 if(OutRightBorder != 0.0) {
411 NOutRightBins = (Int_t)(OutRightBorder - RightZonePos) + 1;
414 Int_t begin_strip_num = cluster.
Strips.at(0);
416 Int_t nstrips = last_strip_num - begin_strip_num + 1;
418 TH1F hist(
"hist_for_fit",
"hist_for_fit", nstrips+NOutLeftBins+NOutRightBins, begin_strip_num-NOutLeftBins, last_strip_num+1+NOutRightBins);
419 Int_t hist_index = 0;
422 Double_t value = cluster.
Signals.at(
i);
423 hist.SetBinContent(hist_index+1+NOutLeftBins, value);
428 if(NOutLeftBins > 0.0) {
429 Double_t first = OutLeftBorder;
430 Double_t last = (Int_t)OutLeftBorder;
431 Double_t S = gausF.Integral(first, last);
432 Double_t Energy = (signal*Gain)*(S/SCluster);
433 Energy += rand.Gaus(0.0, var_level*Energy);
434 if(Energy < 0.0) Energy = 0.0;
435 Double_t value = Energy;
436 hist.SetBinContent(1, value);
439 for(Int_t
i = 1;
i < NOutLeftBins; ++
i) {
441 first = (Int_t)OutLeftBorder+
dist;
443 S = gausF.Integral(first, last);
444 Energy = (signal*Gain)*(S/SCluster);
445 Energy += rand.Gaus(0.0, var_level*Energy);
446 if(Energy < 0.0) Energy = 0.0;
448 hist.SetBinContent(1+
i, value);
454 if(NOutRightBins > 0.0) {
456 for(Int_t
i = hist_index;
i < hist_index+NOutRightBins-1; ++
i) {
458 Double_t first = NStripsInLayer+
dist;
459 Double_t last = first + h;
460 Double_t S = gausF.Integral(first, last);
461 Double_t Energy = (signal*Gain)*(S/SCluster);
462 Energy += rand.Gaus(0.0, var_level*Energy);
463 if(Energy < 0.0) Energy = 0.0;
464 Double_t value = Energy;
465 hist.SetBinContent(1+
i, value);
469 Double_t first = (Int_t)OutRightBorder;
470 Double_t last = first + (OutRightBorder - (Int_t)OutRightBorder);
471 Double_t S = gausF.Integral(first, last);
472 Double_t Energy = (signal*Gain)*(S/SCluster);
473 Energy += rand.Gaus(0.0, var_level*Energy);
474 if(Energy < 0.0) Energy = 0.0;
475 Double_t value = Energy;
476 hist.SetBinContent(hist_index+NOutRightBins, value);
479 TF1* gausFitFunction = 0;
480 TString fit_params =
"WQ0";
482 #ifdef DRAW_REAL_CLUSTER_HISTOGRAMS
487 hist.Fit(
"gaus", fit_params);
488 gausFitFunction = hist.GetFunction(
"gaus");
489 if(gausFitFunction) {
490 mean_fit_pos = gausFitFunction->GetParameter(1);
493 mean_fit_pos = hist.GetMean();
497 mean_fit_pos = hist.GetMean();
513 Int_t n_strip_layers = StripLayers.size();
516 for(Int_t ilayer = 0; ilayer < n_strip_layers; ++ilayer) {
517 StripLayers[ilayer].FindClustersAndStripHits();
521 map<Int_t, Bool_t> UsageStatus_LowerClusters;
522 map<Int_t, Bool_t> UsageStatus_UpperClusters;
525 for(Int_t ilayer = 0; ilayer < n_strip_layers; ++ilayer) {
526 for(Int_t i_strip_hit = 0; i_strip_hit < StripLayers[ilayer].GetNStripHits(); ++i_strip_hit) {
527 StripCluster cluster = StripLayers[ilayer].GetStripClusters()[i_strip_hit];
529 UsageStatus_LowerClusters[cluster.GetUniqueID()] =
false;
532 UsageStatus_UpperClusters[cluster.GetUniqueID()] =
false;
537 for(Int_t ilayer = 0; ilayer < n_strip_layers; ++ilayer) {
538 for(Int_t jlayer = ilayer+1; jlayer < n_strip_layers; ++jlayer) {
541 if(StripLayers[ilayer].GetType() == StripLayers[jlayer].GetType())
continue;
543 Double_t iAngleRad = StripLayers[ilayer].GetAngleRad();
544 Double_t jAngleRad = StripLayers[jlayer].GetAngleRad();
546 if( Abs(iAngleRad - jAngleRad) < 0.01 )
continue;
548 Double_t i_PiOver2MinusAngleRad = PiOver2() - iAngleRad;
549 Double_t j_PiOver2MinusAngleRad = PiOver2() - jAngleRad;
551 for(Int_t i_strip_hit = 0; i_strip_hit < StripLayers[ilayer].GetNStripHits(); ++i_strip_hit) {
552 for(Int_t j_strip_hit = 0; j_strip_hit < StripLayers[jlayer].GetNStripHits(); ++j_strip_hit) {
554 Double_t iStripHitPos = StripLayers[ilayer].GetStripHitPos(i_strip_hit);
555 Double_t jStripHitPos = StripLayers[jlayer].GetStripHitPos(j_strip_hit);
557 Double_t iStripHitError = StripLayers[ilayer].GetStripHitError(i_strip_hit);
558 Double_t jStripHitError = StripLayers[jlayer].GetStripHitError(j_strip_hit);
563 if( Abs(iAngleRad) >= 0.01 && Abs(jAngleRad) >= 0.01 ) {
565 Double_t iB = StripLayers[ilayer].CalculateStripEquationB(iStripHitPos);
566 Double_t jB = StripLayers[jlayer].CalculateStripEquationB(jStripHitPos);
568 xcoord = (jB - iB)/(Tan(i_PiOver2MinusAngleRad) - Tan(j_PiOver2MinusAngleRad));
569 ycoord = Tan(i_PiOver2MinusAngleRad)*xcoord + iB;
573 if( Abs(iAngleRad) < 0.01 ) {
575 if(StripLayers[ilayer].GetStripNumberingOrder() ==
LeftToRight ) {
576 xcoord = StripLayers[ilayer].GetXLeftStripBorderPoint() + iStripHitPos*StripLayers[ilayer].GetPitch();
579 xcoord = StripLayers[ilayer].GetXRightStripBorderPoint() - iStripHitPos*StripLayers[ilayer].GetPitch();
582 Double_t jB = StripLayers[jlayer].CalculateStripEquationB(jStripHitPos);
583 ycoord = Tan(j_PiOver2MinusAngleRad)*xcoord + jB;
586 if( Abs(jAngleRad) < 0.01 ) {
588 if(StripLayers[jlayer].GetStripNumberingOrder() ==
LeftToRight ) {
589 xcoord = StripLayers[jlayer].GetXLeftStripBorderPoint() + jStripHitPos*StripLayers[jlayer].GetPitch();
592 xcoord = StripLayers[jlayer].GetXRightStripBorderPoint() - jStripHitPos*StripLayers[jlayer].GetPitch();
595 Double_t iB = StripLayers[ilayer].CalculateStripEquationB(iStripHitPos);
596 ycoord = Tan(i_PiOver2MinusAngleRad)*xcoord + iB;
601 if( StripLayers[ilayer].IsPointInsideStripLayer(xcoord, ycoord) && StripLayers[jlayer].IsPointInsideStripLayer(xcoord, ycoord) ) {
603 IntersectionPointsX.push_back(xcoord);
604 IntersectionPointsY.push_back(ycoord);
607 Double_t AngleIntersecRad = Abs(iAngleRad - jAngleRad);
610 Double_t RhombSide1 = (iStripHitError*StripLayers[ilayer].GetPitch())/Sin(AngleIntersecRad);
611 Double_t RhombSide2 = (jStripHitError*StripLayers[jlayer].GetPitch())/Sin(AngleIntersecRad);
614 Double_t xerr1 = Sin(Abs(jAngleRad))*RhombSide1;
615 Double_t xerr2 = Sin(Abs(iAngleRad))*RhombSide2;
616 Double_t xcoord_err = xerr1 + xerr2;
619 Double_t yerr1 = Cos(Abs(jAngleRad))*RhombSide1;
620 Double_t yerr2 = Cos(Abs(iAngleRad))*RhombSide2;
621 Double_t ycoord_err = yerr1 + yerr2;
623 IntersectionPointsXErrors.push_back(xcoord_err);
624 IntersectionPointsYErrors.push_back(ycoord_err);
628 BmnMatch iStripMatch = StripLayers[ilayer].GetStripMatch((Int_t)iStripHitPos);
629 BmnMatch jStripMatch = StripLayers[jlayer].GetStripMatch((Int_t)jStripHitPos);
632 intersection_match.
AddLink(iStripMatch);
633 intersection_match.
AddLink(jStripMatch);
635 IntersectionPointMatches.push_back(intersection_match);
639 BmnMatch iStripDigitNumberMatch = StripLayers[ilayer].GetStripDigitNumberMatch((Int_t)iStripHitPos);
640 BmnMatch jStripDigitNumberMatch = StripLayers[jlayer].GetStripDigitNumberMatch((Int_t)jStripHitPos);
642 BmnMatch intersection_digit_num_match;
643 intersection_digit_num_match.
AddLink(iStripDigitNumberMatch);
644 intersection_digit_num_match.
AddLink(jStripDigitNumberMatch);
646 IntersectionPointDigitNumberMatches.push_back(intersection_digit_num_match);
651 Int_t iLayerClusterSize = StripLayers[ilayer].GetStripHitClusterSize(i_strip_hit);
652 Int_t jLayerClusterSize = StripLayers[jlayer].GetStripHitClusterSize(j_strip_hit);
655 Double_t iLayerStripPosition = StripLayers[ilayer].ConvertPointToStripPosition(xcoord, ycoord);
656 Double_t jLayerStripPosition = StripLayers[jlayer].ConvertPointToStripPosition(xcoord, ycoord);
659 IntersectionPoints_LowerLayerClusterSize.push_back(iLayerClusterSize);
660 IntersectionPoints_UpperLayerClusterSize.push_back(jLayerClusterSize);
661 IntersectionPoints_LowerLayerStripPosition.push_back(iLayerStripPosition);
662 IntersectionPoints_UpperLayerStripPosition.push_back(jLayerStripPosition);
663 IntersectionPoints_LowerLayerStripTotalSignal.push_back(StripLayers[ilayer].GetStripHitTotalSignal(i_strip_hit));
664 IntersectionPoints_UpperLayerStripTotalSignal.push_back(StripLayers[jlayer].GetStripHitTotalSignal(j_strip_hit));
665 LowerClusters.push_back(StripLayers[ilayer].GetStripClusters().at(i_strip_hit));
666 UpperClusters.push_back(StripLayers[jlayer].GetStripClusters().at(j_strip_hit));
667 UsageStatus_LowerClusters[StripLayers[ilayer].GetStripClusters()[i_strip_hit].GetUniqueID()] =
true;
668 UsageStatus_UpperClusters[StripLayers[jlayer].GetStripClusters()[j_strip_hit].GetUniqueID()] =
true;
671 IntersectionPoints_LowerLayerClusterSize.push_back(jLayerClusterSize);
672 IntersectionPoints_UpperLayerClusterSize.push_back(iLayerClusterSize);
673 IntersectionPoints_LowerLayerStripPosition.push_back(jLayerStripPosition);
674 IntersectionPoints_UpperLayerStripPosition.push_back(iLayerStripPosition);
675 IntersectionPoints_LowerLayerStripTotalSignal.push_back(StripLayers[jlayer].GetStripHitTotalSignal(j_strip_hit));
676 IntersectionPoints_UpperLayerStripTotalSignal.push_back(StripLayers[ilayer].GetStripHitTotalSignal(i_strip_hit));
677 LowerClusters.push_back(StripLayers[jlayer].GetStripClusters().at(j_strip_hit));
678 UpperClusters.push_back(StripLayers[ilayer].GetStripClusters().at(i_strip_hit));
679 UsageStatus_LowerClusters[StripLayers[jlayer].GetStripClusters()[j_strip_hit].GetUniqueID()] =
true;
680 UsageStatus_UpperClusters[StripLayers[ilayer].GetStripClusters()[i_strip_hit].GetUniqueID()] =
true;
693 for(
auto it : UsageStatus_LowerClusters) {
697 if(it.second ==
false) {
699 for(Int_t ilayer = 0; ilayer < n_strip_layers; ++ilayer) {
703 for (
size_t icluster = 0; icluster < StripLayers[ilayer].GetStripClusters().size(); ++icluster) {
704 StripCluster cluster = StripLayers[ilayer].GetStripClusters()[icluster];
706 if ((
int)cluster.GetUniqueID() != it.first)
continue;
711 if(StripLayers[ilayer].GetStripNumberingOrder() ==
LeftToRight ) {
712 xcoord = StripLayers[ilayer].GetXLeftStripBorderPoint() + cluster.
MeanPosition*StripLayers[ilayer].GetPitch();
715 xcoord = StripLayers[ilayer].GetXRightStripBorderPoint() - cluster.
MeanPosition*StripLayers[ilayer].GetPitch();
718 ycoord = (StripLayers[ilayer].GetYMinLayer() + StripLayers[ilayer].GetYMaxLayer())*0.5;
720 Double_t xerr = cluster.
Error*StripLayers[ilayer].GetPitch();
721 Double_t yerr = StripLayers[ilayer].GetYSize()*0.5;
733 PseudoIntersectionsX.push_back(xcoord);
734 PseudoIntersectionsY.push_back(ycoord);
736 PseudoIntersectionsXErrors.push_back(xerr);
737 PseudoIntersectionsYErrors.push_back(yerr);
739 PseudoIntersections_LowerLayerClusterSize.push_back(cluster.
Width);
740 PseudoIntersections_UpperLayerClusterSize.push_back(0);
742 PseudoIntersections_LowerLayerStripPosition.push_back(StripLayers[ilayer].ConvertPointToStripPosition(xcoord, ycoord));
743 PseudoIntersections_UpperLayerStripPosition.push_back(0);
745 PseudoIntersections_LowerLayerStripTotalSignal.push_back(cluster.
TotalSignal);
746 PseudoIntersections_UpperLayerStripTotalSignal.push_back(0);
748 PseudoIntersectionMatches.push_back(StripLayers[ilayer].GetStripMatch((Int_t)cluster.
MeanPosition));
749 PseudoIntersectionDigitNumberMatches.push_back(StripLayers[ilayer].GetStripDigitNumberMatch((Int_t)cluster.
MeanPosition));
751 LowerClusters_PseudoIntersections.push_back(cluster);
752 UpperClusters_PseudoIntersections.push_back(
StripCluster());
762 Int_t ilayer = layerA_index;
763 Int_t jlayer = layerB_index;
765 if(StripLayers[ilayer].GetType() == StripLayers[jlayer].GetType())
return false;
767 Double_t iAngleRad = StripLayers[ilayer].GetAngleRad();
768 Double_t jAngleRad = StripLayers[jlayer].GetAngleRad();
770 if( Abs(iAngleRad - jAngleRad) < 0.01 )
return false;
772 Double_t i_PiOver2MinusAngleRad = PiOver2() - iAngleRad;
773 Double_t j_PiOver2MinusAngleRad = PiOver2() - jAngleRad;
775 Double_t iStripHitPos = strip_pos_layerA;
776 Double_t jStripHitPos = strip_pos_layerB;
781 if( Abs(iAngleRad) >= 0.01 && Abs(jAngleRad) >= 0.01 ) {
783 Double_t iB = StripLayers[ilayer].CalculateStripEquationB(iStripHitPos);
784 Double_t jB = StripLayers[jlayer].CalculateStripEquationB(jStripHitPos);
786 xcoord = (jB - iB)/(Tan(i_PiOver2MinusAngleRad) - Tan(j_PiOver2MinusAngleRad));
787 ycoord = Tan(i_PiOver2MinusAngleRad)*xcoord + iB;
791 if( Abs(iAngleRad) < 0.01 ) {
793 if(StripLayers[ilayer].GetStripNumberingOrder() ==
LeftToRight ) {
794 xcoord = StripLayers[ilayer].GetXLeftStripBorderPoint() + iStripHitPos*StripLayers[ilayer].GetPitch();
797 xcoord = StripLayers[ilayer].GetXRightStripBorderPoint() - iStripHitPos*StripLayers[ilayer].GetPitch();
800 Double_t jB = StripLayers[jlayer].CalculateStripEquationB(jStripHitPos);
801 ycoord = Tan(j_PiOver2MinusAngleRad)*xcoord + jB;
804 if( Abs(jAngleRad) < 0.01 ) {
806 if(StripLayers[jlayer].GetStripNumberingOrder() ==
LeftToRight ) {
807 xcoord = StripLayers[jlayer].GetXLeftStripBorderPoint() + jStripHitPos*StripLayers[jlayer].GetPitch();
810 xcoord = StripLayers[jlayer].GetXRightStripBorderPoint() - jStripHitPos*StripLayers[jlayer].GetPitch();
813 Double_t iB = StripLayers[ilayer].CalculateStripEquationB(iStripHitPos);
814 ycoord = Tan(i_PiOver2MinusAngleRad)*xcoord + iB;
822 if( StripLayers[ilayer].IsPointInsideStripLayer(xcoord, ycoord) && StripLayers[jlayer].IsPointInsideStripLayer(xcoord, ycoord) ) {