ROOT logo
/**************************************************************************
 * 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$ */

/* History of cvs commits:
 *
 * $Log$
 * Revision 1.111  2007/07/24 09:41:19  morsch
 * AliStack included for kKeepBit.
 *
 * Revision 1.110  2007/03/10 08:58:52  kharlov
 * Protection for noCPV geometry
 *
 * Revision 1.109  2007/03/01 11:37:37  kharlov
 * Strip units changed from 8x1 to 8x2 (T.Pocheptsov)
 *
 * Revision 1.108  2007/02/02 09:40:50  alibrary
 * Includes required by ROOT head
 *
 * Revision 1.107  2007/02/01 10:34:47  hristov
 * Removing warnings on Solaris x86
 *
 * Revision 1.106  2006/11/14 17:11:15  hristov
 * Removing inheritances from TAttLine, TAttMarker and AliRndm in AliModule. The copy constructor and assignment operators are moved to the private part of the class and not implemented. The corresponding changes are propagated to the detectors
 *
 * Revision 1.105  2006/09/13 07:31:01  kharlov
 * Effective C++ corrections (T.Pocheptsov)
 *
 * Revision 1.104  2005/05/28 14:19:05  schutz
 * Compilation warnings fixed by T.P.
 *
 */

//_________________________________________________________________________
// Implementation version v1 of PHOS Manager class 
//---
//---
// Layout EMC + CPV  has name IHEP:
// Produces hits for CPV, cumulated hits
//---
//---
//*-- Author: Yves Schutz (SUBATECH)


// --- ROOT system ---
#include <TClonesArray.h>
#include <TParticle.h>
#include <TVirtualMC.h>

// --- Standard library ---


// --- AliRoot header files ---
#include "AliPHOSCPVDigit.h"
#include "AliPHOSGeometry.h"
#include "AliPHOSHit.h"
#include "AliPHOSv1.h"
#include "AliRun.h"
#include "AliMC.h"
#include "AliStack.h"
#include "AliPHOSSimParam.h"

ClassImp(AliPHOSv1)

//____________________________________________________________________________
AliPHOSv1::AliPHOSv1() : fCPVDigits("AliPHOSCPVDigit",20)
{
  //Def ctor.
}

//____________________________________________________________________________
AliPHOSv1::AliPHOSv1(const char *name, const char *title):
  AliPHOSv0(name,title), fCPVDigits("AliPHOSCPVDigit",20)
{
  //
  // We store hits :
  //   - fHits (the "normal" one), which retains the hits associated with
  //     the current primary particle being tracked
  //     (this array is reset after each primary has been tracked).
  //



  // We do not want to save in TreeH the raw hits
  // But save the cumulated hits instead (need to create the branch myself)
  // It is put in the Digit Tree because the TreeH is filled after each primary
  // and the TreeD at the end of the event (branch is set in FinishEvent() ). 
  
  fHits= new TClonesArray("AliPHOSHit",1000) ;
//   fCPVDigits("AliPHOSCPVDigit",20);
  gAlice->GetMCApp()->AddHitList(fHits) ; 

  fNhits = 0 ;

  fIshunt     =  2 ; // All hits are associated with primary particles
}

//____________________________________________________________________________
AliPHOSv1::~AliPHOSv1()
{
  // dtor
 if ( fHits) {
    fHits->Delete() ; 
    delete fHits ;
    fHits = 0 ; 
 }
}

//____________________________________________________________________________
void AliPHOSv1::AddHit(Int_t shunt, Int_t primary, Int_t Id, Float_t * hits)
{
  // Add a hit to the hit list.
  // A PHOS hit is the sum of all hits in a single crystal from one primary and within some time gate

  Int_t hitCounter ;
  AliPHOSHit *newHit ;
  AliPHOSHit *curHit ;
  Bool_t deja = kFALSE ;
  AliPHOSGeometry * geom = GetGeometry() ; 

  newHit = new AliPHOSHit(shunt, primary, Id, hits) ;

  for ( hitCounter = fNhits-1 ; hitCounter >= 0 && !deja ; hitCounter-- ) {
    curHit = static_cast<AliPHOSHit*>((*fHits)[hitCounter]) ;
    if(curHit->GetPrimary() != primary) break ; 
           // We add hits with the same primary, while GEANT treats primaries succesively 
    if( *curHit == *newHit ) {
      *curHit + *newHit ;
      deja = kTRUE ;
    }
  }
         
  if ( !deja ) {
    new((*fHits)[fNhits]) AliPHOSHit(*newHit) ;
    // get the block Id number
    Int_t relid[4] ;
    geom->AbsToRelNumbering(Id, relid) ;

    fNhits++ ;
  }
  
  delete newHit;
}

//____________________________________________________________________________
void AliPHOSv1::FinishPrimary() 
{
  // called at the end of each track (primary) by AliRun
  // hits are reset for each new track
  // accumulate the total hit-multiplicity

}

