warning fixed
[u/mrichter/AliRoot.git] / START / AliSTARTDigitizer.cxx
CommitLineData
ede9aff7 1
2/**************************************************************************
3 * Copyright(c) 1998-2000, ALICE Experiment at CERN, All rights reserved. *
4 * *
5 * Author: The ALICE Off-line Project. *
6 * Contributors are mentioned in the code where appropriate. *
7 * *
8 * Permission to use, copy, modify and distribute this software and its *
9 * documentation strictly for non-commercial purposes is hereby granted *
10 * without fee, provided that the above copyright notice appears in all *
11 * copies and that both the copyright notice and this permission notice *
12 * appear in the supporting documentation. The authors make no claims *
13 * about the suitability of this software for any purpose. It is *
14 * provided "as is" without express or implied warranty. *
15 **************************************************************************/
16
17
18#include <TTree.h>
ede9aff7 19#include <TFile.h>
20#include <TDirectory.h>
21#include <TRandom.h>
e73d68f2 22#include <TArrayI.h>
2b4678e2 23#include <TError.h>
ede9aff7 24
25
26#include "AliSTARTDigitizer.h"
27#include "AliSTART.h"
28#include "AliSTARThit.h"
e73d68f2 29#include "AliSTARThitPhoton.h"
ede9aff7 30#include "AliSTARTdigit.h"
31#include "AliRunDigitizer.h"
affef71b 32#include <AliDetector.h>
ede9aff7 33#include "AliRun.h"
affef71b 34#include <AliLoader.h>
35#include <AliRunLoader.h>
ede9aff7 36#include <stdlib.h>
ef0750c2 37#include <Riostream.h>
38#include <Riostream.h>
ede9aff7 39
40ClassImp(AliSTARTDigitizer)
41
42//___________________________________________
43 AliSTARTDigitizer::AliSTARTDigitizer() :AliDigitizer()
44{
45// Default ctor - don't use it
46 ;
47}
48
49//___________________________________________
50AliSTARTDigitizer::AliSTARTDigitizer(AliRunDigitizer* manager)
51 :AliDigitizer(manager)
52{
f540341d 53 // cout<<"AliSTARTDigitizer::AliSTARTDigitizer"<<endl;
ede9aff7 54// ctor which should be used
55// fDebug =0;
56ab13b4 56 if (GetDebug())
57 Info("(AliRunDigitizer* manager)" ,"processed");
ede9aff7 58
affef71b 59 ftimeRightTDC = new TArrayI(12);
60 ftimeLeftTDC = new TArrayI(12);
61 fRightADC = new TArrayI(12);
62 fLeftADC = new TArrayI(12);
ede9aff7 63}
64
65//------------------------------------------------------------------------
66AliSTARTDigitizer::~AliSTARTDigitizer()
67{
68// Destructor
affef71b 69 if(GetDebug()) Info("dtor","START");
70 delete ftimeRightTDC;
71 delete ftimeLeftTDC;
72 delete fRightADC;
73 delete fLeftADC;
ede9aff7 74}
75
76 //------------------------------------------------------------------------
77Bool_t AliSTARTDigitizer::Init()
78{
79// Initialization
f540341d 80// cout<<"AliSTARTDigitizer::Init"<<endl;
ede9aff7 81 return kTRUE;
82}
83
84
85//---------------------------------------------------------------------
86
dc63cec5 87void AliSTARTDigitizer::Exec(Option_t* /*option*/)
ede9aff7 88{
89
affef71b 90 /*
91 Produde digits from hits
92 digits is TObject and includes
93 We are writing array if left & right TDC
94 left & right ADC (will need for slow simulation)
95 TOF first particle left & right
96 mean time and time difference (vertex position)
97
98 */
88cb7938 99
100 AliRunLoader *inRL, *outRL;//in and out Run Loaders
affef71b 101 AliLoader *pInStartLoader, *pOutStartLoader;// in and out STARTLoaders
88cb7938 102
103 outRL = AliRunLoader::GetRunLoader(fManager->GetOutputFolderName());
affef71b 104 pOutStartLoader = outRL->GetLoader("STARTLoader");
88cb7938 105
ede9aff7 106#ifdef DEBUG
affef71b 107 cout<<"AliSTARTDigitizer::>Hits2Digits start...\n";
ede9aff7 108#endif
109 //
110 // From hits to digits
111 //
e73d68f2 112 Int_t hit, nhits;
affef71b 113 Float_t meanTime;
114 Int_t countEr[13],countEl[13];
e73d68f2 115 Int_t volume,pmt,tr,tl,sumRight;
e73d68f2 116 Int_t bestRightADC,bestLeftADC;
117 Float_t besttimeleftGaus, besttimerightGaus;
118 Float_t timeright[13]={13*0};
119 Float_t timeleft[13]={13*0};
120 Float_t channelWidth=2.5; //ps
121 Int_t channelWidthADC=1; //ps
1ab4b835 122 // Int_t thresholdAmpl=10;
e73d68f2 123
e73d68f2 124
7a68e0ef 125 inRL = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(0));
7a68e0ef 126
affef71b 127
128 AliSTART *fSTART = (AliSTART*) inRL->GetAliRun()->GetDetector("START");
ede9aff7 129 AliSTARThit *startHit;
130 TBranch *brHits=0;
e73d68f2 131 TBranch *brHitPhoton=0;
ede9aff7 132 fdigits= new AliSTARTdigit();
133
134 Int_t nFiles=fManager->GetNinputs();
135 for (Int_t inputFile=0; inputFile<nFiles; inputFile++) {
e73d68f2 136
affef71b 137 Float_t besttimeright=9999.;
138 Float_t besttimeleft=9999.;
139 Int_t iTimeDiff=0;
140 Int_t iTimeAv=0;
141 Float_t timeDiff,timeAv;
e73d68f2 142 sumRight=0;
143 for (Int_t i0=0; i0<13; i0++)
144 {
145 timeright[i0]=0; timeleft[i0]=0;
affef71b 146 countEr[i0]=0; countEl[i0]=0;
e73d68f2 147 }
88cb7938 148
149 inRL = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(inputFile));
affef71b 150 pInStartLoader = inRL->GetLoader("STARTLoader");
151 pInStartLoader->LoadHits("READ");//probably it is necessary to load them before
152 pOutStartLoader->LoadDigits("UPDATE");//probably it is necessary to load them before
153 TClonesArray *fHits = fSTART->Hits ();
ede9aff7 154
affef71b 155 TTree *th = pInStartLoader->TreeH();
ede9aff7 156 brHits = th->GetBranch("START");
e73d68f2 157 brHitPhoton = th->GetBranch("STARThitPhoton");
ede9aff7 158 if (brHits) {
affef71b 159 fSTART->SetHitsAddressBranch(brHits,brHitPhoton);
ede9aff7 160 }else{
00907af4 161 cerr<<"EXEC Branch START hit not found"<<endl;
162 exit(111);
ede9aff7 163 }
164 Int_t ntracks = (Int_t) th->GetEntries();
affef71b 165#ifdef DEBUG
166 Info("Digitizer",ntracks);
167#endif
168 if (ntracks<=0) return;
ede9aff7 169 // Start loop on tracks in the hits containers
170 for (Int_t track=0; track<ntracks;track++) {
171 brHits->GetEntry(track);
7a68e0ef 172 nhits = fHits->GetEntriesFast();
ede9aff7 173 for (hit=0;hit<nhits;hit++) {
7a68e0ef 174 startHit = (AliSTARThit*) fHits->UncheckedAt(hit);
2b4678e2 175 if (!startHit) {
176 ::Error("Exec","The unchecked hit doesn't exist");
177 break;
178 }
0b73602e 179 pmt=startHit->Pmt();
180 volume = startHit->Volume();
ede9aff7 181 if(volume==1){
0b73602e 182 timeright[pmt] = startHit->Time();
e73d68f2 183 if(timeright[pmt]<besttimeright)
e73d68f2 184 {
affef71b 185 besttimeright=timeright[pmt];
ede9aff7 186 } //timeright
187 }//time for right shoulder
188 if(volume==2){
0b73602e 189 timeleft[pmt] = startHit->Time();
e73d68f2 190 if(timeleft[pmt]<besttimeleft)
e73d68f2 191 {
affef71b 192 besttimeleft=timeleft[pmt];
e73d68f2 193
ede9aff7 194 } //timeleftbest
195 }//time for left shoulder
196 } //hit loop
197 } //track loop
dc63cec5 198
e73d68f2 199 // z position
e73d68f2 200
ede9aff7 201 //folding with experimental time distribution
e73d68f2 202
7115262b 203 Float_t koef=69.7/350.;
affef71b 204 besttimeright=koef*besttimeright;
205 besttimeleftGaus=gRandom->Gaus(besttimeleft,0.05);
206 bestLeftADC=Int_t (besttimeleftGaus*1000/channelWidth);
207 besttimerightGaus=gRandom->Gaus(besttimeright,0.05);
dc63cec5 208 bestRightADC=Int_t (besttimerightGaus*1000/channelWidth);
affef71b 209 timeDiff=besttimerightGaus-besttimeleftGaus;
210#ifdef DEBUG
211 cout<<" timediff in ns "<<timeDiff<<" z= "<<timeDiff*30<<endl;
212#endif
ede9aff7 213 meanTime=(besttimerightGaus+besttimeleftGaus)/2.;
affef71b 214 if ( TMath::Abs(timeDiff)<TMath::Abs(0.3) )
e73d68f2 215 {
216 Float_t t1=1000.*besttimeleftGaus;
217 Float_t t2=1000.*besttimerightGaus;
218 t1=t1/channelWidth; //time in ps to channelWidth
219 t2=t2/channelWidth; //time in ps to channelWidth
affef71b 220 timeAv=(t1+t2)/2.;// time channel numbres
e73d68f2 221
222 // Time to TDC signal
223 // 256 channels for timediff, range 1ns
affef71b 224 iTimeAv=(Int_t)timeAv;
225 timeDiff= 512+1000*timeDiff/channelWidth; // time channel numbres
226 iTimeDiff=(Int_t)timeDiff;
e73d68f2 227 // fill digits
228 fdigits->SetTimeBestLeft(bestLeftADC);
229 fdigits->SetTimeBestRight(bestRightADC);
affef71b 230 fdigits->SetMeanTime(iTimeAv);
231 fdigits->SetTimeDiff(iTimeDiff);
e73d68f2 232 for (Int_t i=0; i<12; i++)
233 {
234 // fill TDC
235 timeright[i+1]=gRandom->Gaus(timeright[i+1],0.05);
236 timeleft[i+1]=gRandom->Gaus(timeleft[i+1],0.05);
237 tr= Int_t (timeright[i+1]*1000/channelWidth);
238 if(tr<200) tr=0;
239 tl= Int_t (timeleft[i+1]*1000/channelWidth);
240 if(tl<1000) tl=0;
241
242 ftimeRightTDC->AddAt(tr,i);
243 ftimeLeftTDC->AddAt(tl,i);
244 //fill ADC
affef71b 245 Int_t al=( Int_t ) countEl[i+1]/ channelWidthADC;
246 Int_t ar=( Int_t ) countEr[i+1]/ channelWidthADC;
e73d68f2 247 fRightADC->AddAt(ar,i);
248 fLeftADC ->AddAt(al,i);
affef71b 249 sumRight+=countEr[i+1];
e73d68f2 250 }
251 fdigits->SetTimeRight(*ftimeRightTDC);
252 fdigits->SetTimeLeft(*ftimeLeftTDC);
253 fdigits->SetADCRight(*fRightADC);
254 fdigits->SetADCLeft(*fLeftADC);
e73d68f2 255 fdigits->SetSumADCRight(sumRight);
256 }
ede9aff7 257 else
258 {timeAv=999999; timeDiff=99999;}
88cb7938 259
260// trick to find out output dir:
7a68e0ef 261
7a68e0ef 262 TDirectory *wd = gDirectory;
affef71b 263 pOutStartLoader->GetDigitsDataLoader()->GetDirectory()->cd();
264 fdigits->Write("START_D");
7a68e0ef 265 wd->cd();
affef71b 266 pInStartLoader->UnloadHits();
267 pOutStartLoader->UnloadDigits();
268 } //event loop
ede9aff7 269}
270
271
e73d68f2 272//------------------------------------------------------------------------
dc63cec5 273Bool_t AliSTARTDigitizer::RegisterPhotoE(/*AliSTARThitPhoton *hit*/)
e73d68f2 274{
affef71b 275 Double_t pP = 0.2;
e73d68f2 276 Double_t p;
277
278 p = gRandom->Rndm();
affef71b 279 if (p > pP)
e73d68f2 280 return kFALSE;
281
282 return kTRUE;
283}
7a68e0ef 284//----------------------------------------------------------------------------