1 //Author: Uli Frankenfeld
2 //Author: Anders Strand Vestbo
3 //Last Modified: 13.12.2000
6 #include <TDirectory.h>
7 #include <TClonesArray.h>
8 #include <TStopwatch.h>
11 #include "AliL3Logging.h"
12 #include "AliLevel3.h"
13 #include "AliL3ConfMapper.h"
14 #include "AliL3Vertex.h"
15 #include "AliL3VertexFinder.h"
16 #include "AliL3TrackMerger.h"
17 #include "AliL3GlobalMerger.h"
18 #include "AliL3InterMerger.h"
19 #include "AliL3ConfMapPoint.h"
20 #include "AliL3ConfMapTrack.h"
21 #include "AliL3Transform.h"
22 #include "AliL3ClustFinder.h"
23 #include "AliL3DigitData.h"
24 #include "AliL3TrackArray.h"
25 #include "AliL3MemHandler.h"
27 #include "AliL3FileHandler.h"
29 #include "AliL3Benchmark.h"
31 #include "AliL3DigitData.h"
32 #include "AliL3TrackSegmentData.h"
33 #include "AliL3SpacePointData.h"
34 #include "AliL3VertexData.h"
36 //_______________________________________
40 // Interface class for Level3 tracker.
41 // Tracking is done by calling constructor with input,output
43 // You must always remember to set the tracking parameters. E.g.:
45 // AliLevel3 *level3 = new AliLevel3(inputfile,outputfile);
46 // level3->SetTrackerParam(); //Sets default tracking parameters
47 // level3->ProcessSector(2,2); //Does tracking on sector 2 (actually 2+38)
51 AliLevel3::AliLevel3(){
57 AliLevel3::AliLevel3(Char_t *infile,Char_t *outfile){
58 //Constructor. Calls constructor of the tracker, vertexfinder and merger classes.
60 fOutputFile = new TFile(outfile,"NEW");
62 if(!fOutputFile->IsOpen())
64 LOG(AliL3Log::kWarning, "AliLevel3::AliLevel3","File Open")
65 <<"Delete your old "<<outfile<<" file!"<<ENDLOG;
67 fInputFile = new TFile(infile,"READ");
69 if(!fInputFile->IsOpen())
71 LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
72 <<"Inputfile "<<infile<<" does not exist"<<ENDLOG;
79 AliLevel3::AliLevel3(TFile *in, TFile *out){
83 LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
84 <<"Pointer to InFile 0x0!"<<ENDLOG;
88 LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
89 <<"Pointer to OutFile 0x0!"<<ENDLOG;
93 if(!fOutputFile->IsOpen())
95 LOG(AliL3Log::kWarning,"AliLevel3::AliLevel3","File Open")
96 <<"no output file!"<<ENDLOG;
99 if(!fInputFile->IsOpen())
101 LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
102 <<"Inputfile does not exist"<<ENDLOG;
108 void AliLevel3::Init(){
111 fTransformer = new AliL3Transform();
116 fNPatch = 5; //number of patches change row in process
117 fVertexFinder = new AliL3VertexFinder();
118 fVertex = new AliL3Vertex();
119 fTracker = new AliL3ConfMapper();
120 fTrackMerger = new AliL3TrackMerger(fNPatch);
121 fInterMerger = new AliL3InterMerger();
123 fFileHandler = new AliL3FileHandler();
124 fFileHandler->SetAliInput(fInputFile);
126 fFileHandler = new AliL3MemHandler();
128 fBenchmark = new AliL3Benchmark();
131 void AliLevel3::DoBench(char* name){
132 fBenchmark->Analyze(name);
135 void AliLevel3::DoMc(char* file){
137 if(!fFileHandler->IsDigit())
138 fFileHandler->SetMCOutput(file);
142 AliLevel3::~AliLevel3(){
144 if(fVertexFinder) delete fVertexFinder;
145 if(fVertex) delete fVertex;
146 if(fTracker) delete fTracker;
147 if(fTransformer) delete fTransformer;
148 if(fTrackMerger) delete fTrackMerger;
149 if(fInterMerger) delete fInterMerger;
150 if(fFileHandler) delete fFileHandler;
153 void AliLevel3::SetTrackerParam(Int_t phi_segments, Int_t eta_segments,
154 Int_t trackletlength, Int_t tracklength,
155 Int_t rowscopetracklet, Int_t rowscopetrack,
156 Double_t min_pt_fit, Double_t maxangle,
157 Double_t goodDist, Double_t hitChi2Cut,
158 Double_t goodHitChi2, Double_t trackChi2Cut,
161 //Set parameters input to the tracker
162 //If no arguments are given, default parameters will be used
164 fTracker->SetNSegments(phi_segments,eta_segments);
165 fTracker->MainVertexSettings(trackletlength,tracklength,rowscopetracklet,rowscopetrack);
166 fTracker->SetMaxDca(min_pt_fit);
167 fTracker->SetTrackletCuts(maxangle,goodDist,true);
168 fTracker->SetTrackCuts(hitChi2Cut,goodHitChi2,trackChi2Cut,maxdist);
170 fTracker->SetParamDone(true);
173 void AliLevel3::ProcessEvent(Int_t first,Int_t last){
174 //Do tracking on all slices in region [first,last]
175 //Slices numbering in TPC goes from 0-35, which means that 1 slice
176 //corresponds to inner+outer sector.E.g. slice 2 corresponds to
177 //inner=2 + outer=38.
178 fGlobalMerger= new AliL3GlobalMerger(first,last);
179 for(Int_t i=first; i<=last; i++){
181 fGlobalMerger->SetVertex(fVertex);
182 fGlobalMerger->SetTransformer(fTransformer);
183 fGlobalMerger->InitSlice(i);
184 fGlobalMerger->FillTracks(fNTrackData,fTrackData);
185 fFileHandler->Free(); //free the memory
189 fBenchmark->Start("Global Merger");
190 fGlobalMerger->Merge();
191 // fGlobalMerger->SlowMerge();
192 fBenchmark->Stop("Global Merger");
194 if(fWriteOut) WriteResults();
195 delete fGlobalMerger; fGlobalMerger = 0;
198 void AliLevel3::ProcessSlice(Int_t slice){
200 // Int_t row[5][2] = {{ 0,173}};
201 Int_t row[5][2] = {{ 0, 45},{46,77},{78,109},{110,141},{142,173}};
202 const Int_t maxpoints=100000;
203 const Int_t pointsize = maxpoints * sizeof(AliL3SpacePointData);
204 AliL3MemHandler *memory = new AliL3MemHandler();
206 fTrackMerger->Reset();
207 fTrackMerger->SetTransformer(fTransformer);
208 fTrackMerger->SetRows(row[0]);
209 for(Int_t patch=fNPatch-1;patch>=0;patch--){
210 fFileHandler->Init(slice,patch,row[patch]);
211 fFileHandler->Init(fTransformer);
213 AliL3SpacePointData *points =0;
215 AliL3DigitRowData *digits =0;
219 if(0){ //Binary to Memory
220 fFileHandler->Free();
221 sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
222 fFileHandler->SetBinaryInput(name);
223 digits= (AliL3DigitRowData *)fFileHandler->CompBinary2Memory(ndigits);
224 fFileHandler->CloseBinaryInput();
227 if(1){ //Binary to Memory with Benchmark
228 fFileHandler->Free();
229 sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
230 memory->SetBinaryInput(name);
231 UInt_t compsize=memory->GetFileSize();
232 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
233 memory->CompBinary2CompMemory(ndigits,comp);
234 memory->CloseBinaryInput();
235 UInt_t datasize=memory->GetMemorySize(ndigits,comp);
236 digits=(AliL3DigitRowData *)fFileHandler->Allocate(datasize);
237 fBenchmark->Start("Unpacker");
238 fFileHandler->CompMemory2Memory(ndigits,digits,comp);
239 fBenchmark->Stop("Unpacker");
243 if(0){ //Binary to Memory with Random
244 fFileHandler->Free();
245 fFileHandler->ResetRandom();
246 fFileHandler->SetRandomCluster(100);
247 fFileHandler->SetNGenerate(100);
248 sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
249 memory->SetBinaryInput(name);
250 UInt_t compsize=memory->GetFileSize();
251 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
252 memory->CompBinary2CompMemory(ndigits,comp);
253 memory->CloseBinaryInput();
254 UInt_t dsize=memory->GetMemorySize(ndigits,comp);
255 UInt_t rsize=fFileHandler->GetRandomSize();
256 digits=(AliL3DigitRowData*)fFileHandler->Allocate(dsize+rsize);
257 fBenchmark->Start("Unpacker");
258 fFileHandler->CompMemory2Memory(ndigits,digits,comp);
259 fBenchmark->Stop("Unpacker");
264 else{ //Binary to Memory with Roi
265 fFileHandler->Free();
267 fFileHandler->SetROI(fEta,sli);
268 sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
269 memory->SetBinaryInput(name);
270 UInt_t compsize=memory->GetFileSize();
271 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
272 memory->CompBinary2CompMemory(ndigits,comp);
273 memory->CloseBinaryInput();
274 UInt_t datasize=memory->GetMemorySize(ndigits,comp);
275 digits=(AliL3DigitRowData *)fFileHandler->Allocate(datasize);
276 fBenchmark->Start("Unpacker");
277 datasize = fFileHandler->CompMemory2Memory(ndigits,digits,comp);
278 fBenchmark->Stop("Unpacker");
283 points = (AliL3SpacePointData *) memory->Allocate(pointsize);
285 fClusterFinder = new AliL3ClustFinder(fTransformer);
286 fClusterFinder->InitSlice(slice,patch,row[patch][0],row[patch][1]
288 fClusterFinder->SetXYError(0.1);
289 fClusterFinder->SetZError(0.2);
290 fClusterFinder->SetOutputArray(points);
291 fClusterFinder->Read(ndigits,digits);
292 fBenchmark->Start("Cluster Finder");
293 fClusterFinder->ProcessDigits();
294 fBenchmark->Stop("Cluster Finder");
295 npoints = fClusterFinder->GetNumberOfClusters();
296 delete fClusterFinder;
298 fFileHandler->Free();
300 LOG(AliL3Log::kInformational,"AliLevel3::ProcessSlice","Cluster Finder")
301 <<AliL3Log::kDec<<"Found "<<npoints<<" Points"<<ENDLOG;
306 if(fFileHandler->IsDigit()){
307 sprintf(name,"digits_%d_%d.raw",slice,patch);
309 if(0){ //Ali to Binary
310 fFileHandler->SetBinaryOutput(name);
311 fFileHandler->AliDigits2CompBinary();
312 fFileHandler->CloseBinaryOutput();
315 if(1){ //Ali to Memory
316 digits=(AliL3DigitRowData *)fFileHandler->AliDigits2Memory(ndigits);
317 if(fWriteOut){ //Memory to Binary
318 fFileHandler->SetBinaryOutput(name);
319 fFileHandler->Memory2CompBinary(ndigits,digits);
320 fFileHandler->CloseBinaryOutput();
324 else points = fFileHandler->AliPoints2Memory(npoints);
328 if(patch == fNPatch-1){
333 fBenchmark->Start("Vertex Finder Read");
334 fVertexFinder->Reset();
335 fVertexFinder->Read(npoints,points);
336 fBenchmark->Stop("Vertex Finder Read");
337 fBenchmark->Start("Vertex Finder");
338 fVertexFinder->Analyze();
339 AliL3VertexData vertex[1];
340 fVertexFinder->Write(vertex);
341 fVertex->Read(vertex);
342 fBenchmark->Stop("Vertex Finder");
345 //use 0,0,0 for vertex
348 fTrackMerger->SetVertex(fVertex);
350 fTracker->InitSector(slice,row[patch]);
351 fTracker->SetVertex(fVertex);
352 fBenchmark->Start("Tracker Read Hits");
353 fTracker->ReadHits(npoints,points);
354 fBenchmark->Stop("Tracker Read Hits");
355 fBenchmark->Start("MainVertexTracking A");
356 fTracker->MainVertexTracking_a();
357 fBenchmark->Stop("MainVertexTracking A");
358 fBenchmark->Start("MainVertexTracking B");
359 fTracker->MainVertexTracking_b();
360 fBenchmark->Stop("MainVertexTracking B");
361 fBenchmark->Start("Tracking fit");
362 fTracker->FillTracks();
363 fBenchmark->Stop("Tracking fit");
366 WriteSpacePoints(npoints, points, slice, patch); //do after Tracking
367 fFileHandler->Free();
370 AliL3TrackSegmentData *trackdata0 =
371 (AliL3TrackSegmentData *) memory->Allocate(fTracker->GetTracks());
372 memory->TrackArray2Memory(ntracks0,trackdata0,fTracker->GetTracks());
376 sprintf(name,"tracks_tr_%d_%d.raw",slice,patch);
377 memory->SetBinaryOutput(name);
378 memory->Memory2Binary(ntracks0,trackdata0);
379 memory->CloseBinaryOutput();
382 fInterMerger->Reset();
383 fInterMerger->SetTransformer(fTransformer);
384 fInterMerger->Init(row[patch],patch);
386 fInterMerger->FillTracks(ntracks0,trackdata0);
387 fBenchmark->Start("Inter Merger");
388 fInterMerger->Merge();
389 // fInterMerger->SlowMerge();
391 fBenchmark->Stop("Inter Merger");
393 //write inter merged tracks
395 sprintf(name,"tracks_im_%d_%d.raw",slice,patch);
396 WriteTracks(name,fInterMerger,'i'); //write output of intermerger
401 AliL3TrackSegmentData *trackdata1 =
402 (AliL3TrackSegmentData *) memory->Allocate(fInterMerger->GetInTracks(0));
403 memory->TrackArray2Memory(ntracks1,trackdata1,fInterMerger->GetInTracks(0));
405 fTrackMerger->InitSector(slice,patch);
406 fTrackMerger->FillTracks(ntracks1,trackdata1);
410 fBenchmark->Start("Patch Merger");
411 // fTrackMerger->SlowMerge();
412 fTrackMerger->Merge();
413 fBenchmark->Stop("Patch Merger");
414 //write merged tracks
416 sprintf(name,"tracks_tm_%d.raw",slice);
417 WriteTracks(name,fTrackMerger,'o'); //write output of trackmerger
420 fTrackData = (AliL3TrackSegmentData *)
421 fFileHandler->Allocate(fTrackMerger->GetOutTracks());
423 fFileHandler->TrackArray2Memory(fNTrackData,fTrackData,
424 fTrackMerger->GetOutTracks());
429 void AliLevel3::WriteSpacePoints(UInt_t npoints,AliL3SpacePointData *points,
430 Int_t slice,Int_t patch){
432 sprintf(name,"points_%d_%d.raw",slice,patch);
433 AliL3MemHandler * memory = new AliL3MemHandler();
434 memory->SetBinaryOutput(name);
435 memory->Transform(npoints,points,slice,fTransformer);
436 memory->Memory2Binary(npoints,points);
437 memory->CloseBinaryOutput();
442 Int_t AliLevel3::WriteTracks(char *filename,AliL3Merger *merger,char opt){
443 AliL3MemHandler *memory = new AliL3MemHandler();
444 memory->SetBinaryOutput(filename);
445 if(opt=='a'||opt=='i'){ //add intracks
446 for(Int_t i=0;i<merger->GetNIn();i++){
447 AliL3TrackArray *tr=merger->GetInTracks(i);
448 memory->TrackArray2Binary(tr);
452 if(opt=='o'||opt=='a'){
453 AliL3TrackArray *tr=merger->GetOutTracks();
454 memory->TrackArray2Binary(tr);
457 memory->CloseBinaryOutput();
462 void AliLevel3::WriteResults()
464 //Write the resulting tracks to outputfile
465 WriteTracks("tracks.raw",fGlobalMerger,'a');