//____________________________________________________________________________
void AliPHOSv1::FinishEvent() 
{
  // called at the end of each event by AliRun
  // accumulate the hit-multiplicity and total energy per block 
  // if the values have been updated check it
  
  AliDetector::FinishEvent(); 
}
//____________________________________________________________________________
void AliPHOSv1::StepManager(void)
{
   // Accumulates hits as long as the track stays in a single crystal or CPV gas Cell

  Int_t          relid[4] ;           // (box, layer, row, column) indices
  Int_t          absid    ;           // absolute cell ID number
  Float_t        xyzte[5]={-1000.,-1000.,-1000.,0.,0.}  ; // position wrt MRS, time and energy deposited
  TLorentzVector pos      ;           // Lorentz vector of the track current position
  Int_t          copy     ;

  Int_t moduleNumber ;
  
  static Int_t idPCPQ = -1;
  if (strstr(fTitle.Data(),"noCPV") == 0) 
    idPCPQ = TVirtualMC::GetMC()->VolId("PCPQ");

  if( TVirtualMC::GetMC()->CurrentVolID(copy) == idPCPQ &&
     (TVirtualMC::GetMC()->IsTrackEntering() ) &&
      TVirtualMC::GetMC()->TrackCharge() != 0) {      
    
    TVirtualMC::GetMC() -> TrackPosition(pos);

    Float_t xyzm[3], xyzd[3] ;
    Int_t i;
    for (i=0; i<3; i++) xyzm[i] = pos[i];
    TVirtualMC::GetMC() -> Gmtod (xyzm, xyzd, 1);    // transform coordinate from master to daughter system    


    Float_t        xyd[3]={0,0,0}   ;   //local position of the entering
    xyd[0]  = xyzd[0];
    xyd[1]  =-xyzd[2];
    xyd[2]  =-xyzd[1];
    
    // Current momentum of the hit's track in the local ref. system
    TLorentzVector pmom     ;        //momentum of the particle initiated hit
    TVirtualMC::GetMC() -> TrackMomentum(pmom);
    Float_t pm[3], pd[3];
    for (i=0; i<3; i++)  
      pm[i]   = pmom[i];
    
    TVirtualMC::GetMC() -> Gmtod (pm, pd, 2);        // transform 3-momentum from master to daughter system
    pmom[0] = pd[0];
    pmom[1] =-pd[1];
    pmom[2] =-pd[2];

    // Digitize the current CPV hit:
    
    // 1. find pad response and    
    TVirtualMC::GetMC()->CurrentVolOffID(3,moduleNumber);
    moduleNumber--;
    
//     TClonesArray *cpvDigits = new TClonesArray("AliPHOSCPVDigit",0);   // array of digits for current hit
    CPVDigitize(pmom,xyd,&fCPVDigits);
      
    Float_t xmean = 0;
    Float_t zmean = 0;
    Float_t qsum  = 0;
    Int_t   idigit,ndigits;
    
    // 2. go through the current digit list and sum digits in pads
    
    ndigits = fCPVDigits.GetEntriesFast();
    for (idigit=0; idigit<ndigits-1; idigit++) {
      AliPHOSCPVDigit  *cpvDigit1 = static_cast<AliPHOSCPVDigit*>(fCPVDigits.UncheckedAt(idigit));
      Float_t x1 = cpvDigit1->GetXpad() ;
      Float_t z1 = cpvDigit1->GetYpad() ;
      for (Int_t jdigit=idigit+1; jdigit<ndigits; jdigit++) {
	AliPHOSCPVDigit  *cpvDigit2 = static_cast<AliPHOSCPVDigit*>(fCPVDigits.UncheckedAt(jdigit));
	Float_t x2 = cpvDigit2->GetXpad() ;
	Float_t z2 = cpvDigit2->GetYpad() ;
	if (x1==x2 && z1==z2) {
	  Float_t qsumpad = cpvDigit1->GetQpad() + cpvDigit2->GetQpad() ;
	  cpvDigit2->SetQpad(qsumpad) ;
	  fCPVDigits.RemoveAt(idigit) ;
	}
      }
    }
    fCPVDigits.Compress() ;
    
    // 3. add digits to temporary hit list fTmpHits
    
    ndigits = fCPVDigits.GetEntriesFast();
    for (idigit=0; idigit<ndigits; idigit++) {
      AliPHOSCPVDigit  *cpvDigit = static_cast<AliPHOSCPVDigit*>(fCPVDigits.UncheckedAt(idigit));
      relid[0] = moduleNumber + 1 ;                             // CPV (or PHOS) module number
      relid[1] =-1 ;                                            // means CPV
      relid[2] = cpvDigit->GetXpad() ;                          // column number of a pad
      relid[3] = cpvDigit->GetYpad() ;                          // row    number of a pad
      
      // get the absolute Id number
      GetGeometry()->RelToAbsNumbering(relid, absid) ; 
      
      // add current digit to the temporary hit list

      xyzte[3] = TVirtualMC::GetMC()->TrackTime() ;
      xyzte[4] = cpvDigit->GetQpad() ;                          // amplitude in a pad

      Int_t primary  =  gAlice->GetMCApp()->GetPrimary( gAlice->GetMCApp()->GetCurrentTrackNumber() ); 
      AddHit(fIshunt, primary, absid, xyzte);  
      
      if (cpvDigit->GetQpad() > 0.02) {
	xmean += cpvDigit->GetQpad() * (cpvDigit->GetXpad() + 0.5);
	zmean += cpvDigit->GetQpad() * (cpvDigit->GetYpad() + 0.5);
	qsum  += cpvDigit->GetQpad();
      }
    }
    fCPVDigits.Clear();
  }

 
  static Int_t idPXTL = TVirtualMC::GetMC()->VolId("PXTL");  
  if(TVirtualMC::GetMC()->CurrentVolID(copy) == idPXTL ) { //  We are inside a PBWO crystal

    TVirtualMC::GetMC()->TrackPosition(pos) ;
    xyzte[0] = pos[0] ;
    xyzte[1] = pos[1] ;
    xyzte[2] = pos[2] ;

    Float_t lostenergy = TVirtualMC::GetMC()->Edep(); 
    
    //Put in the TreeK particle entering PHOS and all its parents
    if ( TVirtualMC::GetMC()->IsTrackEntering() ){
      Float_t xyzd[3] ;
      TVirtualMC::GetMC() -> Gmtod (xyzte, xyzd, 1);    // transform coordinate from master to daughter system    
      if (xyzd[1] < -GetGeometry()->GetCrystalSize(1)/2.+0.1){   //Entered close to forward surface  
	Int_t parent = gAlice->GetMCApp()->GetCurrentTrackNumber() ; 
	TParticle * part = gAlice->GetMCApp()->Particle(parent) ; 
	Float_t vert[3],vertd[3] ;
	vert[0]=part->Vx() ;
	vert[1]=part->Vy() ;
	vert[2]=part->Vz() ;
	TVirtualMC::GetMC() -> Gmtod (vert, vertd, 1);    // transform coordinate from master to daughter system
	if(vertd[1]<-GetGeometry()->GetCrystalSize(1)/2.-0.1){ //Particle is created in foront of PHOS 
	                                                       //0.1 to get rid of numerical errors 
	  part->SetBit(kKeepBit);
	  while ( parent != -1 ) {
	    part = gAlice->GetMCApp()->Particle(parent) ; 
	    part->SetBit(kKeepBit);
	    parent = part->GetFirstMother() ; 
	  }
	}
      }
    }
    if ( lostenergy != 0 ) {  // Track is inside the crystal and deposits some energy 
      xyzte[3] = TVirtualMC::GetMC()->TrackTime() ;     
      
      TVirtualMC::GetMC()->CurrentVolOffID(10, moduleNumber) ; // get the PHOS module number ;
      
      Int_t strip ;
      TVirtualMC::GetMC()->CurrentVolOffID(3, strip);
      Int_t cell ;
      TVirtualMC::GetMC()->CurrentVolOffID(2, cell);

      //Old formula for row is wrong. For example, I have strip 56 (28 for 2 x 8), row must be 1.
      //But row == 1 + 56 - 56 % 56 == 57 (row == 1 + 28 - 28 % 28 == 29)
      //Int_t row = 1 + GetGeometry()->GetEMCAGeometry()->GetNStripZ() - strip % (GetGeometry()->GetEMCAGeometry()->GetNStripZ()) ;
      Int_t row = GetGeometry()->GetEMCAGeometry()->GetNStripZ() - (strip - 1) % (GetGeometry()->GetEMCAGeometry()->GetNStripZ()) ;
      Int_t col = (Int_t) TMath::Ceil((Double_t) strip/(GetGeometry()->GetEMCAGeometry()->GetNStripZ())) -1 ;

      // Absid for 8x2-strips. Looks nice :) 
      absid = (moduleNumber-1)*GetGeometry()->GetNCristalsInModule() + 
	            row * 2 + (col*GetGeometry()->GetEMCAGeometry()->GetNCellsXInStrip() + (cell - 1) / 2)*GetGeometry()->GetNZ() - (cell & 1 ? 1 : 0);

      
      //Calculates the light yield, the number of photons produced in the
      //crystal 
      //There is no dependence of reponce on distance from energy deposition to APD
      Float_t lightYield = gRandom->Poisson(AliPHOSSimParam::GetInstance()->GetLightFactor() * lostenergy) ;

      //Calculates de energy deposited in the crystal  
      xyzte[4] = AliPHOSSimParam::GetInstance()->GetAPDFactor() * lightYield ;
      
      Int_t primary ;
      if(fIshunt == 2){
	primary = gAlice->GetMCApp()->GetCurrentTrackNumber() ;
	TParticle * part = gAlice->GetMCApp()->Particle(primary) ;
	while ( !part->TestBit(kKeepBit) ) {
	  primary = part->GetFirstMother() ;
	  if(primary == -1){	    
	    primary  =  gAlice->GetMCApp()->GetPrimary( gAlice->GetMCApp()->GetCurrentTrackNumber() ); 
	    break ; //there is a possibility that particle passed e.g. thermal isulator and hits a side 
	  //surface of the crystal. In this case it may have no primary at all. 
	  //We can not easily separate this case from the case when this is part of the shower, 
	  //developed in the neighboring crystal.
	  }
	  part = gAlice->GetMCApp()->Particle(primary) ;
	}
      }
      else{
	primary  =  gAlice->GetMCApp()->GetPrimary( gAlice->GetMCApp()->GetCurrentTrackNumber() ); 
      }
      
      // add current hit to the hit list
      // Info("StepManager","%d %d", primary, tracknumber) ; 
      AddHit(fIshunt, primary, absid, xyzte);
        
    } // there is deposited energy
  } // we are inside a PHOS Xtal
  
}

