]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PHOS/AliPHOSRecPoint.cxx
Coverity fix
[u/mrichter/AliRoot.git] / PHOS / AliPHOSRecPoint.cxx
index 98229f480a12939db71e2f852bb2c7d75fe6bbf6..e34210e090dcd28d7d61a45783a4cc2ac7b36999 100644 (file)
  * about the suitability of this software for any purpose. It is          *
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
-
+/* $Id$ */
 //_________________________________________________________________________
-// PHOSRecPoint base class deriving from AliRecPoint
-//*-- Author : Gines MARTINEZ  SUBATECH 
-//////////////////////////////////////////////////////////////////////////////
+//  Base Class for PHOS Reconstructed Points  
+//  Why should I put meaningless comments
+//  just to satisfy
+//  the code checker                
+//-- Author: Gines Martinez (SUBATECH)
 
 // --- ROOT system ---
 #include "TPad.h"
+#include "TGraph.h"
+#include "TPaveText.h"
+#include "TClonesArray.h"
+#include "TGeoMatrix.h"
 
 // --- Standard library ---
-#include <iostream>
-#include <cstdio>
 
 // --- AliRoot header files ---
-
+#include "AliLog.h"
+#include "AliPHOSLoader.h"
 #include "AliPHOSGeometry.h"
 #include "AliPHOSDigit.h"
 #include "AliPHOSRecPoint.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)
 {
-  fGeom =   AliPHOSGeometry::GetInstance() ;
-  fPHOSMod = 0;
+  // ctor
+
 }
 
 //____________________________________________________________________________
+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)
+
+{
+  // ctor
+  
+}
+//_______________________________________________________________________
 AliPHOSRecPoint::~AliPHOSRecPoint()
 {
   // dtor
+  
+  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)
+{
+  //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;
+
+  if (fDigitsList != 0) delete [] fDigitsList;
+  if (rp.fMulDigit>0) fDigitsList = new Int_t[rp.fMulDigit];
+  for(Int_t i=0; i<fMaxDigit; i++)
+    fDigitsList[i] = rp.fDigitsList[i];
+
+  if (fTracksList != 0) delete [] fTracksList;
+  if (rp.fMulTrack>0) fTracksList = new Int_t[rp.fMulTrack];
+  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)
 {
-  //Compute distance from point px,py to  a AliPHOSRecPoint considered as a Tmarker
-  //  Compute the closest distance of approach from point px,py to this marker.
-  //  The distance is computed in pixels units.
-  //
-
-   TVector3 pos(0.,0.,0.) ;
-   GetLocalPosition( pos) ;
-   Float_t x =  pos.X() ;
-   Float_t y =  pos.Z() ;
-   const Int_t kMaxDiff = 10;
-   Int_t pxm  = gPad->XtoAbsPixel(x);
-   Int_t pym  = gPad->YtoAbsPixel(y);
-   Int_t dist = (px-pxm)*(px-pxm) + (py-pym)*(py-pym);
-
-   if (dist > kMaxDiff) return 9999;
-   return dist;
+  // Compute distance from point px,py to  a AliPHOSRecPoint considered as a Tmarker
+  // Compute the closest distance of approach from point px,py to this marker.
+  // The distance is computed in pixels units.
+
+  TVector3 pos(0.,0.,0.) ;
+  GetLocalPosition( pos) ;
+  Float_t x =  pos.X() ;
+  Float_t y =  pos.Z() ;
+  const Int_t kMaxDiff = 10;
+  Int_t pxm  = gPad->XtoAbsPixel(x);
+  Int_t pym  = gPad->YtoAbsPixel(y);
+  Int_t dist = (px-pxm)*(px-pxm) + (py-pym)*(py-pym);
+  
+  if (dist > kMaxDiff) return 9999;
+  return dist;
 }
 
 //___________________________________________________________________________
@@ -80,162 +147,211 @@ Int_t AliPHOSRecPoint::DistancetoPrimitive(Int_t px, Int_t py)
  }
 
 //______________________________________________________________________________
-void AliPHOSRecPoint::ExecuteEvent(Int_t event, Int_t px, Int_t py)
+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
   //
   // If Left button is clicked on AliPHOSRecPoint, the digits are switched on    
   // and switched off when the mouse button is released.
-  //
 
   //  static Int_t pxold, pyold;
 
