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 Revision 1.6 2002/01/21 17:15:23 kowal2
21 Revision 1.5 2001/11/24 16:10:22 kowal2
24 Revision 1.4 2000/10/05 16:01:49 kowal2
25 Corrected for memory leaks.
27 Revision 1.3 2000/06/30 12:07:49 kowal2
28 Updated from the TPC-PreRelease branch
30 Revision 1.2.4.3 2000/06/26 07:39:42 kowal2
31 Changes to obey the coding rules
33 Revision 1.2.4.2 2000/06/25 08:38:41 kowal2
34 Splitted from AliTPCtracking
36 Revision 1.2.4.1 2000/06/14 16:45:13 kowal2
37 Improved algorithms. Compiler warnings removed.
39 Revision 1.2 2000/04/17 09:37:33 kowal2
40 removed obsolete AliTPCDigitsDisplay.C
42 Revision 1.1.4.2 2000/04/10 11:37:42 kowal2
44 Digits handling in a new data structure
50 ///////////////////////////////////////////////////////////////////////////////
52 // Alice segment manager object //
54 // AliSimDigits object (derived from AliDigits) //
55 // provide additional track information to digit //
57 // Origin: Marian Ivanov GSI Darmstadt //
61 ///////////////////////////////////////////////////////////////////////////////
64 #include <Riostream.h>
66 #include "AliSegmentID.h"
68 #include "AliArrayI.h"
69 #include "AliArrayS.h"
70 #include "AliDigits.h"
71 #include "AliSimDigits.h"
73 #include <TClonesArray.h>
77 //_____________________________________________________________________________
78 //_____________________________________________________________________________
79 //_____________________________________________________________________________
80 ClassImp(AliSimDigits)
82 AliSimDigits::AliSimDigits()
84 // AliDigits::Invalite();
89 AliSimDigits::~AliSimDigits()
101 void AliSimDigits::InvalidateTrack()
104 //set default (invalid parameters)
105 if ( fTracks != 0) delete fTracks;
106 fTracks = new AliArrayI;
107 if ( fTrIndex != 0) delete fTrIndex;
108 fTrIndex = new AliArrayI;
110 for (Int_t i = 0; i<3; i++){
116 void AliSimDigits::AllocateTrack(Int_t length)
119 //construct empty buffer fElements and fTracks with size fNrows x fNcols x
123 fTracks->Set(fNcols*fNrows*fNlevel);
128 Int_t AliSimDigits::GetTrackID(Int_t row, Int_t column, Int_t level)
132 if (fTrBufType == 0) return GetTrackIDFast(row, column,level);
133 if (fTrBufType == 1) return GetTrackID1(row, column,level);
134 if (fTrBufType == 2) return GetTrackID2(row, column,level);
138 void AliSimDigits::ExpandTrackBuffer()
141 //expand buffer to two dimensional array
143 Error("ExpandBuffer", "buffer doesn't exist");
146 if (fTrBufType==0) return; //buffer expanded
147 if (fTrBufType==1) {ExpandTrackBuffer1(); return;}
148 if (fTrBufType==2) ExpandTrackBuffer2();
152 void AliSimDigits::CompresTrackBuffer(Int_t bufType)
155 //compres buffer according buffertype algorithm
158 Error("CompressBuffer", "buffer doesn't exist");
161 if (fTrBufType == bufType) return;
163 if (fTrBufType>0) ExpandTrackBuffer();
164 if (fTrBufType !=0) {
165 Error("CompressBuffer", "buffer doesn't exist");
168 //compress buffer of type 1
170 if (bufType==1) {CompresTrackBuffer1();return;}
171 if (bufType==2) CompresTrackBuffer2();
175 Int_t AliSimDigits::GetTrackID1(Int_t row, Int_t column, Int_t level)
177 //return track ID of digits - for buffer compresion 2
179 i = level*fNcols+column;
180 if ( (i+1)>=fTrIndex->fN) n2 = fTracks->fN;
182 n2 = fTrIndex->At(i+1);
183 n1 = fTrIndex->At(i);
187 for (i = n1;(i<n2);i++){
189 Int_t num = fTracks->At(i);
195 num = fTracks->At(i);
208 if ( (row>=rowold) && (row<=rownew) ) return id;
209 if (row < rownew ) return -2; //empty track
214 void AliSimDigits::ExpandTrackBuffer1()
217 //expand track compressed according algorithm 1 (track id comression independent to the digit compression)
218 // !!in expanded tracks we don't use fTrIndex array
222 Int_t all = fNrows*fNcols; //total number of digits
223 Int_t elems = all*fNlevel; //length of the buffer
225 AliArrayI * buf = new AliArrayI;
235 //oposite signa means how many unwrited (under threshold) values
236 Int_t num = fTracks->At(i);
237 if (num<0) row-=num; //negative number mean number of zeroes (no tracks of gibven level no need to write to array)
240 Int_t id = fTracks->At(i);
241 for (j = 0; j<num; j++,row++) (*buf)[level*all+col*fNrows+row]=id;
251 }//end of loop over digits
256 void AliSimDigits::CompresTrackBuffer1()
259 //comress track according algorithm 1 (track id comression independent to the digit compression)
263 AliArrayI * buf = new AliArrayI; //create new buffer
264 buf->Set(fNrows*fNcols*fNlevel); //lets have the nearly the "worst case"
265 AliArrayI * index = new AliArrayI;
266 index->Set(fNcols*fNlevel);
270 Int_t icurrent=-1; //current index
271 Int_t izero; //number of zero
272 Int_t inum; //number of digits with the same current track id
273 Int_t lastID =0; //last track id
275 Int_t *cbuff=fTracks->GetArray(); //MI change
277 for (Int_t lev =0; lev<fNlevel; lev++){ //loop over levels
278 for (Int_t col = 0; col<fNcols; col++){ //loop over columns
282 (*index)[lev*fNcols+col]=icurrent+1;//set collumn pointer
283 Int_t id=0; //current id
284 for (Int_t row = 0; row< fNrows;row++){ //loop over rows
285 id = *cbuff; //MI change
286 // id = GetTrackIDFast(row,col,lev);
288 if ( inum> 0 ) { //if we have some tracks in buffer
290 if ((icurrent+1)>=buf->fN) buf->Expand(icurrent*2+1); //MI change - allocate +1
291 (*buf)[icurrent] = inum;
293 (*buf)[icurrent] = lastID;
302 //if we have currently izero count of non tracks digits
304 if (icurrent>=buf->fN) buf->Expand(icurrent*2+1);
305 (*buf)[icurrent]= -izero; //write how many under zero
311 //if we change track id from another track id
313 if ((icurrent+1)>=buf->fN) buf->Expand(icurrent*2+1);
314 (*buf)[icurrent] = inum;
316 (*buf)[icurrent] = lastID;
325 }//end of loop over row
327 //if we have currently izero count of non tracks digits
329 if (icurrent>=buf->fN) buf->Expand(icurrent*2);
330 (*buf)[icurrent]= -izero; //write how many under zero
332 if ( inum> 0 ) { //if we have some tracks in buffer
334 if ((icurrent+1)>=buf->fN) buf->Expand(icurrent*2);
335 (*buf)[icurrent] = inum;
337 (*buf)[icurrent] = id;
339 }//end of loop over columns
340 }//end of loop over differnet track level
341 buf->Expand(icurrent+1);
350 void AliSimDigits::ExpandTrackBuffer2()
353 //comress track according algorithm 2 (track id comression according digit compression)
357 void AliSimDigits::CompresTrackBuffer2()
360 //comress track according algorithm 2 (track id comression according digit compression)
365 Int_t AliSimDigits::GetTrackID2(Int_t row, Int_t column, Int_t level)
367 //returnb track id of digits - for buffer compresion 2
373 AliH2F * AliSimDigits::DrawTracks( const char *option,Int_t level,
374 Float_t x1, Float_t x2, Float_t y1, Float_t y2)
377 //draw digits in given array
381 sprintf(ch,"Track Segment_%d level %d ",GetID(),level );
382 if ( (fNrows<1)|| (fNcols<1)) {
385 AliH2F * his = new AliH2F("Track histo",ch,fNrows,0,fNrows,fNcols,0,fNcols);
387 //set histogram values
388 for (Int_t i = 0; i<fNrows;i++)
389 for (Int_t j = 0; j<fNcols;j++)
390 his->Fill(i,j,GetTrackIDFast(i,j,level));
392 AliH2F *h2fsub = his->GetSubrange2d(x1,x2,y1,y2);
396 if (his==0) return 0;
397 if (option!=0) his->Draw(option);
402 TClonesArray * AliSimDigits::GenerTPCClonesArray(TClonesArray * arr)
405 //generate TClonnesArray of digits
407 TClonesArray * digits;
408 if (arr==0) digits=new TClonesArray("AliTPCdigit",300);
410 Int_t index = digits->GetEntriesFast();
411 for (Int_t row =0; row<fNrows; row++)
412 for (Int_t col =0; col<fNcols; col++){
413 Int_t amp = GetDigit(row,col);
414 if (amp>GetThreshold()){
419 dig.fPadRow =fSegmentID;
420 dig.fSector =fSegmentID;
421 dig.fTracks[0]= GetTrackID(row,col,0);
422 dig.fTracks[1]= GetTrackID(row,col,1);
423 dig.fTracks[2]= GetTrackID(row,col,2);
424 TClonesArray &ldigits = *digits;
425 new(ldigits[index++]) AliTPCdigit(dig);