//____________________________________________________________________________
void AliPHOSv1::CPVDigitize (TLorentzVector p, Float_t *zxhit, TClonesArray *cpvDigits)
{
  // ------------------------------------------------------------------------
  // Digitize one CPV hit:
  // On input take exact 4-momentum p and position zxhit of the hit,
  // find the pad response around this hit and
  // put the amplitudes in the pads into array digits
  //
  // Author: Yuri Kharlov (after Serguei Sadovsky)
  // 2 October 2000
  // ------------------------------------------------------------------------

  const Float_t kCelWr  = GetGeometry()->GetPadSizePhi()/2;  // Distance between wires (2 wires above 1 pad)
  const Float_t kDetR   = 0.1;     // Relative energy fluctuation in track for 100 e-
  const Float_t kdEdx   = 4.0;     // Average energy loss in CPV;
  const Int_t   kNgamz  = 5;       // Ionization size in Z
  const Int_t   kNgamx  = 9;       // Ionization size in Phi
  const Float_t kNoise = 0.03;    // charge noise in one pad

  Float_t rnor1,rnor2;

  // Just a reminder on axes notation in the CPV module:
  // axis Z goes along the beam
  // axis X goes across the beam in the module plane
  // axis Y is a normal to the module plane showing from the IP

  Float_t hitX  = zxhit[0];
  Float_t hitZ  =-zxhit[1];
  Float_t pX    = p.Px();
  Float_t pZ    =-p.Pz();
  Float_t pNorm = p.Py();
  Float_t eloss = kdEdx;

  Float_t dZY   = pZ/pNorm * GetGeometry()->GetCPVGasThickness();
  Float_t dXY   = pX/pNorm * GetGeometry()->GetCPVGasThickness();
  gRandom->Rannor(rnor1,rnor2);
  eloss *= (1 + kDetR*rnor1) *
           TMath::Sqrt((1 + ( pow(dZY,2) + pow(dXY,2) ) / pow(GetGeometry()->GetCPVGasThickness(),2)));
  Float_t zhit1 = hitZ + GetGeometry()->GetCPVActiveSize(1)/2 - dZY/2;
  Float_t xhit1 = hitX + GetGeometry()->GetCPVActiveSize(0)/2 - dXY/2;
  Float_t zhit2 = zhit1 + dZY;
  Float_t xhit2 = xhit1 + dXY;

  Int_t   iwht1 = (Int_t) (xhit1 / kCelWr);           // wire (x) coordinate "in"
  Int_t   iwht2 = (Int_t) (xhit2 / kCelWr);           // wire (x) coordinate "out"

  Int_t   nIter;
  Float_t zxe[3][5];
  if (iwht1==iwht2) {                      // incline 1-wire hit
    nIter = 2;
    zxe[0][0] = (zhit1 + zhit2 - dZY*0.57735) / 2;
    zxe[1][0] = (iwht1 + 0.5) * kCelWr;
    zxe[2][0] =  eloss/2;
    zxe[0][1] = (zhit1 + zhit2 + dZY*0.57735) / 2;
    zxe[1][1] = (iwht1 + 0.5) * kCelWr;
    zxe[2][1] =  eloss/2;
  }
  else if (TMath::Abs(iwht1-iwht2) != 1) { // incline 3-wire hit
    nIter = 3;
    Int_t iwht3 = (iwht1 + iwht2) / 2;
    Float_t xwht1 = (iwht1 + 0.5) * kCelWr; // wire 1
    Float_t xwht2 = (iwht2 + 0.5) * kCelWr; // wire 2
    Float_t xwht3 = (iwht3 + 0.5) * kCelWr; // wire 3
    Float_t xwr13 = (xwht1 + xwht3) / 2;   // center 13
    Float_t xwr23 = (xwht2 + xwht3) / 2;   // center 23
    Float_t dxw1  = xhit1 - xwr13;
    Float_t dxw2  = xhit2 - xwr23;
    Float_t egm1  = TMath::Abs(dxw1) / ( TMath::Abs(dxw1) + TMath::Abs(dxw2) + kCelWr );
    Float_t egm2  = TMath::Abs(dxw2) / ( TMath::Abs(dxw1) + TMath::Abs(dxw2) + kCelWr );
    Float_t egm3  =           kCelWr / ( TMath::Abs(dxw1) + TMath::Abs(dxw2) + kCelWr );
    zxe[0][0] = (dXY*(xwr13-xwht1)/dXY + zhit1 + zhit1) / 2;
    zxe[1][0] =  xwht1;
    zxe[2][0] =  eloss * egm1;
    zxe[0][1] = (dXY*(xwr23-xwht1)/dXY + zhit1 + zhit2) / 2;
    zxe[1][1] =  xwht2;
    zxe[2][1] =  eloss * egm2;
    zxe[0][2] =  dXY*(xwht3-xwht1)/dXY + zhit1;
    zxe[1][2] =  xwht3;
    zxe[2][2] =  eloss * egm3;
  }
  else {                                   // incline 2-wire hit
    nIter = 2;
    Float_t xwht1 = (iwht1 + 0.5) * kCelWr;
    Float_t xwht2 = (iwht2 + 0.5) * kCelWr;
    Float_t xwr12 = (xwht1 + xwht2) / 2;
    Float_t dxw1  = xhit1 - xwr12;
    Float_t dxw2  = xhit2 - xwr12;
    Float_t egm1  = TMath::Abs(dxw1) / ( TMath::Abs(dxw1) + TMath::Abs(dxw2) );
    Float_t egm2  = TMath::Abs(dxw2) / ( TMath::Abs(dxw1) + TMath::Abs(dxw2) );
    zxe[0][0] = (zhit1 + zhit2 - dZY*egm1) / 2;
    zxe[1][0] =  xwht1;
    zxe[2][0] =  eloss * egm1;
    zxe[0][1] = (zhit1 + zhit2 + dZY*egm2) / 2;
    zxe[1][1] =  xwht2;
    zxe[2][1] =  eloss * egm2;
  }

  // Finite size of ionization region

  Int_t nCellZ  = GetGeometry()->GetNumberOfCPVPadsZ();
  Int_t nCellX  = GetGeometry()->GetNumberOfCPVPadsPhi();
  Int_t nz3     = (kNgamz+1)/2;
  Int_t nx3     = (kNgamx+1)/2;
  cpvDigits->Expand(nIter*kNgamx*kNgamz);
  TClonesArray &ldigits = *(static_cast<TClonesArray *>(cpvDigits));

  for (Int_t iter=0; iter<nIter; iter++) {

    Float_t zhit = zxe[0][iter];
    Float_t xhit = zxe[1][iter];
    Float_t qhit = zxe[2][iter];
    Float_t zcell = zhit / GetGeometry()->GetPadSizeZ();
    Float_t xcell = xhit / GetGeometry()->GetPadSizePhi();
    if ( zcell<=0      || xcell<=0 ||
	 zcell>=nCellZ || xcell>=nCellX) return;
    Int_t izcell = (Int_t) zcell;
    Int_t ixcell = (Int_t) xcell;
    Float_t zc = zcell - izcell - 0.5;
    Float_t xc = xcell - ixcell - 0.5;
    for (Int_t iz=1; iz<=kNgamz; iz++) {
      Int_t kzg = izcell + iz - nz3;
      if (kzg<=0 || kzg>nCellZ) continue;
      Float_t zg = (Float_t)(iz-nz3) - zc;
      for (Int_t ix=1; ix<=kNgamx; ix++) {
	Int_t kxg = ixcell + ix - nx3;
	if (kxg<=0 || kxg>nCellX) continue;
	Float_t xg = (Float_t)(ix-nx3) - xc;
	
	// Now calculate pad response
	Float_t qpad = CPVPadResponseFunction(qhit,zg,xg);
	qpad += kNoise*rnor2;
	if (qpad<0) continue;
	
	// Fill the array with pad response ID and amplitude
	new(ldigits[cpvDigits->GetEntriesFast()]) AliPHOSCPVDigit(kxg,kzg,qpad);
      }
    }
  }
}

