LCOV - code coverage report
Current view: top level - MUON/MUONmapping - AliMpSlatPadIterator.cxx (source / functions) Hit Total Coverage
Test: coverage.info Lines: 59 71 83.1 %
Date: 2016-06-14 17:26:59 Functions: 13 15 86.7 %

          Line data    Source code
       1             : /**************************************************************************
       2             : * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
       3             : *                                                                        *
       4             : * Author: The ALICE Off-line Project.                                    *
       5             : * Contributors are mentioned in the code where appropriate.              *
       6             : *                                                                        *
       7             : * Permission to use, copy, modify and distribute this software and its   *
       8             : * documentation strictly for non-commercial purposes is hereby granted   *
       9             : * without fee, provided that the above copyright notice appears in all   *
      10             : * copies and that both the copyright notice and this permission notice   *
      11             : * appear in the supporting documentation. The authors make no claims     *
      12             : * about the suitability of this software for any purpose. It is          *
      13             : * provided "as is" without express or implied warranty.                  *
      14             : **************************************************************************/
      15             : 
      16             : // $Id$
      17             : // $MpId: AliMpSlatPadIterator.cxx,v 1.6 2006/05/24 13:58:50 ivana Exp $
      18             : 
      19             : #include "AliMpSlatPadIterator.h"
      20             : 
      21             : #include "AliLog.h"
      22             : #include "AliMpArea.h"
      23             : #include "AliMpPCB.h"
      24             : #include "AliMpSlat.h"
      25             : #include "AliMpPCBPadIterator.h"
      26             : 
      27             : 
      28             : //-----------------------------------------------------------------------------
      29             : /// \class AliMpSlatPadIterator
      30             : ///
      31             : /// Implementation of AliMpVPadIterator for slats.
      32             : ///
      33             : /// This class first split the input area (upon which to iterate)
      34             : /// into a set of areas of constant pad size.
      35             : /// Then each of those areas is iterated over, using
      36             : /// AliMpSlatZonePadIterator objects.
      37             : ///
      38             : /// \author L. Aphecetche
      39             : //-----------------------------------------------------------------------------
      40             : 
      41             : /// \cond CLASSIMP
      42          18 : ClassImp(AliMpSlatPadIterator)
      43             : /// \endcond
      44             : 
      45             : //_____________________________________________________________________________
      46             : AliMpSlatPadIterator::AliMpSlatPadIterator()
      47           0 : : AliMpVPadIterator(),
      48           0 : fkSlat(0),
      49           0 : fDelegates(),
      50           0 : fCurrentDelegate(0),
      51           0 : fCurrentDelegateIndex(0)
      52           0 : {
      53             :   ///
      54             :   /// Empty (default) ctor.
      55             :   ///
      56           0 : }
      57             : 
      58             : //_____________________________________________________________________________
      59             : AliMpSlatPadIterator::AliMpSlatPadIterator(const AliMpSlat* slat,
      60             :                                                                                                                                                                          const AliMpArea& area)
      61         102 : : AliMpVPadIterator(),
      62         102 : fkSlat(slat),
      63         102 : fDelegates(),
      64         102 : fCurrentDelegate(0),
      65         102 : fCurrentDelegateIndex(0)
      66         510 : {
      67             :   ///
      68             :   /// Normal ctor.
      69             :   /// The iteration will occur on the given slat over the specified area.
      70             :   ///
      71         510 :   AliDebug(1,Form("this=%p ctor area=(%e,%e,%e,%e)",this,
      72             :                                                                         area.LeftBorder(),area.DownBorder(),
      73             :                   area.RightBorder(),area.UpBorder()));
      74         204 :   if (!Prepare(area)) 
      75             :         {
      76           0 :                 AliError("Iterator invalidated by improper initialization (e.g. incorrect area given ?)");
      77             :         }
      78         102 :   fDelegates.SetOwner(kTRUE);
      79         204 : }
      80             : 
      81             : //_____________________________________________________________________________
      82             : AliMpSlatPadIterator::~AliMpSlatPadIterator()
      83         612 : { 
      84             :   ///
      85             :   /// Dtor.
      86             :   ///
      87         510 :   AliDebug(1,Form("this=%p dtor",this));
      88         102 :   Invalidate();
      89         306 : }
      90             : 
      91             : //_____________________________________________________________________________
      92             : AliMpArea
      93             : AliMpSlatPadIterator::Intersect(const AliMpArea& a, const AliMpArea& b) const
      94             : { 
      95             :   ///
      96             :   /// Returns the common part of a and b.
      97             :   ///
      98        2040 :   AliDebug(4,Form("a=(%7.2f,%7.2f;%7.2f,%7.2f) b=(%7.2f,%7.2f;%7.2f,%7.2f)",
      99             :                                                                         a.LeftBorder(),a.DownBorder(),a.RightBorder(),a.UpBorder(),
     100             :                                                                         b.LeftBorder(),b.DownBorder(),b.RightBorder(),b.UpBorder()));
     101             :         
     102         510 :         Double_t xmin = TMath::Max(a.LeftBorder(),b.LeftBorder());
     103         510 :   Double_t xmax = TMath::Min(a.RightBorder(),b.RightBorder());
     104         510 :   Double_t ymin = TMath::Max(a.DownBorder(),b.DownBorder());
     105         510 :   Double_t ymax = TMath::Min(a.UpBorder(),b.UpBorder());
     106        1020 :   AliMpArea c( (xmin+xmax)/2.0, (ymin+ymax)/2.0 ,
     107         510 :                (xmax-xmin)/2.0, (ymax-ymin)/2.0 );
     108             :         
     109        2550 :   AliDebug(4,Form("a intersect b = (%7.2f,%7.2f;%7.2f,%7.2f)",
     110             :                                                                         c.LeftBorder(),c.DownBorder(),c.RightBorder(),c.UpBorder()));
     111             :   return c;
     112        1020 : }
     113             : 
     114             : //_____________________________________________________________________________
     115             : Bool_t
     116             : AliMpSlatPadIterator::Prepare(const AliMpArea& area)
     117             : {
     118             :   ///
     119             :   /// Split area into smaller area intersecting pcbs,
     120             :   /// and allocate the corresponding delegate iterators.
     121             :         
     122        1326 :   for ( Int_t i = 0; i < fkSlat->GetSize(); ++i )
     123             :         {
     124         510 :                 const AliMpPCB* pcb = fkSlat->GetPCB(i);
     125         510 :                 AliMpArea pcbArea(pcb->Area());
     126         510 :                 AliMpArea zone = Intersect(pcbArea,area);
     127        2550 :                 AliDebug(3,Form("i=%2d zone is %7.2f,%7.2f->%7.2f,%7.2f %d",i,
     128             :                                                                                 zone.LeftBorder(),zone.DownBorder(),
     129             :                                                                                 zone.RightBorder(),zone.UpBorder(),
     130             :                                                                                 zone.IsValid()));
     131         510 :                 if ( zone.IsValid() )
     132             :                 {
     133         330 :                         fDelegates.AddLast(new AliMpPCBPadIterator(fkSlat,zone));
     134             :                 }
     135         510 :         }
     136         306 :   AliDebug(3,Form("Number of delegates = %d",fDelegates.GetEntries()));
     137             : //  StdoutToAliDebug(3,fDelegates.Print(););
     138         102 :   return fDelegates.GetLast()>=0;
     139           0 : }
     140             : 
     141             : //_____________________________________________________________________________
     142             : AliMpPad
     143             : AliMpSlatPadIterator::CurrentItem() const
     144             : {
     145             :   ///
     146             :   /// Returns the current pad of the iteration.
     147             :   ///
     148        2762 :   if ( fCurrentDelegate )
     149             :         {
     150        1381 :                 return fCurrentDelegate->CurrentItem();
     151             :         }
     152             :   else
     153             :         {
     154           0 :                 return AliMpPad::Invalid();
     155             :         }
     156        1381 : }
     157             : 
     158             : //_____________________________________________________________________________
     159             : void
     160             : AliMpSlatPadIterator::First()
     161             : {
     162             :   ///
     163             :   /// (Re)starts the iteration.
     164             :   ///
     165         204 :   if ( fDelegates.GetLast() < 0 )
     166             :         {
     167           0 :                 AliError("Iterator is not valid, as it gets no delegates at all !");
     168           0 :         }
     169             :   else
     170             :         {
     171         102 :                 fCurrentDelegateIndex = 0;
     172         102 :                 fCurrentDelegate = static_cast<AliMpVPadIterator*>(fDelegates.At(0));
     173         102 :                 fCurrentDelegate->First();
     174             :         }
     175         102 : }
     176             : 
     177             : //_____________________________________________________________________________
     178             : void
     179             : AliMpSlatPadIterator::Invalidate()
     180             : {
     181             :   ///
     182             :   /// Make the iterator invalid.
     183             :   ///
     184         204 :   fDelegates.Delete();
     185         102 :   fCurrentDelegate = 0;
     186         102 :   fCurrentDelegateIndex = 0;
     187         102 : }
     188             : 
     189             : //_____________________________________________________________________________
     190             : Bool_t
     191             : AliMpSlatPadIterator::IsDone() const
     192             : {
     193             :   ///
     194             :   /// Returns whether the iteration is ended or not.
     195             :   ///
     196        8898 :   return ( !fCurrentDelegate ||
     197        2966 :                                          ( fCurrentDelegateIndex > fDelegates.GetLast() && 
     198         102 :                                                  fCurrentDelegate->IsDone() ) );
     199             : }
     200             : 
     201             : //_____________________________________________________________________________
     202             : void
     203             : AliMpSlatPadIterator::Next()
     204             : {
     205             :   ///
     206             :   /// Next step of the iteration.
     207             :   ///
     208        2762 :   if (IsDone()) return;
     209             :         
     210        1381 :   fCurrentDelegate->Next();
     211             :         
     212        1381 :   if ( fCurrentDelegate->IsDone() )
     213             :         {
     214         330 :                 AliDebug(3,"Moving to next delegate");
     215         110 :                 ++fCurrentDelegateIndex;
     216         110 :                 if ( fCurrentDelegateIndex <= fDelegates.GetLast() )
     217             :                 {
     218           8 :                         fCurrentDelegate = static_cast<AliMpVPadIterator*>(fDelegates.At(fCurrentDelegateIndex));
     219           8 :                         fCurrentDelegate->First();
     220           8 :                 }
     221             :         }
     222        1381 : }

Generated by: LCOV version 1.11