]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/mapping/AliMpRowSegment.cxx
Fix for the problem during PbPb run of Nov 2010 (Indra)
[u/mrichter/AliRoot.git] / MUON / mapping / AliMpRowSegment.cxx
index 7a25708efd565bdecab5cf40cfc0be433bd6d812..8f45f7edb904b19b2f2f890198dd9f2839b7600e 100755 (executable)
@@ -1,15 +1,30 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
 // $Id$
+// $MpId: AliMpRowSegment.cxx,v 1.10 2006/05/24 13:58:46 ivana Exp $
 // Category: sector
-//
+
+//-----------------------------------------------------------------------------
 // Class AliMpRowSegment
 // ---------------------
 // Class describing a row segment composed of the 
 // the identic motifs.
 // Included in AliRoot: 2003/05/02
 // Authors: David Guez, Ivana Hrivnacova; IPN Orsay
-
-#include <TError.h>
-#include <TMath.h>
+//-----------------------------------------------------------------------------
 
 #include "AliMpRowSegment.h"
 #include "AliMpRow.h"
 #include "AliMpMotifMap.h"
 #include "AliMpMotifPosition.h"
 #include "AliMpConstants.h"
+#include "AliMpEncodePair.h"
+
+#include "AliLog.h"
+
+#include <TMath.h>
+#include <Riostream.h>
 
+/// \cond CLASSIMP
 ClassImp(AliMpRowSegment)
+/// \endcond
 
 //_____________________________________________________________________________
 AliMpRowSegment::AliMpRowSegment(AliMpRow* row, AliMpVMotif* motif, 
-                                 AliMpIntPair padOffset, 
+                                 Int_t padOffsetX, Int_t padOffsetY,
                                  Int_t nofMotifs,
                                  Int_t motifPositionId, Int_t motifPositionDId)
   : AliMpVRowSegment(),
     fNofMotifs(nofMotifs),
-    fPadOffset(padOffset),
-    fOffset(TVector2()),
+    fLPadOffset(AliMp::Pair(padOffsetX,padOffsetY)),
+    fOffsetX(0.),
+    fOffsetY(0.),
     fRow(row),
     fMotif(motif),
     fMotifPositionId(motifPositionId),
     fMotifPositionDId(motifPositionDId)
 {
-// 
+/// Standard constructor
   // Keep pad offset in the low indices limits
-  SetLowIndicesLimit(padOffset);
+  SetLowIndicesLimit(fLPadOffset);
 }
 
 //_____________________________________________________________________________
 AliMpRowSegment::AliMpRowSegment() 
   : AliMpVRowSegment(),
     fNofMotifs(0),
-    fPadOffset(AliMpIntPair()),
-    fOffset(TVector2()),
+    fLPadOffset(0),
+    fOffsetX(0.),
+    fOffsetY(0.),
     fRow(0),
     fMotif(0),
     fMotifPositionId(0),
     fMotifPositionDId(0)
 {
-//
+/// Default constructor
 }
 
 //_____________________________________________________________________________
-AliMpRowSegment::AliMpRowSegment(const AliMpRowSegment& right) 
-  : AliMpVRowSegment(right) {
-// 
-  Fatal("AliMpRowSegment", "Copy constructor not provided.");
-}
-
-//_____________________________________________________________________________
-AliMpRowSegment::~AliMpRowSegment() {
-//  
-}
-
-//
-// operators
-//
-
-//_____________________________________________________________________________
-AliMpRowSegment& AliMpRowSegment::operator=(const AliMpRowSegment& right)
+AliMpRowSegment::~AliMpRowSegment() 
 {
-  // check assignement to self
-  if (this == &right) return *this;
-
-  Fatal("operator =", "Assignement operator not provided.");
-    
-  return *this;  
-}    
+/// Destructor  
+}
 
 //
 // private methods  
