3Int_t BmnGemStripLayer::fUniqueIdL = 0;
4Int_t BmnGemStripLayer::fUniqueIdU = 0;
21 AngleRad = AngleDeg * Pi() / 180;
25 if (AngleDeg <= 0.0 && AngleDeg >= -90.0) {
28 if (AngleDeg > 0.0 && AngleDeg <= 90.0) {
34 ClusterFindingThreshold = 1.0;
36 TotalClusterThreshold = 40.0;
53 LayerZoneNumber = zone_number;
54 LayerType = layer_type;
57 XMaxLayer = xorig + xsize;
59 YMaxLayer = yorig + ysize;
63 AngleRad = AngleDeg * Pi() / 180;
67 if (AngleDeg <= 0.0 && AngleDeg >= -90.0) {
70 if (AngleDeg > 0.0 && AngleDeg <= 90.0) {
76 ClusterFindingThreshold = 1.0;
78 TotalClusterThreshold = 40.0;
91 Strips.resize(NStrips, 0.0);
100 BmnGemStripLayer::fUniqueIdL = 0;
101 BmnGemStripLayer::fUniqueIdU = 0;
113 Double_t n_strips = (xright_layer - xleft_layer) / Pitch;
115 if ((n_strips - (Int_t)n_strips) < 1E-10) {
116 return (Int_t)n_strips;
118 return (Int_t)(n_strips + 1);
132 XMaxLayer = xorig + xsize;
134 YMaxLayer = yorig + ysize;
141 if (Abs(deg) <= 90.0) {
146 cerr <<
"WARNING: BmnGemStripLayer::SetAngleDeg(): the strip angle is incorrect and has been set to zero\n";
149 AngleRad = AngleDeg * Pi() / 180;
156 if (x_right < x_left)
159 XLeftPointOfStripNumbering = x_left;
160 YLeftPointOfStripNumbering = y_left;
161 XRightPointOfStripNumbering = x_right;
162 YRightPointOfStripNumbering = y_right;
174 cerr <<
"WARNING: SetStripNumberingBorders: left strip border point is incorrect\n";
179 cerr <<
"WARNING: SetStripNumberingBorders: right strip border point is incorrect\n";
183 XLeftPointOfStripNumbering = XMinLayer;
184 XRightPointOfStripNumbering = XMaxLayer;
188 YLeftPointOfStripNumbering = YMaxLayer;
191 YLeftPointOfStripNumbering = YMinLayer;
199 YRightPointOfStripNumbering = YMaxLayer;
202 YRightPointOfStripNumbering = YMinLayer;
215 StripOrder = strip_direction;
225 Bool_t status = dead_zone.
SetDeadZone(n_points, x_points, y_points);
226 if (status ==
true) {
227 DeadZones.push_back(dead_zone);
237 DeadZones.push_back(dead_zone);
246 for (
size_t izone = 0; izone < DeadZones.size(); ++izone) {
247 if (DeadZones[izone].IsInside(x, y))
256 if (x >= XMinLayer && x <= XMaxLayer && y >= YMinLayer && y <= YMaxLayer && !
IsPointInsideDeadZones(x, y))
264 if (strip_num >= 0 && strip_num < (
int)Strips.size()) {
265 Strips[strip_num] = signal;
273 if (strip_num >= 0 && strip_num < (
int)Strips.size()) {
274 Strips[strip_num] += signal;
282 if (strip_num >= 0 && strip_num < (
int)Strips.size()) {
283 return Strips[strip_num];
290 if (strip_num >= 0 && strip_num < (
int)StripMatches.size()) {
291 StripMatches[strip_num] = mc_match;
299 if (strip_num >= 0 && strip_num < (
int)StripMatches.size()) {
300 StripMatches[strip_num].AddLink(weight, mc_num);
308 if (strip_num >= 0 && strip_num < (
int)StripDigitNumberMatches.size()) {
309 StripDigitNumberMatches[strip_num] = digit_num_match;
317 if (strip_num >= 0 && strip_num < (
int)StripDigitNumberMatches.size()) {
318 StripDigitNumberMatches[strip_num].AddLink(weight, digit_num);
326 if (strip_num >= 0 && strip_num < (
int)StripMatches.size()) {
327 return StripMatches[strip_num];
334 if (strip_num >= 0 && strip_num < (
int)StripDigitNumberMatches.size()) {
335 return StripDigitNumberMatches[strip_num];
344 StripMatches.clear();
345 StripMatches.resize(NStrips,
BmnMatch());
352 StripDigitNumberMatches.clear();
353 StripDigitNumberMatches.resize(NStrips,
BmnMatch());
358 if (num >= 0 && num < (
int)StripHits.size()) {
359 return StripHits[num];
366 if (num >= 0 && num < (
int)StripHitsTotalSignal.size()) {
367 return StripHitsTotalSignal[num];
374 if (num >= 0 && num < (
int)StripHitsErrors.size()) {
375 return StripHitsErrors[num];
382 if (num >= 0 && num < (
int)StripHitsClusterSize.size()) {
383 return StripHitsClusterSize[num];
391 StripHitsTotalSignal.clear();
392 StripHitsErrors.clear();
393 StripHitsClusterSize.clear();
394 StripClusters.clear();
399 Double_t XRotationCenter;
400 Double_t YRotationCenter;
403 XRotationCenter = XLeftPointOfStripNumbering;
404 YRotationCenter = YLeftPointOfStripNumbering;
407 XRotationCenter = XRightPointOfStripNumbering;
408 YRotationCenter = YRightPointOfStripNumbering;
412 (x - XRotationCenter) * Cos(-AngleRad) + (y - YRotationCenter) * Sin(-AngleRad) + XRotationCenter;
418 Double_t XRotationCenter;
419 Double_t YRotationCenter;
422 XRotationCenter = XLeftPointOfStripNumbering;
423 YRotationCenter = YLeftPointOfStripNumbering;
426 XRotationCenter = XRightPointOfStripNumbering;
427 YRotationCenter = YRightPointOfStripNumbering;
431 -(x - XRotationCenter) * Sin(-AngleRad) + (y - YRotationCenter) * Cos(-AngleRad) + YRotationCenter;
456 if (Abs(AngleDeg) != 90.0) {
457 Double_t x_strip_shift = (strip_pos * Pitch) / Cos(Abs(AngleRad));
461 xcoord = XLeftPointOfStripNumbering + x_strip_shift;
462 b = YLeftPointOfStripNumbering - Tan(PiOver2() - AngleRad) * xcoord;
465 xcoord = XRightPointOfStripNumbering - x_strip_shift;
466 b = YRightPointOfStripNumbering - Tan(PiOver2() - AngleRad) * xcoord;
470 Double_t y_strip_shift = strip_pos * Pitch * Sin(AngleRad);
473 b = YLeftPointOfStripNumbering - y_strip_shift;
476 b = YRightPointOfStripNumbering + y_strip_shift;
489 Double_t threshold = ClusterFindingThreshold;
494 Bool_t ascent =
false;
495 Bool_t descent =
false;
498 vector<Double_t> AnalyzableStrips = Strips;
505 for (Int_t is = 0; is < (int)AnalyzableStrips.size(); is++) {
507 if (AnalyzableStrips.at(is) <= threshold) {
508 if (descent || ascent) {
538 cluster.
AddStrip(is, AnalyzableStrips.at(is));
543 Int_t lastnum = AnalyzableStrips.size() - 1;
551 Double_t mean_strip_position = 0.0;
552 Double_t total_cluster_signal = 0.0;
553 Double_t cluster_rms = 0.0;
559 if (AnalyzableStrips.at(curcnt) >= AnalyzableStrips.at(curcnt - 1)) {
561 AnalyzableStrips.at(curcnt - 1) *= 0.5;
566 for (Int_t
i = 0;
i < NStripsInCluster; ++
i) {
567 Double_t strip_num = cluster.
Strips.at(
i);
568 Double_t signal = cluster.
Signals.at(
i);
569 total_cluster_signal += signal;
570 mean_strip_position += (strip_num + 0.5) * signal;
572 mean_strip_position /= total_cluster_signal;
574 if (mean_strip_position < 0.0)
575 mean_strip_position = 0.0;
576 if (mean_strip_position >= AnalyzableStrips.size())
577 mean_strip_position = AnalyzableStrips.size() - 0.001;
597 Double_t sumW = total_cluster_signal;
599 Double_t sumWX2 = 0.;
600 if (NStripsInCluster > 1) {
601 for (Int_t
i = 0;
i < NStripsInCluster; ++
i) {
602 Double_t strip_num = cluster.
Strips.at(
i);
603 Double_t signal = cluster.
Signals.at(
i);
604 sumWX += strip_num * signal;
605 sumWX2 += strip_num * strip_num * signal;
607 cluster_rms = (sumWX2 - sumWX * sumWX / sumW) / sumW;
612 cluster_rms = 1.0 / TMath::Sqrt(12.0);
630 if (total_cluster_signal > TotalClusterThreshold) {
631 StripHits.push_back(mean_strip_position);
632 StripHitsTotalSignal.push_back(total_cluster_signal);
633 StripHitsErrors.push_back(cluster_rms);
634 StripHitsClusterSize.push_back(NStripsInCluster);
637 cluster.SetUniqueID(fUniqueIdL++);
640 cluster.SetUniqueID(fUniqueIdU++);
647 cluster.
Error = cluster_rms;
659 if (total_cluster_signal > TotalClusterThreshold)
660 StripClusters.push_back(cluster);
681 SmoothStrips.clear();
682 Int_t NStrips = AnalyzableStrips.size();
684 for (Int_t iteration = 0; iteration < NIterations; ++iteration) {
685 SmoothStrips.clear();
686 for (Int_t istrip = 0; istrip < NStrips; ++istrip) {
687 Double_t mean_value = 0.0;
688 for (Int_t iw = istrip - SmoothWindow; iw <= istrip + SmoothWindow; ++iw) {
689 if (iw >= 0 && iw < NStrips) {
691 mean_value += AnalyzableStrips[iw] * Weight;
693 mean_value += AnalyzableStrips[iw];
696 mean_value /= 2.0 * SmoothWindow + Weight;
697 SmoothStrips.push_back(mean_value);
699 AnalyzableStrips = SmoothStrips;
Double_t GetStripHitError(Int_t num)
void SmoothStripSignal(vector< Double_t > &AnalyzableStrips, Int_t NIterations, Int_t SmoothWindow, Double_t Weight)
Double_t ConvertPointToStripPosition(Double_t x, Double_t y)
virtual ~BmnGemStripLayer()
Bool_t SetStripNumberingOrder(StripNumberingDirection strip_direction)
BmnMatch GetStripDigitNumberMatch(Int_t strip_num)
Bool_t SetStripMatch(Int_t strip_num, BmnMatch mc_match)
Bool_t IsPointInsideStripLayer(Double_t x, Double_t y)
void ResetStripDigitNumberMatches()
void MakeStripHit(StripCluster &cluster, vector< Double_t > &AnalyzableStrips, Int_t &curcnt)
Double_t ConvertNormalPointToStripY(Double_t x, Double_t y)
void SetLayerSizes(Double_t xsize, Double_t ysize, Double_t xorig=0.0, Double_t yorig=0.0)
Bool_t SetStripSignal(Int_t strip_num, Double_t signal)
Bool_t IsPointInsideDeadZones(Double_t x, Double_t y)
Double_t CalculateStripEquationB(Double_t strip_pos)
Bool_t AddStripSignal(Int_t strip_num, Double_t signal)
Int_t GetStripHitClusterSize(Int_t num)
void SetPitch(Double_t pitch)
void FindClustersAndStripHits()
Bool_t SetStripDigitNumberMatch(Int_t strip_num, BmnMatch digit_num_match)
BmnMatch GetStripMatch(Int_t strip_num)
Double_t GetStripHitPos(Int_t num)
Double_t GetStripHitTotalSignal(Int_t num)
Double_t GetStripSignal(Int_t strip_num)
Bool_t AddLinkToStripMatch(Int_t strip_num, Double_t weight, Int_t mc_num)
Bool_t AddLinkToStripDigitNumberMatch(Int_t strip_num, Double_t weight, Int_t digit_num)
Bool_t AddDeadZone(Int_t n_points, Double_t *x_points, Double_t *y_points)
void SetAngleDeg(Double_t deg)
Bool_t SetStripNumberingBorders(Double_t x_left, Double_t y_left, Double_t x_right, Double_t y_right)
Double_t ConvertNormalPointToStripX(Double_t x, Double_t y)
Bool_t SetDeadZone(Int_t n_points, Double_t *xpoints, Double_t *ypoints)
void AddStrip(Int_t strip_num, Double_t strip_signal)
vector< Double_t > Signals