Common class for raw data reading and ALTRO mappiing for PHOS and EMCAL (Gustavo...
[u/mrichter/AliRoot.git] / PHOS / AliPHOS.cxx
CommitLineData
4c039060 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 **************************************************************************/
b2a60966 15/* $Id$ */
ffcecca6 16/* History of cvs commits:
17 *
18 * $Log$
d84933b0 19 * Revision 1.103 2006/11/14 17:11:15 hristov
20 * Removing inheritances from TAttLine, TAttMarker and AliRndm in AliModule. The copy constructor and assignment operators are moved to the private part of the class and not implemented. The corresponding changes are propagated to the detectors
21 *
e939a978 22 * Revision 1.102 2006/10/27 17:14:27 kharlov
23 * Introduce AliDebug and AliLog (B.Polichtchouk)
24 *
e1afea68 25 * Revision 1.101 2006/10/13 06:47:29 kharlov
26 * Simulation of RAW data applies real mapping (B.Polichtchouk)
27 *
464a797e 28 * Revision 1.100 2006/08/11 12:36:26 cvetan
29 * Update of the PHOS code needed in order to read and reconstruct the beam test raw data (i.e. without an existing galice.root)
30 *
52c5f046 31 * Revision 1.99 2006/06/28 11:36:09 cvetan
32 * New detector numbering scheme (common for DAQ/HLT/Offline). All the subdetectors shall use the AliDAQ class for the sim and rec of the raw data. The AliDAQ and raw reader classes now provide all the necessary interfaces to write and select the detector specific raw-data payload. Look into the AliDAQ.h and AliRawReader.h for more details.
33 *
362c9d61 34 * Revision 1.98 2006/05/11 11:30:48 cvetan
35 * Major changes in AliAltroBuffer. Now it can be used only for writing of raw data. All the corresponding read method are removed. It is based now on AliFstream in order to avoid endianess problems. The altro raw data is written always with little endian
36 *
4c846604 37 * Revision 1.97 2006/04/22 10:30:17 hristov
38 * Add fEnergy to AliPHOSDigit and operate with EMC amplitude in energy units (Yu.Kharlov)
39 *
27a73a5d 40 * Revision 1.96 2006/04/07 08:41:59 hristov
41 * Follow AliAlignObj framework and remove AliPHOSAlignData (Yu.Kharlov)
42 *
85698486 43 * Revision 1.95 2006/03/14 19:40:41 kharlov
44 * Remove De-digitizing of raw data and digitizing the raw data fit
45 *
b482deac 46 * Revision 1.94 2006/03/07 18:56:25 kharlov
47 * CDB is passed via environment variable
48 *
7b60fe7e 49 * Revision 1.93 2005/11/22 08:45:11 kharlov
50 * Calibration is read from CDB if any (Boris Polichtchouk)
51 *
c15b04ad 52 * Revision 1.92 2005/11/03 13:09:19 hristov
53 * Removing meaningless const declarations (linuxicc)
54 *
eb0b1051 55 * Revision 1.91 2005/07/27 15:08:53 kharlov
56 * Mixture ArCO2 is corrected
57 *
a004143a 58 * Revision 1.90 2005/06/17 07:39:07 hristov
59 * Removing GetDebug and SetDebug from AliRun and AliModule. Using AliLog for the messages
60 *
4951e003 61 * Revision 1.89 2005/05/28 12:10:07 schutz
62 * Copy constructor is corrected (by T.P.)
63 *
ffcecca6 64 */
b2a60966 65
d15a28e7 66//_________________________________________________________________________
b2a60966 67// Base Class for PHOS description:
68// PHOS consists of a PbWO4 calorimeter (EMCA) and a gazeous charged
69// particles detector (CPV or PPSD).
70// The only provided method here is CreateMaterials,
71// which defines the materials common to all PHOS versions.
72//
73//*-- Author: Laurent Aphecetche & Yves Schutz (SUBATECH)
d15a28e7 74//////////////////////////////////////////////////////////////////////////////
e84be1eb 75
fdeead01 76
fe4da5cc 77// --- ROOT system ---
2ab0c725 78class TFile;
88cb7938 79#include <TFolder.h>
88cb7938 80#include <TTree.h>
81#include <TVirtualMC.h>
046ae904 82#include <TH1F.h>
83#include <TF1.h>
e9a5efdf 84#include <TRandom.h>
fe4da5cc 85
86// --- Standard library ---
d15a28e7 87
548f0134 88// --- AliRoot header files ---
94de3818 89#include "AliMagF.h"
88cb7938 90#include "AliPHOS.h"
e9a5efdf 91#include "AliPHOSGetter.h"
85a5290f 92#include "AliRun.h"
93#include "AliPHOSDigitizer.h"
94#include "AliPHOSSDigitizer.h"
65792ca0 95#include "AliPHOSDigit.h"
96#include "AliAltroBuffer.h"
464a797e 97#include "AliAltroMapping.h"
d84933b0 98#include "AliCaloAltroMapping.h"
e4d04cf1 99#include "AliLog.h"
c15b04ad 100#include "AliCDBManager.h"
101#include "AliCDBEntry.h"
102#include "AliCDBStorage.h"
103#include "AliPHOSCalibData.h"
362c9d61 104#include "AliDAQ.h"
7f78a025 105
fe4da5cc 106ClassImp(AliPHOS)
e4d04cf1 107
108Double_t AliPHOS::fgCapa = 1.; // 1pF
109Int_t AliPHOS::fgOrder = 2 ;
110Double_t AliPHOS::fgTimeMax = 2.56E-5 ; // each sample is over 100 ns fTimeMax/fTimeBins
111Double_t AliPHOS::fgTimePeak = 4.1E-6 ; // 4 micro seconds
112Double_t AliPHOS::fgTimeTrigger = 100E-9 ; // 100ns, just for a reference
e4d04cf1 113
52c5f046 114Double_t AliPHOS::fgHighCharge = 8.2; // adjusted for a high gain range of 5.12 GeV (10 bits)
115Double_t AliPHOS::fgHighGain = 6.64;
116Double_t AliPHOS::fgHighLowGainFactor = 16.; // adjusted for a low gain range of 82 GeV (10 bits)
117
0ce0b56f 118//____________________________________________________________________________
046ae904 119 AliPHOS:: AliPHOS() : AliDetector()
6b87d0dd 120{
a532e9d8 121 // Default ctor
046ae904 122 fName = "PHOS" ;
e4d04cf1 123
6b87d0dd 124}
fa7cce36 125
6b87d0dd 126//____________________________________________________________________________
046ae904 127AliPHOS::AliPHOS(const char* name, const char* title): AliDetector(name, title)
6b87d0dd 128{
a532e9d8 129 // ctor : title is used to identify the layout
6b87d0dd 130}
fa7cce36 131
0ce0b56f 132//____________________________________________________________________________
7b326aac 133AliPHOS::~AliPHOS()
134{
0ce0b56f 135}
136
487d23e3 137//____________________________________________________________________________
138AliDigitizer* AliPHOS::CreateDigitizer(AliRunDigitizer* manager) const
139{
140 return new AliPHOSDigitizer(manager);
141}
142
d15a28e7 143//____________________________________________________________________________
fe4da5cc 144void AliPHOS::CreateMaterials()
145{
b2a60966 146 // Definitions of materials to build PHOS and associated tracking media.
147 // media number in idtmed are 699 to 798.
fe4da5cc 148
d15a28e7 149 // --- The PbWO4 crystals ---
92862013 150 Float_t aX[3] = {207.19, 183.85, 16.0} ;
151 Float_t zX[3] = {82.0, 74.0, 8.0} ;
152 Float_t wX[3] = {1.0, 1.0, 4.0} ;
153 Float_t dX = 8.28 ;
fe4da5cc 154
92862013 155 AliMixture(0, "PbWO4$", aX, zX, dX, -3, wX) ;
fe4da5cc 156
fe4da5cc 157
d15a28e7 158 // --- The polysterene scintillator (CH) ---
92862013 159 Float_t aP[2] = {12.011, 1.00794} ;
160 Float_t zP[2] = {6.0, 1.0} ;
161 Float_t wP[2] = {1.0, 1.0} ;
162 Float_t dP = 1.032 ;
fe4da5cc 163
92862013 164 AliMixture(1, "Polystyrene$", aP, zP, dP, -2, wP) ;
fe4da5cc 165
d15a28e7 166 // --- Aluminium ---
167 AliMaterial(2, "Al$", 26.98, 13., 2.7, 8.9, 999., 0, 0) ;
168 // --- Absorption length is ignored ^
fe4da5cc 169
d15a28e7 170 // --- Tyvek (CnH2n) ---
92862013 171 Float_t aT[2] = {12.011, 1.00794} ;
172 Float_t zT[2] = {6.0, 1.0} ;
173 Float_t wT[2] = {1.0, 2.0} ;
174 Float_t dT = 0.331 ;
fe4da5cc 175
92862013 176 AliMixture(3, "Tyvek$", aT, zT, dT, -2, wT) ;
fe4da5cc 177
d15a28e7 178 // --- Polystyrene foam ---
92862013 179 Float_t aF[2] = {12.011, 1.00794} ;
180 Float_t zF[2] = {6.0, 1.0} ;
181 Float_t wF[2] = {1.0, 1.0} ;
182 Float_t dF = 0.12 ;
fe4da5cc 183
92862013 184 AliMixture(4, "Foam$", aF, zF, dF, -2, wF) ;
fe4da5cc 185
d15a28e7 186 // --- Titanium ---
92862013 187 Float_t aTIT[3] = {47.88, 26.98, 54.94} ;
188 Float_t zTIT[3] = {22.0, 13.0, 25.0} ;
189 Float_t wTIT[3] = {69.0, 6.0, 1.0} ;
190 Float_t dTIT = 4.5 ;
fe4da5cc 191
92862013 192 AliMixture(5, "Titanium$", aTIT, zTIT, dTIT, -3, wTIT);
fe4da5cc 193
d15a28e7 194 // --- Silicon ---
195 AliMaterial(6, "Si$", 28.0855, 14., 2.33, 9.36, 42.3, 0, 0) ;
fe4da5cc 196
fe4da5cc 197
fe4da5cc 198
d15a28e7 199 // --- Foam thermo insulation ---
92862013 200 Float_t aTI[2] = {12.011, 1.00794} ;
201 Float_t zTI[2] = {6.0, 1.0} ;
202 Float_t wTI[2] = {1.0, 1.0} ;
85218d13 203 Float_t dTI = 0.04 ;
fe4da5cc 204
92862013 205 AliMixture(7, "Thermo Insul.$", aTI, zTI, dTI, -2, wTI) ;
fe4da5cc 206
74e56d72 207 // --- Textolith ---
92862013 208 Float_t aTX[4] = {16.0, 28.09, 12.011, 1.00794} ;
209 Float_t zTX[4] = {8.0, 14.0, 6.0, 1.0} ;
210 Float_t wTX[4] = {292.0, 68.0, 462.0, 736.0} ;
211 Float_t dTX = 1.75 ;
fe4da5cc 212
92862013 213 AliMixture(8, "Textolit$", aTX, zTX, dTX, -4, wTX) ;
fe4da5cc 214
d15a28e7 215 //--- FR4 ---
74e56d72 216 Float_t aFR[4] = {16.0, 28.09, 12.011, 1.00794} ;
217 Float_t zFR[4] = {8.0, 14.0, 6.0, 1.0} ;
218 Float_t wFR[4] = {292.0, 68.0, 462.0, 736.0} ;
92862013 219 Float_t dFR = 1.8 ;
fe4da5cc 220
74e56d72 221 AliMixture(9, "FR4$", aFR, zFR, dFR, -4, wFR) ;
fe4da5cc 222
d15a28e7 223 // --- The Composite Material for micromegas (so far polyetylene) ---
92862013 224 Float_t aCM[2] = {12.01, 1.} ;
225 Float_t zCM[2] = {6., 1.} ;
226 Float_t wCM[2] = {1., 2.} ;
227 Float_t dCM = 0.935 ;
fe4da5cc 228
92862013 229 AliMixture(10, "Compo Mat$", aCM, zCM, dCM, -2, wCM) ;
fe4da5cc 230
d15a28e7 231 // --- Copper ---
232 AliMaterial(11, "Cu$", 63.546, 29, 8.96, 1.43, 14.8, 0, 0) ;
233
234 // --- G10 : Printed Circuit material ---
92862013 235 Float_t aG10[4] = { 12., 1., 16., 28.} ;
236 Float_t zG10[4] = { 6., 1., 8., 14.} ;
237 Float_t wG10[4] = { .259, .288, .248, .205} ;
238 Float_t dG10 = 1.7 ;
d15a28e7 239
92862013 240 AliMixture(12, "G10$", aG10, zG10, dG10, -4, wG10);
fe4da5cc 241
d15a28e7 242 // --- Lead ---
243 AliMaterial(13, "Pb$", 207.2, 82, 11.35, 0.56, 0., 0, 0) ;
fe4da5cc 244
d15a28e7 245 // --- The gas mixture ---
246 // Co2
92862013 247 Float_t aCO[2] = {12.0, 16.0} ;
248 Float_t zCO[2] = {6.0, 8.0} ;
249 Float_t wCO[2] = {1.0, 2.0} ;
250 Float_t dCO = 0.001977 ;
fe4da5cc 251
92862013 252 AliMixture(14, "CO2$", aCO, zCO, dCO, -2, wCO);
fe4da5cc 253
d15a28e7 254 // Ar
92862013 255 Float_t dAr = 0.001782 ;
256 AliMaterial(15, "Ar$", 39.948, 18.0, dAr, 14.0, 0., 0, 0) ;
d15a28e7 257
a004143a 258 // Ar+CO2 Mixture (80% / 20%)
259 Float_t arContent = 0.80 ; // Ar-content of the ArCO2-mixture
260 Float_t aArCO[3] = {39.948, 12.0, 16.0} ;
261 Float_t zArCO[3] = {18.0 , 6.0, 8.0} ;
262 Float_t wArCO[3];
263 wArCO[0] = arContent;
264 wArCO[1] = (1-arContent)*1;
265 wArCO[2] = (1-arContent)*2;
266 Float_t dArCO = arContent*dAr + (1-arContent)*dCO ;
267 AliMixture(16, "ArCO2$", aArCO, zArCO, dArCO, -3, wArCO) ;
fe4da5cc 268
a530ba0a 269 // --- Stainless steel (let it be pure iron) ---
270 AliMaterial(17, "Steel$", 55.845, 26, 7.87, 1.76, 0., 0, 0) ;
85218d13 271
272
273 // --- Fiberglass ---
274 Float_t aFG[4] = {16.0, 28.09, 12.011, 1.00794} ;
275 Float_t zFG[4] = {8.0, 14.0, 6.0, 1.0} ;
276 Float_t wFG[4] = {292.0, 68.0, 462.0, 736.0} ;
277 Float_t dFG = 1.9 ;
278
279 AliMixture(18, "Fibergla$", aFG, zFG, dFG, -4, wFG) ;
280
281 // --- Cables in Air box ---
282 // SERVICES
283
284 Float_t aCA[4] = { 1.,12.,55.8,63.5 };
285 Float_t zCA[4] = { 1.,6.,26.,29. };
286 Float_t wCA[4] = { .014,.086,.42,.48 };
287 Float_t dCA = 0.8 ; //this density is raw estimation, if you know better - correct
288
289 AliMixture(19, "Cables $", aCA, zCA, dCA, -4, wCA) ;
290
291
d15a28e7 292 // --- Air ---
a7262d8e 293 Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
294 Float_t zAir[4]={6.,7.,8.,18.};
295 Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
296 Float_t dAir = 1.20479E-3;
d15a28e7 297
a7262d8e 298 AliMixture(99, "Air$", aAir, zAir, dAir, 4, wAir) ;
299
d15a28e7 300 // DEFINITION OF THE TRACKING MEDIA
fe4da5cc 301
d15a28e7 302 // for PHOS: idtmed[699->798] equivalent to fIdtmed[0->100]
303 Int_t * idtmed = fIdtmed->GetArray() - 699 ;
92862013 304 Int_t isxfld = gAlice->Field()->Integ() ;
305 Float_t sxmgmx = gAlice->Field()->Max() ;
fe4da5cc 306
d15a28e7 307 // The scintillator of the calorimeter made of PBW04 -> idtmed[699]
308 AliMedium(0, "PHOS Xtal $", 0, 1,
92862013 309 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
fe4da5cc 310
d15a28e7 311 // The scintillator of the CPV made of Polystyrene scintillator -> idtmed[700]
312 AliMedium(1, "CPV scint. $", 1, 1,
92862013 313 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
fe4da5cc 314
d15a28e7 315 // Various Aluminium parts made of Al -> idtmed[701]
316 AliMedium(2, "Al parts $", 2, 0,
92862013 317 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.001, 0.001, 0, 0) ;
fe4da5cc 318
d15a28e7 319 // The Tywek which wraps the calorimeter crystals -> idtmed[702]
320 AliMedium(3, "Tyvek wrapper$", 3, 0,
92862013 321 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.001, 0.001, 0, 0) ;
fe4da5cc 322
d15a28e7 323 // The Polystyrene foam around the calorimeter module -> idtmed[703]
324 AliMedium(4, "Polyst. foam $", 4, 0,
92862013 325 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
fe4da5cc 326
d15a28e7 327 // The Titanium around the calorimeter crystal -> idtmed[704]
328 AliMedium(5, "Titan. cover $", 5, 0,
92862013 329 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.0001, 0.0001, 0, 0) ;
fe4da5cc 330
d15a28e7 331 // The Silicon of the pin diode to read out the calorimeter crystal -> idtmed[705]
332 AliMedium(6, "Si PIN $", 6, 0,
7b326aac 333 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.01, 0.01, 0, 0) ;
fe4da5cc 334
d15a28e7 335 // The thermo insulating material of the box which contains the calorimeter module -> idtmed[706]
336 AliMedium(7, "Thermo Insul.$", 7, 0,
92862013 337 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
fe4da5cc 338
d15a28e7 339 // The Textolit which makes up the box which contains the calorimeter module -> idtmed[707]
340 AliMedium(8, "Textolit $", 8, 0,
92862013 341 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
fe4da5cc 342
d15a28e7 343 // FR4: The Plastic which makes up the frame of micromegas -> idtmed[708]
344 AliMedium(9, "FR4 $", 9, 0,
92862013 345 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.0001, 0, 0) ;
fe4da5cc 346
fe4da5cc 347
d15a28e7 348 // The Composite Material for micromegas -> idtmed[709]
349 AliMedium(10, "CompoMat $", 10, 0,
92862013 350 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
fe4da5cc 351
d15a28e7 352 // Copper -> idtmed[710]
353 AliMedium(11, "Copper $", 11, 0,
92862013 354 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.0001, 0, 0) ;
fe4da5cc 355
d15a28e7 356 // G10: Printed Circuit material -> idtmed[711]
357
358 AliMedium(12, "G10 $", 12, 0,
92862013 359 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.01, 0, 0) ;
fe4da5cc 360
d15a28e7 361 // The Lead -> idtmed[712]
362
363 AliMedium(13, "Lead $", 13, 0,
92862013 364 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
fe4da5cc 365
d15a28e7 366 // The gas mixture: ArCo2 -> idtmed[715]
367
368 AliMedium(16, "ArCo2 $", 16, 1,
92862013 369 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.01, 0, 0) ;
d15a28e7 370
a530ba0a 371 // Stainless steel -> idtmed[716]
372 AliMedium(17, "Steel $", 17, 0,
373 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.0001, 0, 0) ;
374
85218d13 375 // Fibergalss -> idtmed[717]
376 AliMedium(18, "Fiberglass$", 18, 0,
377 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
378
379 // Cables in air -> idtmed[718]
380 AliMedium(19, "Cables $", 19, 0,
381 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
382
d15a28e7 383 // Air -> idtmed[798]
384 AliMedium(99, "Air $", 99, 0,
92862013 385 isxfld, sxmgmx, 10.0, 1.0, 0.1, 0.1, 10.0, 0, 0) ;
fe4da5cc 386
d15a28e7 387 // --- Set decent energy thresholds for gamma and electron tracking
fe4da5cc 388
d15a28e7 389 // Tracking threshold for photons and electrons in the scintillator crystal
390 gMC->Gstpar(idtmed[699], "CUTGAM",0.5E-4) ;
391 gMC->Gstpar(idtmed[699], "CUTELE",1.0E-4) ;
9f616d61 392
d15a28e7 393 // --- Generate explicitly delta rays in the titan cover ---
394 gMC->Gstpar(idtmed[704], "LOSS",3.) ;
395 gMC->Gstpar(idtmed[704], "DRAY",1.) ;
d15a28e7 396 // --- and in aluminium parts ---
397 gMC->Gstpar(idtmed[701], "LOSS",3.) ;
398 gMC->Gstpar(idtmed[701], "DRAY",1.) ;
92862013 399 // --- and in PIN diode
400 gMC->Gstpar(idtmed[705], "LOSS",3) ;
401 gMC->Gstpar(idtmed[705], "DRAY",1) ;
402 // --- and in the passive convertor
403 gMC->Gstpar(idtmed[712], "LOSS",3) ;
404 gMC->Gstpar(idtmed[712], "DRAY",1) ;
405 // Tracking threshold for photons and electrons in the gas ArC02
b7101219 406 gMC->Gstpar(idtmed[715], "CUTGAM",1.E-5) ;
407 gMC->Gstpar(idtmed[715], "CUTELE",1.E-5) ;
408 gMC->Gstpar(idtmed[715], "CUTNEU",1.E-5) ;
409 gMC->Gstpar(idtmed[715], "CUTHAD",1.E-5) ;
410 gMC->Gstpar(idtmed[715], "CUTMUO",1.E-5) ;
411 gMC->Gstpar(idtmed[715], "BCUTE",1.E-5) ;
412 gMC->Gstpar(idtmed[715], "BCUTM",1.E-5) ;
413 gMC->Gstpar(idtmed[715], "DCUTE",1.E-5) ;
414 gMC->Gstpar(idtmed[715], "DCUTM",1.E-5) ;
415 gMC->Gstpar(idtmed[715], "PPCUTM",1.E-5) ;
9f616d61 416 gMC->Gstpar(idtmed[715], "LOSS",2.) ;
417 gMC->Gstpar(idtmed[715], "DRAY",0.) ;
418 gMC->Gstpar(idtmed[715], "STRA",2.) ;
419
0c409cb2 420}
a532e9d8 421
65792ca0 422//____________________________________________________________________________
423void AliPHOS::Digits2Raw()
424{
425// convert digits of the current event to raw data
e4d04cf1 426
427 AliPHOSLoader * loader = dynamic_cast<AliPHOSLoader*>(fLoader) ;
65792ca0 428
429 // get the digits
e4d04cf1 430 loader->LoadDigits();
431 TClonesArray* digits = loader->Digits() ;
e9a5efdf 432
65792ca0 433 if (!digits) {
351dd634 434 AliError(Form("No digits found !"));
65792ca0 435 return;
436 }
437
438 // get the geometry
e4d04cf1 439 AliPHOSGeometry* geom = GetGeometry();
65792ca0 440 if (!geom) {
351dd634 441 AliError(Form("No geometry found !"));
65792ca0 442 return;
443 }
444
445 // some digitization constants
27a73a5d 446// const Int_t kThreshold = 1; // skip digits below this threshold // YVK
447 const Float_t kThreshold = 0.001; // skip digits below 1 MeV
448 const Int_t kAdcThreshold = 1; // Lower ADC threshold to write to raw data
65792ca0 449
450 AliAltroBuffer* buffer = NULL;
451 Int_t prevDDL = -1;
046ae904 452 Int_t adcValuesLow[fkTimeBins];
453 Int_t adcValuesHigh[fkTimeBins];
65792ca0 454
e1afea68 455
456 //!!!!for debug!!!
457 Int_t modMax=-111;
458 Int_t colMax=-111;
459 Int_t rowMax=-111;
460 Float_t eMax=-333;
461 //!!!for debug!!!
462
65792ca0 463 // loop over digits (assume ordered digits)
464 for (Int_t iDigit = 0; iDigit < digits->GetEntries(); iDigit++) {
e4d04cf1 465 AliPHOSDigit* digit = dynamic_cast<AliPHOSDigit *>(digits->At(iDigit)) ;
27a73a5d 466 if (digit->GetEnergy() < kThreshold)
e9a5efdf 467 continue;
65792ca0 468 Int_t relId[4];
469 geom->AbsToRelNumbering(digit->GetId(), relId);
470 Int_t module = relId[0];
e9a5efdf 471
472 // Begin FIXME
473 if (relId[1] != 0)
474 continue; // ignore digits from CPV
475 // End FIXME
476
464a797e 477 Int_t row = relId[2]-1;
478 Int_t col = relId[3]-1;
479
480 Int_t iRCU = -111;
481
482 //RCU0
483 if(0<=row&&row<32 && 0<=col&&col<28) iRCU=0;
484
485 //RCU1
486 if(0<=row&&row<32 && 28<=col&&col<56) iRCU=1;
487
488 //RCU2
489 if(32<=row&&row<64 && 0<=col&&col<28) iRCU=2;
490
491 //RCU3
492 if(32<=row&&row<64 && 28<=col&&col<56) iRCU=3;
493
494
495 // PHOS EMCA has 4 DDL per module. Splitting is based on the (row,column) numbers.
496 // PHOS internal convention: 1<module<5.
497 Int_t iDDL = 4 * (module - 1) + iRCU;
65792ca0 498
499 // new DDL
500 if (iDDL != prevDDL) {
501 // write real header and close previous file
502 if (buffer) {
503 buffer->Flush();
504 buffer->WriteDataHeader(kFALSE, kFALSE);
505 delete buffer;
506 }
507
508 // open new file and write dummy header
362c9d61 509 TString fileName = AliDAQ::DdlFileName("PHOS",iDDL);
464a797e 510
511 TString path = gSystem->Getenv("ALICE_ROOT");
512 path += "/PHOS/mapping/RCU";
513 path += iRCU;
514 path += ".data";
515
d84933b0 516 AliAltroMapping* mapping = new AliCaloAltroMapping(path.Data());
464a797e 517 buffer = new AliAltroBuffer(fileName.Data(),mapping);
65792ca0 518 buffer->WriteDataHeader(kTRUE, kFALSE); //Dummy;
519
520 prevDDL = iDDL;
521 }
522
523 // out of time range signal (?)
e4d04cf1 524 if (digit->GetTimeR() > GetRawFormatTimeMax() ) {
e1afea68 525 AliInfo("Signal is out of time range.\n");
27a73a5d 526 buffer->FillBuffer((Int_t)digit->GetEnergy());
e4d04cf1 527 buffer->FillBuffer(GetRawFormatTimeBins() ); // time bin
528 buffer->FillBuffer(3); // bunch length
65792ca0 529 buffer->WriteTrailer(3, relId[3], relId[2], module); // trailer
530
e4d04cf1 531 // calculate the time response function
65792ca0 532 } else {
c15b04ad 533 Double_t energy = 0 ;
534 Int_t module = relId[0];
c15b04ad 535 if ( digit->GetId() <= geom->GetNModules() * geom->GetNCristalsInModule()) {
27a73a5d 536 energy=digit->GetEnergy();
e1afea68 537 AliDebug(2,Form("digit energy: %f\n",digit->GetEnergy()));
538 if(energy>eMax) {eMax=energy; modMax=module; colMax=col; rowMax=row;}
b482deac 539 }
540 else {
541// energy = digit->GetAmp()*digitizer->GetCPVchannel()+digitizer->GetCPVpedestal();
542 energy = 0; // CPV raw data format is now know yet
543 }
addad4c9 544 Bool_t lowgain = RawSampledResponse(digit->GetTimeR(), energy, adcValuesHigh, adcValuesLow) ;
046ae904 545
85698486 546 if (lowgain)
464a797e 547 buffer->WriteChannel(relId[3]-1, relId[2]-1, 0,
27a73a5d 548 GetRawFormatTimeBins(), adcValuesLow , kAdcThreshold);
addad4c9 549 else
464a797e 550 buffer->WriteChannel(relId[3]-1, relId[2]-1, 1,
27a73a5d 551 GetRawFormatTimeBins(), adcValuesHigh, kAdcThreshold);
addad4c9 552
65792ca0 553 }
554 }
046ae904 555
65792ca0 556 // write real header and close last file
557 if (buffer) {
558 buffer->Flush();
559 buffer->WriteDataHeader(kFALSE, kFALSE);
560 delete buffer;
561 }
046ae904 562
e1afea68 563 AliDebug(1,Form("Digit with max. energy: modMax %d colMax %d rowMax %d eMax %f\n",
564 modMax,colMax,rowMax,eMax));
565
e4d04cf1 566 loader->UnloadDigits();
e9a5efdf 567}
568
569//____________________________________________________________________________
570void AliPHOS::Hits2SDigits()
571{
572// create summable digits
573
a1952ef7 574 AliPHOSSDigitizer phosDigitizer(fLoader->GetRunLoader()->GetFileName().Data()) ;
575 phosDigitizer.SetEventRange(0, -1) ; // do all the events
576 phosDigitizer.ExecuteTask("all") ;
e9a5efdf 577}
578
579//____________________________________________________________________________
580AliLoader* AliPHOS::MakeLoader(const char* topfoldername)
581{
582//different behaviour than standard (singleton getter)
583// --> to be discussed and made eventually coherent
584 fLoader = new AliPHOSLoader(GetName(),topfoldername);
585 return fLoader;
586}
587
046ae904 588//__________________________________________________________________
e4d04cf1 589Double_t AliPHOS::RawResponseFunction(Double_t *x, Double_t *par)
046ae904 590{
591 // Shape of the electronics raw reponse:
e4d04cf1 592 // It is a semi-gaussian, 2nd order Gamma function of the general form
593 // v(t) = n**n * Q * A**n / C *(t/tp)**n * exp(-n * t/tp) with
594 // tp : peaking time par[0]
595 // n : order of the function
596 // C : integrating capacitor in the preamplifier
597 // A : open loop gain of the preamplifier
598 // Q : the total APD charge to be measured Q = C * energy
046ae904 599
e4d04cf1 600 Double_t signal ;
601 Double_t xx = x[0] - ( fgTimeTrigger + par[3] ) ;
602
603 if (xx < 0 || xx > fgTimeMax)
604 signal = 0. ;
605 else {
606 Double_t fac = par[0] * TMath::Power(fgOrder, fgOrder) * TMath::Power(par[1], fgOrder) / fgCapa ;
607 signal = fac * par[2] * TMath::Power(xx / fgTimePeak, fgOrder) * TMath::Exp(-fgOrder * (xx / fgTimePeak)) ;
608 }
609 return signal ;
610}
611
612//__________________________________________________________________
613Double_t AliPHOS::RawResponseFunctionMax(Double_t charge, Double_t gain)
614{
615 return ( charge * TMath::Power(fgOrder, fgOrder) * TMath::Power(gain, fgOrder)
616 / ( fgCapa * TMath::Exp(fgOrder) ) );
617
046ae904 618}
619
620//__________________________________________________________________
eb0b1051 621Bool_t AliPHOS::RawSampledResponse(Double_t dtime, Double_t damp, Int_t * adcH, Int_t * adcL) const
046ae904 622{
623 // for a start time dtime and an amplitude damp given by digit,
e4d04cf1 624 // calculates the raw sampled response AliPHOS::RawResponseFunction
85698486 625 // Input: dtime - signal start time
626 // damp - signal amplitude (energy)
627 // Output: adcH - array[fkTimeBins] of 10-bit samples for high-gain channel
628 // adcL - array[fkTimeBins] of 10-bit samples for low-gain channel
046ae904 629
630 const Int_t kRawSignalOverflow = 0x3FF ;
e4d04cf1 631 Bool_t lowGain = kFALSE ;
632
633 TF1 signalF("signal", RawResponseFunction, 0, GetRawFormatTimeMax(), 4);
634
635 for (Int_t iTime = 0; iTime < GetRawFormatTimeBins(); iTime++) {
636 signalF.SetParameter(0, GetRawFormatHighCharge() ) ;
637 signalF.SetParameter(1, GetRawFormatHighGain() ) ;
638 signalF.SetParameter(2, damp) ;
639 signalF.SetParameter(3, dtime) ;
640 Double_t time = iTime * GetRawFormatTimeMax() / GetRawFormatTimeBins() ;
641 Double_t signal = signalF.Eval(time) ;
642 if ( static_cast<Int_t>(signal+0.5) > kRawSignalOverflow ){ // larger than 10 bits
643 signal = kRawSignalOverflow ;
644 lowGain = kTRUE ;
645 }
646 adcH[iTime] = static_cast<Int_t>(signal + 0.5) ;
e1afea68 647 AliDebug(4,Form("iTime: %d Energy: %f HG signal: %f adcH: %d ",iTime,damp,signal,adcH[iTime]));
e4d04cf1 648
649 signalF.SetParameter(0, GetRawFormatLowCharge() ) ;
650 signalF.SetParameter(1, GetRawFormatLowGain() ) ;
651 signal = signalF.Eval(time) ;
652 if ( static_cast<Int_t>(signal+0.5) > kRawSignalOverflow) // larger than 10 bits
653 signal = kRawSignalOverflow ;
654 adcL[iTime] = static_cast<Int_t>(0.5 + signal ) ;
e1afea68 655 AliDebug(4,Form("..LG: %f adcL: %d\n",signal,adcL[iTime]));
e4d04cf1 656
046ae904 657 }
e4d04cf1 658 return lowGain ;
046ae904 659}
660
e9a5efdf 661//____________________________________________________________________________
662void AliPHOS::SetTreeAddress()
663{
664 // Links Hits in the Tree to Hits array
665 TBranch *branch;
666 char branchname[20];
667 sprintf(branchname,"%s",GetName());
e9a5efdf 668 // Branch address for hit tree
351dd634 669 TTree *treeH = TreeH();
e9a5efdf 670 if (treeH) {
671 branch = treeH->GetBranch(branchname);
672 if (branch)
673 {
674 if (fHits == 0x0) fHits= new TClonesArray("AliPHOSHit",1000);
351dd634 675 //AliInfo(Form("<%s> Setting Hits Address",GetName()));
e9a5efdf 676 branch->SetAddress(&fHits);
677 }
678 }
679}
680