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
122 AliInfo("Convert raw data digits into digit objects [RawReader -> Digit TTree]");
124 AliTRDrawData rawData;
126 rawReader->Select("TRD");
127 AliTRDdigitsManager *manager = rawData.Raw2Digits(rawReader);
128 manager->MakeBranch(digitsTree);
129 manager->WriteDigits();
134 //_____________________________________________________________________________
135 void AliTRDReconstructor::Reconstruct(AliRawReader *rawReader
136 , TTree *clusterTree) const
139 // Reconstruct clusters
142 //AliInfo("Reconstruct TRD clusters from RAW data [RawReader -> Cluster TTree]");
146 rawReader->Select("TRD");
148 // New (fast) cluster finder
149 AliTRDclusterizer clusterer("clusterer","TRD clusterizer");
150 clusterer.SetReconstructor(this);
151 clusterer.OpenOutput(clusterTree);
152 clusterer.SetAddLabels(kFALSE);
153 clusterer.Raw2ClustersChamber(rawReader);
155 if(IsWritingClusters()) return;
157 // take over ownership of clusters
158 fgClusters = clusterer.RecPoints();
159 clusterer.SetClustersOwner(kFALSE);
162 //_____________________________________________________________________________
163 void AliTRDReconstructor::Reconstruct(TTree *digitsTree
164 , TTree *clusterTree) const
167 // Reconstruct clusters
170 //AliInfo("Reconstruct TRD clusters from Digits [Digit TTree -> Cluster TTree]");
172 AliTRDclusterizer clusterer("clusterer","TRD clusterizer");
173 clusterer.SetReconstructor(this);
174 clusterer.OpenOutput(clusterTree);
175 clusterer.ReadDigits(digitsTree);
176 clusterer.MakeClusters();
178 if(IsWritingClusters()) return;
180 // take over ownership of clusters
181 fgClusters = clusterer.RecPoints();
182 clusterer.SetClustersOwner(kFALSE);
185 //_____________________________________________________________________________
186 AliTracker *AliTRDReconstructor::CreateTracker() const
189 // Create a TRD tracker
192 //return new AliTRDtracker(NULL);
193 AliTRDtrackerV1 *tracker = new AliTRDtrackerV1();
194 tracker->SetReconstructor(this);
199 //_____________________________________________________________________________
200 void AliTRDReconstructor::FillESD(TTree* /*digitsTree*/
201 , TTree* /*clusterTree*/
202 , AliESDEvent* /*esd*/) const
211 //_____________________________________________________________________________
212 void AliTRDReconstructor::SetOption(Option_t *opt)
214 // Read option string into the steer param.
216 // Default steer param values
218 // digits conversion [dc] = false
219 // drift gas [ar] = false - do not update the number of exponentials in the TC !
220 // write clusters [cw] = true
221 // write online tracklets [tw] = false
222 // track seeding (stand alone tracking) [sa] = true
223 // PID method in reconstruction (NN) [nn] = true
224 // 8 dEdx slices in ESD [8s] = false
225 // HLT tracking [hlt] = false
226 // Cosmic Reconstruction [cos] = false
229 AliReconstructor::SetOption(opt);
232 TObjArray *opar = s.Tokenize(",");
233 for(Int_t ipar=0; ipar<opar->GetEntriesFast(); ipar++){
234 TString sopt(((TObjString*)(*opar)[ipar])->String());
235 if(sopt.Contains("dc")){
236 SETFLG(fSteerParam, kDigitsConversion);
237 if(sopt.Contains("!")) CLRFLG(fSteerParam, kDigitsConversion);
239 } else if(sopt.Contains("cw")){
240 SETFLG(fSteerParam, kWriteClusters);
241 if(sopt.Contains("!")) CLRFLG(fSteerParam, kWriteClusters);
243 } else if(sopt.Contains("sa")){
244 SETFLG(fSteerParam, kSeeding);
245 if(sopt.Contains("!")) CLRFLG(fSteerParam, kSeeding);
247 } else if(sopt.Contains("nn")){
248 SETFLG(fSteerParam, kSteerPID);
249 if(sopt.Contains("!")) CLRFLG(fSteerParam, kSteerPID);
251 } else if(sopt.Contains("8s")){
252 SETFLG(fSteerParam, kEightSlices);
253 if(sopt.Contains("!")) CLRFLG(fSteerParam, kEightSlices);
255 } else if(sopt.Contains("tw")){
256 SETFLG(fSteerParam, kWriteTracklets);
257 if(sopt.Contains("!")) CLRFLG(fSteerParam, kWriteTracklets);
259 } else if(sopt.Contains("ar")){
260 SETFLG(fSteerParam, kDriftGas);
261 if(sopt.Contains("!")) CLRFLG(fSteerParam, kDriftGas);
263 } else if(sopt.Contains("hlt")){
264 SETFLG(fSteerParam, kHLT);
265 if(sopt.Contains("!")) CLRFLG(fSteerParam, kHLT);
267 } else if(sopt.Contains("cos")){
268 SETFLG(fSteerParam, kCosmic);
269 if(sopt.Contains("!")) CLRFLG(fSteerParam, kCosmic);
270 } else if(sopt.Contains("sl")){
271 TObjArray *stl = sopt.Tokenize("_");
272 if(stl->GetEntriesFast() < 3) continue;
273 TString taskstr(((TObjString*)(*stl)[1])->String());
274 TString levelstring(((TObjString*)(*stl)[2])->String());
275 // Set the stream Level
276 Int_t level = levelstring.Atoi();
277 AliTRDReconstructorTask task = kTracker;
278 if(taskstr.CompareTo("cl") == 0) task = kClusterizer;
279 else if(taskstr.CompareTo("tr") == 0) task = kTracker;
280 else if(taskstr.CompareTo("pi") == 0) task = kPID;
281 SetStreamLevel(level, task);
287 //_____________________________________________________________________________
288 void AliTRDReconstructor::SetStreamLevel(Int_t level, AliTRDReconstructorTask task){
290 // Set the Stream Level for one of the tasks Clusterizer, Tracker or PID
295 taskname = "Clusterizer";
298 taskname = "Tracker";
304 //AliInfo(Form("Setting Stream Level for Task %s to %d", taskname.Data(),level));
305 fStreamLevel[(Int_t)task] = level;