]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MUON/AliMUONBusStruct.cxx
Updated list of MUON libraries
[u/mrichter/AliRoot.git] / MUON / AliMUONBusStruct.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
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  **************************************************************************/
15
16 /* $Id$ */
17
18 #include "AliMUONBusStruct.h"
19 #include "AliLog.h"
20 #include <Riostream.h>
21 #include <string.h>
22
23 /// \class AliMUONBusStruct
24 /// Bus patch structure for tracker raw data
25 /// each Dsp contains at most 5 bus patch structure
26 /// Beside the total length and length of the below data
27 /// the header of the block contains the bus patch id, trigger words 
28 /// and data structure itself (11bits for manu id, 6 bits for channel id and
29 /// 12 bits for charge)
30 ///
31 /// \author Christian Finck
32
33 /// \cond CLASSIMP
34 ClassImp(AliMUONBusStruct)
35 /// \endcond
36
37 const Int_t  AliMUONBusStruct::fgkHeaderLength = 4;
38 const UInt_t AliMUONBusStruct::fgkDefaultDataKey = 0xB000000B;
39
40 //___________________________________________
41 AliMUONBusStruct::AliMUONBusStruct()
42   :  TObject(),
43      fDataKey(0),
44      fTotalLength(0),
45      fLength(0),
46      fBusPatchId(0),
47      fBufSize(43*64), 
48   /* assuming 43 manus max per bustpatch.
49   Anyway fData is resized where needed (though it makes it slower) */
50      fData(new UInt_t[fBufSize]),
51      fDspId(0),
52      fBlkId(0)
53 {
54   ///
55   /// ctor
56   /// 
57
58 }
59 //___________________________________________
60 AliMUONBusStruct::~AliMUONBusStruct()
61 {
62   ///
63   /// dtor
64   ///
65   delete[] fData;
66 }
67
68 //___________________________________________
69 void AliMUONBusStruct::SetAlloc(Int_t size)
70 {
71   ///
72   /// Allocate size 
73   /// return if size < fBufSize 
74   ///
75   if (size < fBufSize) 
76     return;
77   else 
78     ResizeData(size);
79 }
80 //___________________________________________
81 void AliMUONBusStruct::AddData(UInt_t data)
82 {
83   /// could have used class from ROOT
84   /// but the structure must be as simple as possible
85   /// to be written on disc blockwise, not so sure ?
86   if (fLength == fBufSize) 
87     ResizeData();
88   fData[fLength++] = data;
89   fTotalLength = fLength + fgkHeaderLength;
90 }
91
92 //___________________________________________
93 void AliMUONBusStruct::ResizeData(Int_t size)
94 {
95   /// In case of resizing the vector
96   /// the most simplest way to do it
97   ///
98   if (size == 0)
99     fBufSize *= 2;
100   else
101     fBufSize = size;
102   UInt_t* newData = new UInt_t[fBufSize];
103   for (Int_t i = 0; i < fLength; i++)
104     newData[i] = fData[i];
105   delete[] fData;
106   fData = newData;
107 }
108 //___________________________________________
109 AliMUONBusStruct::
110 AliMUONBusStruct(const AliMUONBusStruct& event)
111   : TObject(event),
112     fDataKey(event.fDataKey),
113     fTotalLength(event.fTotalLength),
114     fLength(event.fLength),
115     fBusPatchId(event.fBusPatchId),
116     fBufSize(event.fBufSize),
117     fData(new UInt_t[event.fBufSize]),
118     fDspId(event.fDspId),
119     fBlkId(event.fBlkId)
120 {
121   ///
122   /// copy ctor
123   ///
124
125   for (int i = 0; i < event.fBufSize; i++)
126     fData[i] = event.fData[i];
127 }
128 //___________________________________________
129 AliMUONBusStruct&
130 AliMUONBusStruct::operator=(const AliMUONBusStruct& event)
131 {
132   ///
133   /// assignment operator
134   ///
135   if (this == &event) return *this;
136   fDataKey     = event.fDataKey;
137   fTotalLength = event.fTotalLength;
138   fLength      = event.fLength;
139   fBusPatchId  = event.fBusPatchId;
140   fBufSize     = event.fBufSize;
141
142   fBlkId = event.fBlkId;
143   fDspId = event.fDspId;
144
145   delete [] fData;  
146   fData =  new UInt_t[event.fBufSize];
147   for (int i = 0; i < event.fLength; i++)
148     fData[i] = event.fData[i];
149
150   return *this;
151 }
152 //___________________________________________
153 Int_t AliMUONBusStruct::Compare(const TObject *obj) const
154 {
155   /// 
156   /// sort bus patch by bus patch number
157   /// important for AliMUONRawWriter
158   ///
159   AliMUONBusStruct* event = (AliMUONBusStruct*) obj;
160   return (fBusPatchId > event->GetBusPatchId()) ? 1 : -1;
161 }
162
163 //___________________________________________
164 void AliMUONBusStruct::Clear(Option_t *)
165 {
166   /// clear
167   /// delete the allocated memory 
168   ///
169   delete[] fData;
170 }
171 //___________________________________________
172 UInt_t AliMUONBusStruct::GetData(Int_t n) const 
173 {
174   ///
175   /// get data
176   ///
177   if ( n>=0 && n<fLength ) return fData[n];
178
179   AliError("Index outside limits."); 
180   return 0; 
181 }
182
183 //___________________________________________
184 Char_t AliMUONBusStruct::GetParity(Int_t n) const   
185 {
186   ///
187   /// get parity
188   ///
189   if ( n>=0 && n<fLength ) return (Char_t)(fData[n] >> 31) &  0x1;
190
191   AliError("Index outside limits."); 
192   return 0; 
193 }
194
195 //___________________________________________
196 UShort_t AliMUONBusStruct::GetManuId(Int_t n) const     
197 {
198   ///
199   /// get manu Id
200   ///
201   if ( n>=0 && n<fLength ) return (UShort_t)(fData[n] >> 18) &  0x7FF;
202
203   AliError("Index outside limits."); 
204   return 0; 
205 }
206
207 //___________________________________________
208 UChar_t AliMUONBusStruct::GetChannelId(Int_t n) const  
209 {
210   /// 
211   /// get channel Id
212   ///
213   if ( n>=0 && n<fLength ) return (Char_t)(fData[n] >> 12) & 0x3F;
214
215   AliError("Index outside limits."); 
216   return 0; 
217 }
218
219 //___________________________________________
220 UShort_t AliMUONBusStruct::GetCharge(Int_t n) const     
221 {
222   ///
223   /// get charge (in ADC)
224   ///
225   if ( n>=0 && n<fLength ) return (UShort_t)(fData[n] & 0xFFF);
226
227   AliError("Index outside limits."); 
228   return 0; 
229 }
230
231 //___________________________________________
232 void AliMUONBusStruct::Print(Option_t* opt) const
233 {
234   /// print out
235
236   cout << "Bus patch info" << endl;
237   cout << "DataKey: "      << fDataKey << endl;
238   cout << "fTotalLength: " << fTotalLength << endl;
239   cout << "fLength: "      << fLength << endl;
240   cout << "fBusPatchId: "  << fBusPatchId << endl;
241   cout << "fBufSize: "     << fBufSize << endl;
242
243   if (strstr(opt, "all")) {
244   for (Int_t i = 0; i <fLength; ++i)
245       cout << "Data["<< i << "] = " << fData[i] << endl;
246   }
247 }
248
249