]> git.uio.no Git - u/mrichter/AliRoot.git/blame - START/AliSTARTDigitizer.cxx
Number of pads along z is corrected
[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>
e4da63c2 24#include <TH1F.h>
ede9aff7 25
e4da63c2 26#include "AliLog.h"
ede9aff7 27#include "AliSTARTDigitizer.h"
28#include "AliSTART.h"
29#include "AliSTARThit.h"
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)
7a18b6a5 51 :AliDigitizer(manager),
52 fSTART(0),
53 fHits(0),
54 fdigits(0),
55 ftimeTDC(0),
56 fADC(0),
db173afc 57 ftimeTDCAmp(0),
58 fADCAmp(0),
59 fSumMult(0),
7a18b6a5 60 fEff(0)
ede9aff7 61{
ede9aff7 62// ctor which should be used
e4da63c2 63
64 AliDebug(1,"processed");
65
7a18b6a5 66 fSTART = 0;
7a18b6a5 67 fHits = 0;
68 fdigits = 0;
69
db173afc 70 ftimeTDC = new TArrayI(24);
71 fADC = new TArrayI(24);
72 ftimeTDCAmp = new TArrayI(24);
73 fADCAmp = new TArrayI(24);
74 fSumMult = new TArrayI(6);
75
174d209f 76
77 TFile* file = TFile::Open("$ALICE_ROOT/START/PMTefficiency.root");
78 fEff = (TH1F*) file->Get("hEff")->Clone();
79 fEff->SetDirectory(NULL);
80 file->Close();
81 delete file;
ede9aff7 82}
83
84//------------------------------------------------------------------------
85AliSTARTDigitizer::~AliSTARTDigitizer()
86{
87// Destructor
e4da63c2 88
7a18b6a5 89 AliDebug(1,"START");
90
e4da63c2 91 delete ftimeTDC;
92 delete fADC;
174d209f 93 delete fEff;
db173afc 94 delete ftimeTDCAmp;
95 delete fADCAmp;
96 delete fSumMult;
ede9aff7 97}
98
99 //------------------------------------------------------------------------
100Bool_t AliSTARTDigitizer::Init()
101{
102// Initialization
e4da63c2 103 AliDebug(1," Init");
ede9aff7 104 return kTRUE;
105}
106
107
108//---------------------------------------------------------------------
109
dc63cec5 110void AliSTARTDigitizer::Exec(Option_t* /*option*/)
ede9aff7 111{
112
affef71b 113 /*
114 Produde digits from hits
115 digits is TObject and includes
116 We are writing array if left & right TDC
117 left & right ADC (will need for slow simulation)
118 TOF first particle left & right
119 mean time and time difference (vertex position)
120
121 */
88cb7938 122
db173afc 123 //output loader
124 AliRunLoader *outRL = AliRunLoader::GetRunLoader(fManager->GetOutputFolderName());
125 AliLoader * pOutStartLoader = outRL->GetLoader("STARTLoader");
88cb7938 126
e4da63c2 127 AliDebug(1,"start...");
db173afc 128 //input loader
ede9aff7 129 //
130 // From hits to digits
131 //
e73d68f2 132 Int_t hit, nhits;
db173afc 133 Int_t countE[24], sumMult[3];
134 Int_t volume,pmt,tr,qt,qtAmp;
e4da63c2 135 Int_t bestRightTDC,bestLeftTDC;
db173afc 136 Float_t time[24],besttime[24], timeGaus[24] ;
e4da63c2 137 Float_t channelWidth=25.; //ps
db173afc 138 //Q->T-> coefficients !!!! should be asked!!!
139 Float_t ph2mV = 150./500.;
140 Int_t threshold =50; //photoelectrons
141 Int_t mV2channel=200000/(25*25); //5V -> 200ns
142
e73d68f2 143
ede9aff7 144 AliSTARThit *startHit;
145 TBranch *brHits=0;
e4da63c2 146
ede9aff7 147 Int_t nFiles=fManager->GetNinputs();
148 for (Int_t inputFile=0; inputFile<nFiles; inputFile++) {
6fc133d2 149 if (inputFile < nFiles-1) {
e4da63c2 150 AliWarning(Form("ignoring input stream %d", inputFile));
6fc133d2 151 continue;
db173afc 152
6fc133d2 153 }
db173afc 154
155 Float_t besttimeright=99999.;
156 Float_t besttimeleft=99999.;
157 Int_t timeDiff, meanTime;
158
159 for (Int_t i0=0; i0<24; i0++)
e73d68f2 160 {
40d2047f 161 time[i0]=besttime[i0]=timeGaus[i0]=99999; countE[i0]=0;
e73d68f2 162 }
db173afc 163 for ( Int_t imu=0; imu<3; imu++) sumMult[imu]=0;
164 AliRunLoader * inRL = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(inputFile));
165 AliLoader * pInStartLoader = inRL->GetLoader("STARTLoader");
6fc133d2 166 if (!inRL->GetAliRun()) inRL->LoadgAlice();
985b3149 167 AliSTART *fSTART = (AliSTART*)inRL ->GetAliRun()->GetDetector("START");
db173afc 168
169 //read Hits
affef71b 170 pInStartLoader->LoadHits("READ");//probably it is necessary to load them before
affef71b 171 TClonesArray *fHits = fSTART->Hits ();
affef71b 172 TTree *th = pInStartLoader->TreeH();
ede9aff7 173 brHits = th->GetBranch("START");
174 if (brHits) {
e4da63c2 175 fSTART->SetHitsAddressBranch(brHits);
ede9aff7 176 }else{
db173afc 177 AliError("Branch START hit not found");
00907af4 178 exit(111);
ede9aff7 179 }
180 Int_t ntracks = (Int_t) th->GetEntries();
db173afc 181
e4da63c2 182 if (ntracks<=0) return;
ede9aff7 183 // Start loop on tracks in the hits containers
184 for (Int_t track=0; track<ntracks;track++) {
185 brHits->GetEntry(track);
7a68e0ef 186 nhits = fHits->GetEntriesFast();
db173afc 187 for (hit=0;hit<nhits;hit++)
e4da63c2 188 {
189 startHit = (AliSTARThit*) fHits->UncheckedAt(hit);
190 if (!startHit) {
191 AliError("The unchecked hit doesn't exist");
192 break;
193 }
194 pmt=startHit->Pmt();
195 Int_t numpmt=pmt-1;
db173afc 196 Double_t e=startHit->Etot();
e4da63c2 197 volume = startHit->Volume();
e4da63c2 198
db173afc 199 if(e>0 && RegisterPhotoE(e)) {
200 countE[numpmt]++;
201 besttime[numpmt] = startHit->Time();
202 if(besttime[numpmt]<time[numpmt])
203 {
204 time[numpmt]=besttime[numpmt];
205 }
206 }
e4da63c2 207 } //hits loop
ede9aff7 208 } //track loop
e4da63c2 209
db173afc 210 //spread time right&left by 25ps && besttime
211 for (Int_t ipmt=0; ipmt<12; ipmt++){
212 if(countE[ipmt] > threshold) {
213 timeGaus[ipmt]=gRandom->Gaus(time[ipmt],25);
e4da63c2 214 if(timeGaus[ipmt]<besttimeleft) besttimeleft=timeGaus[ipmt]; //timeleft
db173afc 215 sumMult[0] += countE[ipmt];
216 sumMult[1] += countE[ipmt];
e4da63c2 217 }
db173afc 218 }
219 for ( Int_t ipmt=12; ipmt<24; ipmt++){
220 if(countE[ipmt] > threshold) {
221 timeGaus[ipmt]=gRandom->Gaus(time[ipmt],25);
e4da63c2 222 if(timeGaus[ipmt]<besttimeright) besttimeright=timeGaus[ipmt]; //timeright
db173afc 223 sumMult[0] += countE[ipmt];
224 sumMult[2] += countE[ipmt];
225 }
226 }
227 //ADC features fill digits
228 //folding with experimental time distribution
229 Float_t c = 0.0299792; // cm/ps
e4da63c2 230 Float_t koef=(350.-69.7)/c;
231 Float_t besttimeleftR= besttimeleft;
232 besttimeleft=koef+besttimeleft;
db173afc 233 bestLeftTDC=Int_t (besttimeleftR/channelWidth);
234 bestRightTDC=Int_t (besttimeright/channelWidth);
235 timeDiff=Int_t ((besttimeright-besttimeleftR)/channelWidth);
236 meanTime=Int_t (((besttimeright+besttimeleft)/2.)/channelWidth);
237 AliDebug(2,Form(" time in ns %f ", besttimeleft));
238 for (Int_t i=0; i<24; i++)
e73d68f2 239 {
e4da63c2 240 // fill TDC
db173afc 241 tr= Int_t (timeGaus[i]/channelWidth);
242 if(timeGaus[i]>50000) tr=0;
e73d68f2 243
e4da63c2 244 //fill ADC
db173afc 245 Int_t al= countE[i];
246 // QTC procedure:
247 // phe -> mV 0.3; 1MIP ->500phe -> ln (amp (mV)) = 5;
248 // max 200ns, HIJING mean 50000phe -> 15000mv -> ln = 15 (s zapasom)
249 // channel 25ps
250 if (al>threshold) {
251 qt=Int_t (TMath::Log(al*ph2mV) * mV2channel);
252 qtAmp=Int_t (TMath::Log(al*10*ph2mV) * mV2channel);
db173afc 253 fADC->AddAt(qt,i);
254 ftimeTDC->AddAt(tr,i);
255 fADCAmp->AddAt(qtAmp,i);
256 ftimeTDCAmp->AddAt(tr,i); //now is the same as non-amplified but will be change
257 }
e4da63c2 258 } //pmt loop
db173afc 259 for (Int_t im=0; im<3; im++)
260 {
261 if (sumMult[im]>threshold){
262 Int_t sum=Int_t (TMath::Log(sumMult[im]*ph2mV) * mV2channel);
263 Int_t sumAmp=Int_t (TMath::Log(10*sumMult[im]*ph2mV) * mV2channel);
264 fSumMult->AddAt(sum,im);
265 fSumMult->AddAt(sumAmp,im+3);
266 }
267 }
268
269 fSTART->AddDigit(bestRightTDC,bestLeftTDC,meanTime,timeDiff,fSumMult,
270 ftimeTDC,fADC,ftimeTDCAmp,fADCAmp);
271 pOutStartLoader->UnloadHits();
6fc133d2 272 } //input streams loop
db173afc 273
274 //load digits
275 pOutStartLoader->LoadDigits("UPDATE");
276 TTree *treeD = pOutStartLoader->TreeD();
277 if (treeD == 0x0) {
278 pOutStartLoader->MakeTree("D");
279 treeD = pOutStartLoader->TreeD();
280 }
985b3149 281 AliSTART *fSTART = (AliSTART*)outRL ->GetAliRun()->GetDetector("START");
db173afc 282 fSTART->MakeBranch("D");
283 treeD->Reset();
284 treeD->Fill();
285
6fc133d2 286 pOutStartLoader->WriteDigits("OVERWRITE");
db173afc 287
288 fSTART->ResetDigits();
6fc133d2 289 pOutStartLoader->UnloadDigits();
db173afc 290
ede9aff7 291}
292
293
e73d68f2 294//------------------------------------------------------------------------
2303c85c 295Bool_t AliSTARTDigitizer::RegisterPhotoE(Double_t energy)
e73d68f2 296{
e4da63c2 297
298
299 // Float_t hc=197.326960*1.e6; //mev*nm
2303c85c 300 Double_t hc=1.973*1.e-6; //gev*nm
2303c85c 301 Float_t lambda=hc/energy;
174d209f 302 Int_t bin= fEff->GetXaxis()->FindBin(lambda);
303 Float_t eff=fEff->GetBinContent(bin);
e4da63c2 304 Double_t p = gRandom->Rndm();
305 if (p > eff)
306 return kFALSE;
307
308 return kTRUE;
e73d68f2 309}
7a68e0ef 310//----------------------------------------------------------------------------