Implementation of ITS tracking for HLT. The tracking is based on the off-line AliITSt...
[u/mrichter/AliRoot.git] / HLT / ITS / AliL3ITStracker.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
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  **************************************************************************/
15
16 //-------------------------------------------------------------------------
17 //               Implementation of the HLT ITS tracker class
18 //    It reads AliITSclusterV2 clusters and HLT ESD tracks and creates 
19 //    AliITStrackV2 tracks. For details, see also RunHLTITS.C macro.
20 //          Origin: Cvetan Cheshkov, CERN, Cvetan.Cheshkov@cern.ch
21 //-------------------------------------------------------------------------
22
23 #include "AliESD.h"
24 #include "AliL3ITStrack.h"
25 #include "AliL3ITStracker.h"
26
27 ClassImp(AliL3ITStracker)
28
29 static Int_t CorrectForDeadZoneMaterial(AliITStrackV2 *t) {
30   //--------------------------------------------------------------------
31   // Correction for the material between the TPC and the ITS
32   // (should it belong to the TPC code ?)
33   //--------------------------------------------------------------------
34   Double_t riw=80., diw=0.0053, x0iw=30; // TPC inner wall ? 
35   Double_t rcd=61., dcd=0.0053, x0cd=30; // TPC "central drum" ?
36   Double_t yr=12.8, dr=0.03; // rods ?
37   Double_t zm=0.2, dm=0.40;  // membrane
38   //Double_t rr=52., dr=0.19, x0r=24., yyr=7.77; //rails
39   Double_t rs=50., ds=0.001; // something belonging to the ITS (screen ?)
40
41   if (t->GetX() > riw) {
42      if (!t->PropagateTo(riw,diw,x0iw)) return 1;
43      if (TMath::Abs(t->GetY())>yr) t->CorrectForMaterial(dr);
44      if (TMath::Abs(t->GetZ())<zm) t->CorrectForMaterial(dm);
45      if (!t->PropagateTo(rcd,dcd,x0cd)) return 1;
46      //Double_t x,y,z; t->GetGlobalXYZat(rr,x,y,z);
47      //if (TMath::Abs(y)<yyr) t->PropagateTo(rr,dr,x0r); 
48      if (!t->PropagateTo(rs,ds)) return 1;
49   } else if (t->GetX() < rs) {
50      if (!t->PropagateTo(rs,-ds)) return 1;
51      //Double_t x,y,z; t->GetGlobalXYZat(rr,x,y,z);
52      //if (TMath::Abs(y)<yyr) t->PropagateTo(rr,-dr,x0r); 
53      if (!t->PropagateTo(rcd,-dcd,x0cd)) return 1;
54      if (!t->PropagateTo(riw+0.001,-diw,x0iw)) return 1;
55   } else {
56     //    ::Error("CorrectForDeadZoneMaterial","track is already in the dead zone !");
57     return 1;
58   }
59   
60   return 0;
61 }
62
63 Int_t AliL3ITStracker::Clusters2Tracks(AliESD *event) {
64   //--------------------------------------------------------------------
65   // This functions reconstructs HLT ITS tracks
66   //--------------------------------------------------------------------
67   TObjArray itsTracks(15000);
68
69   {/* Read HLT ESD tracks */
70     Int_t nentr;
71     nentr=event->GetNumberOfHLTHoughTracks();
72     Info("Clusters2Tracks", "Number of ESD HLT tracks: %d\n", nentr);
73     while (nentr--) {
74
75       AliESDHLTtrack *esd=event->GetHLTHoughTrack(nentr);
76       if (esd->GetWeight() > 500) continue;
77
78       AliL3ITStrack *t=0;
79       try {
80         t=new AliL3ITStrack(*esd,GetZ());
81       } catch (const Char_t *msg) {
82         Warning("Clusters2Tracks",msg);
83         delete t;
84         continue;
85       }
86       if (TMath::Abs(t->GetD())>5) {
87         delete t;
88         continue;
89       }
90
91       if (CorrectForDeadZoneMaterial(t)!=0) {
92         Warning("Clusters2Tracks",
93                 "failed to correct for the material in the dead zone !\n");
94         delete t;
95         continue;
96       }
97       itsTracks.AddLast(t);
98     }
99   } /* End Read HLT ESD tracks */
100
101   itsTracks.Sort();
102   Int_t nentr=itsTracks.GetEntriesFast();
103   Info("Clusters2Tracks", "Number of Selected for tracking HLT ESD tracks: %d\n", nentr);
104
105   Int_t ntrk=0;
106   for (fPass=0; fPass<2; fPass++) {
107      Int_t &constraint=fConstraint[fPass]; if (constraint<0) continue;
108      for (Int_t i=0; i<nentr; i++) {
109        AliL3ITStrack *t=(AliL3ITStrack*)itsTracks.UncheckedAt(i);
110        if (t==0) continue;              //this track has been already tracked
111        Int_t tpcLabel=t->GetLabel(); //save the TPC track label
112
113        ResetTrackToFollow(*t);
114        ResetBestTrack();
115
116        for (FollowProlongation(); fI<kMaxLayer; fI++) {
117          while (TakeNextProlongation()) FollowProlongation();
118        }
119
120        if (fBestTrack.GetNumberOfClusters() == 0) continue;
121        
122        if (fConstraint[fPass]) {
123          ResetTrackToFollow(*t);
124          if (!RefitAt(3.7, &fTrackToFollow, &fBestTrack)) continue;
125          ResetBestTrack();
126          }
127        
128        fBestTrack.SetLabel(tpcLabel);
129        fBestTrack.CookdEdx();
130        CookLabel(&fBestTrack,0.); //For comparison only
131        // Specific to the AliL3ITStracker
132        //       fBestTrack.UpdateESDtrack(AliESDtrack::kITSin);
133        t->GetESDHLTtrack()->UpdateTrackParams(&fBestTrack);
134        //
135        UseClusters(&fBestTrack);
136        delete itsTracks.RemoveAt(i);
137        ntrk++;
138      }
139   }
140
141   itsTracks.Delete();
142
143   Info("Clusters2Tracks","Number of prolonged tracks: %d\n",ntrk);
144
145   return 0;
146 }
147
148 Int_t AliL3ITStracker::PropagateBack(AliESD *event) {
149   //--------------------------------------------------------------------
150   // This functions propagates reconstructed ITS tracks back
151   //--------------------------------------------------------------------
152   Int_t nentr=event->GetNumberOfHLTHoughTracks();
153   Info("PropagateBack", "Number of HLT ESD tracks: %d\n", nentr);
154
155   Int_t ntrk=0;
156   for (Int_t i=0; i<nentr; i++) {
157      AliESDHLTtrack *esd=event->GetHLTHoughTrack(i);
158      if (esd->GetWeight() > 500) continue;
159
160      AliL3ITStrack *t=0;
161      try {
162         t=new AliL3ITStrack(*esd,GetZ());
163      } catch (const Char_t *msg) {
164         Warning("PropagateBack",msg);
165         delete t;
166         continue;
167      }
168
169      ResetTrackToFollow(*t);
170
171      // propagete to vertex [SR, GSI 17.02.2003]
172      // Start Time measurement [SR, GSI 17.02.2003], corrected by I.Belikov
173      if (fTrackToFollow.PropagateTo(3.,0.0028,65.19)) {
174        if (fTrackToFollow.PropagateToVertex()) {
175           fTrackToFollow.StartTimeIntegral();
176        }
177        fTrackToFollow.PropagateTo(3.,-0.0028,65.19);
178      }
179
180      fTrackToFollow.ResetCovariance(); fTrackToFollow.ResetClusters();
181      if (RefitAt(49.,&fTrackToFollow,t)) {
182         if (CorrectForDeadZoneMaterial(&fTrackToFollow)!=0) {
183           Warning("PropagateBack",
184                   "failed to correct for the material in the dead zone !\n");
185           delete t;
186           continue;
187         }
188         fTrackToFollow.SetLabel(t->GetLabel());
189         //fTrackToFollow.CookdEdx();
190         CookLabel(&fTrackToFollow,0.); //For comparison only
191         //      cout<<" Backtrack "<<fTrackToFollow.GetLabel()<<" "<<fTrackToFollow.GetNumberOfClusters()<<" "<<fTrackToFollow.fFakeRatio<<endl;
192         fTrackToFollow.UpdateESDtrack(AliESDtrack::kITSout);
193         //UseClusters(&fTrackToFollow);
194         ntrk++;
195      }
196      delete t;
197   }
198
199   Info("PropagateBack","Number of back propagated HLT ITS tracks: %d\n",ntrk);
200
201   return 0;
202 }
203
204 Int_t AliL3ITStracker::RefitInward(AliESD *event) {
205   //--------------------------------------------------------------------
206   // This functions refits ITS tracks using the 
207   // "inward propagated" TPC tracks
208   //--------------------------------------------------------------------
209
210   Int_t nentr=event->GetNumberOfHLTHoughTracks();
211   Info("RefitInward", "The method is not yet implemented! %d",nentr);
212   return 0;
213 }