-   static TGraph *  digitgraph = 0 ;
-   static TPaveText* clustertext = 0 ;
-
-   if (!gPad->IsEditable()) return;
-
-   switch (event) {
-
+  static TGraph *  digitgraph = 0 ;
+  static TPaveText* clustertext = 0 ;
+  
+  if (!gPad->IsEditable()) return;
+  
+  switch (event) {
+    
+    
+  case kButton1Down:{
+    AliPHOSDigit * digit ;
+  
+    AliPHOSGeometry * phosgeom =  AliPHOSGeometry::GetInstance() ;
 
-   case kButton1Down:{
-     AliPHOSDigit * digit ;
-     AliPHOSGeometry * phosgeom =  (AliPHOSGeometry *) fGeom ;
-     Int_t iDigit;
-     Int_t relid[4] ;
-     Float_t xi[fMulDigit] ;
-     Float_t zi[fMulDigit] ;
-     for(iDigit=0; iDigit<fMulDigit; iDigit++) {
-       digit = (AliPHOSDigit *) fDigitsList[iDigit];
-       phosgeom->AbsToRelNumbering(digit->GetId(), relid) ;
-       phosgeom->RelPosInModule(relid, xi[iDigit], zi[iDigit]) ;
-     }
-
-     if (!digitgraph) {
-       digitgraph = new TGraph(fMulDigit,xi,zi);
-       digitgraph-> SetMarkerStyle(5) ; 
-       digitgraph-> SetMarkerSize(1.) ;
-       digitgraph-> SetMarkerColor(1) ;
-       digitgraph-> Draw("P") ;
-     }
-     if (!clustertext) {
+    Int_t iDigit;
+    Int_t relid[4] ;
+  
+    const Int_t kMulDigit=AliPHOSRecPoint::GetDigitsMultiplicity() ;
+    Float_t * xi = new Float_t [kMulDigit] ; 
+    Float_t * zi = new Float_t [kMulDigit] ;
+    
+    for(iDigit = 0; iDigit < kMulDigit; iDigit++) {
+      Fatal("AliPHOSRecPoint::ExecuteEvent", "-> Something wrong with the code"); 
+      digit = 0 ; //dynamic_cast<AliPHOSDigit *>((fDigitsList)[iDigit]);
+      phosgeom->AbsToRelNumbering(digit->GetId(), relid) ;
+      phosgeom->RelPosInModule(relid, xi[iDigit], zi[iDigit]) ;
+    }
+    
+    if (!digitgraph) {
+      digitgraph = new TGraph(fMulDigit,xi,zi);
+      digitgraph-> SetMarkerStyle(5) ; 
+      digitgraph-> SetMarkerSize(1.) ;
+      digitgraph-> SetMarkerColor(1) ;
+      digitgraph-> Draw("P") ;
+    }
+    if (!clustertext) {
+      
+      TVector3 pos(0.,0.,0.) ;
+      GetLocalPosition(pos) ;
+      clustertext = new TPaveText(pos.X()-10,pos.Z()+10,pos.X()+50,pos.Z()+35,"") ;
+      Text_t  line1[40] ;
+      Text_t  line2[40] ;
+      snprintf(line1,40,"Energy=%1.2f GeV",GetEnergy()) ;
+      snprintf(line2,40,"%d Digits",GetDigitsMultiplicity()) ;
+      clustertext ->AddText(line1) ;
+      clustertext ->AddText(line2) ;
+      clustertext ->Draw("");
+    }
+    gPad->Update() ; 
+    Print("dummy") ;
+    delete[] xi ; 
+    delete[] zi ; 
+   }
+  
+break;
   
-       TVector3 pos(0.,0.,0.) ;
-       GetLocalPosition(pos) ;
-       clustertext = new TPaveText(pos.X()-10,pos.Z()+10,pos.X()+50,pos.Z()+35,"") ;
-       Text_t  line1[40] ;
-       Text_t  line2[40] ;
-       sprintf(line1,"Energy=%1.2f GeV",GetEnergy()) ;
-       sprintf(line2,"%d Digits",GetDigitsMultiplicity()) ;
-       clustertext ->AddText(line1) ;
-       clustertext ->AddText(line2) ;
-       clustertext ->Draw("");
-     }
-     gPad->Update() ; 
-     Print() ;
+  case kButton1Up:
+    if (digitgraph) {
+      delete digitgraph  ;
+      digitgraph = 0 ;
+    }
+    if (clustertext) {
+      delete clustertext ;
+      clustertext = 0 ;
+    }
+    
+    break;
+    
   }
+}
+//____________________________________________________________________________
+void AliPHOSRecPoint::EvalAll(TClonesArray * /* digits */) 
+{
+  //evaluates (if necessary) all RecPoint data members 
 
-     break;
-
-   case kButton1Up:
-     if (digitgraph) {
-       delete digitgraph  ;
-       digitgraph = 0 ;
-     }
-     if (clustertext) {
-       delete clustertext ;
-       clustertext = 0 ;
-     }
-     
-     break;
-     
-   }
 }
 
 //____________________________________________________________________________
