1 /**************************************************************************
2 * Copyright(c) 1998-2003, 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 **************************************************************************/
17 Revision 0.01 2004/6/11 A.De Caro, S.B.Sellitto, R.Silvestri
18 First implementation: global methods RawDataTOF
22 // This class contains the methods to create the Raw Data files
23 // for the TOF detector starting from the Digits.
24 // In this preliminary implementation, we defined the structure
25 // of the ALICE-TOF raw data starting from the current format
26 // for the TOF digits and the TOF raw data.
30 #include <Riostream.h>
31 #include <TClonesArray.h>
35 #include "AliTOFGeometry.h"
36 #include "AliTOFdigit.h"
37 #include "AliTOFDDLRawData.h"
38 #include "AliRawDataHeader.h"
39 #include "AliBitPacking.h"
41 ClassImp(AliTOFDDLRawData)
43 //----------------------------------------------------------------------------------------
44 AliTOFDDLRawData::AliTOFDDLRawData()
51 //----------------------------------------------------------------------------------------
53 AliTOFDDLRawData::AliTOFDDLRawData(const AliTOFDDLRawData &source) :
56 this->fIndex=source.fIndex;
57 this->fVerbose=source.fVerbose;
61 //---------------------------------------------------------------------------------------
63 AliTOFDDLRawData& AliTOFDDLRawData::operator=(const AliTOFDDLRawData &source){
65 this->fIndex=source.fIndex;
66 this->fVerbose=source.fVerbose;
70 //---------------------------------------------------------------------------------------
72 void AliTOFDDLRawData::GetDigits(TClonesArray *TOFdigits,Int_t nDDL,UInt_t *buf)
74 //This method packs the TOF digits in a proper 32 bits structure
75 Int_t iDDL=(Int_t)((nDDL/4.-(Int_t)(nDDL/4.))*4);
76 Int_t iSector=(Int_t)(nDDL/4.);
91 Int_t ndigits = TOFdigits->GetEntries();
96 Error("GetDigits", "No found TOF digits\n");
100 if (fVerbose==2) ftxt.open("TOFdigits.txt",ios::app);
101 for (Int_t digit=0;digit<ndigits;digit++) {
102 digs = (AliTOFdigit*)TOFdigits->UncheckedAt(digit);
103 sector=digs->GetSector(); // Sector Number (0-17)
104 plate=digs->GetPlate(); // Plate Number (0-4)
105 strip=digs->GetStrip(); // Strip Number (0-14/18/19)
106 padx=digs->GetPadx(); // Pad Number in x direction (0-47)
107 padz=digs->GetPadz(); // Pad Number in z direction (0-1)
108 eureka=digs->GetTotPad(); // Global Pad Number inside a Sector
109 totCharge = (Int_t)digs->GetAdc();
110 timeOfFlight = (Int_t)digs->GetTdc();
118 istriPlate = AliTOFGeometry::NStripC();
121 istriPlate = AliTOFGeometry::NStripC()+AliTOFGeometry::NStripB();
124 istriPlate = AliTOFGeometry::NStripC()+AliTOFGeometry::NStripB()+AliTOFGeometry::NStripA();
127 istriPlate = AliTOFGeometry::NStripC()+2*AliTOFGeometry::NStripB()+AliTOFGeometry::NStripA();
131 eureka=2*padx+padz+AliTOFGeometry::NpadXStrip()*(strip+istriPlate);
133 if (eureka!=digs->GetTotPad()) printf(" eureka = %d AND digs->GetTotPad() = %d",eureka,digs->GetTotPad());
135 if (sector!=iSector || (Int_t)((Float_t)eureka/AliTOF::NPadXTRM()/AliTOF::NTRM())!=iDDL) continue;
137 if (fVerbose==2) ftxt <<" Sector: "<<sector<<" plate: "<<plate<<" strip "<<strip<<" padx "<<padx<<" padz "<<padz<<" eureka "<<eureka<<endl;
139 iTRM = (Int_t)((Float_t)eureka/AliTOF::NPadXTRM() - AliTOF::NTRM()*iDDL);
141 iTDC = (Int_t)(AliTOF::NTdc()*
143 (Float_t)eureka/AliTOF::NPadXTRM() -
144 (Int_t)((Float_t)eureka/AliTOF::NPadXTRM())
148 iCH = (Int_t)(AliTOF::NCh() *
150 (Float_t)eureka/AliTOF::NPadXTRM()*AliTOF::NTdc() - (Int_t)((Float_t)eureka/AliTOF::NPadXTRM()*AliTOF::NTdc()) -
151 (Int_t)((Float_t)eureka/AliTOF::NPadXTRM()*AliTOF::NTdc() - (Int_t)((Float_t)eureka/AliTOF::NPadXTRM()*AliTOF::NTdc()))
155 if (fVerbose==2) ftxt << "DDL: "<<iDDL<<" Sector: "<<sector<<" TRM: "<<iTRM<<" TDC: "<<iTDC<<" Channel: "<<iCH<<" totCharge: "<<totCharge<<" tof: "<<timeOfFlight<<endl;
160 AliBitPacking::PackWord(word,baseWord, 0, 3); // TRM ID
162 AliBitPacking::PackWord(word,baseWord, 4, 8); // TDC ID
164 AliBitPacking::PackWord(word,baseWord, 9,11); // CH ID
167 if (totCharge<0) word=TMath::Abs(totCharge);
169 AliBitPacking::PackWord(word,baseWord,12,31); // Charge (TOT)
172 buf[fIndex]=baseWord;
177 AliBitPacking::PackWord(word,baseWord,0, 7); // Error flag
179 AliBitPacking::PackWord(word,baseWord,8,31); // time-of-flight
182 buf[fIndex]=baseWord;
188 if (fVerbose==2) ftxt.close();
194 //---------------------------------------------------------------------------------------
196 Int_t AliTOFDDLRawData::RawDataTOF(TBranch* branch){
197 //This method creates the Raw data files for TOF detector
198 const Int_t kSize=5000; //2*AliTOFGeometry::NpadXSector()
199 //max number of digits per DDL file times 2
206 TClonesArray*& digits = * (TClonesArray**) branch->GetAddress();
208 ofstream outfile; // logical name of the output file
209 AliRawDataHeader header;
211 //loop over TOF DDL files
212 for(Int_t i=0;i<72;i++){
213 sprintf(fileName,"TOF_%d.ddl",i+kDDLOffset); //The name of the output file
215 outfile.open(fileName,ios::binary);
217 outfile.open(fileName);
219 //write Dummy DATA HEADER
220 UInt_t dataHeaderPosition=outfile.tellp();
221 outfile.write((char*)(&header),sizeof(header));
225 AliBitPacking::PackWord(word,baseWord,0, 31); // Number of DDL file
228 buf[fIndex]=baseWord;
232 //For each DDL file, buf contains the array of data words in Binary format
233 //fIndex gives the number of 32 bits words in the buffer for each DDL file
234 GetDigits(digits,i,buf);
235 outfile.write((char *)buf,((fIndex+1)*sizeof(UInt_t)));
237 for(Int_t ii=0;ii<(fIndex+1);ii++) buf[ii]=0;
240 //Write REAL DATA HEADER
241 UInt_t currentFilePosition=outfile.tellp();
242 outfile.seekp(dataHeaderPosition);
243 header.fSize=currentFilePosition-dataHeaderPosition;
244 header.SetAttribute(0); // valid data
245 outfile.write((char*)(&header),sizeof(header));
253 //-----------------------------------------------------------------------------------------
255 void AliTOFDDLRawData::WriteChipHeader(Int_t ChipAddr,Int_t EventCnt,UInt_t &BaseWord)
257 //This method writes a chip header
259 PackWord(BaseWord,ChipAddr,0,3);
260 PackWord(BaseWord,EventCnt,4,10);
261 PackWord(BaseWord,0x7,11,13);
262 PackWord(BaseWord,0x1,14,15);
264 }//end WriteChipHeader
266 //----------------------------------------------------------------------------------------
268 void AliTOFDDLRawData::ReadChipHeader(Int_t &ChipAddr,Int_t &EventCnt,UInt_t BaseWord)
270 //This method reads a chip header
272 UnpackWord(BaseWord,0,3,temp);
273 ChipAddr=(Int_t)temp;
274 UnpackWord(BaseWord,4,10,temp);
275 EventCnt=(Int_t)temp;
277 Info("ReadChipHeader", "Chip:&d Half Stave module:%d",ChipAddr,EventCnt);
279 }//end ReadChipHeader
281 //----------------------------------------------------------------------------------------
283 void AliTOFDDLRawData::WriteChipTrailer(UInt_t *buf,Int_t ChipHitCount,UInt_t &BaseWord)
285 //This method writes a chip trailer
287 if((ChipHitCount%2)!=0){
288 PackWord(BaseWord,0xFEDC,0,15);
290 PackWord(BaseWord,ChipHitCount,16,28);
291 PackWord(BaseWord,0x0,30,31);
293 buf[fIndex]=BaseWord;
296 }//end WriteChipTrailer
298 //------------------------------------------------------------------------------------------
300 void AliTOFDDLRawData::ReadChipTrailer(Int_t &ChipHitCount,UInt_t BaseWord)
302 //This method reads a chip trailer
304 UnpackWord(BaseWord,16,28,temp);
305 ChipHitCount=(Int_t)temp;
307 }//end ReadChipTrailer
309 //------------------------------------------------------------------------------------------