]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TOF/AliTOFDDLRawData.cxx
Set of Sim AlignObj for TOF
[u/mrichter/AliRoot.git] / TOF / AliTOFDDLRawData.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-2003, 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 /*
17 Revision 0.02  2005/7/25 A.De Caro
18         Update number of bits allocated for time-of-flight
19                and 'charge' measurements
20
21 Revision 0.01  2004/6/11 A.De Caro, S.B.Sellitto, R.Silvestri
22         First implementation: global methods RawDataTOF
23                                              GetDigits
24 */
25
26 //////////////////////////////////////////////////////////////////
27 //
28 // This class contains the methods to create the Raw Data files
29 // for the TOF detector starting from the Digits.
30 // In this preliminary implementation, we defined the structure
31 // of the ALICE-TOF raw data starting from the current format
32 // for the TOF digits and the TOF raw data.
33 //
34 //////////////////////////////////////////////////////////////////
35
36 #include <stdlib.h>
37 #include <Riostream.h>
38 #include <TClonesArray.h>
39 #include <TTree.h>
40 #include <TMath.h>
41 #include "AliLog.h"
42
43 #include "AliRawDataHeader.h"
44 #include "AliBitPacking.h"
45
46 #include "AliTOFGeometry.h"
47 #include "AliTOFGeometryV4.h"
48 #include "AliTOFGeometryV5.h"
49 #include "AliTOFdigit.h"
50 #include "AliTOFRawStream.h"
51 #include "AliTOFDDLRawData.h"
52
53 ClassImp(AliTOFDDLRawData)
54
55 //----------------------------------------------------------------------------------------
56 AliTOFDDLRawData::AliTOFDDLRawData()
57 {
58   //Default constructor
59   fIndex=-1;
60   fVerbose=0;
61   fTOFgeometry = 0;
62 }
63
64 //----------------------------------------------------------------------------------------
65 AliTOFDDLRawData::AliTOFDDLRawData(AliTOFGeometry *tofGeom)
66 {
67   //Constructor
68   fIndex=-1;
69   fVerbose=0;
70   fTOFgeometry = tofGeom;
71 }
72
73 //----------------------------------------------------------------------------------------
74
75 AliTOFDDLRawData::AliTOFDDLRawData(const AliTOFDDLRawData &source) : 
76     TObject(source){
77   //Copy Constructor
78   this->fIndex=source.fIndex;
79   this->fVerbose=source.fVerbose;
80   this->fTOFgeometry=source.fTOFgeometry;
81   return;
82 }
83
84 //---------------------------------------------------------------------------------------
85
86 AliTOFDDLRawData& AliTOFDDLRawData::operator=(const AliTOFDDLRawData &source){
87   //Assigment operator
88   this->fIndex=source.fIndex;
89   this->fVerbose=source.fVerbose;
90   this->fTOFgeometry=source.fTOFgeometry;
91   return *this;
92 }
93
94 //---------------------------------------------------------------------------------------
95
96 void AliTOFDDLRawData::GetDigits(TClonesArray *TOFdigits,Int_t nDDL,UInt_t *buf)
97 {
98
99   //This method packs the TOF digits in a proper 32 bits structure
100
101   Int_t iDDL    = nDDL%AliTOFGeometry::NDDL();
102   Int_t iSector = (Int_t)((Float_t)nDDL/AliTOFGeometry::NDDL());
103   Int_t iTRM = 0;
104   Int_t iTDC = 0;
105   Int_t iCH  =-1;
106   Int_t sector; 
107   Int_t plate;
108   Int_t strip;
109   Int_t padx;
110   Int_t padz;
111   Int_t totCharge;
112   Int_t timeOfFlight;
113   Int_t error=0;
114   Int_t eureka;
115   UInt_t word;
116   UInt_t baseWord;
117   Int_t ndigits = TOFdigits->GetEntries();
118   AliTOFdigit *digs;
119   ofstream ftxt;
120   if(!ndigits) 
121     {
122       AliError("No found TOF digits");
123       return;
124     }
125
126   if (fVerbose==2) ftxt.open("TOFdigits.txt",ios::app);
127
128   for (Int_t digit=0;digit<ndigits;digit++) {
129     digs = (AliTOFdigit*)TOFdigits->UncheckedAt(digit);
130     sector = digs->GetSector(); // Sector Number (0-17)
131     plate  = digs->GetPlate();  // Plate Number (0-4)
132     strip  = digs->GetStrip();  // Strip Number (0-14/18/19)
133     padx   = digs->GetPadx();   // Pad Number in x direction (0-47)
134     padz   = digs->GetPadz();   // Pad Number in z direction (0-1)
135     eureka = digs->GetTotPad(fTOFgeometry); // Global Pad Number inside a Sector
136     totCharge = (Int_t)digs->GetAdc();
137     timeOfFlight = (Int_t)digs->GetTdc();
138
139     if (sector!=iSector || (Int_t)((Float_t)eureka/AliTOFGeometry::NPadXTRM()/AliTOFGeometry::NTRM())!=iDDL) continue;
140     
141     if (fVerbose==2) ftxt << " Sector: " << sector << " Plate: " << plate << " Strip: " << strip << " PadZ: " << padz << " PadX: " << padx << " totPadNumber " << eureka << endl;
142     
143     iTRM = (Int_t)((Float_t)eureka/AliTOFGeometry::NPadXTRM()) - iDDL*AliTOFGeometry::NTRM();
144
145     
146     iTDC = (Int_t)((Float_t)eureka/AliTOFGeometry::NCh()) - (iDDL*AliTOFGeometry::NTRM() + iTRM) * AliTOFGeometry::NTdc();
147     /*
148     iTDC = (Int_t)(AliTOFGeometry::NTdc()* 
149                    (
150                     (Float_t)eureka/AliTOFGeometry::NPadXTRM() -
151                     (Int_t)((Float_t)eureka/AliTOFGeometry::NPadXTRM())
152                     )
153                    );
154     */
155
156     iCH  = eureka - ((iDDL*AliTOFGeometry::NTRM() + iTRM) * AliTOFGeometry::NTdc() + iTDC) * AliTOFGeometry::NCh();
157     /*
158     iCH  = (Int_t)(AliTOFGeometry::NCh() * 
159                    (
160                     (Float_t)eureka/AliTOFGeometry::NPadXTRM()*AliTOFGeometry::NTdc() - (Int_t)((Float_t)eureka/AliTOFGeometry::NPadXTRM()*AliTOFGeometry::NTdc()) -
161                     (Int_t)((Float_t)eureka/AliTOFGeometry::NPadXTRM()*AliTOFGeometry::NTdc() - (Int_t)((Float_t)eureka/AliTOFGeometry::NPadXTRM()*AliTOFGeometry::NTdc()))
162                     )
163                    );
164     */
165
166     if (fVerbose==2) ftxt << "DDL: "<<nDDL<<" TRM: "<<iTRM<<" TDC: "<<iTDC<<" Channel: "<<iCH<<" totCharge: "<<totCharge<<" tof: "<<timeOfFlight<<endl;
167
168     AliDebug(2,Form("%2i %2i %2i %2i   %2i %2i %2i %2i %2i %7i %8i",nDDL,iTRM,iTDC,iCH,sector,plate,strip,padz,padx,totCharge,timeOfFlight));
169     
170     baseWord=0;
171     
172     word=iTRM;
173     AliBitPacking::PackWord(word,baseWord, 0, 3); // TRM ID
174     word=iTDC;
175     AliBitPacking::PackWord(word,baseWord, 4, 8); // TDC ID
176     word=iCH;
177     AliBitPacking::PackWord(word,baseWord, 9,11); // CH ID
178
179     // temporary control
180     if (totCharge<0) word=TMath::Abs(totCharge);
181     else word=totCharge;
182     AliBitPacking::PackWord(word,baseWord,12,31); // Charge (TOT) // v0.01
183     //AliBitPacking::PackWord(word,baseWord,12,19); // Charge (TOT) // v0.02
184     //AliBitPacking::PackWord(0,baseWord,20,31); // v0.02
185
186     fIndex++;
187     buf[fIndex]=baseWord;
188     
189     baseWord=0;
190     
191     word=error;
192     AliBitPacking::PackWord(word,baseWord,0, 7); // Error flag
193     word=timeOfFlight;
194     AliBitPacking::PackWord(word,baseWord,8,31); // time-of-flight // v0.01
195     //AliBitPacking::PackWord(word,baseWord,8,19); // time-of-flight // v0.02
196     //AliBitPacking::PackWord(0,baseWord,20,30); // v0.02
197     //AliBitPacking::PackWord(1,baseWord,31,31); // v0.02
198     
199     fIndex++;
200     buf[fIndex]=baseWord;
201     word=0;
202     baseWord=0;
203     
204   }//end for
205   
206   if (fVerbose==2) ftxt.close();
207
208   return;
209
210 }//end GetDigits
211
212 //---------------------------------------------------------------------------------------
213
214 Int_t AliTOFDDLRawData::RawDataTOF(TBranch* branch){
215   //
216   // This method creates the Raw data files for TOF detector
217   //
218
219   const Int_t kSize = 5000; //max number of digits per DDL file times 2
220
221   UInt_t buf[kSize];
222   //UInt_t baseWord; // v0.01
223   //UInt_t word; // v0.01
224
225   fIndex=-1;
226
227   TClonesArray*& digits = * (TClonesArray**) branch->GetAddress();
228   char fileName[15];
229   ofstream outfile;         // logical name of the output file 
230   AliRawDataHeader header;
231   UInt_t sizeRawData = 0;
232
233   //loop over TOF DDL files
234   for(Int_t i = 0; i<AliTOFGeometry::NDDL()*AliTOFGeometry::NSectors(); i++){
235
236     sprintf(fileName,"TOF_%d.ddl",i+AliTOFRawStream::kDDLOffset); //The name of the output file
237 #ifndef __DECCXX
238     outfile.open(fileName,ios::binary);
239 #else
240     outfile.open(fileName);
241 #endif
242
243     //write Dummy DATA HEADER
244     UInt_t dataHeaderPosition=outfile.tellp();
245     outfile.write((char*)(&header),sizeof(header));
246
247     /*
248     // v0.01
249     baseWord=0;
250     word=i;
251     //AliBitPacking::PackWord(word,baseWord,0, 31); // Number of DDL file
252     AliBitPacking::PackWord(word,baseWord,0, 6); // Number of DDL file
253     AliBitPacking::PackWord(0,baseWord,7,31);
254
255     fIndex++;
256     buf[fIndex]=baseWord;
257     */
258
259     branch->GetEvent();
260
261     //For each DDL file, buf contains the array of data words in Binary format
262     //fIndex gives the number of 32 bits words in the buffer for each DDL file
263     GetDigits(digits,i,buf);
264     outfile.write((char *)buf,((fIndex+1)*sizeof(UInt_t)));
265
266     for(Int_t ii=0;ii<(fIndex+1);ii++) buf[ii]=0;
267     fIndex=-1;
268     
269     //Write REAL DATA HEADER
270     UInt_t currentFilePosition=outfile.tellp();
271     sizeRawData = currentFilePosition - dataHeaderPosition - sizeof(header);
272     header.fSize=currentFilePosition-dataHeaderPosition;
273     header.SetAttribute(0);  // valid data
274     outfile.seekp(dataHeaderPosition);
275     outfile.write((char*)(&header),sizeof(header));
276     outfile.seekp(currentFilePosition);
277
278     outfile.close();
279
280   }//end for
281   
282   return 0;  
283 }
284
285 //---------------------------------------------------------------------------