-Int_t AliPHOSRecPoint::GetPHOSMod()
-{ 
-  if(fPHOSMod > 0) 
-    return fPHOSMod ;
+void AliPHOSRecPoint::EvalPHOSMod(AliPHOSDigit * digit) 
+{
+  // Returns the PHOS module in which the RecPoint is found
 
-  Int_t relid[4] ;
-  
-  AliPHOSDigit * digit   ;
-  digit = (AliPHOSDigit *) fDigitsList[0] ;
-  AliPHOSGeometry * phosgeom =  (AliPHOSGeometry *) fGeom ;
+  if( fPHOSMod == 0){
+  Int_t relid[4] ; 
+  AliPHOSGeometry * phosgeom = (AliPHOSGeometry::GetInstance());
 
   phosgeom->AbsToRelNumbering(digit->GetId(), relid) ;
   fPHOSMod = relid[0];
-  return fPHOSMod ;
+  }
 }
 
-//______________________________________________________________________________
-void AliPHOSRecPoint::GetPrimaries(Int_t & number, Int_t * list)
+//____________________________________________________________________________
+void AliPHOSRecPoint::GetGlobalPosition(TVector3 & gpos, TMatrixF & gmat) const
 {
-  AliPHOSDigit * digit ;
-  Int_t index ;
-  Int_t maxcounter = 3 ;
-  Int_t counter    = 0 ;
-  Int_t * tempo    = new Int_t[maxcounter] ;
-  
-  for ( index = 0 ; index < GetDigitsMultiplicity() ; index++ ) { // all digits
-    digit = (AliPHOSDigit *) fDigitsList[index] ; 
-    Int_t nprimaries = digit->GetNprimary() ;
-    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 ( counter > maxcounter ) {
-       number = - 1 ;
-       cout << "AliPHOSRecPoint::GetNprimaries ERROR > increase maxcounter " << endl ;
-       break ;
-      }
-      Int_t newprimary = newprimaryarray[jndex] ;
-      Int_t kndex ;
-      Bool_t already = kFALSE ;
-      for ( kndex = 0 ; kndex < counter ; kndex++ ) { //check if not already stored
-       if ( newprimary == tempo[kndex] ){
-         already = kTRUE ;
-         break ;
-       }
-      } // end of check
-      if ( !already) { // store it 
-         tempo[counter] = newprimary ; 
-         counter++ ;
-      } // store it
-    } // all primaries in digit
-    delete newprimaryarray ; 
-  } // all digits
-
-  number = counter ; 
-  for ( index = 0 ; index < number ; index ++ )
-    list[index] = tempo[index] ;
+  // 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);
   
-  delete tempo ; 
 }
 
 //______________________________________________________________________________
 void AliPHOSRecPoint::Paint(Option_t *)
 {
-// Paint this ALiRecPoint as a TMarker  with its current attributes
-
-   TVector3 pos(0.,0.,0.)  ;
-   GetLocalPosition(pos)   ;
-   Coord_t x = pos.X()     ;
-   Coord_t y = pos.Z()     ;
-   Color_t markercolor = 1 ;
-   Size_t  markersize = 1. ;
-   Style_t markerstyle = 5 ;
-
-   if (!gPad->IsBatch()) {
-     gVirtualX->SetMarkerColor(markercolor) ;
-     gVirtualX->SetMarkerSize (markersize)  ;
-     gVirtualX->SetMarkerStyle(markerstyle) ;
-   }
-   gPad->SetAttMarkerPS(markercolor,markerstyle,markersize) ;
-   gPad->PaintPolyMarker(1,&x,&y,"") ;
+  // Paint this ALiRecPoint as a TMarker  with its current attributes
+  
+  TVector3 pos(0.,0.,0.)  ;
+  GetLocalPosition(pos)   ;
+  Coord_t x = pos.X()     ;
+  Coord_t y = pos.Z()     ;
+  Color_t markercolor = 1 ;
+  Size_t  markersize = 1. ;
+  Style_t markerstyle = 5 ;
+  
+  if (!gPad->IsBatch()) {
+    gVirtualX->SetMarkerColor(markercolor) ;
+    gVirtualX->SetMarkerSize (markersize)  ;
+    gVirtualX->SetMarkerStyle(markerstyle) ;
+  }
+  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()).
+
+  const Float_t * inthermo = geoEMCA->GetInnerThermoHalfSize() ;
+  const Float_t * strip    = geoEMCA->GetStripHalfSize() ;
+  const Float_t * splate   = geoEMCA->GetSupportPlateHalfSize();
+  const Float_t * crystal  = geoEMCA->GetCrystalHalfSize() ;
+  const Float_t * pin      = geoEMCA->GetAPDHalfSize() ;
+  const 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 for VolumeID=%d",GetVolumeId()));
+
+  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()));
+  }
+
 }