1 /**************************************************************************
2 * This file is property of and copyright by the ALICE HLT Project *
3 * All rights reserved. *
6 * Artur Szostak <artursz@iafrica.com> *
8 * Permission to use, copy, modify and distribute this software and its *
9 * documentation strictly for non-commercial purposes is hereby granted *
10 * without fee, provided that the above copyright notice appears in all *
11 * copies and that both the copyright notice and this permission notice *
12 * appear in the supporting documentation. The authors make no claims *
13 * about the suitability of this software for any purpose. It is *
14 * provided "as is" without express or implied warranty. *
15 **************************************************************************/
20 * @file AliHLTMUONMansoTrackerFSM.cxx
21 * @author Artur Szostak <artursz@iafrica.com>
23 * @brief Implementation of AliHLTMUONMansoTrackerFSM class.
26 #include "AliHLTMUONMansoTrackerFSM.h"
27 #include "AliHLTMUONCalculations.h"
28 #include "AliHLTMUONConstants.h"
29 #include "AliHLTMUONUtils.h"
38 std::ostream& operator << (std::ostream& os, AliHLTMUONMansoTrackerFSM::StatesSM4 state)
42 case AliHLTMUONMansoTrackerFSM::kSM4Idle: os << "kSM4Idle"; break;
43 case AliHLTMUONMansoTrackerFSM::kWaitChamber8: os << "kWaitChamber8"; break;
44 case AliHLTMUONMansoTrackerFSM::kWaitMoreChamber8: os << "kWaitMoreChamber8"; break;
45 case AliHLTMUONMansoTrackerFSM::kWaitChamber7: os << "kWaitChamber7"; break;
46 case AliHLTMUONMansoTrackerFSM::kWaitMoreChamber7: os << "kWaitMoreChamber7"; break;
47 default: os << "FAULT!!";
52 std::ostream& operator << (std::ostream& os, AliHLTMUONMansoTrackerFSM::StatesSM5 state)
56 case AliHLTMUONMansoTrackerFSM::kSM5Idle: os << "kSM5Idle"; break;
57 case AliHLTMUONMansoTrackerFSM::kWaitChamber10: os << "kWaitChamber10"; break;
58 case AliHLTMUONMansoTrackerFSM::kWaitMoreChamber10: os << "kWaitMoreChamber10"; break;
59 case AliHLTMUONMansoTrackerFSM::kWaitChamber9: os << "kWaitChamber9"; break;
60 case AliHLTMUONMansoTrackerFSM::kWaitMoreChamber9: os << "kWaitMoreChamber9"; break;
61 case AliHLTMUONMansoTrackerFSM::kSM5Done: os << "kSM5Done"; break;
62 default: os << "FAULT!!";
71 // Deviate from the Manso implementation by allowing a and b
72 // parameters per chamber and not just per station.
73 // The default values are derived from the work done in
74 // "A first algorithm for dimuon High Level Trigger"
75 // Ref ID: ALICE-INT-2002-04 version 1.0
76 AliHLTFloat32_t AliHLTMUONMansoTrackerFSM::fgA7 = 0.016f;
77 AliHLTFloat32_t AliHLTMUONMansoTrackerFSM::fgB7 = 2.0f;
78 AliHLTFloat32_t AliHLTMUONMansoTrackerFSM::fgA8 = 0.016f;
79 AliHLTFloat32_t AliHLTMUONMansoTrackerFSM::fgB8 = 2.0f;
80 AliHLTFloat32_t AliHLTMUONMansoTrackerFSM::fgA9 = 0.020f;
81 AliHLTFloat32_t AliHLTMUONMansoTrackerFSM::fgB9 = 3.0f;
82 AliHLTFloat32_t AliHLTMUONMansoTrackerFSM::fgA10 = 0.020f;
83 AliHLTFloat32_t AliHLTMUONMansoTrackerFSM::fgB10 = 3.0f;
84 AliHLTFloat32_t AliHLTMUONMansoTrackerFSM::fgZ7 = -1274.5f;
85 AliHLTFloat32_t AliHLTMUONMansoTrackerFSM::fgZ8 = -1305.5f;
86 AliHLTFloat32_t AliHLTMUONMansoTrackerFSM::fgZ9 = -1408.6f;
87 AliHLTFloat32_t AliHLTMUONMansoTrackerFSM::fgZ10 = -1439.6f;
88 AliHLTFloat32_t AliHLTMUONMansoTrackerFSM::fgZ11 = -1603.5f;
89 AliHLTFloat32_t AliHLTMUONMansoTrackerFSM::fgZ13 = -1703.5f;
92 void AliHLTMUONMansoTrackerFSM::AliRegionOfInterest::Create(
93 AliHLTMUONRecHitStruct p, AliHLTFloat32_t a, AliHLTFloat32_t b
96 // Creates a region of interest specific to the Manso algorithm from a point and
97 // two Manso specific parameters.
100 // Compute the radius Rp
101 AliHLTFloat32_t rp = (AliHLTFloat32_t) sqrt( p.fX * p.fX + p.fY * p.fY );
103 // The radius Rs for the region of interest is computed from the
104 // specification given in the document:
105 // "A first algorithm for dimuon High Level Trigger"
106 // Ref ID: ALICE-INT-2002-04 version 1.0
109 // given on page 3 section 4.
114 bool AliHLTMUONMansoTrackerFSM::AliRegionOfInterest::Contains(AliHLTMUONRecHitStruct p) const
116 // Compute the distance between the centre of the region of interest and
117 // the point p. This distance must be less than the radius of the region
118 // of interest for p to be contained in the region of interest.
119 register AliHLTFloat32_t lx = fCentre.fX - p.fX;
120 register AliHLTFloat32_t ly = fCentre.fY - p.fY;
121 register AliHLTFloat32_t r = (AliHLTFloat32_t) sqrt( lx * lx + ly * ly );
122 DebugTrace("\tAliRegionOfInterest::Contains : p = " << p
123 << " , centre = " << fCentre << " , r = " << r << " , Rs = " << fRs
129 void AliHLTMUONMansoTrackerFSM::AliRegionOfInterest::GetBoundaryBox(
130 AliHLTFloat32_t& left, AliHLTFloat32_t& right,
131 AliHLTFloat32_t& bottom, AliHLTFloat32_t& top
134 // Works out the smallest boundary box that will contain the region of interest.
136 left = fCentre.fX - fRs;
137 right = fCentre.fX + fRs;
138 bottom = fCentre.fY - fRs;
139 top = fCentre.fY + fRs;
143 AliHLTMUONMansoTrackerFSM::AliVertex::AliVertex(
144 AliHLTFloat32_t x, AliHLTFloat32_t y, AliHLTFloat32_t z
146 : fX(x), fY(y), fZ(z)
148 // Constructor for vertex.
152 AliHLTMUONMansoTrackerFSM::AliVertex::AliVertex(AliHLTMUONRecHitStruct xy, AliHLTFloat32_t z)
153 : fX(xy.fX), fY(xy.fY), fZ(z)
155 // Construct vertex from a point on the XY plane and z coordinate.
159 AliHLTMUONMansoTrackerFSM::AliLine::AliLine(
160 AliHLTFloat32_t ax, AliHLTFloat32_t ay, AliHLTFloat32_t az,
161 AliHLTFloat32_t bx, AliHLTFloat32_t by, AliHLTFloat32_t bz
170 // Construct a line defined by L = M*t + C = (A-B)*t + B
171 // where M and C are 3D vectors and t is a free parameter.
172 // A = (ax, ay, az) and B = (bx, by, bz)
176 AliHLTMUONMansoTrackerFSM::AliLine::AliLine(AliVertex a, AliVertex b) :
184 // Contruct a line to go through two vertices a and b.
188 AliHLTMUONRecHitStruct AliHLTMUONMansoTrackerFSM::AliLine::FindIntersectWithXYPlain(
192 // Find the point of intersection of the line and the XY plane at z.
194 assert( fMz != 0.0 ); // Should not have a ray perpendicular to the beam axis.
195 AliHLTFloat32_t t = (z - fCz) / fMz;
196 AliHLTMUONRecHitStruct p;
204 AliHLTMUONMansoTrackerFSM::AliHLTMUONMansoTrackerFSM() :
208 fRequestsCompleted(0),
209 fSt4chamber(kChamber1),
219 // Default constructor
223 void AliHLTMUONMansoTrackerFSM::FindTrack(const AliHLTMUONTriggerRecordStruct& trigger)
225 // Tries to find the track from the trigger seed.
227 DebugTrace("SM5 state = " << fSm5state << " , SM4 state = " << fSm4state);
228 DebugTrace("Processing trigger with ID = " << trigger.fId);
230 fTriggerId = trigger.fId;
232 AliHLTMUONParticleSign sign;
234 AliHLTMUONUtils::UnpackTriggerRecordFlags(trigger.fFlags, sign, hitset);
235 DebugTrace("hitset = {" << hitset[0] << ", " << hitset[1] << ", "
236 << hitset[2] << ", " << hitset[3] << "}"
239 // Find first valid hit in the trigger record from chambers 11 and 12.
241 for (int i = 0; i < 2; i++)
249 // Find the second valid hit in the trigger record from chambers 13 and 14.
251 for (int i = 2; i < 4; i++)
259 if (firstHit == -1 or secondHit == -1)
266 trigger.fHit[firstHit].fX,
267 trigger.fHit[firstHit].fY,
268 trigger.fHit[firstHit].fZ
270 AliVertex v2 = AliVertex(
271 trigger.fHit[secondHit].fX,
272 trigger.fHit[secondHit].fY,
273 trigger.fHit[secondHit].fZ
276 DebugTrace("Using fV1 = {x = " << fV1.X() << ", y = " << fV1.Y() << ", "
277 << fV1.Z() << "}, with firstHit = " << firstHit
279 DebugTrace("Using v2 = {x = " << v2.X() << ", y = " << v2.Y() << ", "
280 << v2.Z() << "}, with secondHit = " << secondHit
283 // Form the vector line between the above two impact points and
284 // find the crossing point of the line with chamber 10 (i.e. station 5).
285 fMc1.fLine = AliLine(fV1, v2);
286 AliHLTMUONRecHitStruct p10 = fMc1.fLine.FindIntersectWithXYPlain( fgZ10 );
288 // Build a region of interest for tracking station 5 (chamber 10).
289 // Remember the parameters a and b are station specific.
290 fMc1.fChamber = kChamber10;
291 fMc1.fRoi.Create(p10, fgA10, fgB10);
293 // Make SM5 state transition before the call to RequestClusters since
294 // that method could call one of our methods again, so we need to be
295 // in a consistant internal state.
296 fSm5state = kWaitChamber10;
298 AliHLTFloat32_t left, right, bottom, top;
299 fMc1.fRoi.GetBoundaryBox(left, right, bottom, top);
300 RequestClusters(left, right, bottom, top, kChamber10, &fMc1);
304 void AliHLTMUONMansoTrackerFSM::ReturnClusters(
305 void* tag, const AliHLTMUONRecHitStruct* clusters,
309 // Implementation of AliHLTMUONMansoTrackerFSM::ReturnClusters.
312 assert( clusters != NULL );
314 AliTagData* data = (AliTagData*)tag;
315 DebugTrace("Got AliHLTMUONMansoTrackerFSM::ReturnClusters(tag = " << tag
316 << ", chamber = " << data->fChamber
317 << ", clusters = " << clusters << ", count = " << count << ")"
319 DebugTrace("SM5 state = " << fSm5state << " , SM4 state = " << fSm4state);
321 switch (data->fChamber)
323 case kChamber7: ReceiveClustersChamber7(clusters, count, data); break;
324 case kChamber8: ReceiveClustersChamber8(clusters, count, data); break;
325 case kChamber9: ReceiveClustersChamber9(clusters, count); break;
326 case kChamber10: ReceiveClustersChamber10(clusters, count); break;
329 DebugTrace("ERROR: Got tag with an invalid value: " << data->fChamber);
334 void AliHLTMUONMansoTrackerFSM::EndOfClusters(void* tag)
336 // Implementation of AliHLTMUONMansoTrackerFSM::EndOfClusters.
338 AliTagData* data = (AliTagData*)tag;
339 DebugTrace("Got AliHLTMUONMansoTrackerFSM::EndOfClusters(chamber = " << data->fChamber << ")");
340 DebugTrace("SM5 state = " << fSm5state << " , SM4 state = " << fSm4state);
342 switch (data->fChamber)
344 case kChamber7: EndOfClustersChamber7(); break;
345 case kChamber8: EndOfClustersChamber8(); break;
346 case kChamber9: EndOfClustersChamber9(); break;
347 case kChamber10: EndOfClustersChamber10(); break;
350 DebugTrace("ERROR: Got tag with an invalid value: " << data->fChamber);
355 bool AliHLTMUONMansoTrackerFSM::FillTrackData(AliHLTMUONMansoTrackStruct& track)
357 // Implementation of AliHLTMUONMansoTrackerFSM::FillTrackData
359 DebugTrace("FillTrack: st5 = " << fSt5rec->fClusterPoint << ", st4 = " << fFoundPoint->fClusterPoint);
361 track.fId = fTrackId;
362 // Increment track Id and keep it positive.
363 //TODO: handle the wrapparound better.
364 if (fTrackId < 0x7FFFFFFF)
369 track.fTrigRec = fTriggerId;
371 AliHLTFloat32_t x1 = fFoundPoint->fClusterPoint.fX;
372 AliHLTFloat32_t y1 = fFoundPoint->fClusterPoint.fY;
373 AliHLTFloat32_t z1 = fFoundPoint->fClusterPoint.fZ;
374 AliHLTFloat32_t y2 = fSt5rec->fClusterPoint.fY;
375 AliHLTFloat32_t z2 = fSt5rec->fClusterPoint.fZ;
377 bool calculated = AliHLTMUONCalculations::ComputeMomentum(x1, y1, y2, z1, z2);
379 track.fPx = AliHLTMUONCalculations::Px();
380 track.fPy = AliHLTMUONCalculations::Py();
381 track.fPz = AliHLTMUONCalculations::Pz();
382 DebugTrace("Calculated Px = " << track.fPx << ", Py = " << track.fPy
383 << ", Pz = " << track.fPx
385 DebugTrace("\tusing x1 = " << x1 << " , y1 = " << y1 << " , y2 = " << y2
386 << " , z1 = " << z1 << " , z2 = " << z2
392 // Depending on which chamber we found reconstructed hits, fill the hit
393 // in the appropriate location. This is done for station 4 then 5.
394 if (fSt4chamber == kChamber8)
396 track.fHit[0] = AliHLTMUONConstants::NilRecHitStruct();
398 track.fHit[1] = fFoundPoint->fClusterPoint;
403 track.fHit[0] = fFoundPoint->fClusterPoint;
405 track.fHit[1] = AliHLTMUONConstants::NilRecHitStruct();
408 if (fMc1.fChamber == kChamber10)
410 track.fHit[2] = AliHLTMUONConstants::NilRecHitStruct();
412 track.fHit[3] = fSt5rec->fClusterPoint;
417 track.fHit[2] = fSt5rec->fClusterPoint;
419 track.fHit[3] = AliHLTMUONConstants::NilRecHitStruct();
423 track.fFlags = AliHLTMUONUtils::PackMansoTrackFlags(
424 AliHLTMUONCalculations::Sign(), hitset
430 void AliHLTMUONMansoTrackerFSM::Reset()
432 // Implementation of AliHLTMUONMansoTrackerFSM::Reset
434 DebugTrace("SM5 state = " << fSm5state << " , SM4 state = " << fSm4state);
437 fSm4state = kSM4Idle;
438 fSm5state = kSM5Idle;
439 fRequestsCompleted = 0;
444 // Note: In the following ReceiveClustersXXX and EndOfClustersXXX methods we make
445 // the state machine transitions before calls to RequestClusters, FoundTrack,
446 // NoTrackFound or EndOfClusterRequests. This is important since the callback
447 // object will make recursive calls to the tracker's methods so we need to maintain
448 // a consistant internal state.
449 // The same would go for updating internal variables.
450 // In general one should only call the callback methods at the end of any of the
451 // following routines.
453 void AliHLTMUONMansoTrackerFSM::ReceiveClustersChamber7(
454 const AliHLTMUONRecHitStruct* clusters, AliHLTUInt32_t count,
455 const AliTagData* data
458 // State change method for Station 4 state machine.
463 fSm4state = kWaitMoreChamber7;
465 case kWaitMoreChamber7:
466 for (AliHLTUInt32_t j = 0; j < count; j++)
468 AliHLTMUONRecHitStruct cluster = clusters[j];
469 // Check that the cluster actually is in our region of interest on station 4.
470 if ( data->fRoi.Contains(cluster) )
472 DebugTrace("Adding cluster [" << cluster.fX << ", " << cluster.fY << "] from chamber 7.");
473 AliStation4Data* newdata = fSt4points.Add();
474 newdata->fClusterPoint = cluster;
475 newdata->fSt5tag = data;
481 DebugTrace("ERROR: Unexpected state for SM4 in AliHLTMUONMansoTrackerFSM::ReceiveClustersChamber7!");
486 void AliHLTMUONMansoTrackerFSM::ReceiveClustersChamber8(
487 const AliHLTMUONRecHitStruct* clusters, AliHLTUInt32_t count,
488 const AliTagData* data
491 // State change method for Station 4 state machine.
496 fSm4state = kWaitMoreChamber8;
497 fSt4chamber = kChamber8;
499 case kWaitMoreChamber8:
500 for (AliHLTUInt32_t j = 0; j < count; j++)
502 AliHLTMUONRecHitStruct cluster = clusters[j];
503 // Check that the cluster actually is in our region of interest on station 4.
504 if ( data->fRoi.Contains(cluster) )
506 DebugTrace("Adding cluster [" << cluster.fX << ", " << cluster.fY << "] from chamber 8.");
507 AliStation4Data* newdata = fSt4points.Add();
508 newdata->fClusterPoint = cluster;
509 newdata->fSt5tag = data;
515 DebugTrace("ERROR: Unexpected state for SM4 in AliHLTMUONMansoTrackerFSM::ReceiveClustersChamber8!");
520 void AliHLTMUONMansoTrackerFSM::ReceiveClustersChamber9(
521 const AliHLTMUONRecHitStruct* clusters, AliHLTUInt32_t count
524 // State change method for Station 5 state machine.
529 fSm5state = kWaitMoreChamber9;
530 fSm4state = kWaitChamber8; // Start SM4.
532 case kWaitMoreChamber9:
533 for (AliHLTUInt32_t j = 0; j < count; j++)
535 AliHLTMUONRecHitStruct cluster = clusters[j];
536 // Check that the cluster actually is in our region of interest on station 5.
537 if ( fMc1.fRoi.Contains(cluster) )
539 DebugTrace("Adding cluster [" << cluster.fX << ", " << cluster.fY << "] from chamber 9.");
540 AliStation5Data* data = fSt5data.Add();
541 data->fClusterPoint = cluster;
542 ProjectToStation4(data, fgZ9); // This adds a new request for station 4.
548 DebugTrace("ERROR: Unexpected state for SM5 in AliHLTMUONMansoTrackerFSM::ReceiveClustersChamber9!");
553 void AliHLTMUONMansoTrackerFSM::ReceiveClustersChamber10(
554 const AliHLTMUONRecHitStruct* clusters, AliHLTUInt32_t count
557 // State change method for Station 5 state machine.
562 fSm5state = kWaitMoreChamber10;
563 fSm4state = kWaitChamber8; // Start SM4.
565 case kWaitMoreChamber10:
566 for (AliHLTUInt32_t j = 0; j < count; j++)
568 AliHLTMUONRecHitStruct cluster = clusters[j];
569 // Check that the cluster actually is in our region of interest on station 5.
570 if ( fMc1.fRoi.Contains(cluster) )
572 DebugTrace("Adding cluster [" << cluster.fX << ", " << cluster.fY << "] from chamber 10.");
573 AliStation5Data* data = fSt5data.Add();
574 data->fClusterPoint = cluster;
575 ProjectToStation4(data, fgZ10); // This adds a new request for station 4.
581 DebugTrace("ERROR: Unexpected state for SM5 in AliHLTMUONMansoTrackerFSM::ReceiveClustersChamber10!");
586 void AliHLTMUONMansoTrackerFSM::EndOfClustersChamber7()
588 // State change method for Station 4 state machine.
590 fRequestsCompleted++; // Increment the number of requests completed for station 4.
591 DebugTrace("fRequestsCompleted = " << fRequestsCompleted );
596 // If all data from station 5 is received and no data found on
597 // chambers 7 or 8 then we can not find a track.
598 if (fSm5state == kSM5Done) NoTrackFound();
601 case kWaitMoreChamber7:
602 if (fRequestsCompleted == fSt5data.Count() && fSm5state == kSM5Done)
607 DebugTrace("ERROR: Unexpected state for SM4 in AliHLTMUONMansoTrackerFSM::EndOfClustersChamber7!");
612 void AliHLTMUONMansoTrackerFSM::EndOfClustersChamber8()
614 // State change method for Station 4 state machine.
616 fRequestsCompleted++; // Increment the number of requests completed for station 4.
617 DebugTrace("fRequestsCompleted = " << fRequestsCompleted );
622 // Ignore. The requests for chamber 8 are already re-requested below.
627 fSm4state = kWaitChamber7;
628 fSt4chamber = kChamber7;
630 // We need to resend the requests for chamber 8, but change the request
631 // to get data for chamber 7 instead:
632 AliHLTUInt32_t reqlistsize = fSt5data.Count();
633 DebugTrace("Re-requesting clusters from chamber 7... reqlistsize = " << reqlistsize);
635 Station5List::Iterator rec = fSt5data.First();
636 for (AliHLTUInt32_t i = 0; i < reqlistsize; i++, rec++)
638 // Need to create a new st5 data block for the request.
639 AliStation5Data* data = fSt5data.Add();
640 data->fClusterPoint = rec->fClusterPoint;
641 data->fTag.fLine = rec->fTag.fLine;
643 // Rebuild a region of interest for chamber 7.
644 // Remember the parameters a and b are station specific.
645 AliHLTMUONRecHitStruct p7 = data->fTag.fLine.FindIntersectWithXYPlain( fgZ7 );
646 data->fTag.fChamber = kChamber7;
647 data->fTag.fRoi.Create(p7, fgA7, fgB7);
649 AliHLTFloat32_t left, right, bottom, top;
650 data->fTag.fRoi.GetBoundaryBox(left, right, bottom, top);
651 // Make request for chamber 7 data.
652 RequestClusters(left, right, bottom, top, kChamber7, &data->fTag);
657 case kWaitMoreChamber8:
658 if (fRequestsCompleted == fSt5data.Count() && fSm5state == kSM5Done)
663 DebugTrace("ERROR: Unexpected state for SM4 in AliHLTMUONMansoTrackerFSM::EndOfClustersChamber8!");
668 void AliHLTMUONMansoTrackerFSM::EndOfClustersChamber9()
670 // State change method for Station 5 state machine.
675 fSm5state = kSM5Done;
676 EndOfClusterRequests();
680 case kWaitMoreChamber9:
681 fSm5state = kSM5Done;
682 EndOfClusterRequests();
683 if (fRequestsCompleted == fSt5data.Count())
688 DebugTrace("ERROR: Unexpected state for SM5 in AliHLTMUONMansoTrackerFSM::EndOfClustersChamber9!");
693 void AliHLTMUONMansoTrackerFSM::EndOfClustersChamber10()
695 // State change method for Station 5 state machine.
701 fSm5state = kWaitChamber9;
703 // No clusters found on chamber 10 so we need to make a request for
704 // clusters from chamber 9:
705 AliHLTMUONRecHitStruct p9 = fMc1.fLine.FindIntersectWithXYPlain( fgZ9 );
707 // Build a region of interest for tracking station 5 (chamber 9).
708 // Remember the parameters a and b are station specific.
709 fMc1.fChamber = kChamber9;
710 fMc1.fRoi.Create(p9, fgA9, fgB9);
712 AliHLTFloat32_t left, right, bottom, top;
713 fMc1.fRoi.GetBoundaryBox(left, right, bottom, top);
714 RequestClusters(left, right, bottom, top, kChamber9, &fMc1);
718 case kWaitMoreChamber10:
719 fSm5state = kSM5Done;
720 EndOfClusterRequests();
721 if (fRequestsCompleted == fSt5data.Count())
726 DebugTrace("ERROR: Unexpected state for SM5 in AliHLTMUONMansoTrackerFSM::EndOfClustersChamber10!");
731 void AliHLTMUONMansoTrackerFSM::ProjectToStation4(
732 AliStation5Data* data, register AliHLTFloat32_t station5z
735 // Perform chamber specific operations:
736 // Since certain states of SM4 means that it is fetching for Chamber8
737 // and other states are for fetching from Chamber7. We need to make
738 // requests for the correct chamber.
739 assert( fSm4state == kWaitChamber8
740 || fSm4state == kWaitMoreChamber8
741 || fSm4state == kWaitChamber7
742 || fSm4state == kWaitMoreChamber7
744 AliTagData* tag = &data->fTag;
745 if (fSm4state == kWaitChamber8 || fSm4state == kWaitMoreChamber8)
747 // Form the vector line between trigger station 1 and tracking station 5,
748 // and find the intersection point of the line with station 4 (chamber8).
749 AliLine line51( AliVertex(data->fClusterPoint, station5z), fV1 );
750 AliHLTMUONRecHitStruct intercept = line51.FindIntersectWithXYPlain( fgZ8 );
753 // Build a region of interest for tracking station 4.
754 tag->fChamber = kChamber8;
755 tag->fRoi.Create(intercept, fgA8, fgB8);
759 // Form the vector line between trigger station 1 and tracking station 5,
760 // and find the intersection point of the line with station 4 (chamber7).
761 AliLine line51( AliVertex(data->fClusterPoint, station5z), fV1 );
762 AliHLTMUONRecHitStruct intercept = line51.FindIntersectWithXYPlain( fgZ7 );
765 // Build a region of interest for tracking station 4.
766 tag->fChamber = kChamber7;
767 tag->fRoi.Create(intercept, fgA7, fgB7);
770 // Make the request for clusters from station 4.
771 AliHLTFloat32_t left, right, bottom, top;
772 tag->fRoi.GetBoundaryBox(left, right, bottom, top);
773 RequestClusters(left, right, bottom, top, tag->fChamber, tag);
777 void AliHLTMUONMansoTrackerFSM::ProcessClusters()
779 // Process clusters that have been received.
780 // This is called once all clusters have been found.
782 DebugTrace("ProcessClusters...");
784 // Check if the cluster point list on station 4 is empty.
785 // If it is then we have not found any tracks.
786 fFoundPoint = fSt4points.First();
787 if (fFoundPoint == fSt4points.End())
793 fSt5rec = fSt5data.First();
794 if (fSt5rec != fSt5data.End())
796 // Only look at station 5 data records that are for the found chamber number.
797 // Note: either we only have chamber 8 data or we have chamber 7 data followed
798 // by chamber 8 data.
799 // Thus if we hit records that we are not interested in already then the list
800 // contains no interesting data and we can signal no track found.
801 if (fSt5rec->fTag.fChamber != fSt4chamber)
807 // For all combinations of cluster point pairs from station 4 and 5
808 // signal a found track:
811 DebugTrace("\tfSt5rec->fTag.chamber = " << fSt5rec->fTag.fChamber
812 << " , fSt4chamber = " << fSt4chamber
815 for (fFoundPoint = fSt4points.First(); fFoundPoint != fSt4points.End(); fFoundPoint++)
817 if (fFoundPoint->fSt5tag == &fSt5rec->fTag)
821 fSt5rec++; // Get next station 5 cluster point.
822 } while (fSt5rec != fSt5data.End() && fSt5rec->fTag.fChamber == fSt4chamber);