]>
Commit | Line | Data |
---|---|---|
c1c44db3 | 1 | /************************************************************************** |
2 | * Copyright(c) 1998-2000, 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 | ||
16 | ||
17 | /****************************************************************** | |
18 | * Produde digits from hits | |
19 | * digits is TObject and includes | |
20 | * We are writing array if C & A TDC | |
21 | * C & A ADC (will need for slow simulation) | |
22 | * TOF first particle C & A | |
23 | * mean time and time difference (vertex position) | |
24 | * | |
25 | * Alla.Maevskaya@cern.ch | |
26 | ****************************************************************/ | |
27 | ||
28 | ||
29 | #include <TArrayI.h> | |
30 | #include <TFile.h> | |
31 | #include <TGraph.h> | |
32 | #include <TH1F.h> | |
33 | #include <TMath.h> | |
34 | #include <TRandom.h> | |
35 | #include <TTree.h> | |
36 | ||
37 | #include "AliLog.h" | |
38 | #include "AliFITDigitizer.h" | |
39 | #include "AliFIT.h" | |
40 | #include "AliFITHits.h" | |
41 | #include "AliFITDigit.h" | |
42 | #include "AliDigitizationInput.h" | |
43 | #include "AliRun.h" | |
44 | #include <AliLoader.h> | |
45 | #include <AliRunLoader.h> | |
46 | #include <stdlib.h> | |
47 | ||
48 | ClassImp(AliFITDigitizer) | |
49 | ||
50 | //___________________________________________ | |
51 | AliFITDigitizer::AliFITDigitizer() :AliDigitizer(), | |
52 | fFIT(0), | |
53 | fHits(0), | |
54 | fDigits(0), | |
55 | fNdigits(0) | |
56 | { | |
57 | // Default ctor - don't use it | |
58 | ||
59 | } | |
60 | ||
61 | //___________________________________________ | |
62 | AliFITDigitizer::AliFITDigitizer(AliDigitizationInput* digInput) | |
63 | :AliDigitizer(digInput), | |
64 | fFIT(0), | |
65 | fHits(0), | |
66 | fDigits(0), | |
67 | fNdigits(0) | |
68 | { | |
69 | // ctor which should be used | |
70 | ||
71 | } | |
72 | ||
73 | ||
74 | //------------------------------------------------------------------------ | |
75 | AliFITDigitizer::~AliFITDigitizer() | |
76 | { | |
77 | // Destructor | |
78 | ||
79 | AliDebug(1,"FIT"); | |
80 | ||
81 | } | |
82 | ||
83 | //------------------------------------------------------------------------ | |
84 | Bool_t AliFITDigitizer::Init() | |
85 | { | |
86 | // Initialization | |
87 | AliDebug(1," Init"); | |
88 | return kTRUE; | |
89 | ||
90 | } | |
91 | ||
92 | //--------------------------------------------------------------------- | |
93 | void AliFITDigitizer::Digitize(Option_t* /*option*/) | |
94 | { | |
95 | ||
96 | /* | |
97 | Produde digits from hits | |
98 | digits is TObject and includes | |
99 | We are writing array if C & A for each channel CFD, LED, QT0 and QT1 | |
100 | C & A ADC (will need for slow simulation) | |
101 | */ | |
102 | ||
103 | ||
104 | ||
105 | //output loader | |
106 | AliDebug(1,"start..."); | |
107 | //input loader | |
108 | // | |
109 | // From hits to digits | |
110 | // | |
111 | ||
112 | AliRunLoader *outRL = AliRunLoader::GetRunLoader(fDigInput->GetOutputFolderName()); | |
113 | AliLoader * outFitLoader = outRL->GetLoader("FITLoader"); | |
114 | ||
115 | fFIT = static_cast<AliFIT*>(gAlice->GetDetector("FIT")); | |
116 | if (!fFIT) { | |
117 | AliError("Can not get FIT from gAlice"); | |
118 | return; | |
119 | } | |
120 | fFIT->ResetDigits(); | |
121 | ||
122 | DigitizeHits(); | |
123 | ||
124 | //load digits | |
125 | outFitLoader->LoadDigits("UPDATE"); | |
126 | TTree *treeD = outFitLoader->TreeD(); | |
127 | if (treeD == 0x0) { | |
128 | outFitLoader->MakeTree("D"); | |
129 | treeD = outFitLoader->TreeD(); | |
130 | } | |
131 | treeD->Reset(); | |
132 | fFIT = (AliFIT*)outRL ->GetAliRun()->GetDetector("FIT"); | |
133 | // Make a branch in the tree | |
134 | fFIT->MakeBranch("D"); | |
135 | treeD->Fill(); | |
136 | ||
137 | outFitLoader->WriteDigits("OVERWRITE"); | |
138 | fFIT->ResetDigits(); | |
139 | outFitLoader->UnloadDigits(); | |
140 | } | |
141 | //____________________________________________________________________________ | |
142 | void AliFITDigitizer::DigitizeHits() | |
143 | { | |
144 | ||
145 | Int_t hit, nhits; | |
146 | Float_t time[160], besttime[160]; | |
147 | Int_t countE[160]; | |
148 | Int_t timeCFD, timeLED, timeQT1, timeQT0; | |
149 | ||
150 | Int_t threshold = 0; //photoelectrons | |
c1c44db3 | 151 | Float_t channelWidth = 24.4 ; |
152 | Int_t pmt, mcp, volume, qt; | |
153 | //eqailized distance from IP | |
154 | Float_t zdetC = 82; | |
155 | Float_t zdetA = 375.; | |
156 | Float_t c = 0.0299792458; // cm/ps | |
157 | Float_t eqdistance = (zdetA - zdetC) /c; | |
158 | ||
159 | AliFITHits *startHit; | |
160 | TBranch *brHits=0; | |
161 | ||
162 | Int_t nFiles=fDigInput->GetNinputs(); | |
163 | for (Int_t inputFile=0; inputFile<nFiles; inputFile++) { | |
164 | if (inputFile < nFiles-1) { | |
165 | AliWarning(Form("ignoring input stream %d", inputFile)); | |
166 | continue; | |
167 | } | |
168 | ||
169 | for (Int_t i0=0; i0<160; i0++) | |
170 | { | |
171 | time[i0]=besttime[i0]=999999; countE[i0]=0; | |
172 | } | |
173 | AliRunLoader * inRL = AliRunLoader::GetRunLoader(fDigInput->GetInputFolderName(inputFile)); | |
174 | AliLoader * fitLoader = inRL->GetLoader("FITLoader"); | |
175 | if (!inRL->GetAliRun()) inRL->LoadgAlice(); | |
176 | Int_t numpmt; | |
177 | //read Hits | |
178 | fitLoader->LoadHits("READ");//probably it is necessary to load them before | |
179 | fHits = fFIT->Hits (); | |
180 | TTree *th = fitLoader->TreeH(); | |
181 | brHits = th->GetBranch("FIT"); | |
182 | if (brHits) { | |
183 | fFIT->SetHitsAddressBranch(brHits); | |
184 | }else{ | |
185 | AliWarning("Branch FIT hit not found for this event"); | |
186 | continue; | |
187 | } | |
188 | Int_t ntracks = (Int_t) th->GetEntries(); | |
189 | if (ntracks<=0) return; | |
190 | // Start loop on tracks in the hits containers | |
191 | for (Int_t track=0; track<ntracks;track++) { | |
192 | brHits->GetEntry(track); | |
193 | nhits = fHits->GetEntriesFast(); | |
194 | for (hit=0;hit<nhits;hit++) | |
195 | { | |
196 | startHit = (AliFITHits*) fHits->UncheckedAt(hit); | |
197 | if (!startHit) { | |
198 | AliError("The unchecked hit doesn't exist"); | |
199 | break; | |
200 | } | |
201 | pmt = startHit->Pmt(); | |
202 | mcp = startHit->MCP(); | |
203 | volume = startHit->Volume(); | |
204 | numpmt= volume*80 +4*(mcp) + (pmt-1); | |
205 | besttime[numpmt] = startHit->Time(); | |
206 | if(besttime[numpmt]<time[numpmt]) time[numpmt]=besttime[numpmt]; | |
207 | countE[numpmt]++; | |
208 | } //hits loop | |
209 | } //track loop | |
210 | ||
211 | for (Int_t ipmt=0; ipmt<160; ipmt++) | |
212 | { | |
213 | if (countE[ipmt]>threshold && time[ipmt]<50000 && time[ipmt]>0 ) { | |
214 | //fill ADC | |
215 | // QTC procedure: | |
216 | // 1MIP ->200phe ; | |
217 | qt= countE[ipmt] /*/ph2Mip*/; // 50mv/Mip amp in mV | |
218 | // fill TDC | |
219 | if (ipmt<80) time[ipmt] = time[ipmt] + eqdistance; | |
220 | timeCFD = Int_t (gRandom->Gaus(time[ipmt], 50)/channelWidth ); | |
221 | timeLED = Int_t (time[ipmt]/channelWidth ); | |
222 | timeQT0 = 0; | |
223 | timeQT1 = Int_t (qt ) ; | |
224 | AliDebug(1,Form("Digits::::: numpmt %i time CFD %i QTC %i :: counts %i \n ", ipmt, timeCFD, timeQT1, countE[ipmt]) ); | |
225 | fFIT-> AddDigit(ipmt, timeCFD, timeLED, timeQT0, timeQT1, 0); | |
226 | } //hitted PMTs | |
227 | } //pmt loop | |
228 | fitLoader->UnloadHits(); | |
229 | ||
230 | } | |
231 | } | |
232 | ||
233 | //____________________________________________________________________________ | |
234 | void AliFITDigitizer::AddSDigit(Int_t npmt, | |
235 | Int_t timeCFD, Int_t timeLED, Int_t timeQT0, | |
236 | Int_t timeQT1) | |
237 | { | |
238 | ||
239 | // Adds Digit | |
240 | ||
241 | TClonesArray &ldigits = *fDigits; | |
242 | ||
243 | new(ldigits[fNdigits++]) AliFITDigit(npmt, | |
244 | timeCFD, timeLED, timeQT0, timeQT1); | |
245 | ||
246 | } | |
247 | //____________________________________________________________________________ | |
248 | void AliFITDigitizer::ResetDigits() | |
249 | { | |
250 | ||
251 | // Clears Digits | |
252 | ||
253 | fNdigits = 0; | |
254 | if (fDigits) fDigits->Clear(); | |
255 | } |