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 **************************************************************************/
18 ///////////////////////////////////////////////////////////////////////////////
20 // Class for TRD reconstruction //
22 ///////////////////////////////////////////////////////////////////////////////
25 #include <TObjString.h>
26 #include <TObjArray.h>
27 #include <TClonesArray.h>
29 #include "AliRunLoader.h"
30 #include "AliRawReader.h"
32 #include "AliESDTrdTrack.h"
33 #include "AliESDEvent.h"
35 #include "AliTRDReconstructor.h"
36 #include "AliTRDclusterizer.h"
37 #include "AliTRDtracker.h"
38 #include "AliTRDpidESD.h"
39 #include "AliTRDgtuTrack.h"
40 #include "AliTRDrawData.h"
41 #include "AliTRDdigitsManager.h"
42 #include "AliTRDtrackerV1.h"
43 #include "AliTRDrecoParam.h"
45 #define SETFLG(n,f) ((n) |= f)
46 #define CLRFLG(n,f) ((n) &= ~f)
48 ClassImp(AliTRDReconstructor)
50 TClonesArray *AliTRDReconstructor::fgClusters = 0x0;
51 //_____________________________________________________________________________
52 AliTRDReconstructor::AliTRDReconstructor()
56 // setting default "ON" steering parameters
57 // write clusters [cw]
58 SETFLG(fSteerParam, kWriteClusters);
59 // track seeding (stand alone tracking) [sa]
60 SETFLG(fSteerParam, kSeeding);
61 // PID method in reconstruction (NN) [nn]
62 SETFLG(fSteerParam, kSteerPID);
64 memset(fStreamLevel, 0, 5*sizeof(UChar_t));
65 // Xe tail cancellation parameters
66 fTCParams[0] = 1.156; // r1
67 fTCParams[1] = 0.130; // r2
68 fTCParams[2] = 0.114; // c1
69 fTCParams[3] = 0.624; // c2
70 // Ar tail cancellation parameters
71 fTCParams[4] = 6.; // r1
72 fTCParams[5] = 0.62; // r2
73 fTCParams[6] = 0.0087;// c1
74 fTCParams[7] = 0.07; // c2
77 //_____________________________________________________________________________
78 AliTRDReconstructor::AliTRDReconstructor(const AliTRDReconstructor &r)
80 ,fSteerParam(r.fSteerParam)
82 memcpy(fStreamLevel, r.fStreamLevel, 5*sizeof(UChar_t));
83 memcpy(fTCParams, r.fTCParams, 8*sizeof(Double_t));
86 //_____________________________________________________________________________
87 AliTRDReconstructor::~AliTRDReconstructor()
90 fgClusters->Delete(); delete fgClusters;
95 //_____________________________________________________________________________
96 void AliTRDReconstructor::Init(){
100 SetOption(GetOption());
102 AliInfo(Form("\tDigitsConversion [dc] : %s", fSteerParam&kDigitsConversion?"yes":"no"));
103 AliInfo(Form("\tWrite Clusters [cw] : %s", fSteerParam&kWriteClusters?"yes":"no"));
104 AliInfo(Form("\tWrite Online Tracklets [tw] : %s", fSteerParam&kWriteTracklets?"yes":"no"));
105 AliInfo(Form("\tDrift Gas Argon [ar] : %s", fSteerParam&kDriftGas?"yes":"no"));
106 AliInfo(Form("\tStand Alone Tracking [sa] : %s", fSteerParam&kSeeding?"yes":"no"));
107 AliInfo(Form("\tHLT Tracking [hlt] : %s", fSteerParam&kHLT?"yes":"no"));
108 AliInfo(Form("\tCosmic Reconstruction [cos] : %s", fSteerParam&kCosmic?"yes":"no"));
109 AliInfo(Form("\tNN PID [nn] : %s", fSteerParam&kSteerPID?"yes":"no"));
110 AliInfo(Form("\t8 dEdx slices in ESD [8s] : %s", fSteerParam&kEightSlices?"yes":"no"));
111 AliInfo(Form("\tStreaming Levels : Clusterizer[%d] Tracker[%d] PID[%d]", fStreamLevel[kClusterizer], fStreamLevel[kTracker], fStreamLevel[kPID]));
114 //_____________________________________________________________________________
115 void AliTRDReconstructor::ConvertDigits(AliRawReader *rawReader
116 , TTree *digitsTree) const
119 // Convert raw data digits into digit objects in a root tree
121 AliInfo("Feature not available for the moment."); return;
123 AliInfo("Convert raw data digits into digit objects [RawReader -> Digit TTree]");
125 AliTRDrawData rawData;
127 rawReader->Select("TRD");
128 AliTRDdigitsManager *manager = rawData.Raw2Digits(rawReader);
129 manager->MakeBranch(digitsTree);
130 manager->WriteDigits();
135 //_____________________________________________________________________________
136 void AliTRDReconstructor::Reconstruct(AliRawReader *rawReader
137 , TTree *clusterTree) const
140 // Reconstruct clusters
143 //AliInfo("Reconstruct TRD clusters from RAW data [RawReader -> Cluster TTree]");
147 rawReader->Select("TRD");
149 // New (fast) cluster finder
150 AliTRDclusterizer clusterer("clusterer","TRD clusterizer");
151 clusterer.SetReconstructor(this);
152 clusterer.OpenOutput(clusterTree);
153 clusterer.SetAddLabels(kFALSE);
154 clusterer.Raw2ClustersChamber(rawReader);
156 if(IsWritingClusters()) return;
158 // take over ownership of clusters
159 fgClusters = clusterer.RecPoints();
160 clusterer.SetClustersOwner(kFALSE);
163 //_____________________________________________________________________________
164 void AliTRDReconstructor::Reconstruct(TTree *digitsTree
165 , TTree *clusterTree) const
168 // Reconstruct clusters
171 //AliInfo("Reconstruct TRD clusters from Digits [Digit TTree -> Cluster TTree]");
173 AliTRDclusterizer clusterer("clusterer","TRD clusterizer");
174 clusterer.SetReconstructor(this);
175 clusterer.OpenOutput(clusterTree);
176 clusterer.ReadDigits(digitsTree);
177 clusterer.MakeClusters();
179 if(IsWritingClusters()) return;
181 // take over ownership of clusters
182 fgClusters = clusterer.RecPoints();
183 clusterer.SetClustersOwner(kFALSE);
186 //_____________________________________________________________________________
187 AliTracker *AliTRDReconstructor::CreateTracker() const
190 // Create a TRD tracker
193 //return new AliTRDtracker(NULL);
194 AliTRDtrackerV1 *tracker = new AliTRDtrackerV1();
195 tracker->SetReconstructor(this);
200 //_____________________________________________________________________________
201 void AliTRDReconstructor::FillESD(TTree* /*digitsTree*/
202 , TTree* /*clusterTree*/
203 , AliESDEvent* /*esd*/) const
212 //_____________________________________________________________________________
213 void AliTRDReconstructor::SetOption(Option_t *opt)
215 // Read option string into the steer param.
217 // Default steer param values
219 // digits conversion [dc] = false
220 // drift gas [ar] = false - do not update the number of exponentials in the TC !
221 // write clusters [cw] = true
222 // write online tracklets [tw] = false
223 // track seeding (stand alone tracking) [sa] = true
224 // PID method in reconstruction (NN) [nn] = true
225 // 8 dEdx slices in ESD [8s] = false
226 // HLT tracking [hlt] = false
227 // Cosmic Reconstruction [cos] = false
230 AliReconstructor::SetOption(opt);
233 TObjArray *opar = s.Tokenize(",");
234 for(Int_t ipar=0; ipar<opar->GetEntriesFast(); ipar++){
235 TString sopt(((TObjString*)(*opar)[ipar])->String());
236 if(sopt.Contains("dc")){
237 SETFLG(fSteerParam, kDigitsConversion);
238 if(sopt.Contains("!")) CLRFLG(fSteerParam, kDigitsConversion);
240 } else if(sopt.Contains("cw")){
241 SETFLG(fSteerParam, kWriteClusters);
242 if(sopt.Contains("!")) CLRFLG(fSteerParam, kWriteClusters);
244 } else if(sopt.Contains("sa")){
245 SETFLG(fSteerParam, kSeeding);
246 if(sopt.Contains("!")) CLRFLG(fSteerParam, kSeeding);
248 } else if(sopt.Contains("nn")){
249 SETFLG(fSteerParam, kSteerPID);
250 if(sopt.Contains("!")) CLRFLG(fSteerParam, kSteerPID);
252 } else if(sopt.Contains("8s")){
253 SETFLG(fSteerParam, kEightSlices);
254 if(sopt.Contains("!")) CLRFLG(fSteerParam, kEightSlices);
256 } else if(sopt.Contains("tw")){
257 SETFLG(fSteerParam, kWriteTracklets);
258 if(sopt.Contains("!")) CLRFLG(fSteerParam, kWriteTracklets);
260 } else if(sopt.Contains("ar")){
261 SETFLG(fSteerParam, kDriftGas);
262 if(sopt.Contains("!")) CLRFLG(fSteerParam, kDriftGas);
264 } else if(sopt.Contains("hlt")){
265 SETFLG(fSteerParam, kHLT);
266 if(sopt.Contains("!")) CLRFLG(fSteerParam, kHLT);
268 } else if(sopt.Contains("cos")){
269 SETFLG(fSteerParam, kCosmic);
270 if(sopt.Contains("!")) CLRFLG(fSteerParam, kCosmic);
271 } else if(sopt.Contains("sl")){
272 TObjArray *stl = sopt.Tokenize("_");
273 if(stl->GetEntriesFast() < 3) continue;
274 TString taskstr(((TObjString*)(*stl)[1])->String());
275 TString levelstring(((TObjString*)(*stl)[2])->String());
276 // Set the stream Level
277 Int_t level = levelstring.Atoi();
278 AliTRDReconstructorTask task = kTracker;
279 if(taskstr.CompareTo("cl") == 0) task = kClusterizer;
280 else if(taskstr.CompareTo("tr") == 0) task = kTracker;
281 else if(taskstr.CompareTo("pi") == 0) task = kPID;
282 SetStreamLevel(level, task);
288 //_____________________________________________________________________________
289 void AliTRDReconstructor::SetStreamLevel(Int_t level, AliTRDReconstructorTask task){
291 // Set the Stream Level for one of the tasks Clusterizer, Tracker or PID
296 taskname = "Clusterizer";
299 taskname = "Tracker";
305 //AliInfo(Form("Setting Stream Level for Task %s to %d", taskname.Data(),level));
306 fStreamLevel[(Int_t)task] = level;