]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/mapping/AliMpVRowSegmentSpecial.cxx
Fix floating exception bug which can appear in few specific cases.
[u/mrichter/AliRoot.git] / MUON / mapping / AliMpVRowSegmentSpecial.cxx
index e3c4f40c429339ae08b4e1802fc8b7668275ac11..dfbbbc5fb5ae53583ffe7c0d693d725a6cfababf 100644 (file)
@@ -127,35 +127,38 @@ AliMpVRowSegmentSpecial::FindPadRowSegment(Int_t motifPositionId) const
 }
 
 //______________________________________________________________________________
-AliMpIntPair 
+MpPair_t 
 AliMpVRowSegmentSpecial::FindRelativeLowIndicesOf(Int_t motifPositionId) const 
 { 
 /// Return the lowest pad indices where the motif of the given position ID
 /// exist in this segment.
 
-  AliMpIntPair ans(0,1000);
-  AliMpIntPair ans0 = ans;
+  Int_t ans0Ix = 0;
+  Int_t ans0Iy = 1000;
+  Int_t ansIx = 0;
+  Int_t ansIy = 1000;
+  
   Int_t maxNofPadsX=0;
   
   for (Int_t i=0; i<GetNofPadRows(); i++) {
     AliMpPadRow* padRow = GetPadRow(i);
 
     Int_t nofPadsX=0;
-    for (Int_t j=0; j<padRow->GetNofPadRowSegments(); j++) {
+    for ( Int_t j=0; j<padRow->GetNofPadRowSegments(); j++ ) {
       AliMpVPadRowSegment* padRowSegment = padRow->GetPadRowSegment(j);
       nofPadsX += padRowSegment->GetNofPads();
       if (padRowSegment->GetMotifPositionId() == motifPositionId) {
-         if (ans.GetFirst() < nofPadsX) ans.SetFirst(nofPadsX);
-         if (ans.GetSecond()>i) ans.SetSecond(i);
-                  // ans.First = max (nof pads of this pos ID)
-                  // ans.Second = min of pad row number
+         if ( ansIx < nofPadsX ) ansIx = nofPadsX;
+         if ( ansIy >i ) ansIy = i;
+                  // ansIx = max (nof pads of this pos ID)
+                  // ansIy = min of pad row number
       }
     }  
-    if (nofPadsX > maxNofPadsX) maxNofPadsX = nofPadsX;
+    if ( nofPadsX > maxNofPadsX ) maxNofPadsX = nofPadsX;
   }    
-  if (ans == ans0) return AliMpIntPair::Invalid();
+  if ( ansIx == ans0Ix && ansIy == ans0Iy ) return -1;
   
-  return AliMpIntPair(maxNofPadsX-ans.GetFirst(), ans.GetSecond());
+  return AliMp::Pair(maxNofPadsX-ansIx, ansIy);
 }
  
 //______________________________________________________________________________
@@ -259,38 +262,34 @@ Double_t  AliMpVRowSegmentSpecial::HalfSizeY() const
 }
 
 //______________________________________________________________________________
-AliMpVMotif*  AliMpVRowSegmentSpecial::FindMotif(const TVector2& position) const
+AliMpVMotif*  AliMpVRowSegmentSpecial::FindMotif(Double_t x, Double_t y) const
 {
 /// Return the motif of this row; 
 
-  AliMpPadRow* padRow 
-    = FindPadRow(position.Y());
+  AliMpPadRow* padRow = FindPadRow(y);
   
-  if (!padRow) return 0;
+  if ( ! padRow ) return 0;
 
-  AliMpVPadRowSegment* padRowSegment 
-    = padRow->FindPadRowSegment(position.X());
+  AliMpVPadRowSegment* padRowSegment = padRow->FindPadRowSegment(x);
     
-  if (!padRowSegment) return 0;
+  if (! padRowSegment ) return 0;
 
   return padRowSegment->GetMotif();
 }  
 
 //______________________________________________________________________________
-Int_t AliMpVRowSegmentSpecial::FindMotifPositionId(const TVector2& position) const
+Int_t AliMpVRowSegmentSpecial::FindMotifPositionId(Double_t x, Double_t y) const
 {
 /// Return the motif position identified for the given
 /// geometric position.
 
-  AliMpPadRow* padRow 
-    = FindPadRow(position.Y());
+  AliMpPadRow* padRow = FindPadRow(y);
   
-  if (!padRow) return 0;
+  if ( ! padRow ) return 0;
 
-  AliMpVPadRowSegment* padRowSegment 
-    = padRow->FindPadRowSegment(position.X());
+  AliMpVPadRowSegment* padRowSegment = padRow->FindPadRowSegment(x);
     
-  if (!padRowSegment) return 0;
+  if ( ! padRowSegment ) return 0;
 
   return padRowSegment->GetMotifPositionId();
 }
@@ -308,7 +307,8 @@ Bool_t AliMpVRowSegmentSpecial::HasMotifPosition(Int_t motifPositionId) const
 }
 
 //______________________________________________________________________________
-TVector2 AliMpVRowSegmentSpecial::MotifCenter(Int_t motifPositionId) const
+void AliMpVRowSegmentSpecial::MotifCenter(Int_t motifPositionId,
+                                          Double_t& x, Double_t& y) const
 {
 /// Return the coordinates of the motif specified with
 /// the given position identifier.
@@ -316,25 +316,25 @@ TVector2 AliMpVRowSegmentSpecial::MotifCenter(Int_t motifPositionId) const
   // Try to get the motif position from the motif map first
   AliMpMotifPosition* motifPosition
     = GetRow()->GetMotifMap()->FindMotifPosition(motifPositionId);
-  if (motifPosition) return motifPosition->Position();
-
-  // Use slow method otherwise
-  return MotifCenterSlow(motifPositionId);
+    
+  if (motifPosition) { 
+    x = motifPosition->GetPositionX(), 
+    y = motifPosition->GetPositionY();
+  }
+  else {  
+    MotifCenterSlow(motifPositionId, x, y);
+  }
 }
 
 //______________________________________________________________________________
-TVector2 AliMpVRowSegmentSpecial::Dimensions() const
+Double_t AliMpVRowSegmentSpecial::GetDimensionX() const
 {
 /// Return the halflengths in x, y of the row segment rectangular envelope.
 
   Double_t x = 0.;                 
-  Double_t y = 0.;  
   for (Int_t i=0; i<GetNofPadRows(); i++) {    
     AliMpPadRow* padRow = GetPadRow(i); 
     
-    // Add all pad rows y halfsizes   
-    y += padRow->HalfSizeY();
-
     // Find the biggest pad rows x halfsize
     Double_t xx 
       = (padRow->GetPadRowSegment(0)->RightBorderX() -
@@ -342,7 +342,23 @@ TVector2 AliMpVRowSegmentSpecial::Dimensions() const
     if (xx > x) x = xx;                   
   }                  
     
-  return TVector2(x, y);   
+  return x;   
+}
+
+//______________________________________________________________________________
+Double_t AliMpVRowSegmentSpecial::GetDimensionY() const
+{
+/// Return the halflengths in x, y of the row segment rectangular envelope.
+
+  Double_t y = 0.;  
+  for (Int_t i=0; i<GetNofPadRows(); i++) {    
+    AliMpPadRow* padRow = GetPadRow(i); 
+    
+    // Add all pad rows y halfsizes   
+    y += padRow->HalfSizeY();
+  }                  
+    
+  return y;   
 }
 
 //______________________________________________________________________________