/**************************************************************************
 * 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$ */
//_________________________________________________________________________
//  A RecPoint (cluster) in the PPSD 
//  A PPSD RecPoint ends up to be a single digit
//  Why should I put meaningless comments
//  just to satisfy
//  the code checker                
//                
//*--  Yves Schutz (SUBATECH)

// --- ROOT system ---

#include "TPad.h"

// --- Standard library ---

#include <iostream.h>

// --- AliRoot header files ---

#include "AliPHOSGeometry.h"
#include "AliPHOSPpsdRecPoint.h"
#include "AliPHOSCpvRecPoint.h"
#include "AliRun.h"

ClassImp(AliPHOSPpsdRecPoint)

//____________________________________________________________________________
 AliPHOSPpsdRecPoint::AliPHOSPpsdRecPoint(void)
{ 
  // ctor

  fMulDigit = 0 ;  
  fGeom = AliPHOSGeometry::GetInstance() ;  
  fLocPos.SetX(1000000.)  ;      //Local position should be evaluated
}

//____________________________________________________________________________
 void AliPHOSPpsdRecPoint::AddDigit(AliPHOSDigit & digit, Float_t Energy)
{
  // adds a digit to the digits list
  // and accumulates the total amplitude and the multiplicity 
  
  
  if ( fMulDigit >= fMaxDigit ) { // increase the size of the lists 
    fMaxDigit*=2 ; 
    int * tempo = new ( int[fMaxDigit] ) ; 
    Int_t index ; 
    
    for ( index = 0 ; index < fMulDigit ; index++ )
      tempo[index] = fDigitsList[index] ;
    
    delete []  fDigitsList ; 
    fDigitsList =  new ( int[fMaxDigit] ) ;
   
    for ( index = 0 ; index < fMulDigit ; index++ )
      fDigitsList[index] = tempo[index] ;
 
    delete [] tempo ;
  }

  fDigitsList[fMulDigit++]  =  digit.GetIndexInList() ; 
  fAmp += Energy ; 
  EvalPHOSMod(&digit) ;
}

//____________________________________________________________________________
 Int_t AliPHOSPpsdRecPoint::Compare(const TObject * obj) const
{
  // Compares according to the position
  Float_t delta = 1 ; //width of the "Sorting row"

  Int_t rv ; 
  
  if( (strcmp(obj->ClassName() , "AliPHOSPpsdRecPoint" )) == 0)  // PPSD Rec Point
    {
     AliPHOSPpsdRecPoint * clu = (AliPHOSPpsdRecPoint *)obj ; 

     Float_t x1 , z1 ;    //This rec point
     Float_t x2 , z2 ;    //
     
     Int_t phosmod1 ;
     Int_t phosmod2 ;
     
     Int_t up1 ;
     Int_t up2 ; 
  
     if(GetUp()) // upper layer
       up1 = 0 ; 
     else        // lower layer
       up1 = 1 ;       
     
     if(clu->GetUp()) // upper layer
       up2 = 0 ; 
     else            // lower layer
       up2 = 1 ;       

     TVector3 posloc ;
     GetLocalPosition(posloc) ;
     x1 = posloc.X() ;
     z1 = posloc.Z() ; 
     phosmod1 = GetPHOSMod();  
     clu->GetLocalPosition(posloc) ;
     x2 = posloc.X() ;
     z2 = posloc.Z() ; 
     phosmod2 = clu->GetPHOSMod();
     
     if(phosmod1 == phosmod2 ) {
       
       if(up1 == up2 ){
	 Int_t rowdif = (Int_t)TMath::Ceil(x1/delta) - (Int_t) TMath::Ceil(x2/delta) ;
	 
	 if (rowdif> 0) 
	   rv = 1 ;
	 else if(rowdif < 0) 
	   rv = -1 ;
	 else if(z1>z2) 
	   rv = -1 ;
	 else 
	   rv = 1 ; 
       }
       
       else {
	 
	 if(up1 < up2 ) // Upper level first (up = True or False, True > False)
	   rv = -1 ;   
	 else 
	   rv = 1 ;
       }
       
     } // if phosmod1 == phosmod2
     
     else {
       
       if(phosmod1 < phosmod2 ) 
	 rv = -1 ;
       else 
	 rv = 1 ;
       
     }
     
     return rv ;      
    }
  else
    {
      AliPHOSCpvRecPoint * clu  = (AliPHOSCpvRecPoint *) obj ;   
      if(GetPHOSMod()  < clu->GetPHOSMod() ) 
	rv = -1 ;
      else 
	rv = 1 ;
      return rv ;
    }

  
}

