--- /dev/null
+/**************************************************************************
+ * 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. *
+ **************************************************************************/
+
+/*
+$Log$
+Revision 1.1 1999/12/17 09:01:14 fca
+Y.Schutz new classes for reconstruction
+
+*/
+
+//-*-C++-*-
+//_________________________________________________________________________
+// AliGeometry base class is pABC
+//*-- Author : Yves Schutz SUBATECH
+//////////////////////////////////////////////////////////////////////////////
+
+// --- ROOT system ---
+
+// --- Standard library ---
+
+// --- AliRoot header files ---
+
+#include "AliGeometry.h"
+
+ClassImp(AliGeometry)
+
+//____________________________________________________________________________
+AliGeometry::AliGeometry()
+{
+ // ctor
+}
+
+//____________________________________________________________________________
+AliGeometry::~AliGeometry()
+{
+ // dtor
+}
+
--- /dev/null
+/**************************************************************************
+ * 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. *
+ **************************************************************************/
+
+/*
+$Log$
+Revision 1.1 1999/12/17 09:01:14 fca
+Y.Schutz new classes for reconstruction
+
+*/
+
+//-*-C++-*-
+//_________________________________________________________________________
+// AliGeometry base class is pABC
+//*-- Author : Yves Schutz SUBATECH
+//////////////////////////////////////////////////////////////////////////////
+
+// --- ROOT system ---
+
+// --- Standard library ---
+
+// --- AliRoot header files ---
+
+#include "AliGeometry.h"
+
+ClassImp(AliGeometry)
+
+//____________________________________________________________________________
+AliGeometry::AliGeometry()
+{
+ // ctor
+}
+
+//____________________________________________________________________________
+AliGeometry::~AliGeometry()
+{
+ // dtor
+}
+
--- /dev/null
+/**************************************************************************
+ * 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. *
+ **************************************************************************/
+
+//_________________________________________________________________________
+// Geometry class for PHOS version SUBATECH
+//*-- Author : Y. Schutz SUBATECH
+//////////////////////////////////////////////////////////////////////////////
+
+// --- ROOT system ---
+
+#include "TVector3.h"
+#include "TRotation.h"
+
+// --- Standard library ---
+
+#include <iostream.h>
+#include "assert.h"
+
+// --- AliRoot header files ---
+
+#include "AliPHOSGeometry.h"
+#include "AliPHOSPpsdRecPoint.h"
+#include "AliConst.h"
+
+ClassImp(AliPHOSGeometry)
+
+ AliPHOSGeometry * AliPHOSGeometry::fGeom = 0 ;
+
+//____________________________________________________________________________
+AliPHOSGeometry::~AliPHOSGeometry(void)
+{
+ fRotMatrixArray->Delete() ;
+ delete fRotMatrixArray ;
+}
+
+//____________________________________________________________________________
+Bool_t AliPHOSGeometry::AbsToRelNumbering(const Int_t AbsId, Int_t * RelId)
+{
+ // RelId[0] = PHOS Module number 1:fNModules
+ // RelId[1] = 0 if PbW04
+ // = PPSD Module number 1:fNumberOfModulesPhi*fNumberOfModulesZ*2 (2->up and bottom level)
+ // RelId[2] = Row number inside a PHOS or PPSD module
+ // RelId[3] = Column number inside a PHOS or PPSD module
+
+ Bool_t rv = kTRUE ;
+ Float_t Id = AbsId ;
+
+ Int_t PHOSModuleNumber = (Int_t)TMath:: Ceil( Id / ( GetNPhi() * GetNZ() ) ) ;
+
+ if ( PHOSModuleNumber > GetNModules() ) { // its a PPSD pad
+
+ Id -= GetNPhi() * GetNZ() * GetNModules() ;
+ Float_t tempo = 2 * GetNumberOfModulesPhi() * GetNumberOfModulesZ() * GetNumberOfPadsPhi() * GetNumberOfPadsZ() ;
+ RelId[0] = (Int_t)TMath::Ceil( Id / tempo ) ;
+ Id -= ( RelId[0] - 1 ) * tempo ;
+ RelId[1] = (Int_t)TMath::Ceil( Id / ( GetNumberOfPadsPhi() * GetNumberOfPadsZ() ) ) ;
+ Id -= ( RelId[1] - 1 ) * GetNumberOfPadsPhi() * GetNumberOfPadsZ() ;
+ RelId[2] = (Int_t)TMath::Ceil( Id / GetNumberOfPadsPhi() ) ;
+ RelId[3] = (Int_t) ( Id - ( RelId[2] - 1 ) * GetNumberOfPadsPhi() ) ;
+ }
+ else { // its a PW04 crystal
+
+ RelId[0] = PHOSModuleNumber ;
+ RelId[1] = 0 ;
+ Id -= ( PHOSModuleNumber - 1 ) * GetNPhi() * GetNZ() ;
+ RelId[2] = (Int_t)TMath::Ceil( Id / GetNPhi() ) ;
+ RelId[3] = (Int_t)( Id - ( RelId[2] - 1 ) * GetNPhi() ) ;
+ }
+ return rv ;
+}
+
+//____________________________________________________________________________
+void AliPHOSGeometry::GetGlobal(const AliRecPoint* RecPoint, TVector3 & gpos, TMatrix & gmat)
+{
+
+ AliPHOSRecPoint * tmpPHOS = (AliPHOSRecPoint *) RecPoint ;
+ TVector3 LocalPosition ;
+
+ tmpPHOS->GetLocalPosition(gpos) ;
+
+
+ if ( tmpPHOS->IsEmc() ) // it is a EMC crystal
+ { gpos.SetY( -(GetIPtoOuterCoverDistance() + GetUpperPlateThickness() +
+ GetSecondUpperPlateThickness() + GetUpperCoolingPlateThickness()) ) ;
+
+ }
+ else
+ { // it is a PPSD pad
+ AliPHOSPpsdRecPoint * tmpPpsd = (AliPHOSPpsdRecPoint *) RecPoint ;
+ if (tmpPpsd->GetUp() ) // it is an upper module
+ {
+ gpos.SetY(-( GetIPtoOuterCoverDistance() - GetMicromegas2Thickness() -
+ GetLeadToMicro2Gap() - GetLeadConverterThickness() -
+ GetMicro1ToLeadGap() - GetMicromegas1Thickness() / 2.0 ) ) ;
+ }
+ else // it is a lower module
+ gpos.SetY(-( GetIPtoOuterCoverDistance() - GetMicromegas2Thickness() / 2.0) ) ;
+ }
+
+ Float_t Phi = GetPHOSAngle( tmpPHOS->GetPHOSMod()) ;
+ Double_t const RADDEG = 180.0 / kPI ;
+ Float_t rPhi = Phi / RADDEG ;
+
+ TRotation Rot ;
+ Rot.RotateZ(-rPhi) ; // a rotation around Z by angle
+
+ TRotation dummy = Rot.Invert() ; // to transform from original frame to rotate frame
+ gpos.Transform(Rot) ; // rotate the baby
+}
+
+//____________________________________________________________________________
+void AliPHOSGeometry::GetGlobal(const AliRecPoint* RecPoint, TVector3 & gpos)
+{
+ AliPHOSRecPoint * tmpPHOS = (AliPHOSRecPoint *) RecPoint ;
+ TVector3 LocalPosition ;
+ tmpPHOS->GetLocalPosition(gpos) ;
+
+
+ if ( tmpPHOS->IsEmc() ) // it is a EMC crystal
+ { gpos.SetY( -(GetIPtoOuterCoverDistance() + GetUpperPlateThickness() +
+ GetSecondUpperPlateThickness() + GetUpperCoolingPlateThickness()) ) ;
+ }
+ else
+ { // it is a PPSD pad
+ AliPHOSPpsdRecPoint * tmpPpsd = (AliPHOSPpsdRecPoint *) RecPoint ;
+ if (tmpPpsd->GetUp() ) // it is an upper module
+ {
+ gpos.SetY(-( GetIPtoOuterCoverDistance() - GetMicromegas2Thickness() -
+ GetLeadToMicro2Gap() - GetLeadConverterThickness() -
+ GetMicro1ToLeadGap() - GetMicromegas1Thickness() / 2.0 ) ) ;
+ }
+ else // it is a lower module
+ gpos.SetY(-( GetIPtoOuterCoverDistance() - GetMicromegas2Thickness() / 2.0) ) ;
+ }
+
+ Float_t Phi = GetPHOSAngle( tmpPHOS->GetPHOSMod()) ;
+ Double_t const RADDEG = 180.0 / kPI ;
+ Float_t rPhi = Phi / RADDEG ;
+
+ TRotation Rot ;
+ Rot.RotateZ(-rPhi) ; // a rotation around Z by angle
+
+ TRotation dummy = Rot.Invert() ; // to transform from original frame to rotate frame
+ gpos.Transform(Rot) ; // rotate the baby
+}
+
+//____________________________________________________________________________
+void AliPHOSGeometry::Init(void)
+{
+ fRotMatrixArray = new TObjArray(fNModules) ;
+
+ cout << "PHOS geometry setup: parameters for option " << fName << " " << fTitle << endl ;
+ if ( ((strcmp( fName, "default" )) == 0) || ((strcmp( fName, "GPS2" )) == 0) ) {
+ fInit = kTRUE ;
+ this->InitPHOS() ;
+ this->InitPPSD() ;
+ this->SetPHOSAngles() ;
+ }
+ else {
+ fInit = kFALSE ;
+ cout << "PHOS Geometry setup: option not defined " << fName << endl ;
+ }
+}
+
+//____________________________________________________________________________
+void AliPHOSGeometry::InitPHOS(void)
+{
+ // PHOS
+
+ fNPhi = 64 ;
+ fNZ = 64 ;
+ fNModules = 5 ;
+
+ fPHOSAngle[0] = 0.0 ; // Module position angles are set in CreateGeometry()
+ fPHOSAngle[1] = 0.0 ;
+ fPHOSAngle[2] = 0.0 ;
+ fPHOSAngle[3] = 0.0 ;
+
+ fXtlSize[0] = 2.2 ;
+ fXtlSize[1] = 18.0 ;
+ fXtlSize[2] = 2.2 ;
+
+ // all these numbers coming next are subject to changes
+
+ fOuterBoxThickness[0] = 2.8 ;
+ fOuterBoxThickness[1] = 5.0 ;
+ fOuterBoxThickness[2] = 5.0 ;
+
+ fUpperPlateThickness = 4.0 ;
+
+ fSecondUpperPlateThickness = 5.0 ;
+
+ fCrystalSupportHeight = 6.95 ;
+ fCrystalWrapThickness = 0.01 ;
+ fCrystalHolderThickness = 0.005 ;
+ fModuleBoxThickness = 2.0 ;
+ fIPtoOuterCoverDistance = 447.0 ;
+ fIPtoCrystalSurface = 460.0 ;
+
+ fPinDiodeSize[0] = 1.0 ;
+ fPinDiodeSize[1] = 0.1 ;
+ fPinDiodeSize[2] = 1.0 ;
+
+ fUpperCoolingPlateThickness = 0.06 ;
+ fSupportPlateThickness = 10.0 ;
+ fLowerThermoPlateThickness = 3.0 ;
+ fLowerTextolitPlateThickness = 1.0 ;
+ fGapBetweenCrystals = 0.03 ;
+
+ fTextolitBoxThickness[0] = 1.5 ;
+ fTextolitBoxThickness[1] = 0.0 ;
+ fTextolitBoxThickness[2] = 3.0 ;
+
+ fAirThickness[0] = 1.56 ;
+ fAirThickness[1] = 20.5175 ;
+ fAirThickness[2] = 2.48 ;
+
+ Float_t XtalModulePhiSize = fNPhi * ( fXtlSize[0] + 2 * fGapBetweenCrystals ) ;
+ Float_t XtalModuleZSize = fNZ * ( fXtlSize[2] + 2 * fGapBetweenCrystals ) ;
+
+ // The next dimensions are calculated from the above parameters
+
+ fOuterBoxSize[0] = XtalModulePhiSize + 2 * ( fAirThickness[0] + fModuleBoxThickness
+ + fTextolitBoxThickness[0] + fOuterBoxThickness[0] ) ;
+ fOuterBoxSize[1] = ( fXtlSize[1] + fCrystalSupportHeight + fCrystalWrapThickness + fCrystalHolderThickness )
+ + 2 * (fAirThickness[1] + fModuleBoxThickness + fTextolitBoxThickness[1] + fOuterBoxThickness[1] ) ;
+ fOuterBoxSize[2] = XtalModuleZSize + 2 * ( fAirThickness[2] + fModuleBoxThickness
+ + fTextolitBoxThickness[2] + fOuterBoxThickness[2] ) ;
+
+ fTextolitBoxSize[0] = fOuterBoxSize[0] - 2 * fOuterBoxThickness[0] ;
+ fTextolitBoxSize[1] = fOuterBoxSize[1] - fOuterBoxThickness[1] - fUpperPlateThickness ;
+ fTextolitBoxSize[2] = fOuterBoxSize[2] - 2 * fOuterBoxThickness[2] ;
+
+ fAirFilledBoxSize[0] = fTextolitBoxSize[0] - 2 * fTextolitBoxThickness[0] ;
+ fAirFilledBoxSize[1] = fTextolitBoxSize[1] - fSecondUpperPlateThickness ;
+ fAirFilledBoxSize[2] = fTextolitBoxSize[2] - 2 * fTextolitBoxThickness[2] ;
+
+}
+
+//____________________________________________________________________________
+void AliPHOSGeometry::InitPPSD(void)
+{
+ // PPSD
+
+ fAnodeThickness = 0.0009 ;
+ fAvalancheGap = 0.01 ;
+ fCathodeThickness = 0.0009 ;
+ fCompositeThickness = 0.3 ;
+ fConversionGap = 0.3 ;
+ fLeadConverterThickness = 0.56 ;
+ fLeadToMicro2Gap = 0.1 ;
+ fLidThickness = 0.2 ;
+ fMicro1ToLeadGap = 0.1 ;
+ fMicromegasWallThickness = 0.6 ;
+ fNumberOfModulesPhi = 4 ;
+ fNumberOfModulesZ = 4 ;
+ fNumberOfPadsPhi = 24 ;
+ fNumberOfPadsZ = 24 ;
+ fPCThickness = 0.1 ;
+ fPhiDisplacement = 0.8 ;
+ fZDisplacement = 0.8 ;
+
+ fMicromegas1Thickness = fLidThickness + 2 * fCompositeThickness + fCathodeThickness + fPCThickness
+ + fAnodeThickness + fConversionGap + fAvalancheGap ;
+ fMicromegas2Thickness = fMicromegas1Thickness ;
+
+
+ fPPSDModuleSize[0] = 38.0 ;
+ fPPSDModuleSize[1] = fMicromegas1Thickness ;
+ fPPSDModuleSize[2] = 38.0 ;
+
+ fPPSDBoxSize[0] = fNumberOfModulesPhi * fPPSDModuleSize[0] + 2 * fPhiDisplacement ;
+ fPPSDBoxSize[1] = fMicromegas2Thickness + fMicromegas2Thickness + fLeadConverterThickness + fMicro1ToLeadGap + fLeadToMicro2Gap ;
+ fPPSDBoxSize[2] = fNumberOfModulesZ * fPPSDModuleSize[2] + 2 * fZDisplacement ;
+
+ fIPtoTopLidDistance = fIPtoOuterCoverDistance - fPPSDBoxSize[1] - 1. ;
+
+}
+
+//____________________________________________________________________________
+AliPHOSGeometry * AliPHOSGeometry::GetInstance()
+{
+ assert(fGeom!=0) ;
+ return (AliPHOSGeometry *) fGeom ;
+}
+
+//____________________________________________________________________________
+AliPHOSGeometry * AliPHOSGeometry::GetInstance(const Text_t* name, const Text_t* title)
+{
+ AliPHOSGeometry * rv = 0 ;
+ if ( fGeom == 0 ) {
+ fGeom = new AliPHOSGeometry(name, title) ;
+ rv = (AliPHOSGeometry * ) fGeom ;
+ }
+ else {
+ if ( strcmp(fGeom->GetName(), name) != 0 ) {
+ cout << "AliPHOSGeometry <E> : current geometry is " << fGeom->GetName() << endl
+ << " you cannot call " << name << endl ;
+ }
+ else
+ rv = (AliPHOSGeometry *) fGeom ;
+ }
+ return rv ;
+}
+
+//____________________________________________________________________________
+Bool_t AliPHOSGeometry::RelToAbsNumbering(const Int_t * RelId, Int_t & AbsId)
+{
+
+ // AbsId = 1:fNModules * fNPhi * fNZ -> PbWO4
+ // AbsId = 1:fNModules * 2 * (fNumberOfModulesPhi * fNumberOfModulesZ) * fNumberOfPadsPhi * fNumberOfPadsZ -> PPSD
+
+ Bool_t rv = kTRUE ;
+
+ if ( RelId[1] > 0 ) { // its a PPSD pad
+
+ AbsId = GetNPhi() * GetNZ() * GetNModules() // the offset to separate emcal crystals from PPSD pads
+ + ( RelId[0] - 1 ) * GetNumberOfModulesPhi() * GetNumberOfModulesZ() // the pads offset of PHOS modules
+ * GetNumberOfPadsPhi() * GetNumberOfPadsZ() * 2
+ + ( RelId[1] - 1 ) * GetNumberOfPadsPhi() * GetNumberOfPadsZ() // the pads offset of PPSD modules
+ + ( RelId[2] - 1 ) * GetNumberOfPadsPhi() // the pads offset of a PPSD row
+ + RelId[3] ; // the column number
+ }
+ else {
+ if ( RelId[1] == 0 ) { // its a Phos crystal
+ AbsId = ( RelId[0] - 1 ) * GetNPhi() * GetNZ() // the offset of PHOS modules
+ + ( RelId[2] - 1 ) * GetNPhi() // the offset of a xtal row
+ + RelId[3] ; // the column number
+ }
+ }
+
+ return rv ;
+}
+
+//____________________________________________________________________________
+
+void AliPHOSGeometry::RelPosInAlice(const Int_t Id, TVector3 & pos )
+{
+ if (Id > 0) {
+
+ Int_t RelId[4] ;
+
+ AbsToRelNumbering(Id , RelId) ;
+
+ Int_t PHOSModule = RelId[0] ;
+
+
+ if ( RelId[1] == 0 ) // it is a PbW04 crystal
+ { pos.SetY( -(GetIPtoOuterCoverDistance() + GetUpperPlateThickness()
+ + GetSecondUpperPlateThickness() + GetUpperCoolingPlateThickness()) ) ;
+ }
+ if ( RelId[1] > 0 ) { // its a PPSD pad
+ if ( RelId[1] > GetNumberOfModulesPhi() * GetNumberOfModulesZ() ) // its an bottom module
+ {
+ pos.SetY(-( GetIPtoOuterCoverDistance() - GetMicromegas2Thickness() / 2.0) ) ;
+ }
+ else // its an upper module
+ pos.SetY(-( GetIPtoOuterCoverDistance() - GetMicromegas2Thickness() - GetLeadToMicro2Gap()
+ - GetLeadConverterThickness() - GetMicro1ToLeadGap() - GetMicromegas1Thickness() / 2.0) ) ;
+ }
+
+ Float_t x, z ;
+ RelPosInModule(RelId, x, z) ;
+
+ pos.SetX(x);
+ pos.SetZ(z);
+
+
+ Float_t Phi = GetPHOSAngle( PHOSModule) ;
+ Double_t const RADDEG = 180.0 / kPI ;
+ Float_t rPhi = Phi / RADDEG ;
+
+ TRotation Rot ;
+ Rot.RotateZ(-rPhi) ; // a rotation around Z by angle
+
+ TRotation dummy = Rot.Invert() ; // to transform from original frame to rotate frame
+
+ pos.Transform(Rot) ; // rotate the baby
+ }
+ else {
+ pos.SetX(0.);
+ pos.SetY(0.);
+ pos.SetZ(0.);
+ }
+}
+
+//____________________________________________________________________________
+void AliPHOSGeometry::RelPosInModule(const Int_t * RelId, Float_t & x, Float_t & z)
+{
+ Int_t PPSDModule ;
+ Int_t Row = RelId[2] ; //offset along z axiz
+ Int_t Column = RelId[3] ; //offset along x axiz
+
+ Float_t PadSizeZ = GetPPSDModuleSize(2)/ GetNumberOfPadsZ();
+ Float_t PadSizeX = GetPPSDModuleSize(0)/ GetNumberOfPadsPhi();
+
+ if ( RelId[1] == 0 ) { // its a PbW04 crystal
+ x = -( GetNPhi()/2. - Row + 0.5 ) * GetCrystalSize(0) ; // position ox Xtal with respect
+ z = -( GetNZ() /2. - Column + 0.5 ) * GetCrystalSize(2) ; // of center of PHOS module
+ }
+ else {
+ if ( RelId[1] > GetNumberOfModulesPhi() * GetNumberOfModulesZ() )
+ PPSDModule = RelId[1]-GetNumberOfModulesPhi() * GetNumberOfModulesZ();
+ else PPSDModule = RelId[1] ;
+ Int_t ModRow = 1+(Int_t)TMath::Ceil( (Float_t)PPSDModule / GetNumberOfModulesPhi()-1. ) ;
+ Int_t ModCol = PPSDModule - ( ModRow-1 ) * GetNumberOfModulesPhi() ;
+ Float_t x0 = ( GetNumberOfModulesPhi() / 2. - ModRow + 0.5 ) * GetPPSDModuleSize(0) ;
+ Float_t z0 = ( GetNumberOfModulesZ() / 2. - ModCol + 0.5 ) * GetPPSDModuleSize(2) ;
+ x = - ( GetNumberOfPadsPhi()/2. - Row - 0.5 ) * PadSizeX + x0 ; // position of pad with respect
+ z = - ( GetNumberOfPadsZ()/2. - Column - 0.5 ) * PadSizeZ + z0 ; // of center of PHOS module
+ }
+}
+
+//____________________________________________________________________________
+void AliPHOSGeometry:: SetPHOSAngles()
+{
+ Double_t const RADDEG = 180.0 / kPI ;
+ Float_t PPHI = TMath::ATan( fOuterBoxSize[0] / ( 2.0 * fIPtoOuterCoverDistance ) ) ;
+ PPHI *= RADDEG ;
+
+ for( Int_t i = 1; i <= fNModules ; i++ ) {
+ Float_t angle = PPHI * 2 * ( i - fNModules / 2.0 - 0.5 ) ;
+ fPHOSAngle[i-1] = - angle ;
+ }
+}
+
--- /dev/null
+/**************************************************************************
+ * 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. *
+ **************************************************************************/
+
+//_________________________________________________________________________
+// Geometry class for PHOS version SUBATECH
+//*-- Author : Y. Schutz SUBATECH
+//////////////////////////////////////////////////////////////////////////////
+
+// --- ROOT system ---
+
+#include "TVector3.h"
+#include "TRotation.h"
+
+// --- Standard library ---
+
+#include <iostream.h>
+#include "assert.h"
+
+// --- AliRoot header files ---
+
+#include "AliPHOSGeometry.h"
+#include "AliPHOSPpsdRecPoint.h"
+#include "AliConst.h"
+
+ClassImp(AliPHOSGeometry)
+
+ AliPHOSGeometry * AliPHOSGeometry::fGeom = 0 ;
+
+//____________________________________________________________________________
+AliPHOSGeometry::~AliPHOSGeometry(void)
+{
+ fRotMatrixArray->Delete() ;
+ delete fRotMatrixArray ;
+}
+
+//____________________________________________________________________________
+Bool_t AliPHOSGeometry::AbsToRelNumbering(const Int_t AbsId, Int_t * RelId)
+{
+ // RelId[0] = PHOS Module number 1:fNModules
+ // RelId[1] = 0 if PbW04
+ // = PPSD Module number 1:fNumberOfModulesPhi*fNumberOfModulesZ*2 (2->up and bottom level)
+ // RelId[2] = Row number inside a PHOS or PPSD module
+ // RelId[3] = Column number inside a PHOS or PPSD module
+
+ Bool_t rv = kTRUE ;
+ Float_t Id = AbsId ;
+
+ Int_t PHOSModuleNumber = (Int_t)TMath:: Ceil( Id / ( GetNPhi() * GetNZ() ) ) ;
+
+ if ( PHOSModuleNumber > GetNModules() ) { // its a PPSD pad
+
+ Id -= GetNPhi() * GetNZ() * GetNModules() ;
+ Float_t tempo = 2 * GetNumberOfModulesPhi() * GetNumberOfModulesZ() * GetNumberOfPadsPhi() * GetNumberOfPadsZ() ;
+ RelId[0] = (Int_t)TMath::Ceil( Id / tempo ) ;
+ Id -= ( RelId[0] - 1 ) * tempo ;
+ RelId[1] = (Int_t)TMath::Ceil( Id / ( GetNumberOfPadsPhi() * GetNumberOfPadsZ() ) ) ;
+ Id -= ( RelId[1] - 1 ) * GetNumberOfPadsPhi() * GetNumberOfPadsZ() ;
+ RelId[2] = (Int_t)TMath::Ceil( Id / GetNumberOfPadsPhi() ) ;
+ RelId[3] = (Int_t) ( Id - ( RelId[2] - 1 ) * GetNumberOfPadsPhi() ) ;
+ }
+ else { // its a PW04 crystal
+
+ RelId[0] = PHOSModuleNumber ;
+ RelId[1] = 0 ;
+ Id -= ( PHOSModuleNumber - 1 ) * GetNPhi() * GetNZ() ;
+ RelId[2] = (Int_t)TMath::Ceil( Id / GetNPhi() ) ;
+ RelId[3] = (Int_t)( Id - ( RelId[2] - 1 ) * GetNPhi() ) ;
+ }
+ return rv ;
+}
+
+//____________________________________________________________________________
+void AliPHOSGeometry::GetGlobal(const AliRecPoint* RecPoint, TVector3 & gpos, TMatrix & gmat)
+{
+
+ AliPHOSRecPoint * tmpPHOS = (AliPHOSRecPoint *) RecPoint ;
+ TVector3 LocalPosition ;
+
+ tmpPHOS->GetLocalPosition(gpos) ;
+
+
+ if ( tmpPHOS->IsEmc() ) // it is a EMC crystal
+ { gpos.SetY( -(GetIPtoOuterCoverDistance() + GetUpperPlateThickness() +
+ GetSecondUpperPlateThickness() + GetUpperCoolingPlateThickness()) ) ;
+
+ }
+ else
+ { // it is a PPSD pad
+ AliPHOSPpsdRecPoint * tmpPpsd = (AliPHOSPpsdRecPoint *) RecPoint ;
+ if (tmpPpsd->GetUp() ) // it is an upper module
+ {
+ gpos.SetY(-( GetIPtoOuterCoverDistance() - GetMicromegas2Thickness() -
+ GetLeadToMicro2Gap() - GetLeadConverterThickness() -
+ GetMicro1ToLeadGap() - GetMicromegas1Thickness() / 2.0 ) ) ;
+ }
+ else // it is a lower module
+ gpos.SetY(-( GetIPtoOuterCoverDistance() - GetMicromegas2Thickness() / 2.0) ) ;
+ }
+
+ Float_t Phi = GetPHOSAngle( tmpPHOS->GetPHOSMod()) ;
+ Double_t const RADDEG = 180.0 / kPI ;
+ Float_t rPhi = Phi / RADDEG ;
+
+ TRotation Rot ;
+ Rot.RotateZ(-rPhi) ; // a rotation around Z by angle
+
+ TRotation dummy = Rot.Invert() ; // to transform from original frame to rotate frame
+ gpos.Transform(Rot) ; // rotate the baby
+}
+
+//____________________________________________________________________________
+void AliPHOSGeometry::GetGlobal(const AliRecPoint* RecPoint, TVector3 & gpos)
+{
+ AliPHOSRecPoint * tmpPHOS = (AliPHOSRecPoint *) RecPoint ;
+ TVector3 LocalPosition ;
+ tmpPHOS->GetLocalPosition(gpos) ;
+
+
+ if ( tmpPHOS->IsEmc() ) // it is a EMC crystal
+ { gpos.SetY( -(GetIPtoOuterCoverDistance() + GetUpperPlateThickness() +
+ GetSecondUpperPlateThickness() + GetUpperCoolingPlateThickness()) ) ;
+ }
+ else
+ { // it is a PPSD pad
+ AliPHOSPpsdRecPoint * tmpPpsd = (AliPHOSPpsdRecPoint *) RecPoint ;
+ if (tmpPpsd->GetUp() ) // it is an upper module
+ {
+ gpos.SetY(-( GetIPtoOuterCoverDistance() - GetMicromegas2Thickness() -
+ GetLeadToMicro2Gap() - GetLeadConverterThickness() -
+ GetMicro1ToLeadGap() - GetMicromegas1Thickness() / 2.0 ) ) ;
+ }
+ else // it is a lower module
+ gpos.SetY(-( GetIPtoOuterCoverDistance() - GetMicromegas2Thickness() / 2.0) ) ;
+ }
+
+ Float_t Phi = GetPHOSAngle( tmpPHOS->GetPHOSMod()) ;
+ Double_t const RADDEG = 180.0 / kPI ;
+ Float_t rPhi = Phi / RADDEG ;
+
+ TRotation Rot ;
+ Rot.RotateZ(-rPhi) ; // a rotation around Z by angle
+
+ TRotation dummy = Rot.Invert() ; // to transform from original frame to rotate frame
+ gpos.Transform(Rot) ; // rotate the baby
+}
+
+//____________________________________________________________________________
+void AliPHOSGeometry::Init(void)
+{
+ fRotMatrixArray = new TObjArray(fNModules) ;
+
+ cout << "PHOS geometry setup: parameters for option " << fName << " " << fTitle << endl ;
+ if ( ((strcmp( fName, "default" )) == 0) || ((strcmp( fName, "GPS2" )) == 0) ) {
+ fInit = kTRUE ;
+ this->InitPHOS() ;
+ this->InitPPSD() ;
+ this->SetPHOSAngles() ;
+ }
+ else {
+ fInit = kFALSE ;
+ cout << "PHOS Geometry setup: option not defined " << fName << endl ;
+ }
+}
+
+//____________________________________________________________________________
+void AliPHOSGeometry::InitPHOS(void)
+{
+ // PHOS
+
+ fNPhi = 64 ;
+ fNZ = 64 ;
+ fNModules = 5 ;
+
+ fPHOSAngle[0] = 0.0 ; // Module position angles are set in CreateGeometry()
+ fPHOSAngle[1] = 0.0 ;
+ fPHOSAngle[2] = 0.0 ;
+ fPHOSAngle[3] = 0.0 ;
+
+ fXtlSize[0] = 2.2 ;
+ fXtlSize[1] = 18.0 ;
+ fXtlSize[2] = 2.2 ;
+
+ // all these numbers coming next are subject to changes
+
+ fOuterBoxThickness[0] = 2.8 ;
+ fOuterBoxThickness[1] = 5.0 ;
+ fOuterBoxThickness[2] = 5.0 ;
+
+ fUpperPlateThickness = 4.0 ;
+
+ fSecondUpperPlateThickness = 5.0 ;
+
+ fCrystalSupportHeight = 6.95 ;
+ fCrystalWrapThickness = 0.01 ;
+ fCrystalHolderThickness = 0.005 ;
+ fModuleBoxThickness = 2.0 ;
+ fIPtoOuterCoverDistance = 447.0 ;
+ fIPtoCrystalSurface = 460.0 ;
+
+ fPinDiodeSize[0] = 1.0 ;
+ fPinDiodeSize[1] = 0.1 ;
+ fPinDiodeSize[2] = 1.0 ;
+
+ fUpperCoolingPlateThickness = 0.06 ;
+ fSupportPlateThickness = 10.0 ;
+ fLowerThermoPlateThickness = 3.0 ;
+ fLowerTextolitPlateThickness = 1.0 ;
+ fGapBetweenCrystals = 0.03 ;
+
+ fTextolitBoxThickness[0] = 1.5 ;
+ fTextolitBoxThickness[1] = 0.0 ;
+ fTextolitBoxThickness[2] = 3.0 ;
+
+ fAirThickness[0] = 1.56 ;
+ fAirThickness[1] = 20.5175 ;
+ fAirThickness[2] = 2.48 ;
+
+ Float_t XtalModulePhiSize = fNPhi * ( fXtlSize[0] + 2 * fGapBetweenCrystals ) ;
+ Float_t XtalModuleZSize = fNZ * ( fXtlSize[2] + 2 * fGapBetweenCrystals ) ;
+
+ // The next dimensions are calculated from the above parameters
+
+ fOuterBoxSize[0] = XtalModulePhiSize + 2 * ( fAirThickness[0] + fModuleBoxThickness
+ + fTextolitBoxThickness[0] + fOuterBoxThickness[0] ) ;
+ fOuterBoxSize[1] = ( fXtlSize[1] + fCrystalSupportHeight + fCrystalWrapThickness + fCrystalHolderThickness )
+ + 2 * (fAirThickness[1] + fModuleBoxThickness + fTextolitBoxThickness[1] + fOuterBoxThickness[1] ) ;
+ fOuterBoxSize[2] = XtalModuleZSize + 2 * ( fAirThickness[2] + fModuleBoxThickness
+ + fTextolitBoxThickness[2] + fOuterBoxThickness[2] ) ;
+
+ fTextolitBoxSize[0] = fOuterBoxSize[0] - 2 * fOuterBoxThickness[0] ;
+ fTextolitBoxSize[1] = fOuterBoxSize[1] - fOuterBoxThickness[1] - fUpperPlateThickness ;
+ fTextolitBoxSize[2] = fOuterBoxSize[2] - 2 * fOuterBoxThickness[2] ;
+
+ fAirFilledBoxSize[0] = fTextolitBoxSize[0] - 2 * fTextolitBoxThickness[0] ;
+ fAirFilledBoxSize[1] = fTextolitBoxSize[1] - fSecondUpperPlateThickness ;
+ fAirFilledBoxSize[2] = fTextolitBoxSize[2] - 2 * fTextolitBoxThickness[2] ;
+
+}
+
+//____________________________________________________________________________
+void AliPHOSGeometry::InitPPSD(void)
+{
+ // PPSD
+
+ fAnodeThickness = 0.0009 ;
+ fAvalancheGap = 0.01 ;
+ fCathodeThickness = 0.0009 ;
+ fCompositeThickness = 0.3 ;
+ fConversionGap = 0.3 ;
+ fLeadConverterThickness = 0.56 ;
+ fLeadToMicro2Gap = 0.1 ;
+ fLidThickness = 0.2 ;
+ fMicro1ToLeadGap = 0.1 ;
+ fMicromegasWallThickness = 0.6 ;
+ fNumberOfModulesPhi = 4 ;
+ fNumberOfModulesZ = 4 ;
+ fNumberOfPadsPhi = 24 ;
+ fNumberOfPadsZ = 24 ;
+ fPCThickness = 0.1 ;
+ fPhiDisplacement = 0.8 ;
+ fZDisplacement = 0.8 ;
+
+ fMicromegas1Thickness = fLidThickness + 2 * fCompositeThickness + fCathodeThickness + fPCThickness
+ + fAnodeThickness + fConversionGap + fAvalancheGap ;
+ fMicromegas2Thickness = fMicromegas1Thickness ;
+
+
+ fPPSDModuleSize[0] = 38.0 ;
+ fPPSDModuleSize[1] = fMicromegas1Thickness ;
+ fPPSDModuleSize[2] = 38.0 ;
+
+ fPPSDBoxSize[0] = fNumberOfModulesPhi * fPPSDModuleSize[0] + 2 * fPhiDisplacement ;
+ fPPSDBoxSize[1] = fMicromegas2Thickness + fMicromegas2Thickness + fLeadConverterThickness + fMicro1ToLeadGap + fLeadToMicro2Gap ;
+ fPPSDBoxSize[2] = fNumberOfModulesZ * fPPSDModuleSize[2] + 2 * fZDisplacement ;
+
+ fIPtoTopLidDistance = fIPtoOuterCoverDistance - fPPSDBoxSize[1] - 1. ;
+
+}
+
+//____________________________________________________________________________
+AliPHOSGeometry * AliPHOSGeometry::GetInstance()
+{
+ assert(fGeom!=0) ;
+ return (AliPHOSGeometry *) fGeom ;
+}
+
+//____________________________________________________________________________
+AliPHOSGeometry * AliPHOSGeometry::GetInstance(const Text_t* name, const Text_t* title)
+{
+ AliPHOSGeometry * rv = 0 ;
+ if ( fGeom == 0 ) {
+ fGeom = new AliPHOSGeometry(name, title) ;
+ rv = (AliPHOSGeometry * ) fGeom ;
+ }
+ else {
+ if ( strcmp(fGeom->GetName(), name) != 0 ) {
+ cout << "AliPHOSGeometry <E> : current geometry is " << fGeom->GetName() << endl
+ << " you cannot call " << name << endl ;
+ }
+ else
+ rv = (AliPHOSGeometry *) fGeom ;
+ }
+ return rv ;
+}
+
+//____________________________________________________________________________
+Bool_t AliPHOSGeometry::RelToAbsNumbering(const Int_t * RelId, Int_t & AbsId)
+{
+
+ // AbsId = 1:fNModules * fNPhi * fNZ -> PbWO4
+ // AbsId = 1:fNModules * 2 * (fNumberOfModulesPhi * fNumberOfModulesZ) * fNumberOfPadsPhi * fNumberOfPadsZ -> PPSD
+
+ Bool_t rv = kTRUE ;
+
+ if ( RelId[1] > 0 ) { // its a PPSD pad
+
+ AbsId = GetNPhi() * GetNZ() * GetNModules() // the offset to separate emcal crystals from PPSD pads
+ + ( RelId[0] - 1 ) * GetNumberOfModulesPhi() * GetNumberOfModulesZ() // the pads offset of PHOS modules
+ * GetNumberOfPadsPhi() * GetNumberOfPadsZ() * 2
+ + ( RelId[1] - 1 ) * GetNumberOfPadsPhi() * GetNumberOfPadsZ() // the pads offset of PPSD modules
+ + ( RelId[2] - 1 ) * GetNumberOfPadsPhi() // the pads offset of a PPSD row
+ + RelId[3] ; // the column number
+ }
+ else {
+ if ( RelId[1] == 0 ) { // its a Phos crystal
+ AbsId = ( RelId[0] - 1 ) * GetNPhi() * GetNZ() // the offset of PHOS modules
+ + ( RelId[2] - 1 ) * GetNPhi() // the offset of a xtal row
+ + RelId[3] ; // the column number
+ }
+ }
+
+ return rv ;
+}
+
+//____________________________________________________________________________
+
+void AliPHOSGeometry::RelPosInAlice(const Int_t Id, TVector3 & pos )
+{
+ if (Id > 0) {
+
+ Int_t RelId[4] ;
+
+ AbsToRelNumbering(Id , RelId) ;
+
+ Int_t PHOSModule = RelId[0] ;
+
+
+ if ( RelId[1] == 0 ) // it is a PbW04 crystal
+ { pos.SetY( -(GetIPtoOuterCoverDistance() + GetUpperPlateThickness()
+ + GetSecondUpperPlateThickness() + GetUpperCoolingPlateThickness()) ) ;
+ }
+ if ( RelId[1] > 0 ) { // its a PPSD pad
+ if ( RelId[1] > GetNumberOfModulesPhi() * GetNumberOfModulesZ() ) // its an bottom module
+ {
+ pos.SetY(-( GetIPtoOuterCoverDistance() - GetMicromegas2Thickness() / 2.0) ) ;
+ }
+ else // its an upper module
+ pos.SetY(-( GetIPtoOuterCoverDistance() - GetMicromegas2Thickness() - GetLeadToMicro2Gap()
+ - GetLeadConverterThickness() - GetMicro1ToLeadGap() - GetMicromegas1Thickness() / 2.0) ) ;
+ }
+
+ Float_t x, z ;
+ RelPosInModule(RelId, x, z) ;
+
+ pos.SetX(x);
+ pos.SetZ(z);
+
+
+ Float_t Phi = GetPHOSAngle( PHOSModule) ;
+ Double_t const RADDEG = 180.0 / kPI ;
+ Float_t rPhi = Phi / RADDEG ;
+
+ TRotation Rot ;
+ Rot.RotateZ(-rPhi) ; // a rotation around Z by angle
+
+ TRotation dummy = Rot.Invert() ; // to transform from original frame to rotate frame
+
+ pos.Transform(Rot) ; // rotate the baby
+ }
+ else {
+ pos.SetX(0.);
+ pos.SetY(0.);
+ pos.SetZ(0.);
+ }
+}
+
+//____________________________________________________________________________
+void AliPHOSGeometry::RelPosInModule(const Int_t * RelId, Float_t & x, Float_t & z)
+{
+ Int_t PPSDModule ;
+ Int_t Row = RelId[2] ; //offset along z axiz
+ Int_t Column = RelId[3] ; //offset along x axiz
+
+ Float_t PadSizeZ = GetPPSDModuleSize(2)/ GetNumberOfPadsZ();
+ Float_t PadSizeX = GetPPSDModuleSize(0)/ GetNumberOfPadsPhi();
+
+ if ( RelId[1] == 0 ) { // its a PbW04 crystal
+ x = -( GetNPhi()/2. - Row + 0.5 ) * GetCrystalSize(0) ; // position ox Xtal with respect
+ z = -( GetNZ() /2. - Column + 0.5 ) * GetCrystalSize(2) ; // of center of PHOS module
+ }
+ else {
+ if ( RelId[1] > GetNumberOfModulesPhi() * GetNumberOfModulesZ() )
+ PPSDModule = RelId[1]-GetNumberOfModulesPhi() * GetNumberOfModulesZ();
+ else PPSDModule = RelId[1] ;
+ Int_t ModRow = 1+(Int_t)TMath::Ceil( (Float_t)PPSDModule / GetNumberOfModulesPhi()-1. ) ;
+ Int_t ModCol = PPSDModule - ( ModRow-1 ) * GetNumberOfModulesPhi() ;
+ Float_t x0 = ( GetNumberOfModulesPhi() / 2. - ModRow + 0.5 ) * GetPPSDModuleSize(0) ;
+ Float_t z0 = ( GetNumberOfModulesZ() / 2. - ModCol + 0.5 ) * GetPPSDModuleSize(2) ;
+ x = - ( GetNumberOfPadsPhi()/2. - Row - 0.5 ) * PadSizeX + x0 ; // position of pad with respect
+ z = - ( GetNumberOfPadsZ()/2. - Column - 0.5 ) * PadSizeZ + z0 ; // of center of PHOS module
+ }
+}
+
+//____________________________________________________________________________
+void AliPHOSGeometry:: SetPHOSAngles()
+{
+ Double_t const RADDEG = 180.0 / kPI ;
+ Float_t PPHI = TMath::ATan( fOuterBoxSize[0] / ( 2.0 * fIPtoOuterCoverDistance ) ) ;
+ PPHI *= RADDEG ;
+
+ for( Int_t i = 1; i <= fNModules ; i++ ) {
+ Float_t angle = PPHI * 2 * ( i - fNModules / 2.0 - 0.5 ) ;
+ fPHOSAngle[i-1] = - angle ;
+ }
+}
+
--- /dev/null
+/**************************************************************************
+ * 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. *
+ **************************************************************************/
+
+/*
+$Log$
+Revision 1.1 1999/12/17 09:01:14 fca
+Y.Schutz new classes for reconstruction
+
+*/
+
+//-*-C++-*-
+//_________________________________________________________________________
+// Base Class of Cluster (empty cxx needed by Root)
+//*-- Author : Yves Schutz SUBATECH
+//////////////////////////////////////////////////////////////////////////////
+
+// --- ROOT system ---
+
+#include "TObjArray.h"
+
+// --- Standard library ---
+
+// --- AliRoot header files ---
+
+#include "AliRecPoint.h"
+
+ClassImp(AliRecPoint)
+
+
+//____________________________________________________________________________
+AliRecPoint::AliRecPoint()
+{
+ // ctor
+ fAmp = 0.0 ;
+
+ fLocPos.SetXYZ(0., 0., 0.) ;
+ fLocPosM = new TMatrix(3,3) ;
+ fMaxDigit = 100 ;
+ fMulDigit = 0 ;
+ fDigitsList = new int[fMaxDigit]; ;
+ fMaxTrack = 5 ;
+ fMulTrack = 0 ;
+ fTracksList = new int[fMaxTrack]; ;
+}
+
+//____________________________________________________________________________
+AliRecPoint::~AliRecPoint()
+{
+ // dtor
+
+ delete fLocPosM ;
+ if ( fDigitsList ) delete fDigitsList ;
+ if ( fTracksList ) delete fTracksList ;
+
+}
+
+//____________________________________________________________________________
+void AliRecPoint::AddDigit(AliDigitNew & digit)
+{
+ // adds a digit to the digits list
+ // and accumulates the total amplitude and the multiplicity
+
+
+ if ( fMulDigit >= fMaxDigit ) { // increase the size of the list
+ int * tempo = new ( int[fMaxDigit*=2] ) ;
+
+ Int_t index ;
+
+ for ( index = 0 ; index < fMulDigit ; index++ )
+ tempo[index] = fDigitsList[index] ;
+
+ delete fDigitsList ;
+ fDigitsList = tempo ;
+ }
+
+ fDigitsList[fMulDigit++]= (int) &digit ;
+ fAmp += digit.GetAmp() ;
+}
+
+//____________________________________________________________________________
+// void AliRecPoint::AddTrack(AliTrack & track)
+// {
+// // adds a digit to the digits list
+// // and accumulates the total amplitude and the multiplicity
+
+
+// if ( fMulTrack >= fMaxTrack ) { // increase the size of the list
+// int * tempo = new int[fMaxTrack*=2] ;
+// Int_t index ;
+// for ( index = 0 ; index < fMulTrack ; index++ )
+// tempo[index] = fTracksList[index] ;
+// delete fTracksList ;
+// fTracksList = tempo ;
+// }
+
+// fTracksList[fMulTrack++]= (int) &Track ;
+// }
+
+//____________________________________________________________________________
+void AliRecPoint::GetCovarianceMatrix(TMatrix & mat)
+{
+ // returns the covariant matrix for the local position
+
+ mat = *fLocPosM ;
+
+}
+
+//____________________________________________________________________________
+void AliRecPoint::GetLocalPosition(TVector3 & pos)
+{
+ // returns the position of the cluster in the local reference system of the sub-detector
+
+ pos = fLocPos;
+
+
+}
+
+//____________________________________________________________________________
+void AliRecPoint::GetGlobalPosition(TVector3 & gpos, TMatrix & gmat)
+{
+ // returns the position of the cluster in the global reference system of ALICE
+ // and the uncertainty on this position
+
+
+ fGeom->GetGlobal(this, gpos, gmat) ;
+
+}
+
+//______________________________________________________________________________
+void AliRecPoint::Streamer(TBuffer &R__b)
+{
+ // Stream an object of class AliRecPoint.
+
+ if (R__b.IsReading()) {
+ Version_t R__v = R__b.ReadVersion(); if (R__v) { }
+ TObject::Streamer(R__b);
+ R__b >> fAmp;
+ R__b.ReadArray(fDigitsList);
+ R__b >> fGeom;
+ fLocPos.Streamer(R__b);
+ R__b >> fLocPosM;
+ R__b >> fMulDigit;
+ R__b >> fMulTrack;
+ R__b.ReadArray(fTracksList);
+ } else {
+ R__b.WriteVersion(AliRecPoint::IsA());
+ TObject::Streamer(R__b);
+ R__b << fAmp;
+ R__b.WriteArray(fDigitsList, fMaxDigit);
+ R__b << fGeom;
+ fLocPos.Streamer(R__b);
+ R__b << fLocPosM;
+ R__b << fMulDigit;
+ R__b << fMulTrack;
+ R__b.WriteArray(fTracksList, fMaxTrack);
+ }
+}
--- /dev/null
+/**************************************************************************
+ * 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. *
+ **************************************************************************/
+
+/*
+$Log$
+Revision 1.1 1999/12/17 09:01:14 fca
+Y.Schutz new classes for reconstruction
+
+*/
+
+//-*-C++-*-
+//_________________________________________________________________________
+// Base Class of Cluster (empty cxx needed by Root)
+//*-- Author : Yves Schutz SUBATECH
+//////////////////////////////////////////////////////////////////////////////
+
+// --- ROOT system ---
+
+#include "TObjArray.h"
+
+// --- Standard library ---
+
+// --- AliRoot header files ---
+
+#include "AliRecPoint.h"
+
+ClassImp(AliRecPoint)
+
+
+//____________________________________________________________________________
+AliRecPoint::AliRecPoint()
+{
+ // ctor
+ fAmp = 0.0 ;
+
+ fLocPos.SetXYZ(0., 0., 0.) ;
+ fLocPosM = new TMatrix(3,3) ;
+ fMaxDigit = 100 ;
+ fMulDigit = 0 ;
+ fDigitsList = new int[fMaxDigit]; ;
+ fMaxTrack = 5 ;
+ fMulTrack = 0 ;
+ fTracksList = new int[fMaxTrack]; ;
+}
+
+//____________________________________________________________________________
+AliRecPoint::~AliRecPoint()
+{
+ // dtor
+
+ delete fLocPosM ;
+ if ( fDigitsList ) delete fDigitsList ;
+ if ( fTracksList ) delete fTracksList ;
+
+}
+
+//____________________________________________________________________________
+void AliRecPoint::AddDigit(AliDigitNew & digit)
+{
+ // adds a digit to the digits list
+ // and accumulates the total amplitude and the multiplicity
+
+
+ if ( fMulDigit >= fMaxDigit ) { // increase the size of the list
+ int * tempo = new ( int[fMaxDigit*=2] ) ;
+
+ Int_t index ;
+
+ for ( index = 0 ; index < fMulDigit ; index++ )
+ tempo[index] = fDigitsList[index] ;
+
+ delete fDigitsList ;
+ fDigitsList = tempo ;
+ }
+
+ fDigitsList[fMulDigit++]= (int) &digit ;
+ fAmp += digit.GetAmp() ;
+}
+
+//____________________________________________________________________________
+// void AliRecPoint::AddTrack(AliTrack & track)
+// {
+// // adds a digit to the digits list
+// // and accumulates the total amplitude and the multiplicity
+
+
+// if ( fMulTrack >= fMaxTrack ) { // increase the size of the list
+// int * tempo = new int[fMaxTrack*=2] ;
+// Int_t index ;
+// for ( index = 0 ; index < fMulTrack ; index++ )
+// tempo[index] = fTracksList[index] ;
+// delete fTracksList ;
+// fTracksList = tempo ;
+// }
+
+// fTracksList[fMulTrack++]= (int) &Track ;
+// }
+
+//____________________________________________________________________________
+void AliRecPoint::GetCovarianceMatrix(TMatrix & mat)
+{
+ // returns the covariant matrix for the local position
+
+ mat = *fLocPosM ;
+
+}
+
+//____________________________________________________________________________
+void AliRecPoint::GetLocalPosition(TVector3 & pos)
+{
+ // returns the position of the cluster in the local reference system of the sub-detector
+
+ pos = fLocPos;
+
+
+}
+
+//____________________________________________________________________________
+void AliRecPoint::GetGlobalPosition(TVector3 & gpos, TMatrix & gmat)
+{
+ // returns the position of the cluster in the global reference system of ALICE
+ // and the uncertainty on this position
+
+
+ fGeom->GetGlobal(this, gpos, gmat) ;
+
+}
+
+//______________________________________________________________________________
+void AliRecPoint::Streamer(TBuffer &R__b)
+{
+ // Stream an object of class AliRecPoint.
+
+ if (R__b.IsReading()) {
+ Version_t R__v = R__b.ReadVersion(); if (R__v) { }
+ TObject::Streamer(R__b);
+ R__b >> fAmp;
+ R__b.ReadArray(fDigitsList);
+ R__b >> fGeom;
+ fLocPos.Streamer(R__b);
+ R__b >> fLocPosM;
+ R__b >> fMulDigit;
+ R__b >> fMulTrack;
+ R__b.ReadArray(fTracksList);
+ } else {
+ R__b.WriteVersion(AliRecPoint::IsA());
+ TObject::Streamer(R__b);
+ R__b << fAmp;
+ R__b.WriteArray(fDigitsList, fMaxDigit);
+ R__b << fGeom;
+ fLocPos.Streamer(R__b);
+ R__b << fLocPosM;
+ R__b << fMulDigit;
+ R__b << fMulTrack;
+ R__b.WriteArray(fTracksList, fMaxTrack);
+ }
+}
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
+ "http://www.w3.org/TR/REC-html40/loose.dtd">
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.51 [en] (X11; I; Linux 2.2.5-15 i686) [Netscape]">
+ <title>PHOS FAST SIMULATION Proposal</title>
+ <!-- Changed by: Yves Schutz, 7-Dec-1999 -->
+ <link REL="stylesheet" href="http://www-subatech.in2p3.fr/~photons/gps_alice.css" type="text/css">
+ <script language="JavaScript">
+ <!--
+
+ function open1()
+ {
+ x = window.open('alirecpointclassdiagram.html', 'AliRecPoint', 'status=yes,width=680,height=750');
+ }
+ function open2()
+ {
+ x = window.open('alirecpointclass.html', 'AliRecPoint', 'status=yes,width=430,height=650');
+ }
+ function open3()
+ {
+ x = window.open('AliRecPoint.h', 'AliRecPointh', 'status=yes');
+ }
+ function open4()
+ {
+ x = window.open('AliRecPoint.cxx', 'AliRecPointcxx', 'status=yes');
+ }
+ function open5()
+ {
+ x = window.open('AliGeometry.h', 'AliGeometryh', 'status=yes');
+ }
+ function open6()
+ {
+ x = window.open('AliPHOSGeometry.h', 'AliPHOSGeometryh', 'status=yes');
+ }
+ function open7()
+ {
+ x = window.open('AluPHOSGeometry.cxx', 'AliPHOSGeometrycxx', 'status=yes');
+ }
+ //-->
+ </script>
+ </head>
+ <body>
+
+
+ <h1>
+ Proposal for the AliRecPoint Base Class
+ </h1>
+ At the Offline meeting held during December 1999, it was decided
+ that a AliRecpoint base class should be designed.
+ First let's suggest the following class diagram:
+ <br><br>
+ <h4>
+ <ol>
+ <li>
+ <A href="#1" onClick="open1()"> AliRecpoint class in AliRoot</A>
+ </li>
+ <li>
+ <A href="#2" onClick="open2()"> Details of the AliRecpoint class</A>
+ </li>
+ </ol>
+ </h4>
+ <br><br>
+ And now here is the suggested implementation.
+ <br><br>
+ <h4>
+ <ol>
+ <li>
+<!-- <A href="#3" onClick="open3()">AliRecPoint.h</A> -->
+ <A href="AliRecPoint.h">AliRecPoint.h</A>
+ </li>
+ <li>
+<!-- <A href="#4" onClick="open4()">AliRecPoint.cxx</A> -->
+ <A href="AliRecPoint.cxx">AliRecPoint.cxx</A>
+ </li>
+ <li>
+<!-- <A href="#5" onClick="open5()">AliGeometry.h</A> -->
+ <A href="AliGeometry.h">AliGeometry.h</A>
+ </li>
+ </ol>
+ </h4>
+ <br><br>
+ ... and an example on how PHOS uses AliGeometry
+ <br><br>
+ <h4>
+ <ol>
+ <li>
+<!-- <A href="#6" onClick="open6()">AliPHOSGeometry.h</A> -->
+ <A href="AliPHOSGeometry.h">AliPHOSGeometry.h</A>
+ </li>
+ <li>
+<!-- <A href="#7" onClick="open7()">AliPHOSGeometry.cxx</A> -->
+ <A href="AliPHOSGeometry.cxx">AliPHOSGeometry.cxx</A>
+ </li>
+ </ol>
+ </h4>
+ <br><br>
+ But I need a new AliDigit looking like this : <A href="AliDigitNew.h">AliDigitNew.h</A>
+ <hr>
+ <address class="left">
+ © <a href="mailto:schutz@in2p3.fr">Groupe Photons Subatech</a> <a href="http://www-subatech.in2p3.fr/~photons/subatech/en_index.shtml">[Go
+ to the GPS Home Page]</a></address>
+
+ <address class="right">
+ <!-- Created: Tue Oct 26 19:52:56 CEST 1999 -->
+ <!-- hhmts start -->
+Last modified: Thu Dec 9 23:30:14 CET 1999
+<!-- hhmts end --></address>
+
+ <div align=right><a href="http://validator.w3.org/check/referer"><img SRC="vh40.gif" ALT="Valid HTML 4.0!" BORDER=0 height=31 width=88></a><a href="http://jigsaw.w3.org/css-validator"><img SRC="vcss.gif" ALT="Valid CSS!" BORDER=0 height=31 width=88></a></div>
+
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.51 [en] (X11; I; Linux 2.2.5-15 i686) [Netscape]">
+ <title>AliRecPoint Class </title>
+ <link REL="stylesheet" href="http://www-subatech.in2p3.fr/~photons/gps_alice.css" type="text/css">
+ </head>
+
+ <body>
+ <h1>AliRecPoint Class</h1>
+ <center>
+ <img src="alirecpointclass.gif" alt="AliRecPoint class diagram by argo">
+ </center>
+ <br><br>
+ <form>
+ <input type="button" onClick='window.close()' value="Close" name="button">
+ </form>
+ <hr>
+ <address><a href="mailto:schutz@in2p3.fr">Yves SCHUTZ</a></address>
+<!-- Created: Thu Dec 9 21:54:05 CET 1999 -->
+<!-- hhmts start -->
+Last modified: Thu Dec 9 22:02:57 CET 1999
+<!-- hhmts end -->
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.51 [en] (X11; I; Linux 2.2.5-15 i686) [Netscape]">
+ <title>AliRecPoint Class Diagram</title>
+ <link REL="stylesheet" href="http://www-subatech.in2p3.fr/~photons/gps_alice.css" type="text/css">
+ </head>
+
+ <body>
+ <h1>AliRecPoint Class Diagram</h1>
+ <center>
+ <img src="alirecpointclassdiagram.gif" alt="AliRecPoint class diagram by argo">
+ </center>
+ <br><br>
+ <form>
+ <input type=button onClick='window.close()' value="Close" name="button">
+ </form>
+ <hr>
+ <address><a href="mailto:schutz@in2p3.fr">Yves SCHUTZ</a></address>
+<!-- Created: Thu Dec 9 21:54:05 CET 1999 -->
+<!-- hhmts start -->
+Last modified: Thu Dec 9 23:24:42 CET 1999
+<!-- hhmts end -->
+ </body>
+</html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
+ "http://www.w3.org/TR/REC-html40/loose.dtd">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.51 [en] (X11; I; Linux 2.2.5-15 i686) [Netscape]">
+ <title>PHOS FAST SIMULATION Proposal</title>
+ <!-- Changed by: Yves Schutz, 7-Dec-1999 -->
+<link REL="stylesheet" href="http://www-subatech.in2p3.fr/~photons/gps_alice.css" type="text/css">
+</head>
+<body>
+
+
+<h1>
+ PHOS Fast Simulation
+</h1>
+At the Offline meeting held during December 1999, it was decided
+that each sub-detector makes a Use Case for a fast simulation scheme. Here is what we suggest for PHOS.
+<P>
+
+<center><img SRC="usecasefastsimulation.gif" ALT="[Use Case for fast simulation]" height=425 width=483></center>
+
+
+<hr>
+<address class="left">
+© <a href="mailto:schutz@in2p3.fr">Groupe Photons Subatech</a> <a href="http://www-subatech.in2p3.fr/~photons/subatech/en_index.shtml">[Go
+to the GPS Home Page]</a></address>
+
+<address class="right">
+<!-- Created: Tue Oct 26 19:52:56 CEST 1999 -->
+<!-- hhmts start -->
+Last modified: Wed Dec 7 18:54:10 CET 1999
+<!-- hhmts end --></address>
+
+<div align=right><a href="http://validator.w3.org/check/referer"><img SRC="vh40.gif" ALT="Valid HTML 4.0!" BORDER=0 height=31 width=88></a><a href="http://jigsaw.w3.org/css-validator"><img SRC="vcss.gif" ALT="Valid CSS!" BORDER=0 height=31 width=88></a></div>
+
+</body>
+</html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
+ "http://www.w3.org/TR/REC-html40/loose.dtd">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.51 [en] (X11; I; Linux 2.2.5-15 i686) [Netscape]">
+ <title>PHOS Geometry in AliRoot</title>
+<link REL="stylesheet" href="http://www-subatech.in2p3.fr/~photons/gps_alice.css" type="text/css">
+</head>
+<body>
+
+<h1 class="page-header">
+Geometry & Materials
+</h1>
+
+
+This document result from the effort lead by the Photon Group at SUBATECH
+to organize within the PHOS collaboration the software needed for the performance
+and physics simulation of PHOS and for the reconstruction of the raw data
+(presently simulated one's and real data in the future). The PHOS software
+so far distributed with the AliRoot
+V3.02 package is still rather shaky, lacks documentation and organisation.
+It was therefore necessary to establish a few rules to achieve a coherent
+software package usable by any interested user.
+<h1>
+Rules</h1>
+
+<ol>
+<li>
+<a href="http://www-subatech.in2p3.fr/~photons/subatech/">SUBATECH</a>
+represented by <a href="mailto:schutz@in2p3.fr">Yves Schutz</a> is the
+librarian of the PHOS contribution to AliRoot</li>
+
+<li>
+Any modification to the existing software or any new piece of software
+must be approved by the librarian who is in charge of the updates</li>
+
+<li>
+Developpers must used CVS to download the official software from the CERN
+repository</li>
+
+<li>
+Developpers must comply with the AliRoot coding convention</li>
+
+<li>
+FORTRAN is a strictly prohibited language</li>
+
+<li>
+Any new piece of code must be documented along the line: what is the purpose,
+how is it done, how to use it</li>
+</ol>
+<br><br>
+The PHOS package is organized along two directions which we will try to
+keep as independent as possible. The simulation is the first one, the reconstruction
+the second one.
+<h1>
+Simulation</h1>
+The simulation is done in two steps, one which describes the detector geometry
+and material and one which does the particle tracking and stores the hits
+and digits in a TTree itself written on a disk file. These two steps are
+steered through a macro file launched at the AliRoot prompt.
+<h2>
+Geometry</h2>
+
+<h4>
+Definition</h4>
+PHOS consists of two distinct parts. The calorimeter, named EMCA, consists
+of the PbW04 crystals within their housing. The crystals are assembled
+in <i>fNModules</i> modules of <i>fNPhi </i>rows along the x-axis direction
+and <i>fNZ</i> modules along the z-axis direction. Since the total number
+of crystals and their layout within ALICE is presently (11/11/1999) not
+final it was decided to fully parametrize the geometry. A change in any
+of the three previously defined parameters will provide automatically a
+new layout of the modules.
+<br>The second part of PHOS is the charged particle identifier. Since until
+end of 2000 no decision will be taken on the final design of this element
+two or more versions can be considered. Today (11/11/1999) only one version
+is implemented and is named PPSD for PHOS Pre-Shower Detector. It consists
+of a first layer of <i>fNumberOfModulesPhi</i> x <i>fNumberOfModulesZ </i>gas
+detectors per PHOS module, each detectors being subdivided into <i>fNumberOfPadsPhi</i>
+x <i>fNumberOfPadsZ </i>gas cells, a Lead converter and a second layer
+of gas detectors identical to the first layer. This second part is positionned
+on top of the EMCA module.
+<br><br>
+ <center>
+ <img SRC="PHOSGeantTree.gif" ALT="Geant Tree for PHOS" >
+ <br><br>
+ <b> Figure 1.: </b> <i> GEANT Tree which describes the PHOS geometry </i>
+ </center>
+
+<h4>
+Implementation</h4>
+<p>
+ <center>
+ <img SRC="aliphossimulation.gif" ALT="Geom/Simul class diagram" >
+ <br><br>
+ <b> Figure 2.: </b> <i> Class diagram for the geometry/simulation package </i>
+ </center>
+<p>
+<i><u>AliPHOS</u> : </i>This is the base class. It derives from <i>AliDetector.
+</i>It's only purpose so far (11/11/1999) is to describe the materials
+(à la <i>AliMC</i>) needed for the EMCA and PPSD construction.
+<p>
+<i><u>AliPHOSv4</u></i>: It derives from <i>AliPHOS</i>.
+<br>
+<ul>
+<li>
+It sets up the geometry for the Root display (<i>AliPHOSv4::BuildGeometry()</i>)
+and for the GEANT tracking (<i>AliPHOSv4::CreateGeometry()</i>).</li>
+
+<li>
+It watches the tracks passing through the active media of EMCA and PPSD
+(<i>AliPHOSv4::StepManager()</i>).</li>
+
+<li>
+It stores the hits (<i>AliPHOSv4::AddHit()</i>), using the <i>AliPHOSHit</i>
+class.</li>
+
+<li>
+It stores the digits (<i>AliPHOSv4::FinishEvent()</i>), using the <i>AliPHOSDigit</i>
+class.</li>
+</ul>
+<p>
+<i><u>AliPHOSGeometry</u></i>: It derives from <i>TObject</i> to make it
+persistent. It is a singleton, i.e., a pointer to the unique instance of
+this class is obtained by:
+<center><PRE class="code">AliPHOSGeometry * Geom = AliPHOSGeometry::GetInstance()</PRE></center>
+
+<ul>
+<li>
+It sets the various parameters for the geometry description and provides
+the method to access all the parameters. To avoid cumbersome macros at
+run time these parameters can only be changed manually in the source code.</li>
+
+<li>
+It provides the method to convert the absolute detector Id (crystal in
+EMCA or pad in PPSD) into a relative Id : PHOS module number, PPSD module
+number, row, column (<i>AliPHOSGeometry::AbsToRelNumbering()</i>) and the
+reverse operation (<i>AliPHOSGeometry::RelToAbsNumbering()</i>).</li>
+
+<li>
+It provides the method to convert an absolute Id into a three-vector giving
+the position of the detector in ALICE (<i>AliPHOSGeometry::RelPosInAlice()</i>)</li>
+</ul>
+<p>
+<i><u>AliPHOSHit</u></i>: It derives from <i>AliHit</i>. It stores the
+hits as the pair (absolute Id, deposited energy) in the hit TTree when
+ordered by the step manager of <i>AliPHOSv4</i>
+<p>
+<i><u>AliPHOSDigit</u></i> : It derives from <i>AliDigit</i>. It stores
+the digits as the pair (absolute Id, energy) in the digit TTree when
+ordered by the finish event of <i>AliPHOSv4</i>
+<h4>
+Usage</h4>
+<p>
+<PRE class="code">
+Int_t iPHOS=1;
+if(iPHOS) {
+AliPHOS * phos = new AliPHOSv4("PHOS", char * name) ;
+}
+</PRE>
+<br>where name can take the following values:
+<ul>
+<li>
+<i>GPS2</i>: will create EMCA plus PPSD
+<br><br>
+ <center>
+ <table>
+ <tr>
+ <td align=center valign=baseline>
+ <img SRC="AlicebyGeant.gif" ALT="Geant display of PHOS" width="447" height="429" >
+ </td>
+ <td align=center valign=baseline>
+ <img SRC="AlicebyRoot.gif" ALT="Root display of Alice" width="447" height="429" >
+ </td>
+ <tr>
+ <td align=left valign=top>
+ <b> Figure 3.: </b> <i> GEANT display of ALICE </i>
+ </td>
+ <td align=left valign=top>
+ <b> Figure 4.: </b> <i> Root display of ALICE </i>
+ </td>
+ </tr>
+ </table>
+ </center> <br><br>
+</li>
+
+<li>
+more to come from Protvino (EMCA plus other CPV type)</li>
+</ul>
+
+<br>EMCA consists of 5 modules of 64x64 modules each, positionned at
+azimuthal angles -40, -20, 0, +20, +40 (see figures). PPSD consists per
+EMCA module of 2 layers of 4x4 gas detectors each, each detector having
+24x24 gas cells.
+
+<hr>
+<address class="left">
+ © <a href="mailto:schutz@in2p3.fr">>Groupe Photons Subatech (Yves SCHUTZ)</a>
+ <a href="http://www-subatech.in2p3.fr/~photons/subatech/en_index.shtml">[Go
+ to the GPS Home Page]</a>
+</address>
+<!-- Created: Wed Nov 17 12:16:58 CET 1999 -->
+<!-- hhmts start -->
+Last modified: Tue Nov 23 09:49:02 CET 1999
+<!-- hhmts end -->
+<div align=right><a href="http://validator.w3.org/check/referer"><img SRC="vh40.gif" ALT="Valid HTML 4.0!" BORDER=0 height=31 width=88></a><a href="http://jigsaw.w3.org/css-validator"><img SRC="vcss.gif" ALT="Valid CSS!" BORDER=0 height=31 width=88></a></div>
+
+
+</body>
+</html>
+
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
+ "http://www.w3.org/TR/REC-html40/loose.dtd">
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.51 [en] (X11; I; Linux 2.2.5-15 i686) [Netscape]">
+ <title>PHOS in AliRoot</title>
+ <!-- Changed by: Yves Schutz, 7-Dec-1999 -->
+ <link REL="stylesheet" href="http://www-subatech.in2p3.fr/~photons/gps_alice.css" type="text/css">
+
+ <script type="text/javascript">
+ image1 = new Image(30,44);
+ image1.src = "tournesol.jpg";
+ image2 = new Image(30,44);
+ image2.src = "go.jpg";
+ image3 = new Image(30,44);
+ image3.src = "sun.jpg";
+ image5 = new Image(30,44);
+ image5.src = "star.jpg";
+ image4 = new Image(356,240);
+ image4.src = "Title2.jpg";
+ image6 = new Image(356,240);
+ image6.src = "Title1.jpg";
+ image7 = new Image(356,240);
+ image7.src = "ufi.jpg";
+ image8 = new Image(356,240);
+ image8.src = "abl.jpg";
+
+ </script>
+
+ <SCRIPT TYPE="text/javascript">
+ <!-- Hide from old browsers
+ function makeArray(n) {
+ this.length = n;
+ for (var i=1; i<=n; i++) {
+ this[i] = "";
+ }
+ return this;
+ }
+ var i;
+ function imagealeatoire() {
+ i = Math.floor(2 * Math.random() + 1);
+ return image[i];
+ }
+ image = new makeArray(2);
+ image[1]="Title1.jpg";
+ image[2]="Title2.jpg";
+ // Stop hiding from old browsers -->
+ </SCRIPT>
+ </head>
+
+ <body>
+ <center>
+ <table>
+ <tr><td>
+ <SCRIPT type="text/javascript">document.write("<IMG SRC=" +imagealeatoire() +" WIDTH=356 HEIGHT=240 BORDER=0>");</SCRIPT>
+ <br><br>
+ </td>
+ <td>
+ <table align=center>
+ <tr>
+ <td align=right>
+ <h3> <font color="#FF0000"> PHOS Geometry & Materials </font> </h3>
+ </td>
+ <td valign=baseline>
+ <a href="geometry.html" onMouseOver="Bouton1.src = image2.src" onMouseOut="Bouton1.src = image1.src">
+ <img SRC="tournesol.jpg" NAME="Bouton1" BORDER="0" WIDTH="44" HEIGHT="30"></a>
+ </td>
+ </tr>
+ <tr>
+ <td align=right>
+ <h3> <font color="#FF0000"> Event Generator </font></h3>
+ </td>
+ <td valign=baseline>
+ <a href="simulation.html" onMouseOver="Bouton2.src = image2.src" onMouseOut="Bouton2.src = image3.src">
+ <img SRC="sun.jpg" NAME="Bouton2" BORDER="0" WIDTH="44" HEIGHT="30"></a>
+ </td>
+ </tr>
+ <tr>
+ <td align=right>
+ <h3> <font color="#FF0000"> PHOS Reconstruction</font></h3>
+ </td>
+ <td valign=baseline>
+ <a href="reconstruction.html" onMouseOver="Bouton3.src = image2.src" onMouseOut="Bouton3.src = image5.src">
+ <img SRC="star.jpg" NAME="Bouton3" BORDER="0" WIDTH="44" HEIGHT="30"></a>
+ </td>
+ </tr>
+ <tr>
+ <td align=right>
+ <h3> <font color="#FF0000"> Fast simulation</font></h3>
+ </td>
+ <td valign=baseline>
+ <a href="fastsimulation.html" onMouseOver="Bouton4.src = image2.src" onMouseOut="Bouton4.src = image7.src">
+ <img SRC="ufi.jpg" NAME="Bouton4" BORDER="0" WIDTH="44" HEIGHT="30"></a>
+ </td>
+ </tr>
+ <tr>
+ <td align=right>
+ <h3> <font color="#FF0000"> AliRecPoint class</font></h3>
+ </td>
+ <td valign=baseline>
+ <a href="alirecpoint.html" onMouseOver="Bouton5.src = image2.src" onMouseOut="Bouton5.src = image8.src">
+ <img SRC="abl.jpg" NAME="Bouton5" BORDER="0" WIDTH="44" HEIGHT="30"></a>
+ </td>
+ </tr>
+ </table>
+ </table>
+ <h1> The Use Case ... </h1><br>
+ <img SRC="usecasegeneral.gif" ALT="general use case">
+ </center>
+ <hr>
+ <address class="left">
+ © <a href="mailto:schutz@in2p3.fr">Groupe Photons Subatech</a> <a href="http://www-subatech.in2p3.fr/~photons/subatech/en_index.shtml">[Go
+ to the GPS Home Page]</a></address>
+
+ <address class="right">
+ <!-- Created: Tue Oct 26 19:52:56 CEST 1999 -->
+ <!-- hhmts start -->
+Last modified: Wed Dec 1 10:10:38 CET 1999
+<!-- hhmts end --></address>
+
+<!-- <div align=right><a href="http://validator.w3.org/check/referer"><img SRC="vh40.gif" ALT="Valid HTML 4.0!" BORDER=0 height=31 width=88></a><a href="http://jigsaw.w3.org/css-validator"><img SRC="vcss.gif" ALT="Valid CSS!" BORDER=0 height=31 width=88></a></div>-->
+
+ </body>
+</html>
+
+
+
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
+ "http://www.w3.org/TR/REC-html40/loose.dtd">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.51 [en] (X11; I; Linux 2.2.5-15 i686) [Netscape]">
+ <title>PHOS Reconstruction Proposal</title>
+<link REL="stylesheet" href="http://www-subatech.in2p3.fr/~photons/gps_alice.css" type="text/css">
+</head>
+<body>
+
+
+<h1>
+PHOS Reconstruction Proposal</h1>
+At the Offline meeting held during the September ALICE week, it was decided
+to make a major step in the design of the overall reconstruction framework.
+This document presents the results of our early brainstorming about the
+design of the reconstruction of the Photon Spectrometer PHOS.
+<br>
+<br>
+<p>
+<hr><a NAME="definitions and objectives"></a>
+<h1>
+Definitions and objectives</h1>
+
+<h2>
+What is PHOS ?</h2>
+We hereby consider that the PHOS detector is the <i>union</i> of two sub-detectors
+: the lead tungstate crystals and the Charged Particle Veto (CPV). Both
+sub-detectors are physically organized in <i>modules</i>. A separate document
+is dedicated to the <a href="PHOS_Proposal.html">PHOS geometry</a>.
+<h2>
+What is the reconstruction ?</h2>
+Using the AliRoot framework, we would like to be able to compare several
+CPV alternatives. The main focus will be on the photon identification capabilities
+of PHOS, i.e. on the hadron rejection capabilities.
+<p>This document describes the reconstruction software we intend to write/have
+written to achieve this objective. <i>Reconstruction</i> is meant as the
+full path from the PHOS digits to physical particles. The PHOS digits are
+obtained by the simulation part of AliRoot.
+<p>The PHOS reconstruction can be divided in three passes:
+<dl>
+<dt>
+<b>Clusterization</b></dt>
+
+<dd>
+We group adjacent crystals (pads) with a signal over a given threshold
+to form <i>clusters</i></dd>
+
+<dt>
+<b>Sub-Tracking</b></dt>
+
+<dd>
+Crystals and CPV clusters are associated to form PHOS <i>sub-tracks</i>.
+Loosely speaking, a PHOS sub-track is just a crystal cluster with an information
+on its charge.</dd>
+
+<dt>
+<b>Identification</b> (Tracking)</dt>
+
+<dd>
+Several (at least one) detector sub-tracks are combined and matched with
+<i>particles</i>.</dd>
+</dl>
+The two first passes are detector specific, i.e. do not require any information
+about other detectors. The last part may (and probably will) depend on
+other detector reconstructions.
+
+<p class="right">The key point in the following presented design is that
+we want to be able to experiment several alternatives in each of the three
+passes.
+<h2>
+Generalization</h2>
+We often tried to generalized our design 'one step up', i.e. up to the
+AliRoot framework itself, by defining pABC (pure Abstract Base Classes)
+which we derive from. This is by no mean of way of saying that this is
+the way to go. It's just a proposal, i.e. <i>a call for discussion</i>.
+Also, we tried to make an effort on the class names, but you might find
+our names strange or badly chosen. If this is the case, please <a href="mailto:aphecetc@in2p3.fr">tell
+us</a> !
+<br><!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
+<hr>
+<h1>
+Clusterization</h1>
+The clusterization part of the reconstruction can be summarized by the
+following Use Case :
+<center><img SRC="usecasereconstruction.gif" ALT="[Reconstruction Use Case]" height=355 width=599></center>
+So, the basic functionalities we want here are :
+<dl>
+<dt>
+<b>Storing/Retrieving data</b></dt>
+
+<dd>
+We want to <i>read</i> digits from file, and want to be able to <i>write</i>
+clusters on file,</dd>
+
+<dt>
+<b>Clusterizing</b></dt>
+
+<dd>
+A separate document will detail the clusterization method(s).</dd>
+
+<dt>
+<b>Keeping track of what we did</b></dt>
+
+<dd>
+We would like to be able afterwards to answer questions like "I have a
+cluster in hand, with which method has it been constructed ? With which
+method parameters ?".</dd>
+</dl>
+We would like to insist on the last point. It is far more general than
+a particular PHOS issue, and must be addressed in some way by the AliRoot
+framework itself.
+<p>The following class diagram outlines the clusterization part of the
+PHOS reconstruction : a Clusterizer object groups some Digits into Clusters.
+<center><img SRC="aliphosclusterization.gif" ALT="[Clusterization Class Diagram]" ></center>
+The key point here is the possibility to actually change of clusterization
+method (Clusterizer class) at runtime. The idea is to use the <a href="http://hillside.net/patterns/">Strategy
+Design Pattern</a> (see <a href="#particle_identification">Particle Identification</a>
+for a class diagram).
+<p>The following tables presents a trial CRC study of the PHOS classes
+related to the clusterization that lead to the above class diagram.
+<br><!-- crc template
+<div class="crc">
+<dl>
+<dt><strong>Classname:</strong>
+<dd><em class="classname">Ali</em>
+<dt><strong>Superclasses :</strong>
+<dd>Ali
+<dt><strong>Subclasses :</strong>
+<dd>Ali
+<dt><strong>Responsabilities: </strong>
+<dd>
+<dt><strong>Collaborators: </strong>
+<dd>Ali
+</dl>
+</div>
+-->
+<hr class="small-separation">
+<div class="crc">
+<dl>
+<dt>
+<b>Classname:</b></dt>
+
+<dd>
+<i>AliPHOSDigit</i></dd>
+
+<dt>
+<b>Superclasses :</b></dt>
+
+<dd>
+AliDigit</dd>
+
+<dt>
+<b>Subclasses :</b></dt>
+
+<dd>
+AliPHOSCrystalDigit, AliPHOSCPVDigit</dd>
+
+<dt>
+<b>Responsabilities:</b></dt>
+
+<dd>
+Base class for the storage of PHOS digits. Must identify digits (module,row,column)
+and give access to the corresponding signal (energy).
+<br>It can be added to an AliPHOSCluster.</dd>
+<dt>
+<b>Collaborators:</b></dt>
+
+<dd>
+AliPHOSCluster</dd>
+</dl>
+</div>
+
+<hr class="small-separation">
+<div class="crc">
+<dl>
+<dt>
+<b>Classname:</b></dt>
+
+<dd>
+<i>AliPHOSCluster</i></dd>
+
+<dt>
+<b>Superclasses :</b></dt>
+
+<dd>
+AliCluster (?)</dd>
+
+<dt>
+<b>Subclasses :</b></dt>
+
+<dd>
+AliPHOSCrystalCluster, AliPHOSCPVCluster</dd>
+
+<dt>
+<b>Responsabilities:</b></dt>
+
+<dd>
+Base class for PHOS Xtal/CPV clusters. A cluster must know its module,
+its spatial position, must be able to add digits to itself and to give
+access to (/iterates on) its digits.</dd>
+
+<dt>
+<b>Collaborators:</b></dt>
+
+<dd>
+AliPHOSDigit, AliPHOSGeometry</dd>
+</dl>
+</div>
+
+<hr class="small-separation">
+<div class="crc">
+<dl>
+<dt>
+<b>Classname:</b></dt>
+
+<dd>
+<i>AliPHOSGeometry</i></dd>
+
+<dt>
+<b>Superclasses :</b></dt>
+
+<dd>
+none</dd>
+
+<dt>
+<b>Subclasses :</b></dt>
+
+<dd>
+none</dd>
+
+<dt>
+<b>Responsabilities:</b></dt>
+
+<dd>
+Handles several PHOS Xtal/CPV geometrical characteristics (sizes, positions,
+etc...).
+<br>This class is a <b>Singleton</b>.
+</dd>
+<dt>
+<b>Collaborators:</b></dt>
+
+<dd>
+AliPHOS*Cluster, AliPHOSClusterizer*</dd>
+</dl>
+</div>
+
+<hr class="small-separation">
+<div class="crc">
+<dl>
+<dt>
+<b>Classname:</b></dt>
+
+<dd>
+<i>AliPHOSClusterizer*</i></dd>
+
+<dt>
+<b>Superclasses :</b></dt>
+
+<dd>
+AliClusterizer</dd>
+
+<dt>
+<b>Subclasses :</b></dt>
+
+<dd>
+none</dd>
+
+<dt>
+<b>Responsabilities:</b></dt>
+
+<dd>
+Concrete class(es) which implements the makeClusters method. From a list
+of Ali(PHOS)Digit, this method must compute a list of Ali(PHOS)Cluster.</dd>
+
+<dt>
+<b>Collaborators:</b></dt>
+
+<dd>
+AliPHOS*Digit, AliPHOS*Cluster</dd>
+</dl>
+</div>
+
+<div class="crc">
+<dl>
+<dt>
+<b>Classname:</b></dt>
+
+<dd>
+<i>AliParameter</i></dd>
+
+<dt>
+<b>Superclasses :</b></dt>
+
+<dd>
+none</dd>
+
+<dt>
+<b>Subclasses :</b></dt>
+
+<dd>
+(?) probably many of them</dd>
+
+<dt>
+<b>Responsabilities:</b></dt>
+
+<dd>
+pABC. Keep track of methods used and method parameters used. What should
+be the basic interface for this ???</dd>
+
+<dt>
+<b>Collaborators:</b></dt>
+
+<dd>
+Many classes...</dd>
+</dl>
+</div>
+<!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
+<hr><a NAME="sub_tracking"></a>
+<h1>
+Sub-Tracking</h1>
+Once we have crystal and CPV clusters, we must associate them to make what
+we would like to call SubTracks. Doing sub-tracks from clusters is, from
+the design point of view, much like going from digits to clusters. We should
+be able to easily change the class which actually do the sub-tracking job
+:
+<center><img SRC="aliphossubtracking.gif" ALT="[SubTracking Class Diagram]"></center>
+
+<div class="crc">
+<dl>
+<dt>
+<b>Classname:</b></dt>
+
+<dd>
+<i>AliPHOSSubTrack</i></dd>
+
+<dt>
+<b>Superclasses :</b></dt>
+
+<dd>
+AliSubTrack (?)</dd>
+
+<dt>
+<b>Subclasses :</b></dt>
+
+<dd>
+none</dd>
+
+<dt>
+<b>Responsabilities:</b></dt>
+
+<dd>
+Concrete storage class for a PHOS subtrack. It must be able to give access
+to its clusters, and to identify itself as being part of PHOS.</dd>
+
+<dt>
+<b>Collaborators:</b></dt>
+
+<dd>
+AliPHOSSubTracker*</dd>
+</dl>
+</div>
+
+<hr class="small-separation">
+<div class="crc">
+<dl>
+<dt>
+<b>Classname:</b></dt>
+
+<dd>
+<i>AliPHOSSubTracker*</i></dd>
+
+<dt>
+<b>Superclasses :</b></dt>
+
+<dd>
+AliSubTracker</dd>
+
+<dt>
+<b>Subclasses :</b></dt>
+
+<dd>
+none</dd>
+
+<dt>
+<b>Responsabilities:</b></dt>
+
+<dd>
+Concrete class(es) which implements the makeSubTracks method. From a list
+of Ali(PHOS)Cluster, this method must compute a list of Ali(PHOS)SubTrack.</dd>
+
+<dt>
+<b>Collaborators:</b></dt>
+
+<dd>
+AliPHOSCluster, AliPHOSSubTrack</dd>
+</dl>
+</div>
+<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
+<hr><a NAME="particle_identification"></a>
+<h1>
+Particle Identification</h1>
+Clusterization and subtracking are two activities that are <i>detector-driven</i>.
+We can indeed imagine that the full ALICE reconstruction could be (pseudo-)coded
+in AliRoot like :
+<pre class="code">for each detector in ALICE do {
+ detector->Reconstruction() ;
+}</pre>
+assuming that each detector provides a Reconstruction method, and that
+there's a way to parametrize each detector's behavior. The latter could
+be done in the initialization phase of AliRoot, e.g. in the <tt>Config.C</tt>
+file :
+<pre class="code"><i>// Create PHOS clusterizers
+</i>AliPHOSCrystalClusterizerV1 aXtalClusterizer(...) ;
+AliPHOSCPVClusterizerV3 aCPVClusterizer(...) ;
+<i>// Create PHOS SubTracker
+</i>AliPHOSSubTrackerV0 aPHOSSubTracker(...) ;
+<i>// Create a PHOS Reconstructioner
+</i>AliPHOSReconstructioner aPHOSReconstructioner(aXtalClusterizer,
+ aCPVClusterizer,
+ aPHOSSubTracker) ;
+
+<i>// Create PHOS detector and associate
+ a reconstructioner with it
+</i>AliPHOS* phos = new AliPHOSVxx("PHOS",
+ "PHOS Version xx",
+ &;aPHOSReconstructioner) ;</pre>
+In the above code, the clusterization strategies (for Xtals and CPV) and
+the sub-tracking strategy are managed by a control class AliPHOSReconstrutioner
+which would derive from a pABC AliReconstructioner.
+<center><img SRC="aliphosreconstructioner.gif" ALT="[Reconstruction Class Diagram]" height=312 width=484></center>
+The <tt>detector->Reconstruction()</tt> method would then only delegate
+its job to the selected Reconstructioner (aPHOSReconstructioner in the
+above example).
+<p>If we now turn to the particle identification problem, two cases must
+be considered :
+<dl>
+<dt>
+<b>Standalone PHOS</b></dt>
+
+<dd>
+The particle identification is just a refinement (e.g. computation of some
+new values to cut upon) of subtracking. We only need to access PHOS SubTracks.</dd>
+
+<dt>
+<b>PHOS + other ALICE sub-systems</b></dt>
+
+<dd>
+In this case, we must associate several subtracks, coming from different
+sub-systems, in order to identify particles. One problem to solve is how
+to access other sub-systems SubTracks.</dd>
+</dl>
+For this stage of the analysis, the AliRoot activity can not be detector-driven
+anymore. Instead we would like to propose this activity to be <i>particle
+hunting driven</i>. For example :
+<pre class="code"><i>// we assume that all detectors have produced their subtracks in the event event_number
+</i>AliParticleHunter* aPhotonFinder = new AliPhotonFinder(...) ;
+
+<i>/* the UseDetector("ADET") method should "connect"
+ the ParticleHunter with the ADET subtrack branch so it can access
+ other detectors subtracks.
+ We assume that a subtrack knows in which detector she is, so we
+ can recover this information later (e.g. in the FindParticles method).
+*/
+
+</i>aPhotonFinder->UseDetector("ITS") ;
+aPhotonFinder->UseDetector("TPC") ;
+aPhotonFinder->UseDetector("PHOS") ;
+
+for each event do {
+ aPhotonFinder->FetchSubTracks(event) ;
+ <i>/* The FindParticle method can now plays
+ with all the ITS,TPC and PHOS subtracks... */
+</i> aPhotonFinder->FindParticles() ;
+}</pre>
+
+<center><img SRC="classes_identification.gif" ALT="[Identification Class Diagram]" height=279 width=480></center>
+
+<div class="crc">
+<dl>
+<dt>
+<b>Classname:</b></dt>
+
+<dd>
+<i>AliPHOSReconstructioner*</i></dd>
+
+<dt>
+<b>Superclasses :</b></dt>
+
+<dd>
+AliReconstructioner (?)</dd>
+
+<dt>
+<b>Subclasses :</b></dt>
+
+<dd>
+none</dd>
+
+<dt>
+<b>Responsabilities:</b></dt>
+
+<dd>
+This class is control class for the clusterizations and the subtracking.
+It must handles the clusters and subtracks IO. It can be "added" to the
+AliPHOS detector.</dd>
+
+<dt>
+<b>Collaborators:</b></dt>
+
+<dd>
+AliPHOSClusterizer, AliPHOSSubTracker, AliPHOS</dd>
+</dl>
+</div>
+
+<div class="crc">
+<dl>
+<dt>
+<b>Classname:</b></dt>
+
+<dd>
+<i>AliParticleHunter</i></dd>
+
+<dt>
+<b>Superclasses :</b></dt>
+
+<dd>
+non</dd>
+
+<dt>
+<b>Subclasses :</b></dt>
+
+<dd>
+AliPhotonFinder</dd>
+
+<dt>
+<b>Responsabilities:</b></dt>
+
+<dd>
+Associate a number (1..n) different detector subtracks to identify particles.
+It must be able to fetch subtracks for a number of different detectors.
+It handle IO of produced particles.</dd>
+
+<dt>
+<b>Collaborators:</b></dt>
+
+<dd>
+AliSubTrack, AliParticle, AliDetector</dd>
+</dl>
+</div>
+<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
+<hr>
+<h1>
+Disk Storage Structure</h1>
+We present in this section how the PHOS reconstructed data will be arranged
+on disk.
+<p>We suppose that there is one TreeR (Reconstruction Tree) per event,
+and we store different kinds of objects in differents branches, i.e. the
+<b>PHOSCPVClusters
+branch</b> contains CPV clusters the <b>PHOSCrystalClusters branch</b>
+contains Crystal clusters, the <b>PHOSSubTracks branch</b> contains PHOS
+SubTracks, and the <b>PHOSParameters branch</b> contains several information
+related to the way Clusters and SubTracks were made. The following figure
+indicates the inter-relation(s) between those branches and the relation
+between those branches and the PHOS branch in the Digit Tree.
+<center><img SRC="TreeR.gif" ALT="[Reconstruction Tree Structure]" height=425 width=483></center>
+
+<h2>
+How are the links implemented ?</h2>
+If we assume that all the above branches are implemented using <a href="http://root.cern.ch/root/html/TClonesArray.html">TClonesArray</a>,
+we could index things using simple integers refering to positions in the
+TClonesArray. For example, a cluster will keep track of its digits by recording
+the list of the digits position in the TClonesArray of the PHOS branch
+in the digit tree. These positions are of course only valid within a given
+event.
+<p>If we want to be less implementation dependant we could probably have
+classes such as <i>AliDigitIdentifier</i> (which could then be anything
+we like, e.g. a simple integer wrapper or a set {event_number, index position}).
+This solution could be more disk-space consuming, but would have the tremendous
+advantage to isolate "logical" references from implementation.
+<h2>
+What should we save ?</h2>
+At least in the beginning of the analysis, we should be able to perform
+the reconstruction step by step, i.e. be able to save clusters, subtracks
+and particles. It would be nice to include a switching mechanism to e.g.
+disconnect the cluster output if we want to save disk space for instance. <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
+<hr><a NAME="parameters"></a>
+<h1>
+Keeping the entropy small</h1>
+We come back to the problem stated in the clusterization section about
+'keeping track of what we did'. We don't want to loose too much information
+along our way from the raw data to the particles so we can have some checkpoints.
+<p>We proposed in the above class diagrams to use a generic <tt>AliParameter</tt>
+class which could answer question such as 'what was the sub-tracker method
+and version used to do this sub-track ?' or 'what was the Xtal clustering
+low threshold ?'. This 'AliParameter' could be accessible through methods
+like <tt>AliParameter& AliCluster::GetMakerInformation</tt>. That's
+all nice, but we say nothing about what this AliParameter class is.
+<p>We could imagine a very simple AliParameter implementation using e.g.
+(parameter_name, parameter_value) pairs encapsulated in such an AliParameter
+class. Or, entering fully the Alice Wonderland, we could dream of a much
+more ambitious generic parameter class, in which the actual storage of
+the parameters in done using <a href="http://www.w3.org">XML</a> (the W3
+eXtensible Markup Language). The base AliParameter would then only provide
+basic interface to code/decode XML tags, and each subsystems would provide
+DTD to describes their parameters, which would then ressemble 'parameters
+sheets'. We can imagine DTDs per detector or per domain (geometry, reconstruction,
+physics analysis...).
+<br>The strenght of this approach is the use of a (new) <b>standard</b>
+in which data are represented in structured ASCII files. ASCII files are
+human readable/produceable, easy to exchange between computers, and many
+tools already exists, in a wide variety of languages (C/C++, Java, Perl,
+Python...), to handles XML compliant files.
+<p>But, well, may be this is only a dream... and too much work for our
+purposes. Anyway, comments on this idea are welcome ! More information
+can be found at <a href="http://www.oasis-open.org/cover/">http://www.oasis-open.org/cover/</a>
+<br><!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
+<hr>
+<h1>
+Summary</h1>
+To perform the PHOS reconstruction, we need/propose the following classes
+:
+<h2>
+New classes</h2>
+
+<dl>
+<dt>
+<b>Ali(PHOS)Cluster</b></dt>
+
+<dd>
+(pABC) Storage class for groups of digits (per detector)</dd>
+
+<dt>
+<b>Ali(PHOS)SubTrack</b></dt>
+
+<dd>
+(pABC) Storage class for groups of clusters (per detector)</dd>
+
+<dt>
+<b>Ali(PHOS)Reconstructioner</b></dt>
+
+<dd>
+(pABC) Control class for clusterization and subtracking.</dd>
+
+<dt>
+<b>AliParticleHunter</b></dt>
+
+<dd>
+(pABC) Working class to associate different subtracks into particles.</dd>
+
+<dt>
+<b>AliParticle</b></dt>
+
+<dd>
+(pABC?) Storage class for particles.</dd>
+
+<dt>
+<b>AliParameter</b></dt>
+
+<dd>
+(pABC!) Entropy minimizing class. Keeps track of methods/parameters used
+to make clusters, subtracks and particles.</dd>
+
+<dt>
+<b>Ali(Digit,Cluster,SubTrack)Identifier</b></dt>
+
+<dd>
+A simple integer wrapper or a more elaborated way of indexing reconstruction
+objects, so we can go one step back at every analysis step (e.g. access
+the list of clusters a subtrack is made of).</dd>
+</dl>
+
+<h2>
+AliRoot classes impacted</h2>
+
+<dl>
+<dt>
+<b>AliRun</b></dt>
+
+<dd>
+Add Reconstruction method, which would delegate to the corresponding Reconstruction
+methods of the different detectors.</dd>
+
+<dt>
+<b>AliDetector</b></dt>
+
+<dd>
+Add GetSubTracks method (returning a list of subtracks for a given event),
+and Reconstruction method (which delegates its jobs to an AliReconstructioner
+object, selectable at runtime).</dd>
+</dl>
+
+<hr>
+<address class="left">
+© <a href="mailto:aphecetc@in2p3.fr">Groupe Photons Subatech</a> <a href="http://www-subatech.in2p3.fr/~photons/subatech/en_index.shtml">[Go
+to the GPS Home Page]</a></address>
+
+<address class="right">
+<!-- Created: Tue Oct 26 19:52:56 CEST 1999 -->
+<!-- hhmts start -->
+Last modified: Wed Dec 1 18:54:10 CET 1999
+<!-- hhmts end --></address>
+
+<div align=right><a href="http://validator.w3.org/check/referer"><img SRC="vh40.gif" ALT="Valid HTML 4.0!" BORDER=0 height=31 width=88></a><a href="http://jigsaw.w3.org/css-validator"><img SRC="vcss.gif" ALT="Valid CSS!" BORDER=0 height=31 width=88></a></div>
+
+</body>
+</html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
+ "http://www.w3.org/TR/REC-html40/loose.dtd">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.51 [en] (X11; I; Linux 2.2.5-15 i686) [Netscape]">
+ <title>PHOS Reconstruction Proposal</title>
+<link REL="stylesheet" href="http://www-subatech.in2p3.fr/~photons/gps_alice.css" type="text/css">
+</head>
+<body>
+
+<h1 class="page-header">
+Simulation</h1>
+
+<h2>Event generation</h2>
+
+<P>
+One of the main ingredients to simulate the physic performance of PHOS is the
+generation of a realistic background in central Pb+Pb collisions at LHC energies. <BR> <BR>
+However, most of ALICE subdetectors are sensitive to charged particles and, in
+consequence, the charged hadronic background is the most important one (see for
+instance <A HREF="http://www.cern.ch/ALICE/Projects/offline/evgen/Welcome.html">AliGenHIJINGPara class</A>). <BR>
+However, PHOS detector is sensitive to most of particles: electrons, muon, photons, charged and neutral hadrons. In
+particular the main background is generated by the electromagnetic decay of the neutral pion, which was omitted
+in the background generators classes defined in aliroot package 3.01. <BR>
+<BR>
+Within this respect, we have defined a new class:
+<A HREF="ttp://www.cern.ch/ALICE/Projects/offline/aliroot/roothtml/src/AliGenPHOSlib.cxx.html">AliGenPHOSlib class</A>,
+and adapted the
+<A HREF="http://www.cern.ch/ALICE/Projects/offline/aliroot/roothtml/src/AliGenParam.cxx.html">AliGenParam class</A> class in
+order to be able to simulate the full neutral and charged background which is present in heavy-ion collisions.
+All these stuff has been included in the aliroot version 3.02.<BR>
+<BR>
+
+Enclosed, an exemple of the aliroot config file is reported.
+This neutral and charged background contains pi+, pi-,pi0,K+,K-,kshort,Klong,eta,omega,p. p bar, n and n bar with
+relative yields given by hijing in Pb+Pb central collisions (results from venus or shaker are close to the hijing ones).
+Pion transverse momentum (Pt) distribution is taken from AliGenMUONlib class, version 3.01 of aliroot:
+Pt Parameterization CDF (PRL 61(88) 1819): Power law for Pt > 500 MeV and Mt scaling below (slope T=160 MeV).
+Meson Pt distributions are calculated by mt-scaling with pions (see
+<A HREF="http://www.cern.ch/ALICE/Projects/offline/evgen/Welcome.html">AliGenMUONlib or AliGenPHOSlib class</A>).
+
+<PRE class="code">
+//=======================================================================
+// ************* STEERING parameters FOR ALICE SIMULATION **************
+// --- Specify event type to be tracked through the ALICE setup
+// --- All positions are in cm, angles in degrees, and P and E in GeV
+//
+// The following Cocktail generator is defined to simulate the neutral and
+// charged background in the ALICE detector. This background is important
+// in the case of photon detector as PHOS. We simulated a cocktail of
+// pions (pi+, pi- and pi0) , kaons (K+, K-, Kshort and Klong), eta mesons,
+// omega mesons and main baryons (protons, antiprotons, neutrons and
+// antineutrons)
+//
+// 1-Nov-1999 Gines MARTINEZ, GPS @ SUBATECH, Nantes, France
+//
+Int_t ParticleDensity = 8000 // Number of particles created in the selected rapidity range
+Int_t NumberOfPions = 0.77 * ParticleDensity ; // ~77% of pions: pi^+, pi^- and pi^0 with equal probability
+Int_t NumberOfKaons = 0.11 * ParticleDensity ; // ~11% of kaons: K^+, K^-, K_short and K_long with equal probability
+Int_t NumberOfEtas = 0.04 * ParticleDensity ; // ~4.0% of eta mesons
+Int_t NumberOfOmegas = 0.01 * ParticleDensity ; // ~1.0% of omega mesons
+Int_t NumberOfBaryons = 0.07 * ParticleDensity ; // ~7.0% of baryons: p, pbar, n and nbar with equal probability
+
+AliGenCocktail *gener = new AliGenCocktail(); \\ Cocktail class
+ gener->SetPtRange(.5,5.); // Transverse momentum range
+ gener->SetPhiRange(0.,360.); // Azimuthal angle range
+ gener->SetYRange(-0.5,0.5); // Pseudorapidity range
+ gener->SetOrigin(0,0,0); // Vertex position
+ gener->SetSigma(0,0,5.6); // Sigma in (X,Y,Z) (cm) on IP position
+//
+// P I O N S
+ AliGenParam *generpion = new AliGenParam(NumberOfPions,Pion,
+ AliGenPHOSlib::GetPt(Pion), AliGenPHOSlib::GetY(Pion), AliGenPHOSlib::GetIp(Pion) );
+ generpion->SetWeighting(non_analog); // Selecting the Pt distribution provided by AliGenPHOSlib::GetPt
+ generpion->SetForceDecay(nodecay); // Requiring that the generated particle is directly tracked by GEANT
+//
+// K A O N S
+ AliGenParam *generkaon = new AliGenParam(NumberOfKaons,Kaon,
+ AliGenPHOSlib::GetPt(Kaon), AliGenPHOSlib::GetY(Kaon), AliGenPHOSlib::GetIp(Kaon) );
+ generkaon->SetWeighting(non_analog); // Selecting the Pt distribution provided by AliGenPHOSlib::GetPt
+ generkaon->SetForceDecay(nodecay); // Requiring that the generated particle is directly tracked by GEANT
+//
+// E T A S
+ AliGenParam *genereta = new AliGenParam(NumberOfEtas,Eta,
+ AliGenPHOSlib::GetPt(Eta), AliGenPHOSlib::GetY(Eta), AliGenPHOSlib::GetIp(Eta) );
+ genereta->SetWeighting(non_analog); // Selecting the Pt distribution provided by AliGenPHOSlib::GetPt
+ genereta->SetForceDecay(nodecay); // Requiring that the generated particle is directly tracked by GEANT
+//
+// O M E G A S
+ AliGenParam *generomega = new AliGenParam(NumberOfOmegas,Omega,
+ AliGenPHOSlib::GetPt(Omega), AliGenPHOSlib::GetY(Omega), AliGenPHOSlib::GetIp(Omega) );
+ generomega->SetWeighting(non_analog); // Selecting the Pt distribution provided by AliGenPHOSlib::GetPt
+ generomega->SetForceDecay(nodecay); // Requiring that the generated particle is directly tracked by GEANT
+//
+// B A R Y O N S
+
+ AliGenParam *generbaryon = new AliGenParam(NumberOfBaryons,Baryon,
+ AliGenPHOSlib::GetPt(Baryon), AliGenPHOSlib::GetY(Baryon), AliGenPHOSlib::GetIp(Baryon) );
+ generbaryon->SetWeighting(non_analog); // Selecting the Pt distribution provided by AliGenPHOSlib::GetPt
+ generbaryon->SetForceDecay(nodecay); // Requiring that the generated particle is directly tracked by GEANT
+
+
+ gener->AddGenerator(generpion,"pion",1.);
+ gener->AddGenerator(generkaon,"kaon",1.);
+ gener->AddGenerator(genereta,"eta",1.);
+ gener->AddGenerator(generomega,"omega",1.);
+ gener->AddGenerator(generbaryon,"baryon",1.);
+ gener->Init();
+</pre>
+
+
+The resulting hit and digit TTree's (one per event) will be stored
+in the root file on disk.
+
+<hr>
+<address class="left">
+© <a href="mailto:aphecetc@in2p3.fr">Groupe Photons Subatech</a> <a href="http://www-subatech.in2p3.fr/~photons/subatech/en_index.shtml">[Go
+to the GPS Home Page]</a></address>
+
+<address class="right">
+<!-- Created: Tue Oct 26 19:52:56 CEST 1999 -->
+<!-- hhmts start -->
+Last modified: Mon Nov 15 18:55:06 CET 1999
+<!-- hhmts end --></address>
+
+<div align=right><a href="http://validator.w3.org/check/referer"><img SRC="vh40.gif" ALT="Valid HTML 4.0!" BORDER=0 height=31 width=88></a><a href="http://jigsaw.w3.org/css-validator"><img SRC="vcss.gif" ALT="Valid CSS!" BORDER=0 height=31 width=88></a></div>
+
+</body>
+</html>