]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PHOS/AliPHOSRecPoint.cxx
Moved MakePrimary to EMCRecPoint to rpduce correct order of primaries
[u/mrichter/AliRoot.git] / PHOS / AliPHOSRecPoint.cxx
index 5f262dc29ef4699acd30eb970cbb0c416500886b..9e9163ffc48c8ded140c711c43e9f56d8f4b2bd4 100644 (file)
 
 // --- 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 = 200 ;
-  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(new Int_t[rp.fMaxDigit]),
+  fTracksList(new Int_t[rp.fMaxTrack]),fAmp(rp.fAmp),fIndexInList(rp.fIndexInList), 
+  fLocPos(rp.fLocPos),fLocPosM(rp.fLocPosM)
+{
+  //copy ctor
 
+  for(Int_t i=0; i<fMulDigit; i++)
+    fDigitsList[i] = rp.fDigitsList[i];
+
+  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)
 {
@@ -86,7 +143,7 @@ Int_t AliPHOSRecPoint::DistancetoPrimitive(Int_t px, Int_t py)
  }
 
 //______________________________________________________________________________
-void AliPHOSRecPoint::ExecuteEvent(Int_t event, Int_t px, Int_t py) const
+void AliPHOSRecPoint::ExecuteEvent(Int_t event, Int_t, Int_t)
 {
   // Execute action corresponding to one event
   // This member function is called when a AliPHOSRecPoint is clicked with the locator
@@ -106,8 +163,8 @@ void AliPHOSRecPoint::ExecuteEvent(Int_t event, Int_t px, Int_t py) const
     
   case kButton1Down:{
     AliPHOSDigit * digit ;
-    AliPHOSGetter * gime = AliPHOSGetter::GetInstance() ; 
-    AliPHOSGeometry * phosgeom =  const_cast<AliPHOSGeometry*>(gime->PHOSGeometry());
+  
+    AliPHOSGeometry * phosgeom = AliPHOSLoader::GetPHOSGeometry();
 
     Int_t iDigit;
     Int_t relid[4] ;
@@ -144,7 +201,7 @@ void AliPHOSRecPoint::ExecuteEvent(Int_t event, Int_t px, Int_t py) const
       clustertext ->Draw("");
     }
     gPad->Update() ; 
-    Print() ;
+    Print("dummy") ;
     delete[] xi ; 
     delete[] zi ; 
    }
@@ -166,11 +223,12 @@ break;
   }
 }
 //____________________________________________________________________________
-void AliPHOSRecPoint::EvalAll(Float_t logWeight,TClonesArray * digits) {
+void AliPHOSRecPoint::EvalAll(TClonesArray * digits) 
+{
   //evaluates (if necessary) all RecPoint data members 
 
-  EvalPrimaries(digits) ;
 }
+
 //____________________________________________________________________________
 void AliPHOSRecPoint::EvalPHOSMod(AliPHOSDigit * digit) 
 {
@@ -178,106 +236,25 @@ void AliPHOSRecPoint::EvalPHOSMod(AliPHOSDigit * digit)
 
   if( fPHOSMod == 0){
   Int_t relid[4] ; 
-  
-  AliPHOSGetter * gime = AliPHOSGetter::GetInstance() ; 
-  AliPHOSGeometry * phosgeom =  const_cast<AliPHOSGeometry*>(gime->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
-  // First in the list - primary, made strongest contribution to the center
-
-  
-  AliPHOSDigit * digit ;
-  Int_t * tempo    = new Int_t[fMaxTrack] ;
-
-  //Find digit in center
-  AliPHOSGeometry * geom = AliPHOSGeometry::GetInstance("IHEP","") ;
-  if(!geom){
-    Error("EvalPrimaries","Can not instantiate PHOS geometry") ;
-    return ;
-  }
-  TVector3  pos ;
-  TMatrix  mat ;
-  GetGlobalPosition(pos,mat) ;
-  Int_t module ;
-  Double_t x,z ;
-  geom->ImpactOnEmc(pos.Theta(),pos.Phi(),module,z,x);
-  Int_t absId ;
-  geom->RelPosToAbsId(module,x,z,absId) ;
-  //copy primaries
-  Int_t index ;  
-  for ( index = 0 ; index < GetDigitsMultiplicity() ; index++ ) { // all digits
-    digit = dynamic_cast<AliPHOSDigit *>(digits->At( fDigitsList[index] )) ; 
-    if(digit->GetId() == absId){ 
-      fMulTrack = digit->GetNprimary() ;
-      for(Int_t ii = 0 ; ii < fMulTrack ; ii++)
-       tempo[ii] = digit->GetPrimary(ii+1) ; 
-    }
-  }
-  
-  for ( index = 0 ; index < GetDigitsMultiplicity() ; index++ ) { // all digits
-    digit = dynamic_cast<AliPHOSDigit *>(digits->At( fDigitsList[index] )) ; 
-    if(digit->GetId()!=absId){ //already done
-      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
+
+   AliPHOSGeometry * phosgeom = (AliPHOSGeometry::GetInstance());
+   phosgeom->GetGlobalPHOS(this, gpos, gmat);
   
-  
-  AliPHOSGetter::GetInstance()->PHOSGeometry()->GetGlobal(this, gpos, gmat) ;
 }
 
-
 //______________________________________________________________________________
 void AliPHOSRecPoint::Paint(Option_t *)
 {
@@ -299,3 +276,78 @@ void AliPHOSRecPoint::Paint(Option_t *)
   gPad->SetAttMarkerPS(markercolor,markerstyle,markersize) ;
   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()));
+  }
+
+}