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 ///////////////////////////////////////////////////////////////////////////////
19 // Component for redoing the reconstruction from the clusters and tracks
21 // The new calibration data used
23 // In reality it overwrites the content of the ESD
26 // marian.ivanov@cern.ch
28 #include "AliTPCcalibCalib.h"
31 #include "TTreeStream.h"
33 #include "TTimeStamp.h"
34 #include "AliESDEvent.h"
35 #include "AliESDfriend.h"
36 #include "AliESDtrack.h"
37 #include "AliTracker.h"
39 #include "AliTPCcalibDB.h"
40 #include "AliTPCTransform.h"
41 #include "AliTPCclusterMI.h"
42 #include "AliTPCseed.h"
44 ClassImp(AliTPCcalibCalib)
46 AliTPCcalibCalib::AliTPCcalibCalib():
55 AliTPCcalibCalib::AliTPCcalibCalib(const Text_t *name, const Text_t *title)
63 AliTPCcalibCalib::AliTPCcalibCalib(const AliTPCcalibCalib&calib):
64 AliTPCcalibBase(calib)
71 AliTPCcalibCalib &AliTPCcalibCalib::operator=(const AliTPCcalibCalib&calib){
75 ((AliTPCcalibBase *)this)->operator=(calib);
80 AliTPCcalibCalib::~AliTPCcalibCalib() {
87 void AliTPCcalibCalib::Process(AliESDEvent *event){
94 AliESDfriend *ESDfriend=static_cast<AliESDfriend*>(event->FindListObject("AliESDfriend"));
99 if (GetDebugLevel()>20) printf("Hallo world: Im here\n");
100 Int_t ntracks=event->GetNumberOfTracks();
105 for (Int_t i=0;i<ntracks;++i) {
106 AliESDtrack *track = event->GetTrack(i);
107 const AliExternalTrackParam * trackIn = track->GetInnerParam();
108 const AliExternalTrackParam * trackOut = track->GetOuterParam();
109 if (!trackIn) continue;
110 if (!trackOut) continue;
112 AliESDfriendTrack *friendTrack = ESDfriend->GetTrack(i);
113 TObject *calibObject;
114 AliTPCseed *seed = 0;
115 for (Int_t l=0;(calibObject=friendTrack->GetCalibObject(l));++l) {
116 if ((seed=dynamic_cast<AliTPCseed*>(calibObject))) break;
119 RefitTrack(track, seed);
124 Bool_t AliTPCcalibCalib::RefitTrack(AliESDtrack * track, AliTPCseed *seed){
130 // First apply calibration
133 AliTPCTransform *transform = AliTPCcalibDB::Instance()->GetTransform();
134 for (Int_t irow=0;irow<159;irow++) {
135 AliTPCclusterMI *cluster=seed->GetClusterPointer(irow);
136 if (!cluster) continue;
137 AliTPCclusterMI cl0(*cluster);
138 Double_t x[3]={cluster->GetRow(),cluster->GetPad(),cluster->GetTimeBin()};
139 Int_t i[1]={cluster->GetDetector()};
140 transform->Transform(x,i,0,1);
141 if (cluster->GetDetector()%36>17){
149 TTreeSRedirector *cstream = GetDebugStreamer();
151 (*cstream)<<"Clusters"<<
158 Int_t ncl = seed->GetNumberOfClusters();
162 AliExternalTrackParam * trackInOld = (AliExternalTrackParam*)track->GetInnerParam();
163 AliExternalTrackParam * trackOutOld = (AliExternalTrackParam*)track->GetOuterParam();
165 AliExternalTrackParam trackIn = *trackOutOld;
166 AliExternalTrackParam trackOut = *trackInOld;
167 trackIn.ResetCovariance(10.);
168 trackOut.ResetCovariance(10.);
170 Int_t nclIn=0,nclOut=0;
174 for (Int_t irow=0; irow<160; irow++){
175 AliTPCclusterMI *cl=seed->GetClusterPointer(irow);
177 if (cl->GetX()<80) continue;
178 Int_t sector = cl->GetDetector();
179 Float_t dalpha = TMath::DegToRad()*(sector%18*20.+10.)-trackOut.GetAlpha();
181 if (TMath::Abs(dalpha)>0.01)
182 trackOut.Rotate(TMath::DegToRad()*(sector%18*20.+10.));
183 //if (RejectCluster(cl,&trackOut)) continue;
184 Double_t r[3]={cl->GetX(),cl->GetY(),cl->GetZ()};
185 Double_t cov[3]={0.01,0.,0.01}; //TODO: correct error parametrisation
186 trackOut.GetXYZ(xyz);
187 Double_t bz = AliTracker::GetBz(xyz);
188 if (trackOut.PropagateTo(r[0],bz)) nclOut++;
189 trackOut.Update(&r[1],cov);
196 for (Int_t irow=159; irow>0; irow--){
197 AliTPCclusterMI *cl=seed->GetClusterPointer(irow);
199 if (cl->GetX()<80) continue;
200 Int_t sector = cl->GetDetector();
201 Float_t dalpha = TMath::DegToRad()*(sector%18*20.+10.)-trackIn.GetAlpha();
202 if (TMath::Abs(dalpha)>0.01)
203 trackIn.Rotate(TMath::DegToRad()*(sector%18*20.+10.));
204 //if (RejectCluster(cl,&trackIn)) continue;
205 Double_t r[3]={cl->GetX(),cl->GetY(),cl->GetZ()};
206 Double_t cov[3]={0.01,0.,0.01}; //TODO: correct error parametrisation
207 trackOut.GetXYZ(xyz);
208 Double_t bz = AliTracker::GetBz(xyz);
210 if (trackIn.PropagateTo(r[0],bz)) nclIn++;
211 trackIn.Update(&r[1],cov);
215 TTreeSRedirector *cstream = GetDebugStreamer();
217 (*cstream)<<"Tracks"<<
221 "TrIn0.="<<trackInOld<<
222 "TrOut0.="<<trackOutOld<<
223 "TrIn1.="<<&trackIn<<
224 "TrOut1.="<<&trackOut<<
232 Bool_t AliTPCcalibCalib::RejectCluster(AliTPCclusterMI* cl, AliExternalTrackParam * param){
234 // check the acceptance of cluster
235 // Cut on edge effects
237 Bool_t isReject = kFALSE;
238 Float_t edgeY = cl->GetX()*TMath::Tan(TMath::Pi()/18);
239 Float_t dist = edgeY - TMath::Abs(cl->GetY());
240 if (param) dist = TMath::Abs(edgeY - TMath::Abs(param->GetY()));
241 if (dist<3) isReject=kTRUE;
242 if (cl->GetType()<0) isReject=kTRUE;