// new TrackSegment.
// If there is no CPV/PPSD RecPoint we make TrackSegment
// consisting from EMC alone. There is no TrackSegments without EMC RecPoint.
-//// In principle this class should be called from AliPHOSReconstructioner, but
+//// In principle this class should be called from AliPHOSReconstructor, but
// one can use it as well in standalone mode.
// Use case:
// root [0] AliPHOSTrackSegmentMakerv1 * t = new AliPHOSTrackSegmentMaker("galice.root", "tracksegmentsname", "recpointsname")
}
//____________________________________________________________________________
-Float_t AliPHOSTrackSegmentMakerv1::GetDistanceInPHOSPlane(AliPHOSEmcRecPoint * emcClu,AliPHOSRecPoint * cpvClu, Bool_t &toofar) const
+Float_t AliPHOSTrackSegmentMakerv1::GetDistanceInPHOSPlane(AliPHOSEmcRecPoint * emcClu,AliPHOSCpvRecPoint * cpvClu, Bool_t &toofar) const
{
// Calculates the distance between the EMC RecPoint and the PPSD RecPoint
// Clusters are sorted in "rows" and "columns" of width 1 cm
TVector3 vecDist ; // Distance between local positions of two points
emcClu->GetLocalPosition(vecEmc) ;
- cpvClu->GetLocalPosition(vecCpv) ;
+ cpvClu->GetLocalPosition(vecCpv) ;
toofar = kTRUE ;
if(emcClu->GetPHOSMod() == cpvClu->GetPHOSMod()){
- Info("GetDistanceInPHOSPlane","%z",fESD);
if (fESD != 0x0) {
// Extrapolate the global track direction if any to CPV and find the closest track
Int_t nTracks = fESD->GetNumberOfTracks();
Int_t iClosestTrack = -1;
- Double_t distance;
Double_t minDistance = 1e6;
Double_t pxyz[3], xyz[3];
AliESDtrack *track;
for (Int_t iTrack=0; iTrack<nTracks; iTrack++) {
track = fESD->GetTrack(iTrack);
track->GetOuterXYZ(xyz); // track coord on the cylinder of PHOS radius
+ if ((TMath::Abs(xyz[0])+TMath::Abs(xyz[1])+TMath::Abs(xyz[2]))<=0)
+ continue;
track->GetOuterPxPyPz(pxyz); // track momentum ibid.
- vecDist = PropagateToCPV(xyz,pxyz,cpvClu->GetPHOSMod());
+ vecDist = PropagateToPlane(xyz,pxyz,"CPV",cpvClu->GetPHOSMod());
+// Info("GetDistanceInPHOSPlane","Track %d propagation to CPV = (%f,%f,%f)",
+// iTrack,vecDist.X(),vecDist.Y(),vecDist.Z());
vecDist -= vecCpv;
distance = TMath::Sqrt(vecDist.X()*vecDist.X() + vecDist.Z()*vecDist.Z());
// Find the closest track to the EMC recpoint
geom->GetGlobal((AliRecPoint*)cpvClu,vecCpvGlobal);
for (Int_t ixyz=0; ixyz<3; ixyz++)
xyz[ixyz] = vecCpvGlobal[ixyz];
- vecDist = PropagateToCPV(xyz,pxyz,cpvClu->GetPHOSMod());
+ vecDist = PropagateToPlane(xyz,pxyz,"EMC",cpvClu->GetPHOSMod());
+// Info("GetDistanceInPHOSPlane","Track %d propagation to EMC = (%f,%f,%f)",
+// iClosestTrack,vecDist.X(),vecDist.Y(),vecDist.Z());
vecDist -= vecEmc;
distance = TMath::Sqrt(vecDist.X()*vecDist.X() + vecDist.Z()*vecDist.Z());
}
} else {
- // If no ESD, than simply find EMC-CPV distance
+ // If no ESD exists, than simply find EMC-CPV distance
distance = (vecCpv - vecEmc).Mag() ;
}
+// Info("GetDistanceInPHOSPlane","cpv-emc distance is %f cm",
+// distance);
if(distance < fRcpv + 2*delta )
toofar = kFALSE ;
- }
+ }
return distance ;
}
//____________________________________________________________________________
-TVector3 AliPHOSTrackSegmentMakerv1::PropagateToCPV(Double_t *x, Double_t *p,
- Int_t moduleNumber) const
+TVector3 AliPHOSTrackSegmentMakerv1::PropagateToPlane(Double_t *x, Double_t *p,
+ char *det, Int_t moduleNumber) const
{
// Propagate a straight-line track from the origin point x
- // along the direction p to the CPV module moduleNumber
+ // along the direction p to the CPV or EMC module moduleNumber
// Returns a local position of such a propagation
AliPHOSGetter * gime = AliPHOSGetter::Instance() ;
const AliPHOSGeometry * geom = gime->PHOSGeometry() ;
- TVector3 moduleCenter = geom->GetCpvModuleCenter(moduleNumber);
+ TVector3 moduleCenter = geom->GetModuleCenter(det,moduleNumber);
TVector3 vertex(x);
TVector3 direction(p);
+// Info("PropagateToCPV","Center of the %s module %d is (%f,%f,%f)",
+// det,moduleNumber,moduleCenter[0],moduleCenter[1],moduleCenter[2]);
+
Double_t time = (moduleCenter.Mag2() - vertex.Dot(moduleCenter)) /
(direction.Dot(moduleCenter));
TVector3 globalIntersection = vertex + direction*time;
- return geom->Global2LocalCpv(globalIntersection,moduleNumber);
+ return geom->Global2Local(globalIntersection,moduleNumber);
}
//____________________________________________________________________________
fLinkUpArray->Clear() ;
- AliPHOSRecPoint * cpv ;
+ AliPHOSCpvRecPoint * cpv ;
AliPHOSEmcRecPoint * emcclu ;
Int_t iLinkUp = 0 ;
Int_t iCpv = 0 ;
for(iCpv = fCpvFirst; iCpv < fCpvLast;iCpv++ ) {
- cpv = dynamic_cast<AliPHOSRecPoint *>(cpvRecPoints->At(iCpv)) ;
+ cpv = dynamic_cast<AliPHOSCpvRecPoint *>(cpvRecPoints->At(iCpv)) ;
Float_t r = GetDistanceInPHOSPlane(emcclu, cpv, toofar) ;
if(toofar)
AliPHOSLink * linkUp ;
- AliPHOSRecPoint * nullpointer = 0 ;
+ AliPHOSCpvRecPoint * nullpointer = 0 ;
while ( (linkUp = static_cast<AliPHOSLink *>(nextUp()) ) ){
new ((* trackSegments)[fNTrackSegments])
AliPHOSTrackSegment(dynamic_cast<AliPHOSEmcRecPoint *>(emcRecPoints->At(linkUp->GetEmc())) ,
- dynamic_cast<AliPHOSRecPoint *>(cpvRecPoints->At(linkUp->GetPpsd()))) ;
+ dynamic_cast<AliPHOSCpvRecPoint *>(cpvRecPoints->At(linkUp->GetPpsd()))) ;
(dynamic_cast<AliPHOSTrackSegment *>(trackSegments->At(fNTrackSegments)))->SetIndexInList(fNTrackSegments);
fNTrackSegments++ ;