//____________________________________________________________________________
Float_t AliPHOSv1::CPVPadResponseFunction(Float_t qhit, Float_t zhit, Float_t xhit) {
  // ------------------------------------------------------------------------
  // Calculate the amplitude in one CPV pad using the
  // cumulative pad response function
  // Author: Yuri Kharlov (after Serguei Sadovski)
  // 3 October 2000
  // ------------------------------------------------------------------------

  Double_t dz = GetGeometry()->GetPadSizeZ()   / 2;
  Double_t dx = GetGeometry()->GetPadSizePhi() / 2;
  Double_t z  = zhit * GetGeometry()->GetPadSizeZ();
  Double_t x  = xhit * GetGeometry()->GetPadSizePhi();
  Double_t amplitude = qhit *
    (CPVCumulPadResponse(z+dz,x+dx) - CPVCumulPadResponse(z+dz,x-dx) -
     CPVCumulPadResponse(z-dz,x+dx) + CPVCumulPadResponse(z-dz,x-dx));
  return (Float_t)amplitude;
}

//____________________________________________________________________________
Double_t AliPHOSv1::CPVCumulPadResponse(Double_t x, Double_t y) {
  // ------------------------------------------------------------------------
  // Cumulative pad response function
  // It includes several terms from the CF decomposition in electrostatics
  // Note: this cumulative function is wrong since omits some terms
  //       but the cell amplitude obtained with it is correct because
  //       these omitting terms cancel
  // Author: Yuri Kharlov (after Serguei Sadovski)
  // 3 October 2000
  // ------------------------------------------------------------------------

  const Double_t kA=1.0;
  const Double_t kB=0.7;

  Double_t r2       = x*x + y*y;
  Double_t xy       = x*y;
  Double_t cumulPRF = 0;
  for (Int_t i=0; i<=4; i++) {
    Double_t b1 = (2*i + 1) * kB;
    cumulPRF += TMath::Power(-1,i) * TMath::ATan( xy / (b1*TMath::Sqrt(b1*b1 + r2)) );
  }
  cumulPRF *= kA/(2*TMath::Pi());
  return cumulPRF;
}

 AliPHOSv1.cxx:1
 AliPHOSv1.cxx:2
 AliPHOSv1.cxx:3
 AliPHOSv1.cxx:4
 AliPHOSv1.cxx:5
 AliPHOSv1.cxx:6
 AliPHOSv1.cxx:7
 AliPHOSv1.cxx:8
 AliPHOSv1.cxx:9
 AliPHOSv1.cxx:10
 AliPHOSv1.cxx:11
 AliPHOSv1.cxx:12
 AliPHOSv1.cxx:13
 AliPHOSv1.cxx:14
 AliPHOSv1.cxx:15
 AliPHOSv1.cxx:16
 AliPHOSv1.cxx:17
 AliPHOSv1.cxx:18
 AliPHOSv1.cxx:19
 AliPHOSv1.cxx:20
 AliPHOSv1.cxx:21
 AliPHOSv1.cxx:22
 AliPHOSv1.cxx:23
 AliPHOSv1.cxx:24
 AliPHOSv1.cxx:25
 AliPHOSv1.cxx:26
 AliPHOSv1.cxx:27
 AliPHOSv1.cxx:28
 AliPHOSv1.cxx:29
 AliPHOSv1.cxx:30
 AliPHOSv1.cxx:31
 AliPHOSv1.cxx:32
 AliPHOSv1.cxx:33
 AliPHOSv1.cxx:34
 AliPHOSv1.cxx:35
 AliPHOSv1.cxx:36
 AliPHOSv1.cxx:37
 AliPHOSv1.cxx:38
 AliPHOSv1.cxx:39
 AliPHOSv1.cxx:40
 AliPHOSv1.cxx:41
 AliPHOSv1.cxx:42
 AliPHOSv1.cxx:43
 AliPHOSv1.cxx:44
 AliPHOSv1.cxx:45
 AliPHOSv1.cxx:46
 AliPHOSv1.cxx:47
 AliPHOSv1.cxx:48
 AliPHOSv1.cxx:49
 AliPHOSv1.cxx:50
 AliPHOSv1.cxx:51
 AliPHOSv1.cxx:52
 AliPHOSv1.cxx:53
 AliPHOSv1.cxx:54
 AliPHOSv1.cxx:55
 AliPHOSv1.cxx:56
 AliPHOSv1.cxx:57
 AliPHOSv1.cxx:58
 AliPHOSv1.cxx:59
 AliPHOSv1.cxx:60
 AliPHOSv1.cxx:61
 AliPHOSv1.cxx:62
 AliPHOSv1.cxx:63
 AliPHOSv1.cxx:64
 AliPHOSv1.cxx:65
 AliPHOSv1.cxx:66
 AliPHOSv1.cxx:67
 AliPHOSv1.cxx:68
 AliPHOSv1.cxx:69
 AliPHOSv1.cxx:70
 AliPHOSv1.cxx:71
 AliPHOSv1.cxx:72
 AliPHOSv1.cxx:73
 AliPHOSv1.cxx:74
 AliPHOSv1.cxx:75
 AliPHOSv1.cxx:76
 AliPHOSv1.cxx:77
 AliPHOSv1.cxx:78
 AliPHOSv1.cxx:79
 AliPHOSv1.cxx:80
 AliPHOSv1.cxx:81
 AliPHOSv1.cxx:82
 AliPHOSv1.cxx:83
 AliPHOSv1.cxx:84
 AliPHOSv1.cxx:85
 AliPHOSv1.cxx:86
 AliPHOSv1.cxx:87
 AliPHOSv1.cxx:88
 AliPHOSv1.cxx:89
 AliPHOSv1.cxx:90
 AliPHOSv1.cxx:91
 AliPHOSv1.cxx:92
 AliPHOSv1.cxx:93
 AliPHOSv1.cxx:94
 AliPHOSv1.cxx:95
 AliPHOSv1.cxx:96
 AliPHOSv1.cxx:97
 AliPHOSv1.cxx:98
 AliPHOSv1.cxx:99
 AliPHOSv1.cxx:100
 AliPHOSv1.cxx:101
 AliPHOSv1.cxx:102
 AliPHOSv1.cxx:103
 AliPHOSv1.cxx:104
 AliPHOSv1.cxx:105
 AliPHOSv1.cxx:106
 AliPHOSv1.cxx:107
 AliPHOSv1.cxx:108
 AliPHOSv1.cxx:109
 AliPHOSv1.cxx:110
 AliPHOSv1.cxx:111
 AliPHOSv1.cxx:112
 AliPHOSv1.cxx:113
 AliPHOSv1.cxx:114
 AliPHOSv1.cxx:115
 AliPHOSv1.cxx:116
 AliPHOSv1.cxx:117
 AliPHOSv1.cxx:118
 AliPHOSv1.cxx:119
 AliPHOSv1.cxx:120
 AliPHOSv1.cxx:121
 AliPHOSv1.cxx:122
 AliPHOSv1.cxx:123
 AliPHOSv1.cxx:124
 AliPHOSv1.cxx:125
 AliPHOSv1.cxx:126
 AliPHOSv1.cxx:127
 AliPHOSv1.cxx:128
 AliPHOSv1.cxx:129
 AliPHOSv1.cxx:130
 AliPHOSv1.cxx:131
 AliPHOSv1.cxx:132
 AliPHOSv1.cxx:133
 AliPHOSv1.cxx:134
 AliPHOSv1.cxx:135
 AliPHOSv1.cxx:136
 AliPHOSv1.cxx:137
 AliPHOSv1.cxx:138
 AliPHOSv1.cxx:139
 AliPHOSv1.cxx:140
 AliPHOSv1.cxx:141
 AliPHOSv1.cxx:142
 AliPHOSv1.cxx:143
 AliPHOSv1.cxx:144
 AliPHOSv1.cxx:145
 AliPHOSv1.cxx:146
 AliPHOSv1.cxx:147
 AliPHOSv1.cxx:148
 AliPHOSv1.cxx:149
 AliPHOSv1.cxx:150
 AliPHOSv1.cxx:151
 AliPHOSv1.cxx:152
 AliPHOSv1.cxx:153
 AliPHOSv1.cxx:154
 AliPHOSv1.cxx:155
 AliPHOSv1.cxx:156
 AliPHOSv1.cxx:157
 AliPHOSv1.cxx:158
 AliPHOSv1.cxx:159
 AliPHOSv1.cxx:160
 AliPHOSv1.cxx:161
 AliPHOSv1.cxx:162
 AliPHOSv1.cxx:163
 AliPHOSv1.cxx:164
 AliPHOSv1.cxx:165
 AliPHOSv1.cxx:166
 AliPHOSv1.cxx:167
 AliPHOSv1.cxx:168
 AliPHOSv1.cxx:169
 AliPHOSv1.cxx:170
 AliPHOSv1.cxx:171
 AliPHOSv1.cxx:172
 AliPHOSv1.cxx:173
 AliPHOSv1.cxx:174
 AliPHOSv1.cxx:175
 AliPHOSv1.cxx:176
 AliPHOSv1.cxx:177
 AliPHOSv1.cxx:178
 AliPHOSv1.cxx:179
 AliPHOSv1.cxx:180
 AliPHOSv1.cxx:181
 AliPHOSv1.cxx:182
 AliPHOSv1.cxx:183
 AliPHOSv1.cxx:184
 AliPHOSv1.cxx:185
 AliPHOSv1.cxx:186
 AliPHOSv1.cxx:187
 AliPHOSv1.cxx:188
 AliPHOSv1.cxx:189
 AliPHOSv1.cxx:190
 AliPHOSv1.cxx:191
 AliPHOSv1.cxx:192
 AliPHOSv1.cxx:193
 AliPHOSv1.cxx:194
 AliPHOSv1.cxx:195
 AliPHOSv1.cxx:196
 AliPHOSv1.cxx:197
 AliPHOSv1.cxx:198
 AliPHOSv1.cxx:199
 AliPHOSv1.cxx:200
 AliPHOSv1.cxx:201
 AliPHOSv1.cxx:202
 AliPHOSv1.cxx:203
 AliPHOSv1.cxx:204
 AliPHOSv1.cxx:205
 AliPHOSv1.cxx:206
 AliPHOSv1.cxx:207
 AliPHOSv1.cxx:208
 AliPHOSv1.cxx:209
 AliPHOSv1.cxx:210
 AliPHOSv1.cxx:211
 AliPHOSv1.cxx:212
 AliPHOSv1.cxx:213
 AliPHOSv1.cxx:214
 AliPHOSv1.cxx:215
 AliPHOSv1.cxx:216
 AliPHOSv1.cxx:217
 AliPHOSv1.cxx:218
 AliPHOSv1.cxx:219
 AliPHOSv1.cxx:220
 AliPHOSv1.cxx:221
 AliPHOSv1.cxx:222
 AliPHOSv1.cxx:223
 AliPHOSv1.cxx:224
 AliPHOSv1.cxx:225
 AliPHOSv1.cxx:226
 AliPHOSv1.cxx:227
 AliPHOSv1.cxx:228
 AliPHOSv1.cxx:229
 AliPHOSv1.cxx:230
 AliPHOSv1.cxx:231
 AliPHOSv1.cxx:232
 AliPHOSv1.cxx:233
 AliPHOSv1.cxx:234
 AliPHOSv1.cxx:235
 AliPHOSv1.cxx:236
 AliPHOSv1.cxx:237
 AliPHOSv1.cxx:238
 AliPHOSv1.cxx:239
 AliPHOSv1.cxx:240
 AliPHOSv1.cxx:241
 AliPHOSv1.cxx:242
 AliPHOSv1.cxx:243
 AliPHOSv1.cxx:244
 AliPHOSv1.cxx:245
 AliPHOSv1.cxx:246
 AliPHOSv1.cxx:247
 AliPHOSv1.cxx:248
 AliPHOSv1.cxx:249
 AliPHOSv1.cxx:250
 AliPHOSv1.cxx:251
 AliPHOSv1.cxx:252
 AliPHOSv1.cxx:253
 AliPHOSv1.cxx:254
 AliPHOSv1.cxx:255
 AliPHOSv1.cxx:256
 AliPHOSv1.cxx:257
 AliPHOSv1.cxx:258
 AliPHOSv1.cxx:259
 AliPHOSv1.cxx:260
 AliPHOSv1.cxx:261
 AliPHOSv1.cxx:262
 AliPHOSv1.cxx:263
 AliPHOSv1.cxx:264
 AliPHOSv1.cxx:265
 AliPHOSv1.cxx:266
 AliPHOSv1.cxx:267
 AliPHOSv1.cxx:268
 AliPHOSv1.cxx:269
 AliPHOSv1.cxx:270
 AliPHOSv1.cxx:271
 AliPHOSv1.cxx:272
 AliPHOSv1.cxx:273
 AliPHOSv1.cxx:274
 AliPHOSv1.cxx:275
 AliPHOSv1.cxx:276
 AliPHOSv1.cxx:277
 AliPHOSv1.cxx:278
 AliPHOSv1.cxx:279
 AliPHOSv1.cxx:280
 AliPHOSv1.cxx:281
 AliPHOSv1.cxx:282
 AliPHOSv1.cxx:283
 AliPHOSv1.cxx:284
 AliPHOSv1.cxx:285
 AliPHOSv1.cxx:286
 AliPHOSv1.cxx:287
 AliPHOSv1.cxx:288
 AliPHOSv1.cxx:289
 AliPHOSv1.cxx:290
 AliPHOSv1.cxx:291
 AliPHOSv1.cxx:292
 AliPHOSv1.cxx:293
 AliPHOSv1.cxx:294
 AliPHOSv1.cxx:295
 AliPHOSv1.cxx:296
 AliPHOSv1.cxx:297
 AliPHOSv1.cxx:298
 AliPHOSv1.cxx:299
 AliPHOSv1.cxx:300
 AliPHOSv1.cxx:301
 AliPHOSv1.cxx:302
 AliPHOSv1.cxx:303
 AliPHOSv1.cxx:304
 AliPHOSv1.cxx:305
 AliPHOSv1.cxx:306
 AliPHOSv1.cxx:307
 AliPHOSv1.cxx:308
 AliPHOSv1.cxx:309
 AliPHOSv1.cxx:310
 AliPHOSv1.cxx:311
 AliPHOSv1.cxx:312
 AliPHOSv1.cxx:313
 AliPHOSv1.cxx:314
 AliPHOSv1.cxx:315
 AliPHOSv1.cxx:316
 AliPHOSv1.cxx:317
 AliPHOSv1.cxx:318
 AliPHOSv1.cxx:319
 AliPHOSv1.cxx:320
 AliPHOSv1.cxx:321
 AliPHOSv1.cxx:322
 AliPHOSv1.cxx:323
 AliPHOSv1.cxx:324
 AliPHOSv1.cxx:325
 AliPHOSv1.cxx:326
 AliPHOSv1.cxx:327
 AliPHOSv1.cxx:328
 AliPHOSv1.cxx:329
 AliPHOSv1.cxx:330
 AliPHOSv1.cxx:331
 AliPHOSv1.cxx:332
 AliPHOSv1.cxx:333
 AliPHOSv1.cxx:334
 AliPHOSv1.cxx:335
 AliPHOSv1.cxx:336
 AliPHOSv1.cxx:337
 AliPHOSv1.cxx:338
 AliPHOSv1.cxx:339
 AliPHOSv1.cxx:340
 AliPHOSv1.cxx:341
 AliPHOSv1.cxx:342
 AliPHOSv1.cxx:343
 AliPHOSv1.cxx:344
 AliPHOSv1.cxx:345
 AliPHOSv1.cxx:346
 AliPHOSv1.cxx:347
 AliPHOSv1.cxx:348
 AliPHOSv1.cxx:349
 AliPHOSv1.cxx:350
 AliPHOSv1.cxx:351
 AliPHOSv1.cxx:352
 AliPHOSv1.cxx:353
 AliPHOSv1.cxx:354
 AliPHOSv1.cxx:355
 AliPHOSv1.cxx:356
 AliPHOSv1.cxx:357
 AliPHOSv1.cxx:358
 AliPHOSv1.cxx:359
 AliPHOSv1.cxx:360
 AliPHOSv1.cxx:361
 AliPHOSv1.cxx:362
 AliPHOSv1.cxx:363
 AliPHOSv1.cxx:364
 AliPHOSv1.cxx:365
 AliPHOSv1.cxx:366
 AliPHOSv1.cxx:367
 AliPHOSv1.cxx:368
 AliPHOSv1.cxx:369
 AliPHOSv1.cxx:370
 AliPHOSv1.cxx:371
 AliPHOSv1.cxx:372
 AliPHOSv1.cxx:373
 AliPHOSv1.cxx:374
 AliPHOSv1.cxx:375
 AliPHOSv1.cxx:376
 AliPHOSv1.cxx:377
 AliPHOSv1.cxx:378
 AliPHOSv1.cxx:379
 AliPHOSv1.cxx:380
 AliPHOSv1.cxx:381
 AliPHOSv1.cxx:382
 AliPHOSv1.cxx:383
 AliPHOSv1.cxx:384
 AliPHOSv1.cxx:385
 AliPHOSv1.cxx:386
 AliPHOSv1.cxx:387
 AliPHOSv1.cxx:388
 AliPHOSv1.cxx:389
 AliPHOSv1.cxx:390
 AliPHOSv1.cxx:391
 AliPHOSv1.cxx:392
 AliPHOSv1.cxx:393
 AliPHOSv1.cxx:394
 AliPHOSv1.cxx:395
 AliPHOSv1.cxx:396
 AliPHOSv1.cxx:397
 AliPHOSv1.cxx:398
 AliPHOSv1.cxx:399
 AliPHOSv1.cxx:400
 AliPHOSv1.cxx:401
 AliPHOSv1.cxx:402
 AliPHOSv1.cxx:403
 AliPHOSv1.cxx:404
 AliPHOSv1.cxx:405
 AliPHOSv1.cxx:406
 AliPHOSv1.cxx:407
 AliPHOSv1.cxx:408
 AliPHOSv1.cxx:409
 AliPHOSv1.cxx:410
 AliPHOSv1.cxx:411
 AliPHOSv1.cxx:412
 AliPHOSv1.cxx:413
 AliPHOSv1.cxx:414
 AliPHOSv1.cxx:415
 AliPHOSv1.cxx:416
 AliPHOSv1.cxx:417
 AliPHOSv1.cxx:418
 AliPHOSv1.cxx:419
 AliPHOSv1.cxx:420
 AliPHOSv1.cxx:421
 AliPHOSv1.cxx:422
 AliPHOSv1.cxx:423
 AliPHOSv1.cxx:424
 AliPHOSv1.cxx:425
 AliPHOSv1.cxx:426
 AliPHOSv1.cxx:427
 AliPHOSv1.cxx:428
 AliPHOSv1.cxx:429
 AliPHOSv1.cxx:430
 AliPHOSv1.cxx:431
 AliPHOSv1.cxx:432
 AliPHOSv1.cxx:433
 AliPHOSv1.cxx:434
 AliPHOSv1.cxx:435
 AliPHOSv1.cxx:436
 AliPHOSv1.cxx:437
 AliPHOSv1.cxx:438
 AliPHOSv1.cxx:439
 AliPHOSv1.cxx:440
 AliPHOSv1.cxx:441
 AliPHOSv1.cxx:442
 AliPHOSv1.cxx:443
 AliPHOSv1.cxx:444
 AliPHOSv1.cxx:445
 AliPHOSv1.cxx:446
 AliPHOSv1.cxx:447
 AliPHOSv1.cxx:448
 AliPHOSv1.cxx:449
 AliPHOSv1.cxx:450
 AliPHOSv1.cxx:451
 AliPHOSv1.cxx:452
 AliPHOSv1.cxx:453
 AliPHOSv1.cxx:454
 AliPHOSv1.cxx:455
 AliPHOSv1.cxx:456
 AliPHOSv1.cxx:457
 AliPHOSv1.cxx:458
 AliPHOSv1.cxx:459
 AliPHOSv1.cxx:460
 AliPHOSv1.cxx:461
 AliPHOSv1.cxx:462
 AliPHOSv1.cxx:463
 AliPHOSv1.cxx:464
 AliPHOSv1.cxx:465
 AliPHOSv1.cxx:466
 AliPHOSv1.cxx:467
 AliPHOSv1.cxx:468
 AliPHOSv1.cxx:469
 AliPHOSv1.cxx:470
 AliPHOSv1.cxx:471
 AliPHOSv1.cxx:472
 AliPHOSv1.cxx:473
 AliPHOSv1.cxx:474
 AliPHOSv1.cxx:475
 AliPHOSv1.cxx:476
 AliPHOSv1.cxx:477
 AliPHOSv1.cxx:478
 AliPHOSv1.cxx:479
 AliPHOSv1.cxx:480
 AliPHOSv1.cxx:481
 AliPHOSv1.cxx:482
 AliPHOSv1.cxx:483
 AliPHOSv1.cxx:484
 AliPHOSv1.cxx:485
 AliPHOSv1.cxx:486
 AliPHOSv1.cxx:487
 AliPHOSv1.cxx:488
 AliPHOSv1.cxx:489
 AliPHOSv1.cxx:490
 AliPHOSv1.cxx:491
 AliPHOSv1.cxx:492
 AliPHOSv1.cxx:493
 AliPHOSv1.cxx:494
 AliPHOSv1.cxx:495
 AliPHOSv1.cxx:496
 AliPHOSv1.cxx:497
 AliPHOSv1.cxx:498
 AliPHOSv1.cxx:499
 AliPHOSv1.cxx:500
 AliPHOSv1.cxx:501
 AliPHOSv1.cxx:502
 AliPHOSv1.cxx:503
 AliPHOSv1.cxx:504
 AliPHOSv1.cxx:505
 AliPHOSv1.cxx:506
 AliPHOSv1.cxx:507
 AliPHOSv1.cxx:508
 AliPHOSv1.cxx:509
 AliPHOSv1.cxx:510
 AliPHOSv1.cxx:511
 AliPHOSv1.cxx:512
 AliPHOSv1.cxx:513
 AliPHOSv1.cxx:514
 AliPHOSv1.cxx:515
 AliPHOSv1.cxx:516
 AliPHOSv1.cxx:517
 AliPHOSv1.cxx:518
 AliPHOSv1.cxx:519
 AliPHOSv1.cxx:520
 AliPHOSv1.cxx:521
 AliPHOSv1.cxx:522
 AliPHOSv1.cxx:523
 AliPHOSv1.cxx:524
 AliPHOSv1.cxx:525
 AliPHOSv1.cxx:526
 AliPHOSv1.cxx:527
 AliPHOSv1.cxx:528
 AliPHOSv1.cxx:529
 AliPHOSv1.cxx:530
 AliPHOSv1.cxx:531
 AliPHOSv1.cxx:532
 AliPHOSv1.cxx:533
 AliPHOSv1.cxx:534
 AliPHOSv1.cxx:535
 AliPHOSv1.cxx:536
 AliPHOSv1.cxx:537
 AliPHOSv1.cxx:538
 AliPHOSv1.cxx:539
 AliPHOSv1.cxx:540
 AliPHOSv1.cxx:541
 AliPHOSv1.cxx:542
 AliPHOSv1.cxx:543
 AliPHOSv1.cxx:544
 AliPHOSv1.cxx:545
 AliPHOSv1.cxx:546
 AliPHOSv1.cxx:547
 AliPHOSv1.cxx:548
 AliPHOSv1.cxx:549
 AliPHOSv1.cxx:550
 AliPHOSv1.cxx:551
 AliPHOSv1.cxx:552
 AliPHOSv1.cxx:553
 AliPHOSv1.cxx:554
 AliPHOSv1.cxx:555
 AliPHOSv1.cxx:556
 AliPHOSv1.cxx:557
 AliPHOSv1.cxx:558
 AliPHOSv1.cxx:559
 AliPHOSv1.cxx:560
 AliPHOSv1.cxx:561
 AliPHOSv1.cxx:562
 AliPHOSv1.cxx:563