//____________________________________________________________________________
 void AliPHOSPpsdRecPoint::EvalAll(Float_t logWeight,TClonesArray * digits ){
  AliPHOSRecPoint::EvalAll(logWeight,digits) ;
  EvalLocalPosition(logWeight,digits) ;
  EvalUp(digits) ;
}

//____________________________________________________________________________
 void AliPHOSPpsdRecPoint::EvalLocalPosition(Float_t logWeight,TClonesArray * digits )
{
  // Calculates the local position in the PHOS-PPSD-module corrdinates
  
  Int_t relid[4] ;

  Float_t x = 0. ;
  Float_t z = 0. ;

  AliPHOSGeometry * phosgeom = (AliPHOSGeometry *) fGeom ;
  
  AliPHOSDigit * digit ;
  Int_t iDigit;

  for(iDigit = 0; iDigit < fMulDigit; iDigit++) {
    digit = (AliPHOSDigit *) digits->At(fDigitsList[iDigit]) ; 
 
    Float_t xi ;
    Float_t zi ;
    phosgeom->AbsToRelNumbering(digit->GetId(), relid) ;
    phosgeom->RelPosInModule(relid, xi, zi);
    x += xi ;
    z += zi ;
  }

  x /= fMulDigit ;
  z /= fMulDigit ;

  fLocPos.SetX(x)  ;
  fLocPos.SetY(0.) ;
  fLocPos.SetZ(z)  ;

}

//____________________________________________________________________________
 void AliPHOSPpsdRecPoint::EvalUp(TClonesArray * digits)
{
  // Are we in the uper PPSD module ?

  Int_t relid[4] ;
  
  AliPHOSGeometry * phosgeom = (AliPHOSGeometry *) fGeom ;
  
  
  AliPHOSDigit *digit = (AliPHOSDigit *) digits->At(fDigitsList[0]) ; 
  
  phosgeom->AbsToRelNumbering(digit->GetId(),relid);

  if((Int_t)TMath::Ceil((Float_t)relid[1]/
			(phosgeom->GetNumberOfModulesPhi()*phosgeom->GetNumberOfModulesZ())-0.0001 ) > 1) 
    fUp = kFALSE ;
  else  
    fUp = kTRUE ;
  
}
//______________________________________________________________________________
 void AliPHOSPpsdRecPoint::Paint(Option_t *)
{
  //*-*-*-*-*-*-*-*-*-*-*Paint this ALiRecPoint as a TMarker  with its current attributes*-*-*-*-*-*-*
  //*-*                  =============================================

  TVector3 pos(0.,0.,0.) ;
  GetLocalPosition(pos) ;
  Coord_t x = pos.X() ;
  Coord_t y = pos.Z() ;
  Color_t markercolor = 1 ;
  Size_t  markersize  = 1. ;
  Style_t markerstyle = 2 ;
  if (GetUp()) 
    markerstyle = 3 ;
  
  if (!gPad->IsBatch()) {
    gVirtualX->SetMarkerColor(markercolor);
    gVirtualX->SetMarkerSize (markersize);
    gVirtualX->SetMarkerStyle(markerstyle);
  }
  gPad->SetAttMarkerPS(markercolor,markerstyle,markersize);
  gPad->PaintPolyMarker(1,&x,&y,"");
  
  
}

//____________________________________________________________________________
 void AliPHOSPpsdRecPoint::Print(Option_t * option) 
{
  // Print the digits information 
  
  cout << "AliPHOSPpsdRecPoint: " << endl ;
  
  Int_t iDigit; 
  cout << " Digit{s} # " ; 
  for(iDigit=0; iDigit<fMulDigit; iDigit++) 
    cout  << fDigitsList[iDigit] << "  " ;  
  cout << endl   ;  

  cout << "       Multiplicity    = " << fMulDigit  << endl ;
  cout << "       Stored at position " << fIndexInList << endl ; 
}




ROOT page - Class index - Top of the page

This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.