@@ -89,71 +94,67 @@ AliMpRowSegment& AliMpRowSegment::operator=(const AliMpRowSegment& right)
 //_____________________________________________________________________________
 Double_t AliMpRowSegment::FirstMotifCenterX() const
 {
-// Returns the x coordinate of the first motif center
-// in global coordinate system.
-// ---
+/// Return the x coordinate of the first motif center
+/// in the global coordinate system.
 
-  return fOffset.X();
+  return fOffsetX;
 }  
 
 //_____________________________________________________________________________
 Double_t AliMpRowSegment::LastMotifCenterX() const
 {
-// Returns the x coordinate of the last motif center
-// in global coordinate system.
-// ---
+/// Return the x coordinate of the last motif center
+/// in the global coordinate system.
 
-  return fOffset.X() + 2.*(fNofMotifs-1)*fMotif->Dimensions().X();
+  return fOffsetX + 2.*(fNofMotifs-1)*fMotif->DimensionX();
 }
 
 //_____________________________________________________________________________
 Double_t AliMpRowSegment::MotifCenterX(Int_t motifPositionId) const
 {
-// Returns the x coordinate of the motif specified with
-// the given position identifier.
-// ---
+/// Return the x coordinate of the motif specified with
+/// the given position identifier.
 
   // Check if x is in the row segment range
   if (! HasMotifPosition(motifPositionId)) {
-    Error("MotifCenterX", "Outside row segment region");
+    AliErrorStream() << "Outside row segment region" << endl;
     return 0;
   }
   
   // Find the position number in the segment  
   Int_t num = (motifPositionId - fMotifPositionId) *  fMotifPositionDId;
 
-  return fOffset.X() + num*(fMotif->Dimensions().X() * 2.0);
+  return fOffsetX + num*(fMotif->DimensionX() * 2.0);
 }
 
 //_____________________________________________________________________________
 Double_t AliMpRowSegment::MotifCenterY(Int_t motifPositionId) const
 {
-// Returns the y coordinate of the motif specified with
-// the given position identifier.
-// ---
+/// Return the y coordinate of the motif specified with
+/// the given position identifier.
 
   // Check if x is in the row segment range
   if (! HasMotifPosition(motifPositionId)) {
-    Error("MotifCenterY", "Outside row segment region");
+    AliErrorStream() << "Outside row segment region" << endl;
     return 0;
   }
   
-  return GetRow()->Position().Y() + fOffset.Y();
+  return GetRow()->GetPositionY() + fOffsetY;
 }
 
 //_____________________________________________________________________________
