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.02 2005/7/25 A.De Caro
18 Update number of bits allocated for time-of-flight
19 and 'charge' measurements
21 Revision 0.01 2004/6/11 A.De Caro, S.B.Sellitto, R.Silvestri
22 First implementation: global methods RawDataTOF
26 //////////////////////////////////////////////////////////////////
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.
34 //////////////////////////////////////////////////////////////////
36 #include "Riostream.h"
39 #include "TClonesArray.h"
42 #include "AliBitPacking.h"
44 #include "AliRawDataHeader.h"
46 #include "AliTOFDDLRawData.h"
47 #include "AliTOFdigit.h"
48 #include "AliTOFGeometry.h"
49 #include "AliTOFRawStream.h"
51 ClassImp(AliTOFDDLRawData)
53 //----------------------------------------------------------------------------------------
54 AliTOFDDLRawData::AliTOFDDLRawData()
62 //----------------------------------------------------------------------------------------
63 AliTOFDDLRawData::AliTOFDDLRawData(AliTOFGeometry *tofGeom)
68 fTOFgeometry = tofGeom;
71 //----------------------------------------------------------------------------------------
73 AliTOFDDLRawData::AliTOFDDLRawData(const AliTOFDDLRawData &source) :
76 this->fIndex=source.fIndex;
77 this->fVerbose=source.fVerbose;
78 this->fTOFgeometry=source.fTOFgeometry;
82 //---------------------------------------------------------------------------------------
84 AliTOFDDLRawData& AliTOFDDLRawData::operator=(const AliTOFDDLRawData &source){
86 this->fIndex=source.fIndex;
87 this->fVerbose=source.fVerbose;
88 this->fTOFgeometry=source.fTOFgeometry;
92 //---------------------------------------------------------------------------------------
94 void AliTOFDDLRawData::GetDigits(TClonesArray *TOFdigits,Int_t nDDL,UInt_t *buf)
97 //This method packs the TOF digits in a proper 32 bits structure
99 Int_t iDDL = nDDL%AliTOFGeometry::NDDL();
100 Int_t iSector = (Int_t)((Float_t)nDDL/AliTOFGeometry::NDDL());
115 Int_t ndigits = TOFdigits->GetEntries();
120 AliError("No found TOF digits");
124 if (fVerbose==2) ftxt.open("TOFdigits.txt",ios::app);
126 for (Int_t digit=0;digit<ndigits;digit++) {
127 digs = (AliTOFdigit*)TOFdigits->UncheckedAt(digit);
128 sector = digs->GetSector(); // Sector Number (0-17)
129 plate = digs->GetPlate(); // Plate Number (0-4)
130 strip = digs->GetStrip(); // Strip Number (0-14/18/19)
131 padx = digs->GetPadx(); // Pad Number in x direction (0-47)
132 padz = digs->GetPadz(); // Pad Number in z direction (0-1)
133 eureka = digs->GetTotPad(fTOFgeometry); // Global Pad Number inside a Sector
134 // totCharge = (Int_t)digs->GetAdc(); //Use realistic ToT, for Standard production with no miscalibration/Slewing it == fAdC in digit (see AliTOFDigitizer)
135 totCharge = (Int_t)digs->GetToT();
136 timeOfFlight = (Int_t)digs->GetTdc();
138 if (sector!=iSector || (Int_t)((Float_t)eureka/AliTOFGeometry::NPadXTRM()/AliTOFGeometry::NTRM())!=iDDL) continue;
140 if (fVerbose==2) ftxt << " Sector: " << sector << " Plate: " << plate << " Strip: " << strip << " PadZ: " << padz << " PadX: " << padx << " totPadNumber " << eureka << endl;
142 iTRM = (Int_t)((Float_t)eureka/AliTOFGeometry::NPadXTRM()) - iDDL*AliTOFGeometry::NTRM();
145 iTDC = (Int_t)((Float_t)eureka/AliTOFGeometry::NCh()) - (iDDL*AliTOFGeometry::NTRM() + iTRM) * AliTOFGeometry::NTdc();
147 iTDC = (Int_t)(AliTOFGeometry::NTdc()*
149 (Float_t)eureka/AliTOFGeometry::NPadXTRM() -
150 (Int_t)((Float_t)eureka/AliTOFGeometry::NPadXTRM())
155 iCH = eureka - ((iDDL*AliTOFGeometry::NTRM() + iTRM) * AliTOFGeometry::NTdc() + iTDC) * AliTOFGeometry::NCh();
157 iCH = (Int_t)(AliTOFGeometry::NCh() *
159 (Float_t)eureka/AliTOFGeometry::NPadXTRM()*AliTOFGeometry::NTdc() - (Int_t)((Float_t)eureka/AliTOFGeometry::NPadXTRM()*AliTOFGeometry::NTdc()) -
160 (Int_t)((Float_t)eureka/AliTOFGeometry::NPadXTRM()*AliTOFGeometry::NTdc() - (Int_t)((Float_t)eureka/AliTOFGeometry::NPadXTRM()*AliTOFGeometry::NTdc()))
165 if (fVerbose==2) ftxt << "DDL: "<<nDDL<<" TRM: "<<iTRM<<" TDC: "<<iTDC<<" Channel: "<<iCH<<" totCharge: "<<totCharge<<" tof: "<<timeOfFlight<<endl;
167 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));
172 AliBitPacking::PackWord(word,baseWord, 0, 3); // TRM ID
174 AliBitPacking::PackWord(word,baseWord, 4, 8); // TDC ID
176 AliBitPacking::PackWord(word,baseWord, 9,11); // CH ID
179 if (totCharge<0) word=TMath::Abs(totCharge);
181 AliBitPacking::PackWord(word,baseWord,12,31); // Charge (TOT) // v0.01
182 //AliBitPacking::PackWord(word,baseWord,12,19); // Charge (TOT) // v0.02
183 //AliBitPacking::PackWord(0,baseWord,20,31); // v0.02
186 buf[fIndex]=baseWord;
191 AliBitPacking::PackWord(word,baseWord,0, 7); // Error flag
193 AliBitPacking::PackWord(word,baseWord,8,31); // time-of-flight // v0.01
194 //AliBitPacking::PackWord(word,baseWord,8,19); // time-of-flight // v0.02
195 //AliBitPacking::PackWord(0,baseWord,20,30); // v0.02
196 //AliBitPacking::PackWord(1,baseWord,31,31); // v0.02
199 buf[fIndex]=baseWord;
205 if (fVerbose==2) ftxt.close();
211 //---------------------------------------------------------------------------------------
213 Int_t AliTOFDDLRawData::RawDataTOF(TBranch* branch){
215 // This method creates the Raw data files for TOF detector
218 const Int_t kSize = 5000; //max number of digits per DDL file times 2
221 //UInt_t baseWord; // v0.01
222 //UInt_t word; // v0.01
226 TClonesArray*& digits = * (TClonesArray**) branch->GetAddress();
228 ofstream outfile; // logical name of the output file
229 AliRawDataHeader header;
230 UInt_t sizeRawData = 0;
232 //loop over TOF DDL files
233 for(Int_t i = 0; i<AliTOFGeometry::NDDL()*AliTOFGeometry::NSectors(); i++){
235 sprintf(fileName,"TOF_%d.ddl",i+AliTOFRawStream::kDDLOffset); //The name of the output file
237 outfile.open(fileName,ios::binary);
239 outfile.open(fileName);
242 //write Dummy DATA HEADER
243 UInt_t dataHeaderPosition=outfile.tellp();
244 outfile.write((char*)(&header),sizeof(header));
250 //AliBitPacking::PackWord(word,baseWord,0, 31); // Number of DDL file
251 AliBitPacking::PackWord(word,baseWord,0, 6); // Number of DDL file
252 AliBitPacking::PackWord(0,baseWord,7,31);
255 buf[fIndex]=baseWord;
260 //For each DDL file, buf contains the array of data words in Binary format
261 //fIndex gives the number of 32 bits words in the buffer for each DDL file
262 GetDigits(digits,i,buf);
263 outfile.write((char *)buf,((fIndex+1)*sizeof(UInt_t)));
265 for(Int_t ii=0;ii<(fIndex+1);ii++) buf[ii]=0;
268 //Write REAL DATA HEADER
269 UInt_t currentFilePosition=outfile.tellp();
270 sizeRawData = currentFilePosition - dataHeaderPosition - sizeof(header);
271 header.fSize=currentFilePosition-dataHeaderPosition;
272 header.SetAttribute(0); // valid data
273 outfile.seekp(dataHeaderPosition);
274 outfile.write((char*)(&header),sizeof(header));
275 outfile.seekp(currentFilePosition);
284 //---------------------------------------------------------------------------