1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
17 /* History of cvs commits:
20 * Revision 1.9 2007/10/10 09:05:10 schutz
21 * Changing name QualAss to QA
23 * Revision 1.8 2007/08/28 12:55:08 policheh
24 * Loaders removed from the reconstruction code (C.Cheshkov)
26 * Revision 1.7 2007/08/07 14:12:03 kharlov
27 * Quality assurance added (Yves Schutz)
29 * Revision 1.6 2007/08/03 14:41:37 cvetan
30 * Missing header files
32 * Revision 1.5 2007/08/03 13:52:16 kharlov
33 * Working skeleton of matching the ESD tracks and ESD clusters (Iouri Belikov)
37 #include <TClonesArray.h>
41 #include "AliPHOSTracker.h"
42 #include "AliPHOSEmcRecPoint.h"
43 #include "AliESDEvent.h"
44 #include "AliPHOSGetter.h"
45 #include "AliESDtrack.h"
46 #include "AliPHOSTrackSegmentMakerv1.h"
47 #include "AliPHOSPIDv1.h"
49 //-------------------------------------------------------------------------
51 // Matches ESD tracks with the PHOS and makes the PID.
53 //-------------------------------------------------------------------------
55 ClassImp(AliPHOSTracker)
57 Bool_t AliPHOSTracker::fgDebug = kFALSE ;
60 // ***** Some geometrical constants (used in PropagateBack)
62 const Double_t kR=460.+ 9; // Radial coord. of the centre of EMC module (cm)
64 const Double_t kAlpha=20.*TMath::Pi()/180.; // Segmentation angle (rad)
65 const Double_t kYmax=kR*TMath::Tan(0.5*kAlpha); // Maximal possible y-coord.(cm)
66 const Double_t kZmax=65.; // Approximately: the maximal possible z-coord.(cm)
70 //____________________________________________________________________________
71 AliPHOSTracker::AliPHOSTracker():
74 //--------------------------------------------------------------------
75 // The default constructor
76 //--------------------------------------------------------------------
77 for (Int_t i=0; i<5; i++)
78 fModules[i]=new TClonesArray("AliPHOSEmcRecPoint",777);
81 //____________________________________________________________________________
82 AliPHOSTracker::~AliPHOSTracker()
84 //--------------------------------------------------------------------
86 //--------------------------------------------------------------------
87 for (Int_t i=0; i<5; i++) {
88 (fModules[i])->Delete();
93 //____________________________________________________________________________
94 Int_t AliPHOSTracker::LoadClusters(TTree *cTree) {
95 //--------------------------------------------------------------------
96 // This function loads the PHOS clusters
97 //--------------------------------------------------------------------
99 TBranch *branch=cTree->GetBranch("PHOSEmcRP");
101 AliError("No branch with the EMC clusters found !");
104 branch->SetAddress(&arr);
107 Int_t nentr=(Int_t)branch->GetEntries();
108 for (Int_t i=0; i<nentr; i++) {
109 if (!branch->GetEvent(i)) continue;
110 Int_t ncl=arr->GetEntriesFast();
112 AliPHOSEmcRecPoint *cl=(AliPHOSEmcRecPoint*)arr->UncheckedAt(ncl);
114 Int_t m=cl->GetPHOSMod();
116 AliError("Wrong module index !");
120 // Here is how the alignment is treated
121 if (!cl->Misalign()) AliWarning("Can't misalign this cluster !");
123 cl->SetBit(14,kFALSE); // The clusters are not yet attached to any track
125 TClonesArray &module=*fModules[m-1];
126 Int_t idx=module.GetEntriesFast();
127 new (module[idx]) AliPHOSEmcRecPoint(*cl);
134 Info("LoadClusters","Number of loaded clusters: %d",nclusters);
139 //____________________________________________________________________________
140 Int_t AliPHOSTracker::PropagateBack(AliESDEvent *esd) {
141 //--------------------------------------------------------------------
142 // Called by AliReconstruction
143 // Performs the track matching with the PHOS modules
145 //--------------------------------------------------------------------
147 Int_t nt=esd->GetNumberOfTracks();
149 // *** Select and sort the ESD track in accordance with their quality
150 Double_t *quality=new Double_t[nt];
151 Int_t *index=new Int_t[nt];
152 for (Int_t i=0; i<nt; i++) {
153 AliESDtrack *esdTrack=esd->GetTrack(i);
154 quality[i] = esdTrack->GetSigmaY2() + esdTrack->GetSigmaZ2();
156 TMath::Sort(nt,quality,index,kFALSE);
159 // *** Start the matching
162 for (Int_t i=0; i<nt; i++) {
163 AliESDtrack *esdTrack=esd->GetTrack(index[i]);
165 // Skip the tracks having "wrong" status (has to be checked/tuned)
166 ULong_t status = esdTrack->GetStatus();
167 if ((status & AliESDtrack::kTRDout) == 0) continue;
168 if ((status & AliESDtrack::kTRDrefit) == 1) continue;
170 AliExternalTrackParam t(*esdTrack);
172 Int_t isec=Int_t(t.GetAlpha()/kAlpha);
173 Int_t imod=-isec-2; // PHOS module
175 Double_t y; // Some tracks do not reach the PHOS
176 if (!t.GetYAt(kR,bz,y)) continue; // because of the bending
178 Double_t z; t.GetZAt(kR,bz,z);
179 if (TMath::Abs(z) > kZmax) continue; // Some tracks miss the PHOS in Z
182 while (TMath::Abs(y) > kYmax) { // Find the matching module
183 Double_t alp=t.GetAlpha();
185 if (!t.Rotate(alp+kAlpha)) {ok=kFALSE; break;}
187 } else if (y < -kYmax) {
188 if (!t.Rotate(alp-kAlpha)) {ok=kFALSE; break;}
191 if (!t.GetYAt(kR,bz,y)) {ok=kFALSE; break;}
193 if (!ok) continue; // Track rotation failed
196 if ((imod<0)||(imod>4)) continue; // Some tracks miss the PHOS in azimuth
198 //t.CorrectForMaterial(...); // Correct for the TOF material, if needed
199 t.PropagateTo(kR,bz); // Propagate to the matching module
202 // *** Search for the "best" cluster (can be improved)
203 TClonesArray &cArray=*fModules[imod];
204 Int_t ncl=cArray.GetEntriesFast();
205 AliPHOSEmcRecPoint *bestCluster=0; // The "best" cluster
206 Double_t maxd2=400; // (cm^2)
207 for (Int_t i=0; i<ncl; i++) {
208 AliPHOSEmcRecPoint *c=(AliPHOSEmcRecPoint *)cArray.UncheckedAt(i);
210 if (c->TestBit(14)) continue; // This clusters is "used"
212 Double_t dy = t.GetY() - c->GetY(), dz = t.GetZ() - c->GetZ();
213 Double_t d2 = dy*dy + dz*dz;
220 if (!bestCluster) continue; // No reasonable matching found
222 bestCluster->SetBit(14,kTRUE); // This clusters is now attached to a track
226 // *** Now, do the PID with the "bestCluster"
227 // and add the corresponding info to the ESD track pointed by "esdTrack"
230 printf("%e %e %e %e\n",t.GetSign(), t.GetX() - bestCluster->GetX(),
231 t.GetY() - bestCluster->GetY(),
232 t.GetZ() - bestCluster->GetZ());
236 Info("PropagateBack","Number of matched tracks: %d",matched);
244 //____________________________________________________________________________
245 AliCluster *AliPHOSTracker::GetCluster(Int_t index) const {
246 //--------------------------------------------------------------------
247 // Returns the pointer to a given cluster
248 //--------------------------------------------------------------------
249 Int_t m=(index & 0xf0000000) >> 28; // Module number
250 Int_t i=(index & 0x0fffffff) >> 00; // Index within the module
252 return (AliCluster*)(fModules[m])->UncheckedAt(i);
255 //____________________________________________________________________________
256 void AliPHOSTracker::UnloadClusters() {
257 //--------------------------------------------------------------------
258 // This function unloads the PHOS clusters
259 //--------------------------------------------------------------------
260 for (Int_t i=0; i<5; i++) (fModules[i])->Delete();