-Bool_t AliMpRowSegment::IsInside(const TVector2& position, Bool_t warn) const
+Bool_t AliMpRowSegment::IsInside(Double_t x, Double_t y, Bool_t warn) const
 {
-// Checks if the position is inside some motif of this row segment.
-// ---
+/// Check if the position is inside some motif of this row segment.
 
-  Double_t minY = GetRow()->Position().Y() + fOffset.Y() - fMotif->Dimensions().Y();
-  Double_t maxY = GetRow()->Position().Y() + fOffset.Y() + fMotif->Dimensions().Y();
+  Double_t minY = GetRow()->GetPositionY() + fOffsetY - fMotif->DimensionY();
+  Double_t maxY = GetRow()->GetPositionY() + fOffsetY + fMotif->DimensionY();
 
-  if ( position.X() < LeftBorderX() || position.X() > RightBorderX() ||
-       position.Y() < minY || position.Y() > maxY ) {
+  if ( x < LeftBorderX() || x > RightBorderX() ||
+       y < minY || y > maxY ) {
 
-    if (warn) Error("MotifPositionId", "Outside row segment region");
+    if (warn)
+      AliWarningStream() << "Outside row segment region" << endl;
     return false;
   }
   else
@@ -167,56 +168,51 @@ Bool_t AliMpRowSegment::IsInside(const TVector2& position, Bool_t warn) const
 //_____________________________________________________________________________
 Double_t  AliMpRowSegment::LeftBorderX() const
 {
-// Returns the x coordinate of the left row segment border
-// in global coordinate system.
-// ---
+/// Return the x coordinate of the left row segment border
+/// in the global coordinate system.
 
-  return FirstMotifCenterX() - fMotif->Dimensions().X();
+  return FirstMotifCenterX() - fMotif->DimensionX();
 }
 
 //_____________________________________________________________________________
 Double_t  AliMpRowSegment::RightBorderX() const
 {
-// Returns the x coordinate of the right row segment border
-// in global coordinate system.
-// ---
+/// Return the x coordinate of the right row segment border
+/// in the global coordinate system.
 
-  return LastMotifCenterX() + fMotif->Dimensions().X();
+  return LastMotifCenterX() + fMotif->DimensionX();
 }
 
 //_____________________________________________________________________________
 Double_t  AliMpRowSegment::HalfSizeY() const
 {
-// Returns the size in y of this row segment.
-// ---
+/// Return the size in y of this row segment.
 
-  return fMotif->Dimensions().Y() + fOffset.Y();
+  return fMotif->DimensionY() + fOffsetY;
 }
 
 //_____________________________________________________________________________
-AliMpVMotif*  AliMpRowSegment::FindMotif(const TVector2& position) const
+AliMpVMotif*  AliMpRowSegment::FindMotif(Double_t x, Double_t y) const
 {
-// Returns the motif of this row; 
-// ---
+/// Return the motif of this row; 
 
-  if (IsInside(position, false))
+  if ( IsInside(x, y, false) )
     return fMotif;
   else  
     return 0;
 }  
 
 //_____________________________________________________________________________
-Int_t AliMpRowSegment::FindMotifPositionId(const TVector2& position) const
+Int_t AliMpRowSegment::FindMotifPositionId(Double_t x, Double_t y) const
 {
-// Returns the motif position identified for the given
-// geometric position.
-// ---
+/// Return the motif position identified for the given
+/// geometric position.
 
-  if (!IsInside(position, false)) return 0;
+  if ( ! IsInside(x, y, false) ) return 0;
 
   // Find the position number in the segment  
   Int_t num 
-    = Int_t((position.X() - LeftBorderX()) / (fMotif->Dimensions().X() * 2.0));
+    = Int_t((x - LeftBorderX()) / (fMotif->DimensionX() * 2.0));
 
   // Calculate the position Id
   return fMotifPositionId + num*fMotifPositionDId;  
@@ -225,9 +221,8 @@ Int_t AliMpRowSegment::FindMotifPositionId(const TVector2& position) const
 //_____________________________________________________________________________
 Bool_t AliMpRowSegment::HasMotifPosition(Int_t motifPositionId) const
 {
-// Returns true if the motif specified with the given position identifier
-// is in this segment.
-// ---
+/// Return true if the motif specified with the given position identifier
+/// is in this segment.
 
   Int_t minId = TMath::Min(fMotifPositionId, 
                     fMotifPositionId + (fNofMotifs-1)*fMotifPositionDId);
@@ -242,69 +237,76 @@ Bool_t AliMpRowSegment::HasMotifPosition(Int_t motifPositionId) const
 }
 
 //_____________________________________________________________________________
-TVector2 AliMpRowSegment::MotifCenter(Int_t motifPositionId) const
+void AliMpRowSegment::MotifCenter(Int_t motifPositionId,
+                                  Double_t& x, Double_t& y) const
 {
-// Returns the coordinates of the motif specified with
-// the given position identifier.
-// ---
+/// Return the coordinates of the motif specified with
+/// the given position identifier.
 
-  return TVector2(MotifCenterX(motifPositionId), MotifCenterY(motifPositionId));
+  x = MotifCenterX(motifPositionId);
+  y = MotifCenterY(motifPositionId);
 }
 
 //_____________________________________________________________________________
-TVector2 AliMpRowSegment::Position() const
+Double_t AliMpRowSegment::GetPositionX() const
 {
-// Returns the position of the row segment centre.
-// ---
+/// Return the x position of the row segment centre.
 
-  Double_t x = (LeftBorderX() + RightBorderX())/2.;                
-  Double_t y = GetRow()->Position().Y();  
-    
-  return TVector2(x, y);   
+  return (LeftBorderX() + RightBorderX())/2.;              
 }
 
+//_____________________________________________________________________________
+Double_t AliMpRowSegment::GetPositionY() const
+{
+/// Return the y position of the row segment centre.
+
+  return GetRow()->GetPositionY();  
+}
 
 //_____________________________________________________________________________
-TVector2 AliMpRowSegment::Dimensions() const
+Double_t AliMpRowSegment::GetDimensionX() const
 {
-// Returns the halflengths of the row segment in x, y.
+/// Return the halflengths of the row segment in x, y.
 // ---
 
-  Double_t x = (RightBorderX() - LeftBorderX())/2.;                
-  Double_t y = GetRow()->Dimensions().Y();  
-    
-  return TVector2(x, y);   
+  return (RightBorderX() - LeftBorderX())/2.;              
 }
 
 //_____________________________________________________________________________
-void   AliMpRowSegment::SetOffset(const TVector2& offset)
+Double_t AliMpRowSegment::GetDimensionY() const
 {
-// Calculates offset from given offset and 
-// stored offset in pads.
+/// Return the halflengths of the row segment in x, y.
 // ---
 
+  return GetRow()->GetDimensionY();  
+}
+
+//_____________________________________________________________________________
+void   AliMpRowSegment::SetOffset(Double_t x, Double_t y)
+{
+/// Calculate offset from given offset and 
+/// stored offset in pads.
+
   AliMpMotifTypePadIterator iter(fMotif->GetMotifType());
   iter.First();
-  AliMpIntPair localPos = iter.CurrentItem().GetIndices();
-     
-  Double_t offsetX 
-     = offset.X() 
-       + 2.*fPadOffset.GetFirst() * fMotif->GetPadDimensions(localPos).X() 
-       + fMotif->Dimensions().X(); 
 
-  Double_t offsetY 
-    = offset.Y()
-      + fPadOffset.GetSecond() * fMotif->GetPadDimensions(localPos).Y(); 
+  Int_t ix = iter.CurrentItem().GetIx();
+  Int_t iy = iter.CurrentItem().GetIy();
+  
+  Double_t dx, dy;
+  fMotif->GetPadDimensionsByIndices(ix, iy, dx, dy);  
+
+  fOffsetX 
+     = x + 2.*AliMp::PairFirst(fLPadOffset) * dx + fMotif->DimensionX(); 
 
-  fOffset = TVector2(offsetX, offsetY);
+  fOffsetY
+    = y + AliMp::PairSecond(fLPadOffset) * dy; 
 }
 
-#include <Riostream.h>
 //_____________________________________________________________________________
 void AliMpRowSegment::SetGlobalIndices(AliMpRow* /*rowBefore*/)
 {
-// Sets indices limits.
-// ---
+/// Set global indices limits.
 
   // The low/high indices limits has to be taken as the highest/lowest from all 
   // motif positions
@@ -323,48 +325,46 @@ void AliMpRowSegment::SetGlobalIndices(AliMpRow* /*rowBefore*/)
        Fatal("SetGlobalIndices", 
              "Indices of motif positions have to be set first.");
             
-     if ( mPos->GetLowIndicesLimit().GetFirst() < ixl ) 
-       ixl = mPos->GetLowIndicesLimit().GetFirst();
+     if ( mPos->GetLowLimitIx() < ixl ) 
+       ixl = mPos->GetLowLimitIx();
        
-     if ( mPos->GetLowIndicesLimit().GetSecond() < iyl ) 
-       iyl = mPos->GetLowIndicesLimit().GetSecond();
+     if ( mPos->GetLowLimitIy() < iyl ) 
+       iyl = mPos->GetLowLimitIy();
 
-     if ( mPos->GetHighIndicesLimit().GetFirst() > ixh ) 
-       ixh = mPos->GetHighIndicesLimit().GetFirst();
+     if ( mPos->GetHighLimitIx() > ixh ) 
+       ixh = mPos->GetHighLimitIx();
        
-     if ( mPos->GetHighIndicesLimit().GetSecond() > iyh ) 
-       iyh = mPos->GetHighIndicesLimit().GetSecond();
+     if ( mPos->GetHighLimitIy() > iyh ) 
+       iyh = mPos->GetHighLimitIy();
   }     
 
-  SetLowIndicesLimit(AliMpIntPair(ixl, iyl));
-  SetHighIndicesLimit(AliMpIntPair(ixh, iyh));
+  SetLowIndicesLimit(ixl, iyl);
+  SetHighIndicesLimit(ixh, iyh);
 }  
 
 //_____________________________________________________________________________
-Int_t AliMpRowSegment::SetIndicesToMotifPosition(Int_t i, 
-                                 const AliMpIntPair& indices)
+Int_t AliMpRowSegment::SetIndicesToMotifPosition(Int_t i, MpPair_t indices)
 {
-// Sets global indices to i-th motif position and returns next index
-// in x.
-// ---
+/// Set global indices to i-th motif position and returns next index
+/// in x.
 
   // Get motif position
   AliMpMotifPosition* motifPosition
     = GetRow()->GetMotifMap()->FindMotifPosition(GetMotifPositionId(i));
 
   // Low limit
-  AliMpIntPair low = indices + AliMpIntPair(0, GetLowIndicesLimit().GetSecond());
+  MpPair_t low = indices + AliMp::Pair(0, GetLowLimitIy());
   motifPosition->SetLowIndicesLimit(low);
          
   // High limit
   AliMpMotifType* motifType = motifPosition->GetMotif()->GetMotifType();    
-  AliMpIntPair high
-    = motifPosition->GetLowIndicesLimit() 
-      + AliMpIntPair(motifType->GetNofPadsX()-1, motifType->GetNofPadsY()-1);
+  MpPair_t high
+    = motifPosition->GetLowIndicesLimit()
+      + AliMp::Pair(motifType->GetNofPadsX()-1, motifType->GetNofPadsY()-1);
   motifPosition->SetHighIndicesLimit(high);
 
   // Return next index in x
-  return high.GetFirst()+1;
+  return AliMp::PairFirst(high)+1;
   // return motifType->GetNofPadsX();
 }
 
@@ -372,8 +372,7 @@ Int_t AliMpRowSegment::SetIndicesToMotifPosition(Int_t i,
 //_____________________________________________________________________________
 AliMpRow*  AliMpRowSegment::GetRow() const
 {
-// Returns the row.which this row segment belongs to.
-// ---
+/// Return the row.which this row segment belongs to.
 
   return fRow;
 }  
@@ -381,8 +380,7 @@ AliMpRow*  AliMpRowSegment::GetRow() const
 //_____________________________________________________________________________
 Int_t  AliMpRowSegment::GetNofMotifs() const
 {
-// Returns number of motifs in this this row segment.
-// ---
+/// Return number of motifs in this this row segment.
 
   return fNofMotifs;
 }  
@@ -390,8 +388,7 @@ Int_t  AliMpRowSegment::GetNofMotifs() const
 //_____________________________________________________________________________
 Int_t  AliMpRowSegment::GetMotifPositionId(Int_t i) const
 {
-// Returns number of motifs in this this row segment.
-// ---
+/// Return number of motifs in this this row segment.
 
   return fMotifPositionId + i*fMotifPositionDId;
 }  
@@ -399,8 +396,7 @@ Int_t  AliMpRowSegment::GetMotifPositionId(Int_t i) const
 //_____________________________________________________________________________
 AliMpVMotif*  AliMpRowSegment::GetMotif(Int_t /*i*/) const
 {
-// Returns the motif of this row segment.
-// ---
+/// Return the motif of this row segment.
 
   return fMotif;
 }