// --- ROOT system ---
#include "TPad.h"
+#include "TGraph.h"
+#include "TPaveText.h"
#include "TClonesArray.h"
+#include "TGeoMatrix.h"
// --- Standard library ---
// --- AliRoot header files ---
-
+#include "AliLog.h"
+#include "AliPHOSLoader.h"
#include "AliPHOSGeometry.h"
#include "AliPHOSDigit.h"
#include "AliPHOSRecPoint.h"
-#include "AliPHOSGetter.h"
+#include "AliGeomManager.h"
ClassImp(AliPHOSRecPoint)
//____________________________________________________________________________
AliPHOSRecPoint::AliPHOSRecPoint()
- : AliRecPoint()
+ : AliCluster(),fPHOSMod(0),
+ fMulTrack(0),fMaxDigit(100),fMulDigit(0),fMaxTrack(200),
+ fDigitsList(0),fTracksList(0),fAmp(0),
+ fIndexInList(-1), // to be set when the point is already stored
+ fLocPos(0,0,0),fLocPosM(0)
{
// ctor
- fMaxTrack = 0 ;
- fPHOSMod = 0 ;
-
}
//____________________________________________________________________________
-AliPHOSRecPoint::AliPHOSRecPoint(const char * opt) : AliRecPoint(opt)
+AliPHOSRecPoint::AliPHOSRecPoint(const char * )
+ : AliCluster(),fPHOSMod(0),
+ fMulTrack(0),fMaxDigit(100),fMulDigit(0),fMaxTrack(200),
+ fDigitsList(new Int_t[fMaxDigit]),fTracksList(new Int_t[fMaxTrack]),fAmp(0),
+ fIndexInList(-1), // to be set when the point is already stored
+ fLocPos(0,0,0),fLocPosM(new TMatrixF(3,3))
+
{
// ctor
- fMaxTrack = 200 ;
- fPHOSMod = 0;
+}
+//_______________________________________________________________________
+AliPHOSRecPoint::~AliPHOSRecPoint()
+{
+ // dtor
+
+ delete fLocPosM ;
+ delete [] fDigitsList ;
+ delete [] fTracksList ;
}
+//____________________________________________________________________________
+AliPHOSRecPoint::AliPHOSRecPoint(const AliPHOSRecPoint &rp) :
+ AliCluster(rp),
+ fPHOSMod(rp.fPHOSMod),fMulTrack(rp.fMulTrack),fMaxDigit(rp.fMaxDigit),
+ fMulDigit(rp.fMulDigit),fMaxTrack(rp.fMaxTrack),fDigitsList(0x0),
+ fTracksList(0x0),fAmp(rp.fAmp),fIndexInList(rp.fIndexInList),
+ fLocPos(rp.fLocPos),fLocPosM(rp.fLocPosM)
+{
+ //copy ctor
+
+ if (rp.fMulDigit>0) fDigitsList = new Int_t[rp.fMulDigit];
+ for(Int_t i=0; i<fMulDigit; i++)
+ fDigitsList[i] = rp.fDigitsList[i];
+ if (rp.fMulTrack>0) fTracksList = new Int_t[rp.fMulTrack];
+ for(Int_t i=0; i<fMulTrack; i++)
+ fTracksList[i] = rp.fTracksList[i];
+
+}
+//____________________________________________________________________________
+AliPHOSRecPoint& AliPHOSRecPoint::operator= (const AliPHOSRecPoint &rp)
+{
+ if(&rp == this) return *this;
+
+ fPHOSMod = rp.fPHOSMod;
+ fMulTrack = rp.fMulTrack;
+ fMaxDigit = rp.fMaxDigit;
+ fMulDigit = rp.fMulDigit;
+ fMaxTrack = rp.fMaxTrack;
+ fAmp = rp.fAmp;
+ fIndexInList = rp.fIndexInList;
+ fLocPos = rp.fLocPos;
+ fLocPosM = rp.fLocPosM;
+
+ for(Int_t i=0; i<fMaxDigit; i++)
+ fDigitsList[i] = rp.fDigitsList[i];
+
+ for(Int_t i=0; i<fMaxTrack; i++)
+ fTracksList[i] = rp.fTracksList[i];
+
+ return *this;
+}
//____________________________________________________________________________
Int_t AliPHOSRecPoint::DistancetoPrimitive(Int_t px, Int_t py)
{
case kButton1Down:{
AliPHOSDigit * digit ;
-// Accessing geometry this way is equivalent to getting from gAlice
-// to have Detector in Folder one have to load gAlice anyway
-// AliPHOSLoader * gime = AliPHOSLoader::GetInstance();
-// AliPHOSGeometry * phosgeom = const_cast<AliPHOSGeometry*>(gime->PHOSGeometry());
-
AliPHOSGeometry * phosgeom = AliPHOSLoader::GetPHOSGeometry();
Int_t iDigit;
}
}
//____________________________________________________________________________
-void AliPHOSRecPoint::EvalAll(Float_t,TClonesArray * digits)
+void AliPHOSRecPoint::EvalAll(TClonesArray * /* digits */)
{
//evaluates (if necessary) all RecPoint data members
- EvalPrimaries(digits) ;
}
//____________________________________________________________________________
if( fPHOSMod == 0){
Int_t relid[4] ;
- AliPHOSGeometry * phosgeom = (AliPHOSGetter::Instance())->PHOSGeometry();
+ AliPHOSGeometry * phosgeom = (AliPHOSGeometry::GetInstance());
phosgeom->AbsToRelNumbering(digit->GetId(), relid) ;
fPHOSMod = relid[0];
}
}
-//______________________________________________________________________________
-void AliPHOSRecPoint::EvalPrimaries(TClonesArray * digits)
-{
- // Constructs the list of primary particles (tracks) which have contributed to this RecPoint
-
- AliPHOSDigit * digit ;
- Int_t * tempo = new Int_t[fMaxTrack] ;
-
- Int_t index ;
- for ( index = 0 ; index < GetDigitsMultiplicity() ; index++ ) { // all digits
- digit = dynamic_cast<AliPHOSDigit *>(digits->At( fDigitsList[index] )) ;
- Int_t nprimaries = digit->GetNprimary() ;
- if(nprimaries){
- Int_t * newprimaryarray = new Int_t[nprimaries] ;
- Int_t ii ;
- for ( ii = 0 ; ii < nprimaries ; ii++)
- newprimaryarray[ii] = digit->GetPrimary(ii+1) ;
-
- Int_t jndex ;
- for ( jndex = 0 ; jndex < nprimaries ; jndex++ ) { // all primaries in digit
- if ( fMulTrack > fMaxTrack ) {
- fMulTrack = - 1 ;
- Error("EvalPrimaries", "GetNprimaries ERROR > increase fMaxTrack" ) ;
- break ;
- }
- Int_t newprimary = newprimaryarray[jndex] ;
- Int_t kndex ;
- Bool_t already = kFALSE ;
- for ( kndex = 0 ; kndex < fMulTrack ; kndex++ ) { //check if not already stored
- if ( newprimary == tempo[kndex] ){
- already = kTRUE ;
- break ;
- }
- } // end of check
- if ( !already) { // store it
- tempo[fMulTrack] = newprimary ;
- fMulTrack++ ;
- } // store it
- } // all primaries in digit
- delete [] newprimaryarray ;
- }
- } // all digits
-
- if(fMulTrack)
- fTracksList = new Int_t[fMulTrack] ;
- for(index = 0; index < fMulTrack; index++)
- fTracksList[index] = tempo[index] ;
-
- delete [] tempo ;
-
-}
//____________________________________________________________________________
-void AliPHOSRecPoint::GetGlobalPosition(TVector3 & gpos, TMatrix & gmat) const
+void AliPHOSRecPoint::GetGlobalPosition(TVector3 & gpos, TMatrixF & gmat) const
{
// returns the position of the cluster in the global reference system of ALICE
// and the uncertainty on this position
- (AliPHOSGetter::Instance())->PHOSGeometry()->GetGlobal(this, gpos, gmat);
-}
+ AliPHOSGeometry * phosgeom = (AliPHOSGeometry::GetInstance());
+ phosgeom->GetGlobalPHOS(this, gpos, gmat);
+
+}
//______________________________________________________________________________
void AliPHOSRecPoint::Paint(Option_t *)
gPad->PaintPolyMarker(1,&x,&y,"") ;
}
//______________________________________________________________________________
+void AliPHOSRecPoint::GetLocalPosition(TVector3 & pos) const
+{
+ // returns the position of the cluster in the local reference system
+ // of the sub-detector
+
+ pos = fLocPos;
+}
+
+//____________________________________________________________________________
+void AliPHOSRecPoint::EvalLocal2TrackingCSTransform()
+{
+ //Evaluates local to "tracking" c.s. transformation (B.P.).
+ //All evaluations should be completed before calling for this function.
+ //See ALICE PPR Chapter 5 p.18 for "tracking" c.s. definition,
+ //or just ask Jouri Belikov. :)
+
+ if(IsEmc()) {
+ SetVolumeId(AliGeomManager::LayerToVolUID(AliGeomManager::kPHOS1,GetPHOSMod()-1));
+ }
+ else
+ SetVolumeId(AliGeomManager::LayerToVolUID(AliGeomManager::kPHOS2,GetPHOSMod()-1));
+ Double_t lxyz[3] = {fLocPos.X(),fLocPos.Y(),fLocPos.Z()};
+ Double_t txyz[3] = {0,0,0};
+ Double_t dy;
+ Double_t crystalShift;
+
+ AliPHOSGeometry * phosgeom = AliPHOSGeometry::GetInstance();
+ AliPHOSEMCAGeometry* geoEMCA = phosgeom->GetEMCAGeometry();
+
+ //Calculate offset to crystal surface.
+ //See fCrystalShift code in AliPHOSGeometry::Init()).
+
+ Float_t * inthermo = geoEMCA->GetInnerThermoHalfSize() ;
+ Float_t * strip = geoEMCA->GetStripHalfSize() ;
+ Float_t* splate = geoEMCA->GetSupportPlateHalfSize();
+ Float_t * crystal = geoEMCA->GetCrystalHalfSize() ;
+ Float_t * pin = geoEMCA->GetAPDHalfSize() ;
+ Float_t * preamp = geoEMCA->GetPreampHalfSize() ;
+ crystalShift = -inthermo[1]+strip[1]+splate[1]+crystal[1]-geoEMCA->GetAirGapLed()/2.+pin[1]+preamp[1] ;
+
+ if(IsEmc()) {
+ dy = crystalShift;
+ lxyz[2] = -lxyz[2]; //Opposite z directions in EMC matrix and local frame!!!
+ }
+ else
+ dy = phosgeom->GetCPVBoxSize(1)/2.; //center of CPV module
+
+ lxyz[1] = lxyz[1] - dy;
+
+ const TGeoHMatrix* tr2loc = GetTracking2LocalMatrix();
+ if(!tr2loc) AliFatal(Form("No Tracking2LocalMatrix found."));
+
+ tr2loc->MasterToLocal(lxyz,txyz);
+ SetX(txyz[0]); SetY(txyz[1]); SetZ(txyz[2]);
+
+ if(AliLog::GetGlobalDebugLevel()>0) {
+ TVector3 gpos; TMatrixF gmat;
+ GetGlobalPosition(gpos,gmat);
+ Float_t gxyz[3];
+ GetGlobalXYZ(gxyz);
+ TString emc;
+ if(IsEmc())
+ emc="EMC";
+ else
+ emc="CPV";
+ AliInfo(Form("lCS-->(%.3f,%.3f,%.3f), tCS-->(%.3f,%.3f,%.3f), gCS-->(%.3f,%.3f,%.3f), gCScalc-->(%.3f,%.3f,%.3f), module %d %s",
+ fLocPos.X(),fLocPos.Y(),fLocPos.Z(),
+ GetX(),GetY(),GetZ(),
+ gpos.X(),gpos.Y(),gpos.Z(),
+ gxyz[0],gxyz[1],gxyz[2],GetPHOSMod(),emc.Data()));
+ }
+
+}