* 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 ;
+
}
//____________________________________________________________________________
-Int_t AliPHOSRecPoint::DistancetoPrimitive(Int_t px, Int_t py)
+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)
{
- //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.
- //
+ //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;
+
+ 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];
- 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;
+ 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;
}
//___________________________________________________________________________
}
//______________________________________________________________________________
-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] ;
+ sprintf(line1,"Energy=%1.2f GeV",GetEnergy()) ;
+ sprintf(line2,"%d Digits",GetDigitsMultiplicity()) ;
+ clustertext ->AddText(line1) ;
+ clustertext ->AddText(line2) ;
+ clustertext ->Draw("");
+ }
+ gPad->Update() ;
+ Print("dummy") ;
+ delete[] xi ;
+ delete[] zi ;
+ }
- 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() ;
+break;
+
+ 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 = 10 ;
- 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 * newprimaryarray = digit->GetPrimary() ;
- Int_t nprimaries = digit->GetNprimary() ;
- // cout << " nprimaries = " << nprimaries << endl ;
- 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] ;
- // cout << "GetPrimaries " << newprimary << endl ;
- 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
- } // all digits
-
- counter-- ;
- 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);
+
}
//______________________________________________________________________________
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()).
+
+ 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 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()));
+ }
+
}