]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TRD/AliTRDdigitizer.cxx
VZERO volumes now placed in common mother.
[u/mrichter/AliRoot.git] / TRD / AliTRDdigitizer.cxx
CommitLineData
f7336fa3 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
88cb7938 16/* $Id$ */
f7336fa3 17
18///////////////////////////////////////////////////////////////////////////////
19// //
20// Creates and handles digits from TRD hits //
b08ed1cf 21// Authors: C. Blume (blume@ikf.uni-frankfurt.de) //
22// C. Lippmann //
23// B. Vulpescu //
f7336fa3 24// //
25// The following effects are included: //
26// - Diffusion //
27// - ExB effects //
28// - Gas gain including fluctuations //
29// - Pad-response (simple Gaussian approximation) //
abaf1f1d 30// - Time-response //
f7336fa3 31// - Electronics noise //
32// - Electronics gain //
33// - Digitization //
34// - ADC threshold //
35// The corresponding parameter can be adjusted via the various //
36// Set-functions. If these parameters are not explicitly set, default //
37// values are used (see Init-function). //
f7336fa3 38// //
39///////////////////////////////////////////////////////////////////////////////
40
6798b56e 41#include <stdlib.h>
42
f7336fa3 43#include <TMath.h>
44#include <TVector.h>
45#include <TRandom.h>
94de3818 46#include <TROOT.h>
47#include <TTree.h>
793ff80c 48#include <TFile.h>
49#include <TF1.h>
abaf1f1d 50#include <TList.h>
85cbec76 51#include <TTask.h>
3becff3c 52#include <TGeoManager.h>
793ff80c 53
54#include "AliRun.h"
88cb7938 55#include "AliRunLoader.h"
56#include "AliLoader.h"
57#include "AliConfig.h"
db30bf0f 58#include "AliMagF.h"
85cbec76 59#include "AliRunDigitizer.h"
88cb7938 60#include "AliRunLoader.h"
61#include "AliLoader.h"
ad2cc20b 62#include "AliLog.h"
f7336fa3 63
64#include "AliTRD.h"
793ff80c 65#include "AliTRDhit.h"
f7336fa3 66#include "AliTRDdigitizer.h"
da581aea 67#include "AliTRDdataArrayI.h"
68#include "AliTRDdataArrayF.h"
793ff80c 69#include "AliTRDsegmentArray.h"
da581aea 70#include "AliTRDdigitsManager.h"
793ff80c 71#include "AliTRDgeometry.h"
a5cadd36 72#include "AliTRDpadPlane.h"
3551db50 73#include "AliTRDcalibDB.h"
74#include "AliTRDSimParam.h"
75#include "AliTRDCommonParam.h"
f7336fa3 76
afb9f880 77#include "Cal/AliTRDCalROC.h"
78#include "Cal/AliTRDCalDet.h"
79
f7336fa3 80ClassImp(AliTRDdigitizer)
81
82//_____________________________________________________________________________
85cbec76 83AliTRDdigitizer::AliTRDdigitizer()
4d18a639 84 :AliDigitizer()
85 ,fRunLoader(0)
86 ,fDigitsManager(0)
87 ,fSDigitsManager(0)
88 ,fSDigitsManagerList(0)
89 ,fTRD(0)
90 ,fGeo(0)
91 ,fEvent(0)
92 ,fMasks(0)
93 ,fCompress(kTRUE)
94 ,fSDigits(kFALSE)
95 ,fSDigitsScale(0.0)
96 ,fMergeSignalOnly(kFALSE)
97 ,fDiffLastVdrift(0)
98 ,fDiffusionT(0.0)
99 ,fDiffusionL(0.0)
100 ,fOmegaTau(0.0)
101 ,fLorentzFactor(0.0)
102 ,fTimeLastVdrift(0)
103 ,fTimeStruct1(0)
104 ,fTimeStruct2(0)
105 ,fVDlo(0)
106 ,fVDhi(0)
f7336fa3 107{
108 //
109 // AliTRDdigitizer default constructor
110 //
3551db50 111
112 Init();
3becff3c 113
f7336fa3 114}
115
116//_____________________________________________________________________________
4d18a639 117AliTRDdigitizer::AliTRDdigitizer(const Text_t *name, const Text_t *title)
118 :AliDigitizer(name,title)
119 ,fRunLoader(0)
120 ,fDigitsManager(0)
121 ,fSDigitsManager(0)
122 ,fSDigitsManagerList(0)
123 ,fTRD(0)
124 ,fGeo(0)
125 ,fEvent(0)
126 ,fMasks(0)
127 ,fCompress(kTRUE)
128 ,fSDigits(kFALSE)
129 ,fSDigitsScale(0.0)
130 ,fMergeSignalOnly(kFALSE)
131 ,fDiffLastVdrift(0)
132 ,fDiffusionT(0.0)
133 ,fDiffusionL(0.0)
134 ,fOmegaTau(0.0)
135 ,fLorentzFactor(0.0)
136 ,fTimeLastVdrift(0)
137 ,fTimeStruct1(0)
138 ,fTimeStruct2(0)
139 ,fVDlo(0)
140 ,fVDhi(0)
f7336fa3 141{
142 //
85cbec76 143 // AliTRDdigitizer constructor
144 //
145
3551db50 146 Init();
3becff3c 147
85cbec76 148}
149
150//_____________________________________________________________________________
151AliTRDdigitizer::AliTRDdigitizer(AliRunDigitizer *manager
4d18a639 152 , const Text_t *name, const Text_t *title)
153 :AliDigitizer(manager,name,title)
154 ,fRunLoader(0)
155 ,fDigitsManager(0)
156 ,fSDigitsManager(0)
157 ,fSDigitsManagerList(0)
158 ,fTRD(0)
159 ,fGeo(0)
160 ,fEvent(0)
161 ,fMasks(0)
162 ,fCompress(kTRUE)
163 ,fSDigits(kFALSE)
164 ,fSDigitsScale(0.0)
165 ,fMergeSignalOnly(kFALSE)
166 ,fDiffLastVdrift(0)
167 ,fDiffusionT(0.0)
168 ,fDiffusionL(0.0)
169 ,fOmegaTau(0.0)
170 ,fLorentzFactor(0.0)
171 ,fTimeLastVdrift(0)
172 ,fTimeStruct1(0)
173 ,fTimeStruct2(0)
174 ,fVDlo(0)
175 ,fVDhi(0)
85cbec76 176{
177 //
178 // AliTRDdigitizer constructor
f7336fa3 179 //
180
3551db50 181 Init();
3becff3c 182
bfc40adc 183}
184
185//_____________________________________________________________________________
186AliTRDdigitizer::AliTRDdigitizer(AliRunDigitizer *manager)
4d18a639 187 :AliDigitizer(manager,"AliTRDdigitizer","TRD digitizer")
188 ,fRunLoader(0)
189 ,fDigitsManager(0)
190 ,fSDigitsManager(0)
191 ,fSDigitsManagerList(0)
192 ,fTRD(0)
193 ,fGeo(0)
194 ,fEvent(0)
195 ,fMasks(0)
196 ,fCompress(kTRUE)
197 ,fSDigits(kFALSE)
198 ,fSDigitsScale(0.0)
199 ,fMergeSignalOnly(kFALSE)
200 ,fDiffLastVdrift(0)
201 ,fDiffusionT(0.0)
202 ,fDiffusionL(0.0)
203 ,fOmegaTau(0.0)
204 ,fLorentzFactor(0.0)
205 ,fTimeLastVdrift(0)
206 ,fTimeStruct1(0)
207 ,fTimeStruct2(0)
208 ,fVDlo(0)
209 ,fVDhi(0)
bfc40adc 210{
211 //
212 // AliTRDdigitizer constructor
213 //
214
3551db50 215 Init();
3becff3c 216
3551db50 217}
88cb7938 218
3551db50 219//_____________________________________________________________________________
220Bool_t AliTRDdigitizer::Init()
221{
3becff3c 222 //
223 // Initialize the digitizer with default values
224 //
225
85a5290f 226 fRunLoader = 0;
4487dad0 227 fDigitsManager = 0;
4487dad0 228 fSDigitsManager = 0;
85a5290f 229 fSDigitsManagerList = 0;
4487dad0 230 fTRD = 0;
231 fGeo = 0;
3becff3c 232
abaf1f1d 233 fEvent = 0;
85a5290f 234 fMasks = 0;
abaf1f1d 235 fCompress = kTRUE;
abaf1f1d 236 fSDigits = kFALSE;
4d18a639 237 fSDigitsScale = 100.0;
4487dad0 238 fMergeSignalOnly = kFALSE;
3551db50 239
4d18a639 240 fTimeLastVdrift = -1;
241 fTimeStruct1 = 0;
242 fTimeStruct2 = 0;
243 fVDlo = 0;
244 fVDhi = 0;
3551db50 245
4d18a639 246 fDiffLastVdrift = -1;
247 fDiffusionT = 0.0;
248 fDiffusionL = 0.0;
249 fLorentzFactor = 0.0;
793ff80c 250
3551db50 251 return AliDigitizer::Init();
3becff3c 252
f7336fa3 253}
254
8230f242 255//_____________________________________________________________________________
4d18a639 256AliTRDdigitizer::AliTRDdigitizer(const AliTRDdigitizer &d)
257 :AliDigitizer(d)
258 ,fRunLoader(0)
259 ,fDigitsManager(0)
260 ,fSDigitsManager(0)
261 ,fSDigitsManagerList(0)
262 ,fTRD(0)
263 ,fGeo(0)
264 ,fEvent(0)
265 ,fMasks(0)
266 ,fCompress(d.fCompress)
267 ,fSDigits(d.fSDigits)
268 ,fSDigitsScale(d.fSDigitsScale)
269 ,fMergeSignalOnly(d.fMergeSignalOnly)
270 ,fDiffLastVdrift(-1)
271 ,fDiffusionT(0.0)
272 ,fDiffusionL(0.0)
273 ,fOmegaTau(0.0)
274 ,fLorentzFactor(0.0)
275 ,fTimeLastVdrift(-1)
276 ,fTimeStruct1(0)
277 ,fTimeStruct2(0)
278 ,fVDlo(0)
279 ,fVDhi(0)
8230f242 280{
281 //
282 // AliTRDdigitizer copy constructor
283 //
284
4d18a639 285 // Do not copy timestructs, just invalidate lastvdrift.
286 // Next time they are requested, they get recalculated
287 if (((AliTRDdigitizer &) d).fTimeStruct1) {
288 delete [] ((AliTRDdigitizer &) d).fTimeStruct1;
289 ((AliTRDdigitizer &) d).fTimeStruct1 = 0;
290 }
291 if (((AliTRDdigitizer &) d).fTimeStruct2) {
292 delete [] ((AliTRDdigitizer &) d).fTimeStruct2;
293 ((AliTRDdigitizer &) d).fTimeStruct2 = 0;
294 }
8230f242 295
296}
297
f7336fa3 298//_____________________________________________________________________________
299AliTRDdigitizer::~AliTRDdigitizer()
300{
8230f242 301 //
302 // AliTRDdigitizer destructor
303 //
f7336fa3 304
abaf1f1d 305 if (fDigitsManager) {
306 delete fDigitsManager;
4d18a639 307 fDigitsManager = 0;
f7336fa3 308 }
309
4d18a639 310 if (fDigitsManager) {
311 delete fSDigitsManager;
312 fSDigitsManager = 0;
313 }
f7336fa3 314
abaf1f1d 315 if (fSDigitsManagerList) {
47b5729a 316 fSDigitsManagerList->Delete();
abaf1f1d 317 delete fSDigitsManagerList;
4487dad0 318 fSDigitsManagerList = 0;
e23fbb27 319 }
320
321 if (fMasks) {
322 delete [] fMasks;
afb9f880 323 fMasks = 0;
e23fbb27 324 }
325
4d18a639 326 if (fTimeStruct1) {
327 delete [] fTimeStruct1;
328 fTimeStruct1 = 0;
3551db50 329 }
330
4d18a639 331 if (fTimeStruct2) {
332 delete [] fTimeStruct2;
333 fTimeStruct2 = 0;
3551db50 334 }
3becff3c 335
f7336fa3 336}
337
8230f242 338//_____________________________________________________________________________
dd9a6ee3 339AliTRDdigitizer &AliTRDdigitizer::operator=(const AliTRDdigitizer &d)
340{
341 //
342 // Assignment operator
343 //
344
345 if (this != &d) ((AliTRDdigitizer &) d).Copy(*this);
4d18a639 346
dd9a6ee3 347 return *this;
348
349}
350
351//_____________________________________________________________________________
e0d47c25 352void AliTRDdigitizer::Copy(TObject &d) const
8230f242 353{
354 //
355 // Copy function
356 //
357
85a5290f 358 ((AliTRDdigitizer &) d).fRunLoader = 0;
4487dad0 359 ((AliTRDdigitizer &) d).fDigitsManager = 0;
85a5290f 360 ((AliTRDdigitizer &) d).fSDigitsManager = 0;
361 ((AliTRDdigitizer &) d).fSDigitsManagerList = 0;
4487dad0 362 ((AliTRDdigitizer &) d).fTRD = 0;
363 ((AliTRDdigitizer &) d).fGeo = 0;
85a5290f 364 ((AliTRDdigitizer &) d).fEvent = 0;
365 ((AliTRDdigitizer &) d).fMasks = 0;
abaf1f1d 366 ((AliTRDdigitizer &) d).fCompress = fCompress;
abaf1f1d 367 ((AliTRDdigitizer &) d).fSDigits = fSDigits;
368 ((AliTRDdigitizer &) d).fSDigitsScale = fSDigitsScale;
4487dad0 369 ((AliTRDdigitizer &) d).fMergeSignalOnly = fMergeSignalOnly;
0c24ba98 370
3551db50 371 AliTRDdigitizer& target = (AliTRDdigitizer &) d;
372
3becff3c 373 // Do not copy timestructs, just invalidate lastvdrift.
374 // Next time they are requested, they get recalculated
4d18a639 375 if (target.fTimeStruct1) {
95867fd1 376 delete [] target.fTimeStruct1;
4d18a639 377 target.fTimeStruct1 = 0;
3551db50 378 }
4d18a639 379 if (target.fTimeStruct2) {
95867fd1 380 delete [] target.fTimeStruct2;
4d18a639 381 target.fTimeStruct2 = 0;
3becff3c 382 }
4d18a639 383 target.fTimeLastVdrift = -1;
3becff3c 384
e23fbb27 385}
386
e23fbb27 387//_____________________________________________________________________________
4d18a639 388void AliTRDdigitizer::Exec(Option_t *option)
e23fbb27 389{
390 //
391 // Executes the merging
392 //
393
394 Int_t iInput;
395
396 AliTRDdigitsManager *sdigitsManager;
397
398 TString optionString = option;
399 if (optionString.Contains("deb")) {
9afbd7de 400 AliLog::SetClassDebugLevel("AliTRDdigitizer",1);
7925de54 401 AliInfo("Called with debug option");
e23fbb27 402 }
403
cec4059b 404 // The AliRoot file is already connected by the manager
4d18a639 405 AliRunLoader *inrl;
88cb7938 406
9afbd7de 407 if (gAlice) {
7925de54 408 AliDebug(1,"AliRun object found on file.");
9afbd7de 409 }
4487dad0 410 else {
88cb7938 411 inrl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(0));
412 inrl->LoadgAlice();
413 gAlice = inrl->GetAliRun();
9afbd7de 414 if (!gAlice) {
7925de54 415 AliError("Could not find AliRun object.")
9afbd7de 416 return;
417 }
4487dad0 418 }
cec4059b 419
e23fbb27 420 Int_t nInput = fManager->GetNinputs();
4d18a639 421 fMasks = new Int_t[nInput];
e23fbb27 422 for (iInput = 0; iInput < nInput; iInput++) {
423 fMasks[iInput] = fManager->GetMask(iInput);
424 }
e23fbb27 425
9afbd7de 426 //
e23fbb27 427 // Initialization
9afbd7de 428 //
e23fbb27 429
95867fd1 430 AliRunLoader *orl = AliRunLoader::GetRunLoader(fManager->GetOutputFolderName());
431
67c67368 432 if (InitDetector()) {
9afbd7de 433
95867fd1 434 AliLoader *ogime = orl->GetLoader("TRDLoader");
67c67368 435
95867fd1 436 TTree *tree = 0;
9afbd7de 437 if (fSDigits) {
438 // If we produce SDigits
439 tree = ogime->TreeS();
440 if (!tree) {
441 ogime->MakeTree("S");
67c67368 442 tree = ogime->TreeS();
67c67368 443 }
9afbd7de 444 }
445 else {
446 // If we produce Digits
447 tree = ogime->TreeD();
448 if (!tree) {
449 ogime->MakeTree("D");
450 tree = ogime->TreeD();
67c67368 451 }
9afbd7de 452 }
453
67c67368 454 MakeBranch(tree);
9afbd7de 455
67c67368 456 }
457
e23fbb27 458 for (iInput = 0; iInput < nInput; iInput++) {
459
7925de54 460 AliDebug(1,Form("Add input stream %d",iInput));
e23fbb27 461
9afbd7de 462 // Check if the input tree exists
88cb7938 463 inrl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(iInput));
4d18a639 464 AliLoader *gime = inrl->GetLoader("TRDLoader");
88cb7938 465
4d18a639 466 TTree *treees = gime->TreeS();
9afbd7de 467 if (treees == 0x0) {
468 if (gime->LoadSDigits()) {
469 AliError(Form("Error Occured while loading S. Digits for input %d.",iInput));
470 return;
471 }
4d18a639 472 treees = gime->TreeS();
9afbd7de 473 }
88cb7938 474
475 if (treees == 0x0) {
7925de54 476 AliError(Form("Input stream %d does not exist",iInput));
c57e2264 477 return;
478 }
479
e23fbb27 480 // Read the s-digits via digits manager
481 sdigitsManager = new AliTRDdigitsManager();
e23fbb27 482 sdigitsManager->SetSDigits(kTRUE);
88cb7938 483
4d18a639 484 AliRunLoader *rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(iInput));
485 AliLoader *gimme = rl->GetLoader("TRDLoader");
486 if (!gimme->TreeS()) {
487 gimme->LoadSDigits();
488 }
88cb7938 489 sdigitsManager->ReadDigits(gimme->TreeS());
e23fbb27 490
491 // Add the s-digits to the input list
492 AddSDigitsManager(sdigitsManager);
493
494 }
495
496 // Convert the s-digits to normal digits
7925de54 497 AliDebug(1,"Do the conversion");
e23fbb27 498 SDigits2Digits();
499
500 // Store the digits
7925de54 501 AliDebug(1,"Write the digits");
e23fbb27 502 fDigitsManager->WriteDigits();
88cb7938 503
9afbd7de 504 // Write parameters
67c67368 505 orl->CdGAFile();
67c67368 506
7925de54 507 AliDebug(1,"Done");
e23fbb27 508
b1113c6b 509 DeleteSDigitsManager();
510
e23fbb27 511}
512
f7336fa3 513//_____________________________________________________________________________
e23fbb27 514Bool_t AliTRDdigitizer::Open(const Char_t *file, Int_t nEvent)
f7336fa3 515{
516 //
517 // Opens a ROOT-file with TRD-hits and reads in the hit-tree
518 //
f7336fa3 519 // Connect the AliRoot file containing Geometry, Kine, and Hits
3becff3c 520 //
f540341d 521
e191bb57 522 TString evfoldname = AliConfig::GetDefaultEventFolderName();
9afbd7de 523
f540341d 524 fRunLoader = AliRunLoader::GetRunLoader(evfoldname);
9afbd7de 525 if (!fRunLoader) {
526 fRunLoader = AliRunLoader::Open(file,evfoldname,"UPDATE");
527 }
9afbd7de 528 if (!fRunLoader) {
95867fd1 529 AliError(Form("Can not open session for file %s.",file));
530 return kFALSE;
531 }
532
533 if (!fRunLoader->GetAliRun()) {
534 fRunLoader->LoadgAlice();
535 }
536 gAlice = fRunLoader->GetAliRun();
537
538 if (gAlice) {
7925de54 539 AliDebug(1,"AliRun object found on file.");
95867fd1 540 }
541 else {
7925de54 542 AliError("Could not find AliRun object.");
95867fd1 543 return kFALSE;
544 }
545
546 fEvent = nEvent;
547
548 AliLoader *loader = fRunLoader->GetLoader("TRDLoader");
549 if (!loader) {
550 AliError("Can not get TRD loader from Run Loader");
551 return kFALSE;
552 }
553
554 if (InitDetector()) {
555 TTree *tree = 0;
556 if (fSDigits) {
557 // If we produce SDigits
558 tree = loader->TreeS();
559 if (!tree) {
560 loader->MakeTree("S");
561 tree = loader->TreeS();
562 }
563 }
564 else {
565 // If we produce Digits
566 tree = loader->TreeD();
567 if (!tree) {
568 loader->MakeTree("D");
569 tree = loader->TreeD();
570 }
571 }
572 return MakeBranch(tree);
573 }
574 else {
575 return kFALSE;
576 }
577
578}
579
580//_____________________________________________________________________________
581Bool_t AliTRDdigitizer::Open(AliRunLoader *runLoader, Int_t nEvent)
582{
583 //
584 // Opens a ROOT-file with TRD-hits and reads in the hit-tree
585 //
586 // Connect the AliRoot file containing Geometry, Kine, and Hits
587 //
588
589 fRunLoader = runLoader;
590 if (!fRunLoader) {
591 AliError("RunLoader does not exist");
592 return kFALSE;
4d18a639 593 }
88cb7938 594
9afbd7de 595 if (!fRunLoader->GetAliRun()) {
596 fRunLoader->LoadgAlice();
597 }
88cb7938 598 gAlice = fRunLoader->GetAliRun();
599
da581aea 600 if (gAlice) {
7925de54 601 AliDebug(1,"AliRun object found on file.");
da581aea 602 }
603 else {
7925de54 604 AliError("Could not find AliRun object.");
da581aea 605 return kFALSE;
606 }
f7336fa3 607
608 fEvent = nEvent;
609
4d18a639 610 AliLoader *loader = fRunLoader->GetLoader("TRDLoader");
9afbd7de 611 if (!loader) {
612 AliError("Can not get TRD loader from Run Loader");
613 return kFALSE;
614 }
88cb7938 615
abaf1f1d 616 if (InitDetector()) {
4d18a639 617 TTree *tree = 0;
9afbd7de 618 if (fSDigits) {
619 // If we produce SDigits
620 tree = loader->TreeS();
621 if (!tree) {
622 loader->MakeTree("S");
623 tree = loader->TreeS();
4d18a639 624 }
9afbd7de 625 }
626 else {
627 // If we produce Digits
95867fd1 628 tree = loader->TreeD();
9afbd7de 629 if (!tree) {
630 loader->MakeTree("D");
631 tree = loader->TreeD();
4d18a639 632 }
9afbd7de 633 }
88cb7938 634 return MakeBranch(tree);
abaf1f1d 635 }
636 else {
637 return kFALSE;
638 }
793ff80c 639
640}
641
642//_____________________________________________________________________________
643Bool_t AliTRDdigitizer::InitDetector()
644{
645 //
646 // Sets the pointer to the TRD detector and the geometry
647 //
648
dd9a6ee3 649 // Get the pointer to the detector class and check for version 1
4487dad0 650 fTRD = (AliTRD *) gAlice->GetDetector("TRD");
cec4059b 651 if (!fTRD) {
7925de54 652 AliFatal("No TRD module found");
cec4059b 653 exit(1);
654 }
dd9a6ee3 655 if (fTRD->IsVersion() != 1) {
7925de54 656 AliFatal("TRD must be version 1 (slow simulator)");
dd9a6ee3 657 exit(1);
658 }
659
660 // Get the geometry
661 fGeo = fTRD->GetGeometry();
7925de54 662 AliDebug(1,Form("Geometry version %d",fGeo->IsVersion()));
dd9a6ee3 663
abaf1f1d 664 // Create a digits manager
47b5729a 665 delete fDigitsManager;
abaf1f1d 666 fDigitsManager = new AliTRDdigitsManager();
667 fDigitsManager->SetSDigits(fSDigits);
668 fDigitsManager->CreateArrays();
669 fDigitsManager->SetEvent(fEvent);
abaf1f1d 670
671 // The list for the input s-digits manager to be merged
47b5729a 672 if (fSDigitsManagerList) {
673 fSDigitsManagerList->Delete();
3becff3c 674 }
675 else {
47b5729a 676 fSDigitsManagerList = new TList();
677 }
abaf1f1d 678
4487dad0 679 return kTRUE;
f7336fa3 680
681}
682
6244debe 683//_____________________________________________________________________________
95867fd1 684Bool_t AliTRDdigitizer::MakeBranch(TTree *tree) const
6244debe 685{
abaf1f1d 686 //
687 // Create the branches for the digits array
6244debe 688 //
689
88cb7938 690 return fDigitsManager->MakeBranch(tree);
6244debe 691
692}
693
f7336fa3 694//_____________________________________________________________________________
695Bool_t AliTRDdigitizer::MakeDigits()
696{
697 //
872a7aba 698 // Creates digits.
f7336fa3 699 //
700
f7336fa3 701 ///////////////////////////////////////////////////////////////
702 // Parameter
703 ///////////////////////////////////////////////////////////////
704
705 // Converts number of electrons to fC
4d18a639 706 const Double_t kEl2fC = 1.602e-19 * 1.0e15;
f7336fa3 707
708 ///////////////////////////////////////////////////////////////
709
793ff80c 710 // Number of pads included in the pad response
a5cadd36 711 const Int_t kNpad = 3;
793ff80c 712
713 // Number of track dictionary arrays
a5cadd36 714 const Int_t kNDict = AliTRDdigitsManager::kNDict;
793ff80c 715
afb9f880 716 // Width of the amplification region
717 const Float_t kAmWidth = AliTRDgeometry::AmThick();
3becff3c 718 // Width of the drift region
ccb4315c 719 const Float_t kDrWidth = AliTRDgeometry::DrThick();
afb9f880 720 // Drift + amplification region
721 const Float_t kDrMin = - 0.5 * kAmWidth;
722 const Float_t kDrMax = kDrWidth + 0.5 * kAmWidth;
3551db50 723
4d18a639 724 Int_t iRow;
725 Int_t iCol;
726 Int_t iTime;
727 Int_t iPad;
a5cadd36 728 Int_t iDict = 0;
729 Int_t nBytes = 0;
f7336fa3 730
a5cadd36 731 Int_t totalSizeDigits = 0;
732 Int_t totalSizeDict0 = 0;
733 Int_t totalSizeDict1 = 0;
734 Int_t totalSizeDict2 = 0;
f7336fa3 735
a5cadd36 736 Int_t timeBinTRFend = 1;
872a7aba 737
a5cadd36 738 Double_t pos[3];
afb9f880 739 Double_t loc[3];
a5cadd36 740 Double_t padSignal[kNpad];
741 Double_t signalOld[kNpad];
872a7aba 742
a5cadd36 743 AliTRDdataArrayF *signals = 0;
744 AliTRDdataArrayI *digits = 0;
8230f242 745 AliTRDdataArrayI *dictionary[kNDict];
da581aea 746
a5cadd36 747 AliTRDpadPlane *padPlane = 0;
748
afb9f880 749 AliTRDCalROC *calVdriftROC = 0;
750 Float_t calVdriftDetValue = 0.0;
751 AliTRDCalROC *calT0ROC = 0;
752 Float_t calT0DetValue = 0.0;
753 AliTRDCalROC *calGainFactorROC = 0;
754 Float_t calGainFactorDetValue = 0.0;
755
9afbd7de 756 if (!gGeoManager) {
757 AliFatal("No geometry manager!");
758 }
7754cd1f 759
afb9f880 760 if (!fGeo) {
761 AliError("No geometry defined");
762 return kFALSE;
763 }
764 fGeo->ReadGeoMatrices();
765
9afbd7de 766 AliTRDSimParam *simParam = AliTRDSimParam::Instance();
3becff3c 767 if (!simParam) {
afb9f880 768 AliFatal("Could not get simulation parameters");
3551db50 769 return kFALSE;
770 }
771
9afbd7de 772 AliTRDCommonParam *commonParam = AliTRDCommonParam::Instance();
3becff3c 773 if (!commonParam) {
afb9f880 774 AliFatal("Could not get common parameterss");
3551db50 775 return kFALSE;
776 }
793ff80c 777
afb9f880 778 AliTRDcalibDB *calibration = AliTRDcalibDB::Instance();
3becff3c 779 if (!calibration) {
c3714958 780 AliFatal("Could not get calibration object");
3551db50 781 return kFALSE;
782 }
783
afb9f880 784 AliDebug(1,"Start creating digits");
785
786 // Create a container for the amplitudes
787 AliTRDsegmentArray *signalsArray = new AliTRDsegmentArray("AliTRDdataArrayF"
788 ,AliTRDgeometry::Ndet());
872a7aba 789
4d18a639 790 AliLoader *gimme = fRunLoader->GetLoader("TRDLoader");
9afbd7de 791 if (!gimme->TreeH()) {
792 gimme->LoadHits();
793 }
4d18a639 794 TTree *hitTree = gimme->TreeH();
3becff3c 795 if (hitTree == 0x0) {
9afbd7de 796 AliError("Can not get TreeH");
797 return kFALSE;
3becff3c 798 }
88cb7938 799 fTRD->SetTreeAddress();
afb9f880 800
793ff80c 801 // Get the number of entries in the hit tree
802 // (Number of primary particles creating a hit somewhere)
3becff3c 803 Int_t nTrack = (Int_t) hitTree->GetEntries();
7925de54 804 AliDebug(1,Form("Found %d primary particles",nTrack));
805 AliDebug(1,Form("Sampling = %.0fMHz" ,commonParam->GetSamplingFrequency()));
806 AliDebug(1,Form("Gain = %d" ,((Int_t) simParam->GetGasGain())));
807 AliDebug(1,Form("Noise = %d" ,((Int_t) simParam->GetNoise())));
9afbd7de 808 if (simParam->TimeStructOn()) {
7925de54 809 AliDebug(1,"Time Structure of drift cells implemented.");
9afbd7de 810 }
811 else {
7925de54 812 AliDebug(1,"Constant drift velocity in drift cells.");
a328fff9 813 }
afb9f880 814 if (simParam->TRFOn()) {
815 timeBinTRFend = ((Int_t) (simParam->GetTRFhi()
816 * commonParam->GetSamplingFrequency())) - 1;
817 AliDebug(1,Form("Sample the TRF up to bin %d",timeBinTRFend));
818 }
819
820 // Get the detector wise calibration objects
821 const AliTRDCalDet *calVdriftDet = calibration->GetVdriftDet();
822 const AliTRDCalDet *calT0Det = calibration->GetT0Det();
823 const AliTRDCalDet *calGainFactorDet = calibration->GetGainFactorDet();
824
9afbd7de 825 Int_t detectorOld = -1;
826 Int_t countHits = 0;
827
3becff3c 828 Int_t nTimeTotal = calibration->GetNumberOfTimeBins();
b43a3e17 829 Float_t samplingRate = commonParam->GetSamplingFrequency();
afb9f880 830 Float_t elAttachProp = simParam->GetElAttachProp() / 100.0;
a328fff9 831
793ff80c 832 // Loop through all entries in the tree
833 for (Int_t iTrack = 0; iTrack < nTrack; iTrack++) {
834
3becff3c 835 gAlice->ResetHits();
836 nBytes += hitTree->GetEvent(iTrack);
793ff80c 837
e23fbb27 838 // Loop through the TRD hits
839 Int_t iHit = 0;
840 AliTRDhit *hit = (AliTRDhit *) fTRD->FirstHit(-1);
841 while (hit) {
842
793ff80c 843 countHits++;
e23fbb27 844 iHit++;
845
f881dc35 846 Float_t q = hit->GetCharge();
b08ed1cf 847 // Don't analyze test hits
f881dc35 848 if (((Int_t) q) == 0) {
849 hit = (AliTRDhit *) fTRD->NextHit();
850 continue;
851 }
e153aaf6 852
f881dc35 853 pos[0] = hit->X();
854 pos[1] = hit->Y();
855 pos[2] = hit->Z();
856 Int_t track = hit->Track();
857 Int_t detector = hit->GetDetector();
858 Int_t plane = fGeo->GetPlane(detector);
859 Int_t chamber = fGeo->GetChamber(detector);
f881dc35 860 padPlane = commonParam->GetPadPlane(plane,chamber);
e2db9fdc 861 Float_t row0 = padPlane->GetRow0ROC();
f881dc35 862 Int_t nRowMax = padPlane->GetNrows();
863 Int_t nColMax = padPlane->GetNcols();
864 Int_t inDrift = 1;
865
866 // Find the current volume with the geo manager
867 gGeoManager->SetCurrentPoint(pos);
868 gGeoManager->FindNode();
869 if (strstr(gGeoManager->GetPath(),"/UK")) {
870 inDrift = 0;
871 }
872
873 if (detector != detectorOld) {
874
875 // Compress the old one if enabled
876 if ((fCompress) && (detectorOld > -1)) {
877 signals->Compress(1,0);
878 for (iDict = 0; iDict < kNDict; iDict++) {
879 dictionary[iDict]->Compress(1,0);
880 }
881 }
882 // Get the new container
883 signals = (AliTRDdataArrayF *) signalsArray->At(detector);
884 if (signals->GetNtime() == 0) {
885 // Allocate a new one if not yet existing
886 signals->Allocate(nRowMax,nColMax,nTimeTotal);
887 }
888 else {
889 // Expand an existing one
890 if (fCompress) {
891 signals->Expand();
793ff80c 892 }
f881dc35 893 }
894 // The same for the dictionary
895 for (iDict = 0; iDict < kNDict; iDict++) {
896 dictionary[iDict] = fDigitsManager->GetDictionary(detector,iDict);
897 if (dictionary[iDict]->GetNtime() == 0) {
898 dictionary[iDict]->Allocate(nRowMax,nColMax,nTimeTotal);
793ff80c 899 }
900 else {
f881dc35 901 if (fCompress) dictionary[iDict]->Expand();
902 }
903 }
afb9f880 904
905 // Get the calibration objects
906 calVdriftROC = calibration->GetVdriftROC(detector);
907 calVdriftDetValue = calVdriftDet->GetValue(detector);
908 calT0ROC = calibration->GetT0ROC(detector);
909 calT0DetValue = calT0Det->GetValue(detector);
910
f881dc35 911 detectorOld = detector;
afb9f880 912
f881dc35 913 }
793ff80c 914
afb9f880 915 // Go to the local coordinate system:
916 // loc[0] - row direction in amplification or driftvolume
917 // loc[1] - col direction in amplification or driftvolume
918 // loc[2] - time direction in amplification or driftvolume
919 gGeoManager->MasterToLocal(pos,loc);
920 // Now the real local coordinate system of the ROC
921 // row direction: locR
922 // column direction: locC
923 // time direction: locT
924 // locR and locC are identical to the coordinates of the corresponding
925 // volumina of the drift or amplification region.
926 // locT is defined relative to the wire plane (i.e. middle of amplification
927 // region), meaming locT = 0, and is negative for hits coming from the
928 // drift region.
929 Double_t locR = loc[0];
930 Double_t locC = loc[1];
931 Double_t locT = loc[2];
f881dc35 932 if (inDrift) {
afb9f880 933 // locT relative to middle of amplification region
934 locT = locT - kDrWidth/2.0 - kAmWidth/2.0;
f881dc35 935 }
f881dc35 936
afb9f880 937 // The driftlength (w/o diffusion yet !).
938 // It is negative if the hit is between pad plane and anode wires.
939 Double_t driftlength = -1.0 * locT;
f881dc35 940
941 // Loop over all electrons of this hit
942 // TR photons produce hits with negative charge
943 Int_t nEl = ((Int_t) TMath::Abs(q));
944 for (Int_t iEl = 0; iEl < nEl; iEl++) {
945
f881dc35 946 // Stupid patch to take care of TR photons that are absorbed
947 // outside the chamber volume. A real fix would actually need
948 // a more clever implementation of the TR hit generation
949 if (q < 0.0) {
e2db9fdc 950 if ((locR < padPlane->GetRowEndROC()) ||
951 (locR > padPlane->GetRow0ROC())) {
f881dc35 952 if (iEl == 0) {
afb9f880 953 AliDebug(2,Form("Hit outside of sensitive volume, row (z=%f, row0=%f, rowE=%f)\n"
e2db9fdc 954 ,locR,padPlane->GetRow0ROC(),padPlane->GetRowEndROC()));
a328fff9 955 }
f881dc35 956 continue;
957 }
afb9f880 958 if ((driftlength < kDrMin) ||
959 (driftlength > kDrMax)) {
f881dc35 960 if (iEl == 0) {
afb9f880 961 AliDebug(2,Form("Hit outside of sensitive volume, time (Q = %d)\n"
f881dc35 962 ,((Int_t) q)));
a328fff9 963 }
f881dc35 964 continue;
a328fff9 965 }
f881dc35 966 }
a328fff9 967
f881dc35 968 // Get row and col of unsmeared electron to retrieve drift velocity
969 // The pad row (z-direction)
e2db9fdc 970 Int_t rowE = padPlane->GetPadRowNumberROC(locR);
f881dc35 971 if (rowE < 0) continue;
e2db9fdc 972 Double_t rowOffset = padPlane->GetPadRowOffsetROC(rowE,locR);
e23fbb27 973
f881dc35 974 // The pad column (rphi-direction)
975 Double_t offsetTilt = padPlane->GetTiltOffset(rowOffset);
afb9f880 976 Int_t colE = padPlane->GetPadColNumber(locC+offsetTilt);
f881dc35 977 if (colE < 0) continue;
afb9f880 978 Double_t colOffset = padPlane->GetPadColOffset(colE,locC+offsetTilt);
ccb4315c 979
afb9f880 980 Float_t driftvelocity = calVdriftDetValue * calVdriftROC->GetValue(colE,rowE);
3551db50 981
afb9f880 982 // Normalized drift length
f881dc35 983 Double_t absdriftlength = TMath::Abs(driftlength);
984 if (commonParam->ExBOn()) {
985 absdriftlength /= TMath::Sqrt(GetLorentzFactor(driftvelocity));
986 }
3551db50 987
f881dc35 988 // Electron attachment
989 if (simParam->ElAttachOn()) {
afb9f880 990 if (gRandom->Rndm() < (absdriftlength * elAttachProp)) {
991 continue;
992 }
f881dc35 993 }
3551db50 994
f881dc35 995 // Apply the diffusion smearing
996 if (simParam->DiffusionOn()) {
afb9f880 997 if (!(Diffusion(driftvelocity,absdriftlength,locR,locC,locT))) {
998 continue;
999 }
f881dc35 1000 }
3551db50 1001
f881dc35 1002 // Apply E x B effects (depends on drift direction)
1003 if (commonParam->ExBOn()) {
afb9f880 1004 if (!(ExB(driftvelocity,driftlength,locR))) {
1005 continue;
1006 }
f881dc35 1007 }
3551db50 1008
f881dc35 1009 // The electron position after diffusion and ExB in pad coordinates.
1010 // The pad row (z-direction)
e2db9fdc 1011 rowE = padPlane->GetPadRowNumberROC(locR);
f881dc35 1012 if (rowE < 0) continue;
e2db9fdc 1013 rowOffset = padPlane->GetPadRowOffsetROC(rowE,locR);
f881dc35 1014
1015 // The pad column (rphi-direction)
1016 offsetTilt = padPlane->GetTiltOffset(rowOffset);
afb9f880 1017 colE = padPlane->GetPadColNumber(locC+offsetTilt);
f881dc35 1018 if (colE < 0) continue;
afb9f880 1019 colOffset = padPlane->GetPadColOffset(colE,locC+offsetTilt);
3551db50 1020
f881dc35 1021 // Also re-retrieve drift velocity because col and row may have changed
afb9f880 1022 driftvelocity = calVdriftDetValue * calVdriftROC->GetValue(colE,rowE);
1023 Float_t t0 = calT0DetValue + calT0ROC->GetValue(colE,rowE);
d4c6453d 1024
f881dc35 1025 // Convert the position to drift time, using either constant drift velocity or
1026 // time structure of drift cells (non-isochronity, GARFIELD calculation).
1027 Double_t drifttime;
1028 if (simParam->TimeStructOn()) {
afb9f880 1029 // Get z-position with respect to anode wire
1030 Double_t Z = row0 - locR + simParam->GetAnodeWireOffset();
f881dc35 1031 Z -= ((Int_t)(2 * Z)) / 2.0;
1032 if (Z > 0.25) {
1033 Z = 0.5 - Z;
e23fbb27 1034 }
f881dc35 1035 // Use drift time map (GARFIELD)
afb9f880 1036 drifttime = TimeStruct(driftvelocity,0.5*kAmWidth-1.0*locT,Z);
f881dc35 1037 }
1038 else {
1039 // Use constant drift velocity
afb9f880 1040 drifttime = -1.0 * locT / driftvelocity;
f881dc35 1041 }
ccb4315c 1042
f881dc35 1043 // Apply the gas gain including fluctuations
1044 Double_t ggRndm = 0.0;
1045 do {
1046 ggRndm = gRandom->Rndm();
1047 } while (ggRndm <= 0);
1048 Int_t signal = (Int_t) (-(simParam->GetGasGain()) * TMath::Log(ggRndm));
1049
1050 // Apply the pad response
1051 if (simParam->PRFOn()) {
1052 // The distance of the electron to the center of the pad
1053 // in units of pad width
1054 Double_t dist = (colOffset - 0.5*padPlane->GetColSize(colE))
1055 / padPlane->GetColSize(colE);
afb9f880 1056 // This is still the fixed parametrization, i.e. not dependent on
1057 // calibration values !!!!
f881dc35 1058 if (!(calibration->PadResponse(signal,dist,plane,padSignal))) continue;
1059 }
1060 else {
1061 padSignal[0] = 0.0;
1062 padSignal[1] = signal;
1063 padSignal[2] = 0.0;
1064 }
e23fbb27 1065
e2db9fdc 1066 // The time bin (always positive), with t0 distortion
f881dc35 1067 Double_t timeBinIdeal = drifttime * samplingRate + t0;
1068 // Protection
1069 if (TMath::Abs(timeBinIdeal) > 2*nTimeTotal) {
1070 timeBinIdeal = 2 * nTimeTotal;
1071 }
1072 Int_t timeBinTruncated = (Int_t) timeBinIdeal;
1073 // The distance of the position to the middle of the timebin
1074 Double_t timeOffset = ((Float_t) timeBinTruncated
1075 + 0.5 - timeBinIdeal) / samplingRate;
6a739e92 1076
f881dc35 1077 // Sample the time response inside the drift region
1078 // + additional time bins before and after.
1079 // The sampling is done always in the middle of the time bin
afb9f880 1080 for (Int_t iTimeBin = TMath::Max(timeBinTruncated,0)
1081 ;iTimeBin < TMath::Min(timeBinTruncated+timeBinTRFend,nTimeTotal)
1082 ;iTimeBin++) {
f881dc35 1083
1084 // Apply the time response
1085 Double_t timeResponse = 1.0;
1086 Double_t crossTalk = 0.0;
1087 Double_t time = (iTimeBin - timeBinTruncated) / samplingRate + timeOffset;
1088 if (simParam->TRFOn()) {
1089 timeResponse = simParam->TimeResponse(time);
1090 }
1091 if (simParam->CTOn()) {
1092 crossTalk = simParam->CrossTalk(time);
1093 }
e23fbb27 1094
f881dc35 1095 signalOld[0] = 0.0;
1096 signalOld[1] = 0.0;
1097 signalOld[2] = 0.0;
f7336fa3 1098
f881dc35 1099 for (iPad = 0; iPad < kNpad; iPad++) {
e23fbb27 1100
f881dc35 1101 Int_t colPos = colE + iPad - 1;
1102 if (colPos < 0) continue;
1103 if (colPos >= nColMax) break;
e23fbb27 1104
f881dc35 1105 // Add the signals
1106 Int_t iCurrentTimeBin = iTimeBin;
1107 signalOld[iPad] = signals->GetDataUnchecked(rowE,colPos,iCurrentTimeBin);
1108 if (colPos != colE) {
1109 signalOld[iPad] += padSignal[iPad] * (timeResponse + crossTalk);
1110 }
1111 else {
1112 signalOld[iPad] += padSignal[iPad] * timeResponse;
1113 }
1114 signals->SetDataUnchecked(rowE,colPos,iCurrentTimeBin,signalOld[iPad]);
1115
1116 // Store the track index in the dictionary
1117 // Note: We store index+1 in order to allow the array to be compressed
1118 if (signalOld[iPad] > 0) {
1119 for (iDict = 0; iDict < kNDict; iDict++) {
1120 Int_t oldTrack = dictionary[iDict]->GetDataUnchecked(rowE
1121 ,colPos
1122 ,iCurrentTimeBin);
1123 if (oldTrack == track+1) break;
1124 if (oldTrack == 0) {
1125 dictionary[iDict]->SetDataUnchecked(rowE,colPos,iCurrentTimeBin,track+1);
1126 break;
71d9fa7b 1127 }
1128 }
f881dc35 1129 }
872a7aba 1130
f881dc35 1131 } // Loop: pads
f7336fa3 1132
f881dc35 1133 } // Loop: time bins
f7336fa3 1134
f881dc35 1135 } // Loop: electrons of a single hit
f7336fa3 1136
e23fbb27 1137 hit = (AliTRDhit *) fTRD->NextHit();
f7336fa3 1138
e23fbb27 1139 } // Loop: hits of one primary track
1140
1141 } // Loop: primary tracks
1142
7925de54 1143 AliDebug(1,Form("Finished analyzing %d hits",countHits));
793ff80c 1144
afb9f880 1145 //____________________________________________________________________
1146 //
1147 // Create (s)digits
1148 //____________________________________________________________________
1149 //
1150
0c24ba98 1151 // The coupling factor
3551db50 1152 Double_t coupling = simParam->GetPadCoupling()
9afbd7de 1153 * simParam->GetTimeCoupling();
0c24ba98 1154
1155 // The conversion factor
9afbd7de 1156 Double_t convert = kEl2fC
1157 * simParam->GetChipGain();
6244debe 1158
793ff80c 1159 // Loop through all chambers to finalize the digits
0c24ba98 1160 Int_t iDetBeg = 0;
1161 Int_t iDetEnd = AliTRDgeometry::Ndet();
0c24ba98 1162 for (Int_t iDet = iDetBeg; iDet < iDetEnd; iDet++) {
793ff80c 1163
4d18a639 1164 Int_t plane = fGeo->GetPlane(iDet);
1165 Int_t sector = fGeo->GetSector(iDet);
1166 Int_t chamber = fGeo->GetChamber(iDet);
1167 Int_t nRowMax = commonParam->GetRowMax(plane,chamber,sector);
1168 Int_t nColMax = commonParam->GetColMax(plane);
793ff80c 1169
4d18a639 1170 Double_t *inADC = new Double_t[nTimeTotal];
1171 Double_t *outADC = new Double_t[nTimeTotal];
e23fbb27 1172
793ff80c 1173 // Add a container for the digits of this detector
abaf1f1d 1174 digits = fDigitsManager->GetDigits(iDet);
793ff80c 1175 // Allocate memory space for the digits buffer
0c24ba98 1176 if (digits->GetNtime() == 0) {
1177 digits->Allocate(nRowMax,nColMax,nTimeTotal);
1178 }
0c24ba98 1179
793ff80c 1180 // Get the signal container
1181 signals = (AliTRDdataArrayF *) signalsArray->At(iDet);
1182 if (signals->GetNtime() == 0) {
1183 // Create missing containers
872a7aba 1184 signals->Allocate(nRowMax,nColMax,nTimeTotal);
793ff80c 1185 }
1186 else {
1187 // Expand the container if neccessary
1188 if (fCompress) signals->Expand();
1189 }
1190 // Create the missing dictionary containers
3becff3c 1191 for (iDict = 0; iDict < kNDict; iDict++) {
1192 dictionary[iDict] = fDigitsManager->GetDictionary(iDet,iDict);
1193 if (dictionary[iDict]->GetNtime() == 0) {
1194 dictionary[iDict]->Allocate(nRowMax,nColMax,nTimeTotal);
0c24ba98 1195 }
793ff80c 1196 }
f7336fa3 1197
793ff80c 1198 Int_t nDigits = 0;
1199
9afbd7de 1200 // Don't create noise in detectors that are switched off / not installed, etc.
6bf5f0ce 1201 if (( calibration->IsChamberInstalled(iDet)) &&
1202 (!calibration->IsChamberMasked(iDet)) &&
1203 ( fGeo->GetSMstatus(sector))) {
6244debe 1204
afb9f880 1205 // Get the calibration objects
1206 calGainFactorROC = calibration->GetGainFactorROC(iDet);
1207 calGainFactorDetValue = calGainFactorDet->GetValue(iDet);
1208
6244debe 1209 // Create the digits for this chamber
872a7aba 1210 for (iRow = 0; iRow < nRowMax; iRow++ ) {
1211 for (iCol = 0; iCol < nColMax; iCol++ ) {
6244debe 1212
6bf5f0ce 1213 // Check whether pad is masked
1214 // Bridged pads are not considered yet!!!
afb9f880 1215 if (calibration->IsPadMasked(iDet,iCol,iRow)) {
1216 continue;
1217 }
9afbd7de 1218
e23fbb27 1219 // Create summable digits
1220 if (fSDigits) {
6244debe 1221
e23fbb27 1222 for (iTime = 0; iTime < nTimeTotal; iTime++) {
872a7aba 1223 Float_t signalAmp = signals->GetDataUnchecked(iRow,iCol,iTime);
abaf1f1d 1224 signalAmp *= fSDigitsScale;
e23fbb27 1225 signalAmp = TMath::Min(signalAmp,(Float_t) 1.0e9);
abaf1f1d 1226 Int_t adc = (Int_t) signalAmp;
4487dad0 1227 if (adc > 0) nDigits++;
872a7aba 1228 digits->SetDataUnchecked(iRow,iCol,iTime,adc);
c1e4b257 1229 }
6244debe 1230
e23fbb27 1231 }
1232 // Create normal digits
1233 else {
6244debe 1234
afb9f880 1235 Float_t padgain = calGainFactorDetValue
1236 * calGainFactorROC->GetValue(iCol,iRow);
1237 if (padgain <= 0) {
1238 AliError(Form("Not a valid gain %f, %d %d %d",padgain,iDet,iCol,iRow));
1239 }
1240
e23fbb27 1241 for (iTime = 0; iTime < nTimeTotal; iTime++) {
4d18a639 1242
e23fbb27 1243 Float_t signalAmp = signals->GetDataUnchecked(iRow,iCol,iTime);
11dc3a9e 1244
0c24ba98 1245 // Pad and time coupling
1246 signalAmp *= coupling;
afb9f880 1247 // Gain factors
7eea788e 1248 signalAmp *= padgain;
11dc3a9e 1249
7e582e9f 1250 // Add the noise, starting from minus ADC baseline in electrons
3551db50 1251 Double_t baselineEl = simParam->GetADCbaseline() * (simParam->GetADCinRange()
4d18a639 1252 / simParam->GetADCoutRange())
1253 / convert;
3551db50 1254 signalAmp = TMath::Max((Double_t) gRandom->Gaus(signalAmp,simParam->GetNoise())
7e582e9f 1255 ,-baselineEl);
6244debe 1256 // Convert to mV
1257 signalAmp *= convert;
7e582e9f 1258 // Add ADC baseline in mV
3551db50 1259 signalAmp += simParam->GetADCbaseline() * (simParam->GetADCinRange()
4d18a639 1260 / simParam->GetADCoutRange());
11dc3a9e 1261 // Convert to ADC counts. Set the overflow-bit fADCoutRange if the
6244debe 1262 // signal is larger than fADCinRange
1263 Int_t adc = 0;
3551db50 1264 if (signalAmp >= simParam->GetADCinRange()) {
1265 adc = ((Int_t) simParam->GetADCoutRange());
6244debe 1266 }
1267 else {
11dc3a9e 1268 adc = TMath::Nint(signalAmp * (simParam->GetADCoutRange()
4d18a639 1269 / simParam->GetADCinRange()));
6244debe 1270 }
11dc3a9e 1271
e23fbb27 1272 inADC[iTime] = adc;
1273 outADC[iTime] = adc;
4d18a639 1274
e23fbb27 1275 }
6244debe 1276
e23fbb27 1277 for (iTime = 0; iTime < nTimeTotal; iTime++) {
6244debe 1278 // Store the amplitude of the digit if above threshold
7925de54 1279 if ( outADC[iTime] > ( simParam->GetADCbaseline() + simParam->GetADCthreshold() ) ) {
6244debe 1280 nDigits++;
3583ac1a 1281 digits->SetDataUnchecked(iRow,iCol,iTime,((Int_t) outADC[iTime]));
6244debe 1282 }
6244debe 1283 }
1284
1285 }
e23fbb27 1286
6244debe 1287 }
793ff80c 1288 }
6244debe 1289
793ff80c 1290 }
1291
1292 // Compress the arrays
3becff3c 1293 digits->Compress(1,0);
1294 for (iDict = 0; iDict < kNDict; iDict++) {
1295 dictionary[iDict]->Compress(1,0);
1296 }
f7336fa3 1297
3becff3c 1298 totalSizeDigits += digits->GetSize();
1299 totalSizeDict0 += dictionary[0]->GetSize();
1300 totalSizeDict1 += dictionary[1]->GetSize();
1301 totalSizeDict2 += dictionary[2]->GetSize();
0c24ba98 1302
f881dc35 1303 if (nDigits > 0) {
1304 Float_t nPixel = nRowMax * nColMax * nTimeTotal;
7925de54 1305 AliDebug(1,Form("Found %d digits in detector %d (%3.0f)."
f881dc35 1306 ,nDigits,iDet
1307 ,100.0 * ((Float_t) nDigits) / nPixel));
1308 }
abaf1f1d 1309
9afbd7de 1310 if (fCompress) {
1311 signals->Compress(1,0);
1312 }
f7336fa3 1313
e23fbb27 1314 delete [] inADC;
1315 delete [] outADC;
1316
f7336fa3 1317 }
1318
0c24ba98 1319 if (signalsArray) {
1320 delete signalsArray;
1321 signalsArray = 0;
1322 }
1323
7925de54 1324 AliDebug(1,Form("Total number of analyzed hits = %d",countHits));
1325 AliDebug(1,Form("Total digits data size = %d, %d, %d, %d",totalSizeDigits
afb9f880 1326 ,totalSizeDict0
1327 ,totalSizeDict1
1328 ,totalSizeDict2));
abaf1f1d 1329
1330 return kTRUE;
1331
1332}
1333
1334//_____________________________________________________________________________
1335void AliTRDdigitizer::AddSDigitsManager(AliTRDdigitsManager *man)
1336{
1337 //
1338 // Add a digits manager for s-digits to the input list.
1339 //
1340
1341 fSDigitsManagerList->Add(man);
1342
1343}
1344
b1113c6b 1345//_____________________________________________________________________________
1346void AliTRDdigitizer::DeleteSDigitsManager()
1347{
1348 //
1349 // Removes digits manager from the input list.
1350 //
1351
1352 fSDigitsManagerList->Delete();
1353
1354}
1355
abaf1f1d 1356//_____________________________________________________________________________
1357Bool_t AliTRDdigitizer::ConvertSDigits()
1358{
1359 //
1360 // Converts s-digits to normal digits
1361 //
1362
1363 // Number of track dictionary arrays
1364 const Int_t kNDict = AliTRDdigitsManager::kNDict;
1365
1366 // Converts number of electrons to fC
4d18a639 1367 const Double_t kEl2fC = 1.602e-19 * 1.0e15;
abaf1f1d 1368
1369 Int_t iDict = 0;
e23fbb27 1370 Int_t iRow;
1371 Int_t iCol;
1372 Int_t iTime;
abaf1f1d 1373
afb9f880 1374 AliTRDCalROC *calGainFactorROC = 0;
1375 Float_t calGainFactorDetValue = 0.0;
1376
1377 AliTRDSimParam *simParam = AliTRDSimParam::Instance();
9afbd7de 1378 if (!simParam) {
afb9f880 1379 AliFatal("Could not get simulation parameters");
3551db50 1380 return kFALSE;
1381 }
1382
4d18a639 1383 AliTRDCommonParam *commonParam = AliTRDCommonParam::Instance();
9afbd7de 1384 if (!commonParam) {
afb9f880 1385 AliFatal("Could not get common parameters");
3551db50 1386 return kFALSE;
1387 }
1388
afb9f880 1389 AliTRDcalibDB *calibration = AliTRDcalibDB::Instance();
9afbd7de 1390 if (!calibration) {
afb9f880 1391 AliFatal("Could not get calibration object");
3551db50 1392 return kFALSE;
1393 }
1394
abaf1f1d 1395 Double_t sDigitsScale = 1.0 / GetSDigitsScale();
3551db50 1396 Double_t noise = simParam->GetNoise();
1397 Double_t padCoupling = simParam->GetPadCoupling();
1398 Double_t timeCoupling = simParam->GetTimeCoupling();
1399 Double_t chipGain = simParam->GetChipGain();
0c24ba98 1400 Double_t coupling = padCoupling * timeCoupling;
1401 Double_t convert = kEl2fC * chipGain;
3551db50 1402 Double_t adcInRange = simParam->GetADCinRange();
1403 Double_t adcOutRange = simParam->GetADCoutRange();
1404 Int_t adcThreshold = simParam->GetADCthreshold();
1405 Int_t adcBaseline = simParam->GetADCbaseline();
9afbd7de 1406 Int_t nTimeTotal = calibration->GetNumberOfTimeBins();
1407
abaf1f1d 1408 AliTRDdataArrayI *digitsIn;
1409 AliTRDdataArrayI *digitsOut;
1410 AliTRDdataArrayI *dictionaryIn[kNDict];
1411 AliTRDdataArrayI *dictionaryOut[kNDict];
afb9f880 1412
1413 // Get the detector wise calibration objects
1414 const AliTRDCalDet *calGainFactorDet = calibration->GetGainFactorDet();
3551db50 1415
abaf1f1d 1416 // Loop through the detectors
1417 for (Int_t iDet = 0; iDet < AliTRDgeometry::Ndet(); iDet++) {
da581aea 1418
abaf1f1d 1419 Int_t plane = fGeo->GetPlane(iDet);
1420 Int_t sector = fGeo->GetSector(iDet);
1421 Int_t chamber = fGeo->GetChamber(iDet);
3551db50 1422 Int_t nRowMax = commonParam->GetRowMax(plane,chamber,sector);
1423 Int_t nColMax = commonParam->GetColMax(plane);
abaf1f1d 1424
e23fbb27 1425 Double_t *inADC = new Double_t[nTimeTotal];
1426 Double_t *outADC = new Double_t[nTimeTotal];
1427
abaf1f1d 1428 digitsIn = fSDigitsManager->GetDigits(iDet);
1429 digitsIn->Expand();
1430 digitsOut = fDigitsManager->GetDigits(iDet);
1431 digitsOut->Allocate(nRowMax,nColMax,nTimeTotal);
1432 for (iDict = 0; iDict < kNDict; iDict++) {
1433 dictionaryIn[iDict] = fSDigitsManager->GetDictionary(iDet,iDict);
1434 dictionaryIn[iDict]->Expand();
1435 dictionaryOut[iDict] = fDigitsManager->GetDictionary(iDet,iDict);
1436 dictionaryOut[iDict]->Allocate(nRowMax,nColMax,nTimeTotal);
1437 }
1438
6bf5f0ce 1439 // Don't create noise in detectors that are switched off / not installed, etc.
1440 if (( calibration->IsChamberInstalled(iDet)) &&
1441 (!calibration->IsChamberMasked(iDet)) &&
1442 ( fGeo->GetSMstatus(sector))) {
abaf1f1d 1443
afb9f880 1444 // Get the calibration objects
1445 calGainFactorROC = calibration->GetGainFactorROC(iDet);
1446 calGainFactorDetValue = calGainFactorDet->GetValue(iDet);
1447
6bf5f0ce 1448 for (iRow = 0; iRow < nRowMax; iRow++ ) {
1449 for (iCol = 0; iCol < nColMax; iCol++ ) {
9afbd7de 1450
6bf5f0ce 1451 // Check whether pad is masked
1452 // Bridged pads are not considered yet!!!
afb9f880 1453 if (calibration->IsPadMasked(iDet,iCol,iRow)) {
1454 continue;
1455 }
1456
1457 Float_t padgain = calGainFactorDetValue
1458 * calGainFactorROC->GetValue(iCol,iRow);
1459 if (padgain <= 0) {
1460 AliError(Form("Not a valid gain %f, %d %d %d",padgain,iDet,iCol,iRow));
1461 }
6bf5f0ce 1462
afb9f880 1463 for (iTime = 0; iTime < nTimeTotal; iTime++) {
6bf5f0ce 1464
1465 // Scale s-digits to normal digits
1466 Double_t signal = (Double_t) digitsIn->GetDataUnchecked(iRow,iCol,iTime);
1467 signal *= sDigitsScale;
6bf5f0ce 1468 // Pad and time coupling
1469 signal *= coupling;
afb9f880 1470 // Gain factors
1471 signal *= padgain;
6bf5f0ce 1472 // Add the noise, starting from minus ADC baseline in electrons
1473 Double_t baselineEl = adcBaseline * (adcInRange / adcOutRange) / convert;
1474 signal = TMath::Max((Double_t) gRandom->Gaus(signal,noise),-baselineEl);
1475 // Convert to mV
1476 signal *= convert;
1477 // add ADC baseline in mV
1478 signal += adcBaseline * (adcInRange / adcOutRange);
1479 // Convert to ADC counts. Set the overflow-bit adcOutRange if the
1480 // signal is larger than adcInRange
1481 Int_t adc = 0;
1482 if (signal >= adcInRange) {
1483 adc = ((Int_t) adcOutRange);
1484 }
1485 else {
1486 adc = TMath::Nint(signal * (adcOutRange / adcInRange));
1487 }
1488 inADC[iTime] = adc;
1489 outADC[iTime] = adc;
9afbd7de 1490
6bf5f0ce 1491 }
e23fbb27 1492
6bf5f0ce 1493 for (iTime = 0; iTime < nTimeTotal; iTime++) {
1494 // Store the amplitude of the digit if above threshold
7925de54 1495 if (outADC[iTime] > (adcBaseline + adcThreshold)) {
6bf5f0ce 1496 digitsOut->SetDataUnchecked(iRow,iCol,iTime,((Int_t) outADC[iTime]));
1497 // Copy the dictionary
1498 for (iDict = 0; iDict < kNDict; iDict++) {
1499 Int_t track = dictionaryIn[iDict]->GetDataUnchecked(iRow,iCol,iTime);
1500 dictionaryOut[iDict]->SetDataUnchecked(iRow,iCol,iTime,track);
1501 }
e23fbb27 1502 }
abaf1f1d 1503 }
e23fbb27 1504
6bf5f0ce 1505 }
abaf1f1d 1506 }
6bf5f0ce 1507
abaf1f1d 1508 }
1509
1510 if (fCompress) {
1511 digitsIn->Compress(1,0);
1512 digitsOut->Compress(1,0);
1513 for (iDict = 0; iDict < kNDict; iDict++) {
1514 dictionaryIn[iDict]->Compress(1,0);
1515 dictionaryOut[iDict]->Compress(1,0);
1516 }
1517 }
1518
e23fbb27 1519 delete [] inADC;
1520 delete [] outADC;
1521
abaf1f1d 1522 }
f7336fa3 1523
1524 return kTRUE;
1525
1526}
1527
16bf9884 1528//_____________________________________________________________________________
abaf1f1d 1529Bool_t AliTRDdigitizer::MergeSDigits()
16bf9884 1530{
1531 //
abaf1f1d 1532 // Merges the input s-digits:
1533 // - The amplitude of the different inputs are summed up.
1534 // - Of the track IDs from the input dictionaries only one is
1535 // kept for each input. This works for maximal 3 different merged inputs.
16bf9884 1536 //
1537
abaf1f1d 1538 // Number of track dictionary arrays
1539 const Int_t kNDict = AliTRDdigitsManager::kNDict;
1540
4d18a639 1541 AliTRDSimParam *simParam = AliTRDSimParam::Instance();
9afbd7de 1542 if (!simParam) {
afb9f880 1543 AliFatal("Could not get simulation parameters");
3551db50 1544 return kFALSE;
1545 }
1546
4d18a639 1547 AliTRDCommonParam *commonParam = AliTRDCommonParam::Instance();
9afbd7de 1548 if (!commonParam) {
afb9f880 1549 AliFatal("Could not get common parameters");
3551db50 1550 return kFALSE;
1551 }
1552
4d18a639 1553 AliTRDcalibDB *calibration = AliTRDcalibDB::Instance();
9afbd7de 1554 if (!calibration) {
afb9f880 1555 AliFatal("Could not get calibration object");
3551db50 1556 return kFALSE;
1557 }
1558
abaf1f1d 1559 Int_t iDict = 0;
e23fbb27 1560 Int_t jDict = 0;
abaf1f1d 1561
1562 AliTRDdataArrayI *digitsA;
1563 AliTRDdataArrayI *digitsB;
1564 AliTRDdataArrayI *dictionaryA[kNDict];
1565 AliTRDdataArrayI *dictionaryB[kNDict];
1566
1567 // Get the first s-digits
1568 fSDigitsManager = (AliTRDdigitsManager *) fSDigitsManagerList->First();
9afbd7de 1569 if (!fSDigitsManager) {
7925de54 1570 AliError("No SDigits manager");
9afbd7de 1571 return kFALSE;
1572 }
abaf1f1d 1573
1574 // Loop through the other sets of s-digits
1575 AliTRDdigitsManager *mergeSDigitsManager;
4d18a639 1576 mergeSDigitsManager = (AliTRDdigitsManager *)
1577 fSDigitsManagerList->After(fSDigitsManager);
abaf1f1d 1578
9afbd7de 1579 if (mergeSDigitsManager) {
7925de54 1580 AliDebug(1,Form("Merge %d input files.",fSDigitsManagerList->GetSize()));
9afbd7de 1581 }
1582 else {
7925de54 1583 AliDebug(1,"Only one input file.");
abaf1f1d 1584 }
1585
3551db50 1586 Int_t nTimeTotal = calibration->GetNumberOfTimeBins();
1587
abaf1f1d 1588 Int_t iMerge = 0;
1589 while (mergeSDigitsManager) {
1590
1591 iMerge++;
1592
1593 // Loop through the detectors
1594 for (Int_t iDet = 0; iDet < AliTRDgeometry::Ndet(); iDet++) {
1595
4d18a639 1596 Int_t plane = fGeo->GetPlane(iDet);
1597 Int_t sector = fGeo->GetSector(iDet);
1598 Int_t chamber = fGeo->GetChamber(iDet);
1599 Int_t nRowMax = commonParam->GetRowMax(plane,chamber,sector);
1600 Int_t nColMax = commonParam->GetColMax(plane);
abaf1f1d 1601
1602 // Loop through the pixels of one detector and add the signals
1603 digitsA = fSDigitsManager->GetDigits(iDet);
1604 digitsB = mergeSDigitsManager->GetDigits(iDet);
1605 digitsA->Expand();
1606 digitsB->Expand();
1607 for (iDict = 0; iDict < kNDict; iDict++) {
1608 dictionaryA[iDict] = fSDigitsManager->GetDictionary(iDet,iDict);
1609 dictionaryB[iDict] = mergeSDigitsManager->GetDictionary(iDet,iDict);
1610 dictionaryA[iDict]->Expand();
1611 dictionaryB[iDict]->Expand();
1612 }
1613
4487dad0 1614 // Merge only detectors that contain a signal
1615 Bool_t doMerge = kTRUE;
1616 if (fMergeSignalOnly) {
1617 if (digitsA->GetOverThreshold(0) == 0) {
1618 doMerge = kFALSE;
1619 }
abaf1f1d 1620 }
1621
4487dad0 1622 if (doMerge) {
abaf1f1d 1623
7925de54 1624 AliDebug(1,Form("Merge detector %d of input no.%d",iDet,iMerge+1));
abaf1f1d 1625
4487dad0 1626 for (Int_t iRow = 0; iRow < nRowMax; iRow++ ) {
1627 for (Int_t iCol = 0; iCol < nColMax; iCol++ ) {
1628 for (Int_t iTime = 0; iTime < nTimeTotal; iTime++) {
1629
1630 // Add the amplitudes of the summable digits
1631 Int_t ampA = digitsA->GetDataUnchecked(iRow,iCol,iTime);
1632 Int_t ampB = digitsB->GetDataUnchecked(iRow,iCol,iTime);
1633 ampA += ampB;
1634 digitsA->SetDataUnchecked(iRow,iCol,iTime,ampA);
1635
9afbd7de 1636 // Add the mask to the track id if defined.
4487dad0 1637 for (iDict = 0; iDict < kNDict; iDict++) {
1638 Int_t trackB = dictionaryB[iDict]->GetDataUnchecked(iRow,iCol,iTime);
1639 if ((fMasks) && (trackB > 0)) {
1640 for (jDict = 0; jDict < kNDict; jDict++) {
1641 Int_t trackA = dictionaryA[iDict]->GetDataUnchecked(iRow,iCol,iTime);
1642 if (trackA == 0) {
1643 trackA = trackB + fMasks[iMerge];
1644 dictionaryA[iDict]->SetDataUnchecked(iRow,iCol,iTime,trackA);
1645 }
1646 }
1647 }
e23fbb27 1648 }
abaf1f1d 1649
4487dad0 1650 }
abaf1f1d 1651 }
4487dad0 1652 }
1653
abaf1f1d 1654 }
1655
1656 if (fCompress) {
1657 digitsA->Compress(1,0);
1658 digitsB->Compress(1,0);
1659 for (iDict = 0; iDict < kNDict; iDict++) {
1660 dictionaryA[iDict]->Compress(1,0);
1661 dictionaryB[iDict]->Compress(1,0);
1662 }
1663 }
1664
1665 }
1666
1667 // The next set of s-digits
4d18a639 1668 mergeSDigitsManager = (AliTRDdigitsManager *)
1669 fSDigitsManagerList->After(mergeSDigitsManager);
abaf1f1d 1670
1671 }
1672
16bf9884 1673 return kTRUE;
1674
1675}
1676
abaf1f1d 1677//_____________________________________________________________________________
1678Bool_t AliTRDdigitizer::SDigits2Digits()
1679{
1680 //
1681 // Merges the input s-digits and converts them to normal digits
1682 //
1683
4d18a639 1684 if (!MergeSDigits()) {
1685 return kFALSE;
1686 }
abaf1f1d 1687
1688 return ConvertSDigits();
1689
1690}
1691
f7336fa3 1692//_____________________________________________________________________________
0a29d0f1 1693Bool_t AliTRDdigitizer::WriteDigits() const
f7336fa3 1694{
1695 //
1696 // Writes out the TRD-digits and the dictionaries
1697 //
1698
4d18a639 1699 // Write parameters
bdbb05bb 1700 fRunLoader->CdGAFile();
bdbb05bb 1701
da581aea 1702 // Store the digits and the dictionary in the tree
abaf1f1d 1703 return fDigitsManager->WriteDigits();
f7336fa3 1704
1705}
793ff80c 1706
8e64dd77 1707//_____________________________________________________________________________
88cb7938 1708void AliTRDdigitizer::InitOutput(Int_t iEvent)
8e64dd77 1709{
1710 //
1711 // Initializes the output branches
1712 //
1713
1714 fEvent = iEvent;
88cb7938 1715
9afbd7de 1716 if (!fRunLoader) {
1717 AliError("Run Loader is NULL");
1718 return;
1719 }
1720
afb9f880 1721 AliLoader *loader = fRunLoader->GetLoader("TRDLoader");
9afbd7de 1722 if (!loader) {
1723 AliError("Can not get TRD loader from Run Loader");
1724 return;
1725 }
88cb7938 1726
4d18a639 1727 TTree *tree = 0;
88cb7938 1728
9afbd7de 1729 if (fSDigits) {
1730 // If we produce SDigits
88cb7938 1731 tree = loader->TreeS();
9afbd7de 1732 if (!tree) {
88cb7938 1733 loader->MakeTree("S");
1734 tree = loader->TreeS();
9afbd7de 1735 }
1736 }
1737 else {
1738 // If we produce Digits
1739 tree = loader->TreeD();
1740 if (!tree) {
1741 loader->MakeTree("D");
1742 tree = loader->TreeD();
1743 }
1744 }
1745
88cb7938 1746 fDigitsManager->SetEvent(iEvent);
1747 fDigitsManager->MakeBranch(tree);
8e64dd77 1748
1749}
3551db50 1750
1751//_____________________________________________________________________________
1752Double_t AliTRDdigitizer::TimeStruct(Float_t vdrift, Double_t dist, Double_t z)
1753{
1754 //
1755 // Applies the time structure of the drift cells (by C.Lippmann).
1756 // The drift time of electrons to the anode wires depends on the
1757 // distance to the wire (z) and on the position in the drift region.
1758 //
1759 // input :
1760 // dist = radial distance from (cathode) pad plane [cm]
1761 // z = distance from anode wire (parallel to cathode planes) [cm]
1762 //
1763 // output :
1764 // tdrift = the drift time of an electron at the given position
1765 //
1766 // We interpolate between the drift time values at the two drift
1767 // velocities fVDlo and fVDhi, being smaller and larger than
1768 // fDriftVelocity. We use the two stored drift time maps fTimeStruct1
1769 // and fTimeStruct2, calculated for the two mentioned drift velocities.
1770 //
1771
1772 SampleTimeStruct(vdrift);
1773
4d18a639 1774 // Indices:
1775 Int_t r1 = (Int_t)(10 * dist);
9afbd7de 1776 if (r1 < 0) r1 = 0;
1777 if (r1 > 37) r1 = 37;
1778 Int_t r2 = r1 + 1;
1779 if (r2 < 0) r2 = 0;
1780 if (r2 > 37) r2 = 37;
1781 const Int_t kz1 = ((Int_t)(100 * z / 2.5));
1782 const Int_t kz2 = kz1 + 1;
1783
4d18a639 1784 if ((r1 < 0) ||
1785 (r1 > 37) ||
1786 (kz1 < 0) ||
1787 (kz1 > 10)) {
7925de54 1788 AliWarning(Form("Indices out of range: dist=%.2f, z=%.2f, r1=%d, kz1=%d"
9afbd7de 1789 ,dist,z,r1,kz1));
3551db50 1790 }
1791
4d18a639 1792 const Float_t ky111 = fTimeStruct1[r1+38*kz1];
9afbd7de 1793 const Float_t ky221 = ((r2 <= 37) && (kz2 <= 10))
4d18a639 1794 ? fTimeStruct1[r2+38*kz2]
1795 : fTimeStruct1[37+38*10];
9afbd7de 1796 const Float_t ky121 = (kz2 <= 10)
4d18a639 1797 ? fTimeStruct1[r1+38*kz2]
1798 : fTimeStruct1[r1+38*10];
9afbd7de 1799 const Float_t ky211 = (r2 <= 37)
4d18a639 1800 ? fTimeStruct1[r2+38*kz1]
1801 : fTimeStruct1[37+38*kz1];
3551db50 1802
1803 // 2D Interpolation, lower drift time map
1804 const Float_t ky11 = (ky211-ky111)*10*dist + ky111 - (ky211-ky111)*r1;
1805 const Float_t ky21 = (ky221-ky121)*10*dist + ky121 - (ky221-ky121)*r1;
1806
4d18a639 1807 const Float_t ky112 = fTimeStruct2[r1+38*kz1];
9afbd7de 1808 const Float_t ky222 = ((r2 <= 37) && (kz2 <= 10))
4d18a639 1809 ? fTimeStruct2[r2+38*kz2]
1810 : fTimeStruct2[37+38*10];
9afbd7de 1811 const Float_t ky122 = (kz2 <= 10)
4d18a639 1812 ? fTimeStruct2[r1+38*kz2]
1813 : fTimeStruct2[r1+38*10];
9afbd7de 1814 const Float_t ky212 = (r2 <= 37)
4d18a639 1815 ? fTimeStruct2[r2+38*kz1]
1816 : fTimeStruct2[37+38*kz1];
3551db50 1817
1818 // 2D Interpolation, larger drift time map
1819 const Float_t ky12 = (ky212-ky112)*10*dist + ky112 - (ky212-ky112)*r1;
1820 const Float_t ky22 = (ky222-ky122)*10*dist + ky122 - (ky222-ky122)*r1;
1821
4d18a639 1822 // Dist now is the drift distance to the anode wires (negative if electrons are
3551db50 1823 // between anode wire plane and cathode pad plane)
9afbd7de 1824 dist -= AliTRDgeometry::AmThick() / 2.0;
3551db50 1825
1826 // Get the drift times for the drift velocities fVDlo and fVDhi
9afbd7de 1827 const Float_t ktdrift1 = ((TMath::Abs(dist) > 0.005) || (z > 0.005))
1828 ? (ky21 - ky11) * 100 * z / 2.5 + ky11 - (ky21 - ky11) * kz1
1829 : 0.0;
1830 const Float_t ktdrift2 = ((TMath::Abs(dist) > 0.005) || (z > 0.005))
1831 ? (ky22 - ky12) * 100 * z / 2.5 + ky12 - (ky22 - ky12) * kz1
1832 : 0.0;
3551db50 1833
1834 // 1D Interpolation between the values at fVDlo and fVDhi
4d18a639 1835 Float_t a = (ktdrift2 - ktdrift1)
1836 / (fVDhi - fVDlo);
1837 Float_t b = ktdrift2 - a * fVDhi;
3551db50 1838
3551db50 1839 return a * vdrift + b;
1840
1841}
1842
1843//_____________________________________________________________________________
1844void AliTRDdigitizer::SampleTimeStruct(Float_t vdrift)
1845{
1846 //
1847 // Samples the timing structure of a drift cell
1848 // Drift Time data calculated with Garfield (by C.Lippmann)
1849 //
1850
afb9f880 1851 // Nothing to do
4d18a639 1852 if (vdrift == fTimeLastVdrift) {
3551db50 1853 return;
9afbd7de 1854 }
4d18a639 1855 fTimeLastVdrift = vdrift;
3551db50 1856
9afbd7de 1857 // Drift time maps are saved for some drift velocity values (in drift region):
3551db50 1858 Float_t fVDsmp[8];
1859 fVDsmp[0] = 1.032;
1860 fVDsmp[1] = 1.158;
1861 fVDsmp[2] = 1.299;
1862 fVDsmp[3] = 1.450;
1863 fVDsmp[4] = 1.610;
1864 fVDsmp[5] = 1.783;
1865 fVDsmp[6] = 1.959;
1866 fVDsmp[7] = 2.134;
1867
9afbd7de 1868 if (vdrift < fVDsmp[0]) {
7925de54 1869 AliWarning(Form("Drift Velocity too small (%.3f<%.3f)",vdrift,fVDsmp[0]));
3551db50 1870 vdrift = fVDsmp[0];
9afbd7de 1871 }
1872 else if (vdrift > fVDsmp[7]) {
7925de54 1873 AliWarning(Form("Drift Velocity too large (%.3f>%.3f)",vdrift,fVDsmp[6]));
3551db50 1874 vdrift = fVDsmp[7];
1875 }
1876
1877 const Int_t ktimebin = 38;
9afbd7de 1878 const Int_t kZbin = 11;
3551db50 1879
1880 // Garfield simulation at UD = -1500V; vd = 1.032cm/microsec, <driftfield> = 525V/cm
1881 Float_t time1500[ktimebin][kZbin] =
1882 {{0.09170, 0.09205, 0.09306, 0.09475, 0.09716, 0.10035,
1883 0.10445, 0.10993, 0.11838, 0.13986, 0.37858},
1884 {0.06588, 0.06626, 0.06739, 0.06926, 0.07186, 0.07524,
1885 0.07951, 0.08515, 0.09381, 0.11601, 0.35673},
1886 {0.03946, 0.04003, 0.04171, 0.04435, 0.04780, 0.05193,
1887 0.05680, 0.06306, 0.07290, 0.09873, 0.34748},
1888 {0.01151, 0.01283, 0.01718, 0.02282, 0.02880, 0.03479,
1889 0.04098, 0.04910, 0.06413, 0.10567, 0.36897},
1890 {0.01116, 0.01290, 0.01721, 0.02299, 0.02863, 0.03447,
1891 0.04074, 0.04984, 0.06839, 0.11625, 0.37277},
1892 {0.03919, 0.03974, 0.04131, 0.04380, 0.04703, 0.05102,
1893 0.05602, 0.06309, 0.07651, 0.10938, 0.36838},
1894 {0.06493, 0.06560, 0.06640, 0.06802, 0.07051, 0.07392,
1895 0.07853, 0.08510, 0.09690, 0.12621, 0.38058},
1896 {0.09174, 0.09186, 0.09225, 0.09303, 0.09477, 0.00000,
1897 0.11205, 0.11952, 0.13461, 0.16984, 0.43017},
1898 {0.14356, 0.14494, 0.14959, 0.16002, 0.18328, 0.27981,
1899 0.22785, 0.21240, 0.21948, 0.25965, 0.52392},
1900 {0.23120, 0.23366, 0.24046, 0.25422, 0.28071, 0.36914,
1901 0.32999, 0.31208, 0.31772, 0.35804, 0.62249},
1902 {0.32686, 0.32916, 0.33646, 0.35053, 0.37710, 0.46292,
1903 0.42773, 0.40948, 0.41497, 0.45527, 0.71955},
1904 {0.42353, 0.42583, 0.43317, 0.44727, 0.47380, 0.55884,
1905 0.52479, 0.50650, 0.51194, 0.55225, 0.81658},
1906 {0.52038, 0.52271, 0.53000, 0.54415, 0.57064, 0.65545,
1907 0.62172, 0.60341, 0.60885, 0.64915, 0.91339},
1908 {0.61724, 0.61953, 0.62694, 0.64098, 0.66756, 0.75226,
1909 0.71862, 0.70030, 0.70575, 0.74604, 1.01035},
1910 {0.71460, 0.71678, 0.72376, 0.73786, 0.76447, 0.84913,
1911 0.81551, 0.79720, 0.80264, 0.84292, 1.10723},
1912 {0.81101, 0.81334, 0.82066, 0.83475, 0.86127, 0.94599,
1913 0.91240, 0.89408, 0.89952, 0.93981, 1.20409},
1914 {0.90788, 0.91023, 0.91752, 0.93163, 0.95815, 1.04293,
1915 1.00929, 0.99096, 0.99640, 1.03669, 1.30106},
1916 {1.00477, 1.00707, 1.01449, 1.02852, 1.05504, 1.13976,
1917 1.10617, 1.08784, 1.09329, 1.13358, 1.39796},
1918 {1.10166, 1.10397, 1.11130, 1.12541, 1.15257, 1.23672,
1919 1.20307, 1.18472, 1.19018, 1.23046, 1.49486},
1920 {1.19854, 1.20084, 1.20818, 1.22235, 1.24885, 1.33355,
1921 1.29992, 1.28156, 1.28707, 1.32735, 1.59177},
1922 {1.29544, 1.29780, 1.30507, 1.31917, 1.34575, 1.43073,
1923 1.39681, 1.37851, 1.38396, 1.42377, 1.68854},
1924 {1.39236, 1.39462, 1.40205, 1.41607, 1.44259, 1.52745,
1925 1.49368, 1.47541, 1.48083, 1.52112, 1.78546},
1926 {1.49314, 1.49149, 1.49885, 1.51297, 1.53949, 1.62420,
1927 1.59016, 1.57231, 1.57772, 1.61800, 1.88048},
1928 {1.58610, 1.58839, 1.59572, 1.60983, 1.63635, 1.72109,
1929 1.68651, 1.66921, 1.67463, 1.71489, 1.97918},
1930 {1.68400, 1.68529, 1.69261, 1.70671, 1.73331, 1.81830,
1931 1.78341, 1.76605, 1.77150, 1.81179, 2.07608},
1932 {1.77991, 1.78215, 1.78952, 1.80385, 1.83014, 1.91486,
1933 1.88128, 1.86215, 1.86837, 1.90865, 2.17304},
1934 {1.87674, 1.87904, 1.88647, 1.90052, 1.92712, 2.01173,
1935 1.97812, 1.95905, 1.96527, 2.00710, 2.26979},
1936 {1.97369, 1.97594, 1.98326, 1.99869, 2.02442, 2.10865,
1937 2.07501, 2.05666, 2.06214, 2.10243, 2.36669},
1938 {2.07052, 2.07281, 2.08016, 2.09425, 2.12132, 2.20555,
1939 2.17182, 2.15341, 2.15904, 2.19933, 2.46363},
1940 {2.16742, 2.16971, 2.17707, 2.19114, 2.21766, 2.30240,
1941 2.26877, 2.25015, 2.25573, 2.29586, 2.56060},
1942 {2.26423, 2.26659, 2.27396, 2.28803, 2.31456, 2.40828,
1943 2.36567, 2.34705, 2.35282, 2.39765, 2.65744},
1944 {2.36153, 2.36349, 2.37330, 2.38501, 2.41159, 2.49940,
1945 2.46257, 2.44420, 2.44843, 2.48987, 2.75431},
1946 {2.46558, 2.46035, 2.46822, 2.48181, 2.50849, 2.59630,
1947 2.55947, 2.54112, 2.54513, 2.58677, 2.85094},
1948 {2.56248, 2.55723, 2.56486, 2.57871, 2.60520, 2.68998,
1949 2.65626, 2.63790, 2.64316, 2.68360, 2.94813},
1950 {2.65178, 2.65441, 2.66153, 2.67556, 2.70210, 2.78687,
1951 2.75319, 2.73463, 2.74032, 2.78060, 3.04503},
1952 {2.74868, 2.75131, 2.75870, 2.77245, 2.79385, 2.88700,
1953 2.85009, 2.83177, 2.83723, 2.87750, 3.14193},
1954 {2.84574, 2.84789, 2.85560, 2.86935, 2.89075, 2.98060,
1955 2.94576, 2.92868, 2.93356, 2.97436, 3.23868},
1956 {2.94239, 2.94469, 2.95221, 2.96625, 2.99345, 3.07747,
1957 3.04266, 3.02545, 3.03051, 3.07118, 3.33555}};
1958
1959 // Garfield simulation at UD = -1600V; vd = 1.158cm/microsec, <driftfield> = 558V/cm
1960 Float_t time1600[ktimebin][kZbin] =
1961 {{0.09169, 0.09203, 0.09305, 0.09473, 0.09714, 0.10032,
1962 0.10441, 0.10990, 0.11835, 0.13986, 0.37845},
1963 {0.06589, 0.06626, 0.06738, 0.06924, 0.07184, 0.07521,
1964 0.07947, 0.08512, 0.09379, 0.11603, 0.35648},
1965 {0.03947, 0.04003, 0.04171, 0.04434, 0.04778, 0.05190,
1966 0.05678, 0.06304, 0.07292, 0.09876, 0.34759},
1967 {0.01111, 0.01281, 0.01718, 0.02281, 0.02879, 0.03477,
1968 0.04097, 0.04910, 0.06415, 0.10573, 0.36896},
1969 {0.01120, 0.01311, 0.01721, 0.02279, 0.02862, 0.03446,
1970 0.04074, 0.04981, 0.06825, 0.11595, 0.37255},
1971 {0.03919, 0.03980, 0.04132, 0.04380, 0.04704, 0.05102,
1972 0.05602, 0.06302, 0.07633, 0.10896, 0.36743},
1973 {0.06531, 0.06528, 0.06631, 0.06805, 0.07053, 0.07392,
1974 0.07853, 0.08505, 0.09669, 0.12578, 0.37967},
1975 {0.09157, 0.09171, 0.09216, 0.09301, 0.09475, 0.00000,
1976 0.11152, 0.11879, 0.13352, 0.16802, 0.42750},
1977 {0.13977, 0.14095, 0.14509, 0.15433, 0.17534, 0.26406,
1978 0.21660, 0.20345, 0.21113, 0.25067, 0.51434},
1979 {0.21816, 0.22041, 0.22631, 0.23850, 0.26208, 0.34340,
1980 0.30755, 0.29237, 0.29878, 0.33863, 0.60258},
1981 {0.30344, 0.30547, 0.31241, 0.32444, 0.34809, 0.42696,
1982 0.39464, 0.37919, 0.38546, 0.42530, 0.68926},
1983 {0.38969, 0.39164, 0.39810, 0.41059, 0.43441, 0.51246,
1984 0.48112, 0.46562, 0.47191, 0.51172, 0.77558},
1985 {0.47592, 0.47799, 0.48442, 0.49689, 0.52061, 0.59855,
1986 0.56752, 0.55201, 0.55826, 0.59808, 0.86202},
1987 {0.56226, 0.56428, 0.57074, 0.58324, 0.60696, 0.68483,
1988 0.65388, 0.63837, 0.64461, 0.68445, 0.94830},
1989 {0.64881, 0.65063, 0.65709, 0.66958, 0.69331, 0.77117,
1990 0.74023, 0.72472, 0.73098, 0.77079, 1.03486},
1991 {0.73506, 0.73698, 0.74344, 0.75596, 0.77964, 0.85751,
1992 0.82658, 0.81107, 0.81731, 0.85712, 1.12106},
1993 {0.82132, 0.82333, 0.82979, 0.84228, 0.86608, 0.94386,
1994 0.91293, 0.89742, 0.90367, 0.94335, 1.20737},
1995 {0.90767, 0.90968, 0.91614, 0.92863, 0.95236, 1.03021,
1996 0.99928, 0.98377, 0.99001, 1.02984, 1.29371},
1997 {0.99410, 0.99602, 1.00257, 1.01498, 1.03869, 1.11720,
1998 1.08563, 1.07011, 1.07637, 1.11621, 1.37873},
1999 {1.08036, 1.08240, 1.08884, 1.10138, 1.12504, 1.20301,
2000 1.17198, 1.15647, 1.16272, 1.20255, 1.46651},
2001 {1.16670, 1.16872, 1.17525, 1.18783, 1.21139, 1.28934,
2002 1.25833, 1.24281, 1.24909, 1.28889, 1.55275},
2003 {1.25307, 1.25510, 1.26153, 1.27404, 1.29773, 1.37584,
2004 1.34469, 1.32916, 1.33536, 1.37524, 1.63915},
2005 {1.33942, 1.34146, 1.34788, 1.36040, 1.38410, 1.46438,
2006 1.43105, 1.41537, 1.42176, 1.46158, 1.72538},
2007 {1.42579, 1.42782, 1.43458, 1.44674, 1.47043, 1.55085,
2008 1.51675, 1.50168, 1.50810, 1.54793, 1.81174},
2009 {1.51207, 1.51454, 1.52060, 1.53307, 1.55684, 1.63478,
2010 1.60336, 1.58820, 1.59446, 1.63414, 1.89814},
2011 {1.59856, 1.60047, 1.60693, 1.61942, 1.64317, 1.72257,
2012 1.69008, 1.67454, 1.68080, 1.72063, 1.98433},
2013 {1.68481, 1.68682, 1.69330, 1.70584, 1.72949, 1.80752,
2014 1.77643, 1.76089, 1.76716, 1.80692, 2.07069},
2015 {1.77117, 1.77319, 1.77969, 1.79260, 1.81583, 1.89376,
2016 1.86226, 1.84720, 1.85355, 1.89256, 2.15343},
2017 {1.85748, 1.85967, 1.86605, 1.87848, 1.90222, 1.98010,
2018 1.94913, 1.93271, 1.93981, 1.97968, 2.24355},
2019 {1.94386, 1.94587, 1.95233, 1.96484, 1.98854, 2.06646,
2020 2.03542, 2.01755, 2.02617, 2.06604, 2.32993},
2021 {2.03022, 2.03230, 2.03868, 2.05134, 2.07488, 2.15367,
2022 2.12178, 2.10391, 2.11252, 2.15432, 2.41623},
2023 {2.11656, 2.11857, 2.12505, 2.13772, 2.16147, 2.23919,
2024 2.20817, 2.19265, 2.20744, 2.23872, 2.49996},
2025 {2.20291, 2.20611, 2.21137, 2.22387, 2.24758, 2.32563,
2026 2.29450, 2.27901, 2.28525, 2.32507, 2.58897},
2027 {2.28922, 2.29172, 2.29774, 2.31345, 2.33400, 2.41287,
2028 2.38086, 2.36535, 2.37160, 2.40869, 2.67113},
2029 {2.37572, 2.37764, 2.38410, 2.39803, 2.42046, 2.49817,
2030 2.46721, 2.45171, 2.45794, 2.49505, 2.76061},
2031 {2.46190, 2.46396, 2.47043, 2.48340, 2.50665, 2.58453,
2032 2.55357, 2.53728, 2.54430, 2.58407, 2.84816},
2033 {2.54833, 2.55032, 2.55679, 2.56976, 2.59312, 2.67103,
2034 2.63993, 2.62364, 2.63062, 2.67040, 2.93444},
2035 {2.63456, 2.63660, 2.64304, 2.65555, 2.67938, 2.75739,
2036 2.72629, 2.71064, 2.71688, 2.75671, 3.01886}};
2037
2038 // Garfield simulation at UD = -1700V; vd = 1.299cm/microsec, <driftfield> = 590V/cm
2039 Float_t time1700[ktimebin][kZbin] =
2040 {{0.09167, 0.09201, 0.09302, 0.09471, 0.09712, 0.10029,
2041 0.10438, 0.10986, 0.11832, 0.13986, 0.37824},
2042 {0.06591, 0.06626, 0.06736, 0.06923, 0.07183, 0.07519,
2043 0.07944, 0.08511, 0.09378, 0.11603, 0.35625},
2044 {0.03946, 0.04003, 0.04170, 0.04433, 0.04777, 0.05189,
2045 0.05676, 0.06301, 0.07291, 0.09880, 0.34724},
2046 {0.01110, 0.01281, 0.01718, 0.02280, 0.02879, 0.03476,
2047 0.04096, 0.04910, 0.06417, 0.10582, 0.36861},
2048 {0.01115, 0.01294, 0.01721, 0.02276, 0.02862, 0.03447,
2049 0.04074, 0.04980, 0.06812, 0.11565, 0.37231},
2050 {0.03920, 0.03974, 0.04133, 0.04381, 0.04706, 0.05105,
2051 0.05603, 0.06299, 0.07618, 0.10860, 0.36646},
2052 {0.06498, 0.06529, 0.06634, 0.06808, 0.07055, 0.07395,
2053 0.07852, 0.08500, 0.09650, 0.12532, 0.37850},
2054 {0.09143, 0.09159, 0.09207, 0.09297, 0.09473, 0.00000,
2055 0.11102, 0.11809, 0.13245, 0.16627, 0.42496},
2056 {0.13646, 0.13750, 0.14112, 0.14926, 0.16806, 0.24960,
2057 0.20627, 0.19536, 0.20366, 0.24256, 0.50557},
2058 {0.20678, 0.20848, 0.21384, 0.22450, 0.24552, 0.32018,
2059 0.28740, 0.27477, 0.28196, 0.32128, 0.58475},
2060 {0.28287, 0.28461, 0.29020, 0.30108, 0.32224, 0.39467,
2061 0.36500, 0.35217, 0.35926, 0.39860, 0.66194},
2062 {0.35972, 0.36145, 0.36713, 0.37797, 0.39912, 0.47091,
2063 0.44212, 0.42925, 0.43632, 0.47563, 0.73892},
2064 {0.43667, 0.43841, 0.44413, 0.45494, 0.47607, 0.54780,
2065 0.51912, 0.50627, 0.51334, 0.55254, 0.81595},
2066 {0.51365, 0.51540, 0.52101, 0.53193, 0.55305, 0.62463,
2067 0.59617, 0.58328, 0.59035, 0.62965, 0.89303},
2068 {0.59064, 0.59240, 0.59801, 0.60893, 0.63009, 0.70169,
2069 0.67317, 0.66028, 0.66735, 0.70666, 0.96995},
2070 {0.66765, 0.66939, 0.67501, 0.68592, 0.70724, 0.77863,
2071 0.75016, 0.73728, 0.74435, 0.78366, 1.04696},
2072 {0.74464, 0.74636, 0.75200, 0.76293, 0.78405, 0.85561,
2073 0.82716, 0.81427, 0.82133, 0.86064, 1.12396},
2074 {0.82165, 0.82340, 0.82902, 0.83991, 0.86104, 0.93266,
2075 0.90414, 0.89128, 0.89834, 0.93763, 1.20100},
2076 {0.89863, 0.90042, 0.90659, 0.91705, 0.93805, 1.00960,
2077 0.98115, 0.96825, 0.97533, 1.01462, 1.27801},
2078 {0.97563, 0.97740, 0.98310, 0.99391, 1.01504, 1.08659,
2079 1.05814, 1.04526, 1.05233, 1.09163, 1.35503},
2080 {1.05276, 1.05451, 1.06002, 1.07090, 1.09099, 1.16357,
2081 1.13516, 1.12225, 1.12933, 1.16863, 1.43195},
2082 {1.12977, 1.13138, 1.13700, 1.14792, 1.16797, 1.24061,
2083 1.21212, 1.19926, 1.20626, 1.24554, 1.50900},
2084 {1.20664, 1.20839, 1.21400, 1.22490, 1.24606, 1.31772,
2085 1.28914, 1.27382, 1.28329, 1.32262, 1.58550},
2086 {1.28367, 1.28541, 1.29099, 1.30189, 1.32312, 1.39460,
2087 1.36612, 1.34924, 1.36030, 1.39961, 1.66310},
2088 {1.36064, 1.36249, 1.36799, 1.37896, 1.40004, 1.48030,
2089 1.44314, 1.43032, 1.43731, 1.47659, 1.73442},
2090 {1.43762, 1.43937, 1.44497, 1.45618, 1.47704, 1.54932,
2091 1.52012, 1.50725, 1.51430, 1.55357, 1.81708},
2092 {1.51462, 1.51937, 1.52203, 1.53316, 1.55403, 1.62572,
2093 1.59713, 1.58424, 1.59128, 1.63061, 1.89406},
2094 {1.59162, 1.59338, 1.59947, 1.60989, 1.63103, 1.70270,
2095 1.67411, 1.66124, 1.66799, 1.70759, 1.97103},
2096 {1.66874, 1.67037, 1.67597, 1.68687, 1.70814, 1.77969,
2097 1.75112, 1.73806, 1.74530, 1.78457, 2.04794},
2098 {1.74693, 1.74749, 1.75297, 1.76476, 1.78500, 1.85667,
2099 1.82811, 1.81504, 1.82101, 1.86161, 2.12492},
2100 {1.82260, 1.82437, 1.82995, 1.84174, 1.86202, 1.93372,
2101 1.90509, 1.89202, 1.89930, 1.93859, 2.20189},
2102 {1.89964, 1.90135, 1.90693, 1.91789, 1.93952, 2.01080,
2103 1.98207, 1.96921, 1.97628, 2.01384, 2.27887},
2104 {1.97662, 1.97917, 1.98611, 1.99487, 2.01601, 2.08778,
2105 2.05846, 2.04623, 2.05330, 2.09244, 2.35585},
2106 {2.05359, 2.05615, 2.06309, 2.07187, 2.09867, 2.16459,
2107 2.13610, 2.12322, 2.13029, 2.16942, 2.43199},
2108 {2.13063, 2.13233, 2.13795, 2.14886, 2.17008, 2.24199,
2109 2.21310, 2.20020, 2.20727, 2.24659, 2.50983},
2110 {2.20761, 2.20931, 2.21955, 2.22624, 2.24708, 2.32147,
2111 2.29009, 2.27725, 2.28276, 2.32359, 2.58680},
2112 {2.28459, 2.29108, 2.29202, 2.30286, 2.32007, 2.39559,
2113 2.36683, 2.35422, 2.36119, 2.40058, 2.66081},
2114 {2.36153, 2.36806, 2.36889, 2.37985, 2.40092, 2.47828,
2115 2.44381, 2.43099, 2.43819, 2.47750, 2.73779}};
2116
2117 // Garfield simulation at UD = -1800V; vd = 1.450cm/microsec, <driftfield> = 623V/cm
2118 Float_t time1800[ktimebin][kZbin] =
2119 {{0.09166, 0.09199, 0.09300, 0.09470, 0.09709, 0.10026,
2120 0.10434, 0.10983, 0.11831, 0.13987, 0.37802},
2121 {0.06585, 0.06623, 0.06735, 0.06921, 0.07180, 0.07520,
2122 0.07941, 0.08507, 0.09376, 0.11604, 0.35624},
2123 {0.03945, 0.04004, 0.04169, 0.04432, 0.04776, 0.05187,
2124 0.05674, 0.06300, 0.07290, 0.09884, 0.34704},
2125 {0.01108, 0.01287, 0.01717, 0.02280, 0.02880, 0.03476,
2126 0.04095, 0.04909, 0.06419, 0.10589, 0.36843},
2127 {0.01115, 0.01287, 0.01720, 0.02276, 0.02862, 0.03448,
2128 0.04073, 0.04973, 0.06799, 0.11535, 0.37224},
2129 {0.03918, 0.03975, 0.04134, 0.04382, 0.04707, 0.05105,
2130 0.05603, 0.06296, 0.07605, 0.10822, 0.36560},
2131 {0.06498, 0.06532, 0.06635, 0.06809, 0.07058, 0.07395,
2132 0.07855, 0.08495, 0.09632, 0.12488, 0.37730},
2133 {0.09130, 0.09160, 0.09199, 0.09300, 0.09472, 0.00000,
2134 0.11059, 0.11747, 0.13146, 0.16462, 0.42233},
2135 {0.13364, 0.13449, 0.13767, 0.14481, 0.16147, 0.23635,
2136 0.19706, 0.18812, 0.19704, 0.23520, 0.49749},
2137 {0.19698, 0.19844, 0.20311, 0.21236, 0.23082, 0.29920,
2138 0.26936, 0.25927, 0.26732, 0.30601, 0.56871},
2139 {0.26518, 0.26670, 0.27160, 0.28099, 0.29955, 0.36597,
2140 0.33885, 0.32858, 0.33653, 0.37524, 0.63801},
2141 {0.33441, 0.33553, 0.34040, 0.34987, 0.36841, 0.43428,
2142 0.40797, 0.39763, 0.40556, 0.44425, 0.70698},
2143 {0.40296, 0.40447, 0.40934, 0.41881, 0.43737, 0.50306,
2144 0.47695, 0.46662, 0.47455, 0.51329, 0.77600},
2145 {0.47296, 0.47344, 0.47830, 0.48779, 0.50632, 0.57200,
2146 0.54593, 0.53559, 0.54351, 0.58222, 0.84489},
2147 {0.54089, 0.54264, 0.54727, 0.55673, 0.57529, 0.64094,
2148 0.61490, 0.60457, 0.61249, 0.65118, 0.91394},
2149 {0.60987, 0.61138, 0.61624, 0.62573, 0.64428, 0.70989,
2150 0.68397, 0.67354, 0.68147, 0.72015, 0.98291},
2151 {0.67883, 0.68035, 0.68521, 0.69469, 0.71324, 0.77896,
2152 0.75287, 0.74251, 0.75043, 0.78912, 1.04458},
2153 {0.74780, 0.74932, 0.75421, 0.76367, 0.78221, 0.84785,
2154 0.82185, 0.81148, 0.81941, 0.85811, 1.12085},
2155 {0.81690, 0.81830, 0.82316, 0.83263, 0.85120, 0.91683,
2156 0.89077, 0.88045, 0.88837, 0.92707, 1.18976},
2157 {0.88574, 0.88726, 0.89228, 0.90198, 0.92017, 0.98578,
2158 0.95974, 0.94947, 0.95734, 0.99604, 1.25873},
2159 {0.95493, 0.95624, 0.96110, 0.97058, 0.98913, 1.05481,
2160 1.02873, 1.01839, 1.02631, 1.06503, 1.32772},
2161 {1.02392, 1.02524, 1.03008, 1.03955, 1.05810, 1.12378,
2162 1.09757, 1.08605, 1.09530, 1.13399, 1.39669},
2163 {1.09270, 1.09418, 1.09911, 1.10854, 1.12714, 1.19281,
2164 1.16502, 1.15633, 1.16427, 1.20271, 1.46574},
2165 {1.16168, 1.16323, 1.16801, 1.17772, 1.19604, 1.26190,
2166 1.23399, 1.22531, 1.23323, 1.27194, 1.53475},
2167 {1.23061, 1.23214, 1.23698, 1.24669, 1.26503, 1.33073,
2168 1.30461, 1.29428, 1.30220, 1.34091, 1.60372},
2169 {1.29960, 1.30110, 1.30596, 1.31544, 1.33398, 1.39962,
2170 1.37228, 1.36323, 1.37121, 1.40988, 1.67273},
2171 {1.36851, 1.37007, 1.37512, 1.38441, 1.40297, 1.46865,
2172 1.44256, 1.43222, 1.44017, 1.47878, 1.74155},
2173 {1.43752, 1.43904, 1.44773, 1.45338, 1.47220, 1.53759,
2174 1.51136, 1.50119, 1.50914, 1.54775, 1.81050},
2175 {1.50646, 1.50802, 1.51288, 1.52237, 1.54097, 1.60697,
2176 1.58049, 1.57018, 1.57811, 1.61678, 1.87947},
2177 {1.57545, 1.57720, 1.58185, 1.59134, 1.60996, 1.67787,
2178 1.64929, 1.63914, 1.64707, 1.68570, 1.94851},
2179 {1.64442, 1.64617, 1.65081, 1.66035, 1.67893, 1.74684,
2180 1.71826, 1.70745, 1.71604, 1.75310, 2.01748},
2181 {1.71337, 1.71513, 1.71978, 1.72932, 1.74645, 1.81346,
2182 1.78739, 1.77642, 1.78501, 1.82151, 2.08644},
2183 {1.78238, 1.78410, 1.78876, 1.79824, 1.81678, 1.88332,
2184 1.85639, 1.84262, 1.85397, 1.89270, 2.15533},
2185 {1.85135, 1.85306, 1.85778, 1.86728, 1.88580, 1.95615,
2186 1.92536, 1.91171, 1.92283, 1.96165, 2.22428},
2187 {1.92774, 1.92184, 1.92672, 1.93618, 1.95477, 2.02048,
2188 1.99427, 1.98068, 1.99192, 2.03062, 2.29338},
2189 {1.98929, 1.99081, 1.99567, 2.00515, 2.02373, 2.08987,
2190 2.06332, 2.05249, 2.05939, 2.09928, 2.36227},
2191 {2.05829, 2.05978, 2.06464, 2.07414, 2.09272, 2.15850,
2192 2.12928, 2.12194, 2.12987, 2.16825, 2.43083},
2193 {2.12726, 2.12869, 2.13360, 2.14425, 2.16160, 2.22872,
2194 2.20118, 2.19078, 2.19876, 2.23416, 2.50007}};
2195
2196 // Garfield simulation at UD = -1900V; vd = 1.610cm/microsec, <driftfield> = 655V/cm
2197 Float_t time1900[ktimebin][kZbin] =
2198 {{0.09166, 0.09198, 0.09298, 0.09467, 0.09707, 0.10023,
2199 0.10431, 0.10980, 0.11828, 0.13988, 0.37789},
2200 {0.06584, 0.06622, 0.06735, 0.06920, 0.07179, 0.07514,
2201 0.07938, 0.08505, 0.09374, 0.11606, 0.35599},
2202 {0.03945, 0.04002, 0.04169, 0.04432, 0.04775, 0.05185,
2203 0.05672, 0.06298, 0.07290, 0.09888, 0.34695},
2204 {0.01109, 0.01281, 0.01717, 0.02279, 0.02878, 0.03476,
2205 0.04094, 0.04909, 0.06421, 0.10597, 0.36823},
2206 {0.01115, 0.01287, 0.01720, 0.02294, 0.02862, 0.03448,
2207 0.04074, 0.04973, 0.06783, 0.11506, 0.37206},
2208 {0.03940, 0.03975, 0.04135, 0.04386, 0.04708, 0.05106,
2209 0.05604, 0.06293, 0.07592, 0.10787, 0.36484},
2210 {0.06500, 0.06534, 0.06638, 0.06811, 0.07060, 0.07413,
2211 0.07852, 0.08491, 0.09614, 0.12446, 0.37626},
2212 {0.09119, 0.09140, 0.09194, 0.09293, 0.09471, 0.00000,
2213 0.11013, 0.11685, 0.13050, 0.16302, 0.41991},
2214 {0.13111, 0.13190, 0.13466, 0.14091, 0.15554, 0.22409,
2215 0.18846, 0.18167, 0.19113, 0.22854, 0.48995},
2216 {0.18849, 0.18975, 0.19380, 0.20185, 0.21797, 0.28050,
2217 0.25368, 0.24575, 0.25446, 0.29249, 0.55442},
2218 {0.24995, 0.25125, 0.25563, 0.26366, 0.27986, 0.34065,
2219 0.31605, 0.30815, 0.31680, 0.35482, 0.61697},
2220 {0.31187, 0.31324, 0.31745, 0.32580, 0.34205, 0.40217,
2221 0.37825, 0.37031, 0.37897, 0.41696, 0.67890},
2222 {0.37401, 0.37531, 0.37955, 0.38777, 0.40395, 0.46408,
2223 0.44037, 0.43242, 0.44108, 0.47906, 0.74122},
2224 {0.43610, 0.43741, 0.44161, 0.44986, 0.46604, 0.52614,
2225 0.50248, 0.49452, 0.50316, 0.54116, 0.80326},
2226 {0.49820, 0.49988, 0.50372, 0.51196, 0.52814, 0.58822,
2227 0.56459, 0.55661, 0.56527, 0.60326, 0.86526},
2228 {0.56032, 0.56161, 0.56582, 0.57408, 0.59024, 0.65032,
2229 0.62670, 0.61872, 0.62737, 0.66537, 0.92749},
2230 {0.62240, 0.62371, 0.62792, 0.63624, 0.65236, 0.71241,
2231 0.68881, 0.68081, 0.68947, 0.72750, 0.98941},
2232 {0.68449, 0.68581, 0.69002, 0.69828, 0.71444, 0.77452,
2233 0.75089, 0.74295, 0.75157, 0.78957, 1.05157},
2234 {0.74660, 0.74790, 0.75212, 0.76036, 0.77654, 0.83748,
2235 0.81299, 0.80501, 0.81193, 0.85168, 1.11375},
2236 {0.80870, 0.81017, 0.81423, 0.82246, 0.83867, 0.89908,
2237 0.87509, 0.86660, 0.87577, 0.91376, 1.17586},
2238 {0.87080, 0.87233, 0.87632, 0.88458, 0.90074, 0.96083,
2239 0.93718, 0.92922, 0.93787, 0.97588, 1.23794},
2240 {0.93291, 0.93422, 0.93844, 0.94667, 0.96293, 1.02295,
2241 0.99929, 0.99127, 0.99997, 1.03797, 1.29995},
2242 {0.99500, 0.99645, 1.00308, 1.00877, 1.02497, 1.08504,
2243 1.06140, 1.05343, 1.06203, 1.10006, 1.36216},
2244 {1.05712, 1.05926, 1.06262, 1.07092, 1.08706, 1.14754,
2245 1.12350, 1.11550, 1.12417, 1.16218, 1.42427},
2246 {1.11921, 1.12059, 1.12473, 1.13297, 1.14916, 1.21140,
2247 1.18560, 1.17284, 1.18625, 1.22414, 1.48629},
2248 {1.18140, 1.18262, 1.18690, 1.19508, 1.21125, 1.27139,
2249 1.24164, 1.23495, 1.24838, 1.28634, 1.54852},
2250 {1.24340, 1.24473, 1.24901, 1.25732, 1.27336, 1.33358,
2251 1.30793, 1.30179, 1.31047, 1.34848, 1.61066},
2252 {1.30551, 1.30684, 1.31104, 1.32056, 1.33553, 1.39609,
2253 1.37004, 1.36392, 1.37045, 1.41057, 1.67259},
2254 {1.36755, 1.36892, 1.37315, 1.39148, 1.39755, 1.45820,
2255 1.43215, 1.42602, 1.43467, 1.47268, 1.73477},
2256 {1.42966, 1.43101, 1.43549, 1.45359, 1.45976, 1.52031,
2257 1.49601, 1.48811, 1.49677, 1.53477, 1.79691},
2258 {1.49180, 1.49321, 1.49760, 1.51570, 1.52175, 1.58185,
2259 1.55771, 1.55023, 1.55888, 1.59672, 1.85501},
2260 {1.55391, 1.55527, 1.55943, 1.57782, 1.58391, 1.64395,
2261 1.62008, 1.61233, 1.62085, 1.65883, 1.92091},
2262 {1.61599, 1.61732, 1.62154, 1.63993, 1.64612, 1.70608,
2263 1.68237, 1.67108, 1.68301, 1.72110, 1.97931},
2264 {1.67808, 1.67948, 1.68364, 1.70204, 1.70823, 1.76858,
2265 1.74404, 1.73539, 1.74512, 1.78321, 2.04522},
2266 {1.74019, 1.74152, 1.74573, 1.76415, 1.77015, 1.83040,
2267 1.80615, 1.79366, 1.80723, 1.84509, 2.10742},
2268 {1.80235, 1.80362, 1.80783, 1.82626, 1.83227, 1.89246,
2269 1.86795, 1.85405, 1.86938, 1.90720, 2.16953},
2270 {1.86442, 1.86572, 1.86994, 1.88837, 1.89438, 1.95445,
2271 1.93006, 1.92283, 1.93148, 1.96931, 2.23147},
2272 {1.92700, 1.92783, 1.93197, 1.95049, 1.95649, 2.01668,
2273 1.99217, 1.98486, 1.99352, 2.03143, 2.29358}};
2274
2275 // Garfield simulation at UD = -2000V; vd = 1.783cm/microsec, <driftfield> = 688V/cm
2276 Float_t time2000[ktimebin][kZbin] =
2277 {{0.09176, 0.09196, 0.09296, 0.09465, 0.09704, 0.10020,
2278 0.10427, 0.10977, 0.11825, 0.13988, 0.37774},
2279 {0.06583, 0.06620, 0.06735, 0.06918, 0.07177, 0.07513,
2280 0.07936, 0.08503, 0.09372, 0.11606, 0.35586},
2281 {0.03944, 0.04001, 0.04170, 0.04431, 0.04774, 0.05184,
2282 0.05670, 0.06296, 0.07291, 0.09893, 0.34680},
2283 {0.01108, 0.01281, 0.01719, 0.02279, 0.02879, 0.03474,
2284 0.04093, 0.04908, 0.06422, 0.10605, 0.36800},
2285 {0.01114, 0.01287, 0.01720, 0.02276, 0.02863, 0.03449,
2286 0.04073, 0.04970, 0.06774, 0.11478, 0.37179},
2287 {0.03925, 0.03977, 0.04135, 0.04386, 0.04711, 0.05108,
2288 0.05604, 0.06290, 0.07580, 0.10748, 0.36386},
2289 {0.06501, 0.06536, 0.06640, 0.06814, 0.07062, 0.07398,
2290 0.07852, 0.08487, 0.09598, 0.12405, 0.37519},
2291 {0.09109, 0.09127, 0.09188, 0.09292, 0.09472, 0.00000,
2292 0.10964, 0.11630, 0.12960, 0.16150, 0.41765},
2293 {0.12898, 0.12968, 0.13209, 0.13749, 0.15034, 0.21286,
2294 0.18088, 0.17590, 0.18591, 0.22254, 0.48315},
2295 {0.18122, 0.18227, 0.18574, 0.19263, 0.20674, 0.26376,
2296 0.23960, 0.23375, 0.24316, 0.28047, 0.54179},
2297 {0.23674, 0.23784, 0.24142, 0.24847, 0.26264, 0.31810,
2298 0.29602, 0.29008, 0.29944, 0.33675, 0.59795},
2299 {0.29279, 0.29382, 0.29742, 0.30448, 0.31865, 0.37364,
2300 0.35215, 0.34629, 0.35555, 0.39286, 0.65411},
2301 {0.34875, 0.34987, 0.35346, 0.36054, 0.37472, 0.42956,
2302 0.40825, 0.40229, 0.41167, 0.44894, 0.71033},
2303 {0.40484, 0.40594, 0.40954, 0.41660, 0.43077, 0.48560,
2304 0.46433, 0.45840, 0.46772, 0.50500, 0.76632},
2305 {0.46090, 0.46201, 0.46560, 0.47267, 0.48684, 0.54167,
2306 0.52041, 0.51449, 0.52382, 0.56108, 0.82227},
2307 {0.51698, 0.51809, 0.52173, 0.52874, 0.54291, 0.59776,
2308 0.57646, 0.57052, 0.57986, 0.61717, 0.87836},
2309 {0.57306, 0.57418, 0.57782, 0.58513, 0.59899, 0.65380,
2310 0.63255, 0.62661, 0.63594, 0.67325, 0.93460},
2311 {0.62912, 0.63024, 0.63383, 0.64103, 0.65506, 0.70988,
2312 0.68484, 0.68267, 0.69202, 0.72878, 0.99046},
2313 {0.68521, 0.68633, 0.68990, 0.69699, 0.71115, 0.76595,
2314 0.74468, 0.73872, 0.74814, 0.78538, 1.04674},
2315 {0.74127, 0.74239, 0.74605, 0.75303, 0.77022, 0.82204,
2316 0.80078, 0.79484, 0.80416, 0.84147, 1.10261},
2317 {0.79736, 0.79846, 0.80206, 0.80947, 0.82330, 0.87813,
2318 0.85688, 0.85087, 0.86023, 0.89752, 1.15874},
2319 {0.85342, 0.85454, 0.85815, 0.86519, 0.87936, 0.93417,
2320 0.91293, 0.90428, 0.91631, 0.95360, 1.20760},
2321 {0.90949, 0.91061, 0.91423, 0.92128, 0.93544, 0.99026,
2322 0.96807, 0.96305, 0.97239, 1.00967, 1.27078},
2323 {0.96556, 0.96669, 0.97111, 0.97734, 0.99151, 1.04664,
2324 1.02508, 1.01879, 1.02846, 1.06167, 1.32695},
2325 {1.02167, 1.02279, 1.02656, 1.03341, 1.04759, 1.10242,
2326 1.08115, 1.07003, 1.08453, 1.12184, 1.38304},
2327 {1.07776, 1.07883, 1.08242, 1.08950, 1.10384, 1.16422,
2328 1.13725, 1.13133, 1.14061, 1.17793, 1.43910},
2329 {1.13379, 1.13492, 1.13864, 1.14567, 1.15973, 1.21455,
2330 1.19323, 1.18734, 1.19668, 1.23401, 1.49528},
2331 {1.18988, 1.19098, 1.19457, 1.20164, 1.21582, 1.27064,
2332 1.24937, 1.24044, 1.25275, 1.29004, 1.55137},
2333 {1.24592, 1.24706, 1.25087, 1.25773, 1.27188, 1.32670,
2334 1.30544, 1.29953, 1.30883, 1.34613, 1.60743},
2335 {1.30202, 1.30313, 1.30673, 1.31381, 1.32797, 1.38278,
2336 1.36151, 1.35167, 1.36490, 1.40221, 1.66306},
2337 {1.35809, 1.35921, 1.36282, 1.36986, 1.38403, 1.43888,
2338 1.41760, 1.41174, 1.42083, 1.45830, 1.71915},
2339 {1.41419, 1.41528, 1.41890, 1.42595, 1.44011, 1.49496,
2340 1.47368, 1.46769, 1.47706, 1.51436, 1.77523},
2341 {1.47131, 1.47141, 1.47494, 1.48850, 1.49620, 1.55137,
2342 1.52977, 1.51820, 1.53315, 1.57042, 1.83158},
2343 {1.52635, 1.52750, 1.53103, 1.53814, 1.55228, 1.60736,
2344 1.58503, 1.57986, 1.58920, 1.62649, 1.88767},
2345 {1.58418, 1.58355, 1.58711, 1.59526, 1.60833, 1.66316,
2346 1.63345, 1.63261, 1.64556, 1.68204, 1.94359},
2347 {1.64027, 1.63958, 1.64489, 1.65024, 1.66443, 1.71925,
2348 1.69794, 1.69201, 1.70143, 1.73865, 1.99968},
2349 {1.69450, 1.69566, 1.69940, 1.70697, 1.71841, 1.77819,
2350 1.75396, 1.74814, 1.75743, 1.79083, 2.05427},
2351 {1.75054, 1.75221, 1.75527, 1.76306, 1.77662, 1.83428,
2352 1.81006, 1.81173, 1.81345, 1.85076, 2.10289}};
2353
2354 // Garfield simulation at UD = -2100V; vd = 1.959cm/microsec, <driftfield> = 720V/cm
2355 Float_t time2100[ktimebin][kZbin] =
2356 {{0.09160, 0.09194, 0.09294, 0.09462, 0.09701, 0.10017,
2357 0.10424, 0.10974, 0.11823, 0.13988, 0.37762},
2358 {0.06585, 0.06619, 0.06731, 0.06916, 0.07174, 0.07509,
2359 0.07933, 0.08500, 0.09370, 0.11609, 0.35565},
2360 {0.03960, 0.04001, 0.04171, 0.04430, 0.04774, 0.05182,
2361 0.05668, 0.06294, 0.07291, 0.09896, 0.34676},
2362 {0.01109, 0.01280, 0.01716, 0.02279, 0.02876, 0.03474,
2363 0.04096, 0.04908, 0.06424, 0.10612, 0.36790},
2364 {0.01114, 0.01285, 0.01719, 0.02287, 0.02863, 0.03449,
2365 0.04073, 0.04964, 0.06759, 0.11446, 0.37162},
2366 {0.03922, 0.03977, 0.04146, 0.04386, 0.04711, 0.05109,
2367 0.05605, 0.06287, 0.07575, 0.10713, 0.36298},
2368 {0.06504, 0.06538, 0.06641, 0.06818, 0.07064, 0.07426,
2369 0.07852, 0.08483, 0.09581, 0.12363, 0.37424},
2370 {0.09103, 0.09129, 0.09186, 0.09291, 0.09476, 0.00000,
2371 0.10923, 0.11578, 0.12873, 0.16005, 0.41525},
2372 {0.12723, 0.12777, 0.12988, 0.13458, 0.14579, 0.20264,
2373 0.17421, 0.17078, 0.18132, 0.21708, 0.47699},
2374 {0.17508, 0.17601, 0.17897, 0.18487, 0.19698, 0.24881,
2375 0.22737, 0.22337, 0.23348, 0.27000, 0.53032},
2376 {0.22571, 0.22663, 0.22969, 0.23570, 0.24787, 0.29826,
2377 0.27871, 0.27462, 0.28471, 0.32122, 0.58166},
2378 {0.27664, 0.27759, 0.28067, 0.28669, 0.29891, 0.34898,
2379 0.32982, 0.32570, 0.33576, 0.37229, 0.63268},
2380 {0.32766, 0.32862, 0.33170, 0.33778, 0.34988, 0.39973,
2381 0.38088, 0.37675, 0.38680, 0.42333, 0.68159},
2382 {0.37872, 0.37966, 0.38275, 0.38875, 0.40093, 0.45073,
2383 0.43192, 0.42780, 0.43786, 0.47438, 0.73480},
2384 {0.42974, 0.43070, 0.43378, 0.43982, 0.45196, 0.50177,
2385 0.48297, 0.47884, 0.48889, 0.52544, 0.78581},
2386 {0.48081, 0.48175, 0.48482, 0.49084, 0.50302, 0.55290,
2387 0.53398, 0.52988, 0.53994, 0.57647, 0.83687},
2388 {0.53645, 0.53295, 0.53586, 0.54188, 0.55408, 0.60398,
2389 0.58504, 0.58092, 0.59100, 0.62768, 0.88773},
2390 {0.58345, 0.58409, 0.58690, 0.59292, 0.60510, 0.65562,
2391 0.63609, 0.63197, 0.64203, 0.67856, 0.93907},
2392 {0.63397, 0.63490, 0.63795, 0.64403, 0.65613, 0.70612,
2393 0.68714, 0.68301, 0.69294, 0.72955, 0.99000},
2394 {0.68496, 0.68592, 0.68899, 0.69504, 0.70733, 0.75708,
2395 0.73818, 0.73405, 0.74412, 0.78064, 1.04100},
2396 {0.73600, 0.73696, 0.74003, 0.74624, 0.75828, 0.80805,
2397 0.78904, 0.78512, 0.79517, 0.83152, 1.09205},
2398 {0.78709, 0.78801, 0.79108, 0.79709, 0.80931, 0.85906,
2399 0.84027, 0.83614, 0.84621, 0.88269, 1.14058},
2400 {0.83808, 0.83905, 0.84215, 0.84816, 0.86031, 0.91011,
2401 0.89139, 0.88718, 0.89725, 0.93377, 1.19413},
2402 {0.88916, 0.89010, 0.89320, 0.89920, 0.91136, 0.96117,
2403 0.94235, 0.93822, 0.94828, 0.98480, 1.24538},
2404 {0.94036, 0.94113, 0.94422, 0.95023, 0.96241, 1.01220,
2405 0.99310, 0.98927, 0.99933, 1.03585, 1.29629},
2406 {0.99139, 0.99220, 0.99525, 1.00127, 1.01344, 1.06324,
2407 1.04451, 1.04033, 1.04836, 1.08690, 1.34727},
2408 {1.04261, 1.04325, 1.04628, 1.05232, 1.06448, 1.12090,
2409 1.09546, 1.09136, 1.10142, 1.13795, 1.39831},
2410 {1.09331, 1.09429, 1.09742, 1.10336, 1.11557, 1.16547,
2411 1.14658, 1.13642, 1.15247, 1.18898, 1.44936},
2412 {1.14436, 1.14539, 1.14847, 1.15443, 1.16662, 1.21794,
2413 1.19763, 1.19329, 1.20349, 1.23956, 1.50043},
2414 {1.19533, 1.19651, 1.19943, 1.20548, 1.21666, 1.26753,
2415 1.24862, 1.24434, 1.25455, 1.29106, 1.55142},
2416 {1.24638, 1.24756, 1.25046, 1.25648, 1.26764, 1.31858,
2417 1.29967, 1.29538, 1.30499, 1.34211, 1.60250},
2418 {1.29747, 1.29847, 1.30175, 1.30753, 1.31869, 1.36969,
2419 1.35069, 1.34656, 1.35663, 1.39316, 1.64644},
2420 {1.35537, 1.34952, 1.35255, 1.35869, 1.36973, 1.41387,
2421 1.40173, 1.39761, 1.40768, 1.44396, 1.70238},
2422 {1.39956, 1.40056, 1.40380, 1.40961, 1.42178, 1.46492,
2423 1.45278, 1.45423, 1.45872, 1.49522, 1.75557},
2424 {1.45080, 1.45159, 1.45463, 1.46109, 1.47287, 1.52263,
2425 1.50382, 1.50050, 1.50977, 1.54502, 1.80670},
2426 {1.50165, 1.50264, 1.50570, 1.51214, 1.52233, 1.57370,
2427 1.55484, 1.55155, 1.56080, 1.59731, 1.85778},
2428 {1.55269, 1.55364, 1.55675, 1.56274, 1.57491, 1.62598,
2429 1.60590, 1.60259, 1.61185, 1.64836, 1.90883},
2430 {1.60368, 1.60469, 1.60779, 1.61373, 1.62596, 1.67738,
2431 1.65651, 1.65249, 1.66290, 1.69936, 1.95959}};
2432
2433 // Garfield simulation at UD = -2200V; vd = 2.134cm/microsec, <driftfield> = 753V/cm
2434 Float_t time2200[ktimebin][kZbin] =
2435 {{0.09162, 0.09194, 0.09292, 0.09460, 0.09702, 0.10014,
2436 0.10421, 0.10971, 0.11820, 0.13990, 0.37745},
2437 {0.06581, 0.06618, 0.06730, 0.06915, 0.07173, 0.07507,
2438 0.07931, 0.08497, 0.09368, 0.11609, 0.35560},
2439 {0.03947, 0.04001, 0.04167, 0.04429, 0.04772, 0.05183,
2440 0.05667, 0.06293, 0.07292, 0.09900, 0.34673},
2441 {0.01111, 0.01280, 0.01716, 0.02279, 0.02876, 0.03473,
2442 0.04091, 0.04907, 0.06426, 0.10620, 0.36766},
2443 {0.01113, 0.01285, 0.01719, 0.02276, 0.02863, 0.03452,
2444 0.04076, 0.04960, 0.06745, 0.11419, 0.37139},
2445 {0.03923, 0.03978, 0.04137, 0.04387, 0.04713, 0.05110,
2446 0.05605, 0.06284, 0.07551, 0.10677, 0.36210},
2447 {0.06505, 0.06540, 0.06644, 0.06820, 0.07069, 0.07401,
2448 0.07852, 0.08479, 0.09565, 0.12325, 0.37313},
2449 {0.09107, 0.09127, 0.09181, 0.09291, 0.09474, 0.00000,
2450 0.10883, 0.11528, 0.12789, 0.15865, 0.41313},
2451 {0.12559, 0.12622, 0.12800, 0.13206, 0.14166, 0.19331,
2452 0.16832, 0.16632, 0.17724, 0.21218, 0.47098},
2453 {0.16992, 0.17070, 0.17325, 0.17831, 0.18871, 0.23557,
2454 0.21690, 0.21451, 0.22514, 0.26082, 0.52034},
2455 {0.21640, 0.21722, 0.21987, 0.22500, 0.23540, 0.28097,
2456 0.26399, 0.26154, 0.27214, 0.30784, 0.56734},
2457 {0.26318, 0.26400, 0.26679, 0.27181, 0.28220, 0.32739,
2458 0.31090, 0.30842, 0.31902, 0.35474, 0.61415},
2459 {0.31001, 0.31085, 0.31348, 0.31866, 0.32903, 0.37412,
2460 0.35777, 0.35546, 0.36588, 0.40159, 0.66103},
2461 {0.35687, 0.35769, 0.36033, 0.36556, 0.37588, 0.42094,
2462 0.40523, 0.40214, 0.41273, 0.44841, 0.70785},
2463 {0.40372, 0.40457, 0.40723, 0.41234, 0.42273, 0.46778,
2464 0.45148, 0.44903, 0.45961, 0.49526, 0.75486},
2465 {0.45062, 0.45139, 0.45404, 0.45966, 0.46958, 0.51470,
2466 0.49833, 0.49584, 0.50644, 0.54211, 0.80160},
2467 {0.49742, 0.49825, 0.50088, 0.50605, 0.51644, 0.56148,
2468 0.54518, 0.54270, 0.55330, 0.58897, 0.84854},
2469 {0.54427, 0.54510, 0.54774, 0.55290, 0.56329, 0.60846,
2470 0.59203, 0.58955, 0.60014, 0.63578, 0.89528},
2471 {0.59119, 0.59199, 0.59471, 0.59975, 0.61014, 0.65533,
2472 0.63889, 0.63636, 0.64699, 0.68269, 0.94197},
2473 {0.63866, 0.63880, 0.64145, 0.64664, 0.65701, 0.70639,
2474 0.68574, 0.68325, 0.69385, 0.72949, 0.98900},
2475 {0.68483, 0.68566, 0.68831, 0.69347, 0.70386, 0.74890,
2476 0.73260, 0.73010, 0.74069, 0.77638, 1.03320},
2477 {0.73168, 0.73255, 0.73515, 0.74031, 0.75072, 0.79576,
2478 0.77117, 0.77501, 0.78755, 0.82318, 1.08006},
2479 {0.77854, 0.78310, 0.78200, 0.79525, 0.79756, 0.84281,
2480 0.81803, 0.82393, 0.83441, 0.87008, 1.12692},
2481 {0.82541, 0.82642, 0.82916, 0.83528, 0.84442, 0.89086,
2482 0.87315, 0.87079, 0.88125, 0.91694, 1.17648},
2483 {0.87226, 0.87308, 0.87602, 0.88086, 0.89128, 0.93772,
2484 0.92001, 0.91751, 0.92811, 0.95587, 1.22328},
2485 {0.91921, 0.91994, 0.92256, 0.92772, 0.94713, 0.98566,
2486 0.96690, 0.96436, 0.97495, 1.01064, 1.26882},
2487 {0.96790, 0.96679, 0.96941, 0.97463, 0.99399, 1.03001,
2488 1.01376, 1.01112, 1.02181, 1.05749, 1.31568},
2489 {1.01278, 1.01390, 1.01674, 1.02147, 1.03182, 1.07820,
2490 1.06056, 1.05798, 1.06867, 1.10433, 1.36390},
2491 {1.05964, 1.06076, 1.06331, 1.06833, 1.07870, 1.13297,
2492 1.10742, 1.10520, 1.11543, 1.15120, 1.41069},
2493 {1.10664, 1.10762, 1.10997, 1.11519, 1.12556, 1.17531,
2494 1.15427, 1.14620, 1.16229, 1.19805, 1.45758},
2495 {1.15352, 1.15421, 1.15683, 1.16218, 1.17242, 1.21910,
2496 1.20035, 1.19863, 1.20579, 1.24473, 1.50412},
2497 {1.20019, 1.20115, 1.20369, 1.20892, 1.21928, 1.26913,
2498 1.24721, 1.24549, 1.25605, 1.29159, 1.54920},
2499 {1.24707, 1.24846, 1.25052, 1.25602, 1.26608, 1.31558,
2500 1.29448, 1.29232, 1.30293, 1.33675, 1.59798},
2501 {1.29391, 1.29475, 1.29738, 1.30255, 1.31294, 1.36244,
2502 1.34167, 1.33918, 1.34979, 1.38229, 1.64496},
2503 {1.34078, 1.34304, 1.34424, 1.35565, 1.35980, 1.40930,
2504 1.38853, 1.38229, 1.39664, 1.42863, 1.69162},
2505 {1.38762, 1.38847, 1.39110, 1.39627, 1.40666, 1.45183,
2506 1.43539, 1.43289, 1.44348, 1.47549, 1.73876},
2507 {1.43524, 1.43533, 1.43796, 1.44310, 1.45371, 1.49305,
2508 1.48224, 1.47941, 1.49034, 1.52601, 1.78552},
2509 {1.48122, 1.48219, 1.48482, 1.48991, 1.50030, 1.53991,
2510 1.52898, 1.52653, 1.53653, 1.57282, 1.82386}};
2511
4d18a639 2512 if (fTimeStruct1) {
2513 delete [] fTimeStruct1;
2514 }
2515 fTimeStruct1 = new Float_t[ktimebin*kZbin];
2516
2517 if (fTimeStruct2) {
2518 delete [] fTimeStruct2;
2519 }
2520 fTimeStruct2 = new Float_t[ktimebin*kZbin];
2521
2522 for (Int_t ctrt = 0; ctrt < ktimebin; ctrt++) {
2523 for (Int_t ctrz = 0; ctrz < kZbin; ctrz++) {
2524 if (vdrift > fVDsmp[6]) {
2525 fTimeStruct1[ctrt+ctrz*ktimebin] = time2100[ctrt][ctrz];
2526 fTimeStruct2[ctrt+ctrz*ktimebin] = time2200[ctrt][ctrz];
2527 fVDlo = fVDsmp[6];
2528 fVDhi = fVDsmp[7];
2529 }
2530 else if (vdrift > fVDsmp[5]) {
2531 fTimeStruct1[ctrt+ctrz*ktimebin] = time2000[ctrt][ctrz];
2532 fTimeStruct2[ctrt+ctrz*ktimebin] = time2100[ctrt][ctrz];
2533 fVDlo = fVDsmp[5];
2534 fVDhi = fVDsmp[6];
2535 }
2536 else if (vdrift > fVDsmp[4]) {
2537 fTimeStruct1[ctrt+ctrz*ktimebin] = time1900[ctrt][ctrz];
2538 fTimeStruct2[ctrt+ctrz*ktimebin] = time2000[ctrt][ctrz];
2539 fVDlo = fVDsmp[4];
2540 fVDhi = fVDsmp[5];
2541 }
2542 else if (vdrift > fVDsmp[3]) {
2543 fTimeStruct1[ctrt+ctrz*ktimebin] = time1800[ctrt][ctrz];
2544 fTimeStruct2[ctrt+ctrz*ktimebin] = time1900[ctrt][ctrz];
2545 fVDlo = fVDsmp[3];
2546 fVDhi = fVDsmp[4];
2547 }
2548 else if (vdrift > fVDsmp[2]) {
2549 fTimeStruct1[ctrt+ctrz*ktimebin] = time1700[ctrt][ctrz];
2550 fTimeStruct2[ctrt+ctrz*ktimebin] = time1800[ctrt][ctrz];
2551 fVDlo = fVDsmp[2];
2552 fVDhi = fVDsmp[3];
2553 }
2554 else if (vdrift > fVDsmp[1]) {
2555 fTimeStruct1[ctrt+ctrz*ktimebin] = time1600[ctrt][ctrz];
2556 fTimeStruct2[ctrt+ctrz*ktimebin] = time1700[ctrt][ctrz];
2557 fVDlo = fVDsmp[1];
2558 fVDhi = fVDsmp[2];
2559 }
2560 else if (vdrift > (fVDsmp[0] - 1.0e-5)) {
2561 fTimeStruct1[ctrt+ctrz*ktimebin] = time1500[ctrt][ctrz];
2562 fTimeStruct2[ctrt+ctrz*ktimebin] = time1600[ctrt][ctrz];
2563 fVDlo = fVDsmp[0];
2564 fVDhi = fVDsmp[1];
3551db50 2565 }
2566 }
2567 }
4d18a639 2568
3551db50 2569}
2570
2571//_____________________________________________________________________________
2572void AliTRDdigitizer::RecalcDiffusion(Float_t vdrift)
2573{
4d18a639 2574 //
2575 // Recalculates the diffusion parameters
2576 //
0dbeb81c 2577 // The B=0 case is not really included here.
2578 // Should be revisited!
2579 //
4d18a639 2580
2581 if (vdrift == fDiffLastVdrift) {
3551db50 2582 return;
4d18a639 2583 }
7754cd1f 2584
4d18a639 2585 AliTRDSimParam *simParam = AliTRDSimParam::Instance();
9afbd7de 2586 if (!simParam) {
afb9f880 2587 AliFatal("Could not get simulation parameters");
3551db50 2588 return;
2589 }
2590
4d18a639 2591 AliTRDCommonParam *commonParam = AliTRDCommonParam::Instance();
9afbd7de 2592 if (!commonParam) {
afb9f880 2593 AliFatal("Could not get common parameters");
3551db50 2594 return;
2595 }
2596
4d18a639 2597 AliTRDcalibDB *calibration = AliTRDcalibDB::Instance();
9afbd7de 2598 if (!calibration) {
afb9f880 2599 AliFatal("Could not get calibration object");
3551db50 2600 return;
2601 }
2602
4e009ce4 2603 // The magnetic field strength
1b95a37b 2604 Double_t x[3] = { 0.0, 0.0, 0.0 };
2605 Double_t b[3];
4e009ce4 2606 gAlice->Field(x,b); // b[] is in kilo Gauss
1b95a37b 2607 Float_t field = b[2] * 0.1; // Tesla
1b95a37b 2608
4d18a639 2609 fDiffLastVdrift = vdrift;
3551db50 2610
9afbd7de 2611 // DiffusionL
4d18a639 2612 const Int_t kNbL = 5;
2613 Float_t p0L[kNbL] = { 0.007440, 0.007493, 0.007513, 0.007672, 0.007831 };
2614 Float_t p1L[kNbL] = { 0.019252, 0.018912, 0.018636, 0.018012, 0.017343 };
2615 Float_t p2L[kNbL] = { -0.005042, -0.004926, -0.004867, -0.004650, -0.004424 };
2616 Float_t p3L[kNbL] = { 0.000195, 0.000189, 0.000195, 0.000182, 0.000169 };
2617
2618 Int_t ibL = ((Int_t) (10 * (field - 0.15)));
2619 ibL = TMath::Max( 0,ibL);
2620 ibL = TMath::Min(kNbL,ibL);
2621
2622 fDiffusionL = p0L[ibL]
2623 + p1L[ibL] * vdrift
2624 + p2L[ibL] * vdrift*vdrift
2625 + p3L[ibL] * vdrift*vdrift*vdrift;
3551db50 2626
9afbd7de 2627 // DiffusionT
4d18a639 2628 const Int_t kNbT = 5;
2629 Float_t p0T[kNbT] = { 0.009550, 0.009599, 0.009674, 0.009757, 0.009850 };
2630 Float_t p1T[kNbT] = { 0.006667, 0.006539, 0.006359, 0.006153, 0.005925 };
2631 Float_t p2T[kNbT] = { -0.000853, -0.000798, -0.000721, -0.000635, -0.000541 };
2632 Float_t p3T[kNbT] = { 0.000131, 0.000122, 0.000111, 0.000098, 0.000085 };
2633
2634 Int_t ibT= ((Int_t) (10 * (field - 0.15)));
2635 ibT = TMath::Max( 0,ibT);
2636 ibT = TMath::Min(kNbT,ibT);
2637
2638 fDiffusionT = p0T[ibT]
2639 + p1T[ibT] * vdrift
2640 + p2T[ibT] * vdrift*vdrift
2641 + p3T[ibT] * vdrift*vdrift*vdrift;
3551db50 2642
9afbd7de 2643 // OmegaTau
4e009ce4 2644 fOmegaTau = calibration->GetOmegaTau(vdrift,field);
1b95a37b 2645
9afbd7de 2646 // Lorentzfactor
4d18a639 2647 if (commonParam->ExBOn()) {
2648 fLorentzFactor = 1.0 / (1.0 + fOmegaTau*fOmegaTau);
2649 }
2650 else {
2651 fLorentzFactor = 1.0;
3551db50 2652 }
9afbd7de 2653
3551db50 2654}
2655
2656//_____________________________________________________________________________
2657Float_t AliTRDdigitizer::GetDiffusionL(Float_t vdrift)
2658{
2659 //
2660 // Returns the longitudinal diffusion coefficient for a given drift
2661 // velocity <vd> and a B-field <b> for Xe/CO2 (15%).
2662 // The values are according to a GARFIELD simulation.
2663 //
2664
2665 RecalcDiffusion(vdrift);
4d18a639 2666
2667 return fDiffusionL;
9afbd7de 2668
3551db50 2669}
2670
2671//_____________________________________________________________________________
2672Float_t AliTRDdigitizer::GetDiffusionT(Float_t vdrift)
2673{
2674 //
2675 // Returns the transverse diffusion coefficient for a given drift
2676 // velocity <vd> and a B-field <b> for Xe/CO2 (15%).
2677 // The values are according to a GARFIELD simulation.
2678 //
2679
2680 RecalcDiffusion(vdrift);
4d18a639 2681
2682 return fDiffusionT;
9afbd7de 2683
3551db50 2684}
2685
2686//_____________________________________________________________________________
afb9f880 2687Int_t AliTRDdigitizer::Diffusion(Float_t vdrift, Double_t absdriftlength
2688 , Double_t &lRow, Double_t &lCol, Double_t &lTime)
3551db50 2689{
2690 //
afb9f880 2691 // Applies the diffusion smearing to the position of a single electron.
2692 // Depends on absolute drift length.
3551db50 2693 //
2694
2695 RecalcDiffusion(vdrift);
2696
afb9f880 2697 Float_t driftSqrt = TMath::Sqrt(absdriftlength);
4d18a639 2698 Float_t sigmaT = driftSqrt * fDiffusionT;
2699 Float_t sigmaL = driftSqrt * fDiffusionL;
afb9f880 2700 lRow = gRandom->Gaus(lRow ,sigmaT * GetLorentzFactor(vdrift));
2701 lCol = gRandom->Gaus(lCol ,sigmaT);
2702 lTime = gRandom->Gaus(lTime,sigmaL * GetLorentzFactor(vdrift));
3551db50 2703
2704 return 1;
9afbd7de 2705
3551db50 2706}
2707
2708//_____________________________________________________________________________
2709Float_t AliTRDdigitizer::GetLorentzFactor(Float_t vd)
2710{
9afbd7de 2711 //
2712 // Returns the recalculated Lorentz factor
2713 //
2714
3551db50 2715 RecalcDiffusion(vd);
4d18a639 2716
2717 return fLorentzFactor;
9afbd7de 2718
3551db50 2719}
2720
2721//_____________________________________________________________________________
afb9f880 2722Int_t AliTRDdigitizer::ExB(Float_t vdrift, Double_t driftlength, Double_t &lRow)
3551db50 2723{
2724 //
afb9f880 2725 // Applies E x B effects to the position of a single electron.
2726 // Depends on signed drift length.
3551db50 2727 //
2728
2729 RecalcDiffusion(vdrift);
afb9f880 2730
2731 lRow = lRow + fOmegaTau * driftlength;
3551db50 2732
2733 return 1;
9afbd7de 2734
3551db50 2735}