]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - FMD/AliFMDDigitizer.cxx
AliQuenchingWeight first commit (K. Loizides, A. Dainese)
[u/mrichter/AliRoot.git] / FMD / AliFMDDigitizer.cxx
... / ...
CommitLineData
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// Forward Multiplicity Detector based on Silicon plates //
19// This class contains the procedures simulation ADC signal for //
20// the Forward Multiplicity detector : hits -> digits //
21// ADC signal consists //
22// - number of detector; //
23// - number of ring; //
24// - number of sector; //
25// - ADC signal in this channel //
26// //
27 //////////////////////////////////////////////////////////////////////////////
28
29#include <TTree.h>
30#include <TVector.h>
31#include <TObjArray.h>
32#include <TFile.h>
33#include <TDirectory.h>
34#include <TRandom.h>
35
36
37#include "AliFMDDigitizer.h"
38#include "AliFMD.h"
39#include "AliFMDhit.h"
40#include "AliFMDdigit.h"
41#include "AliRunDigitizer.h"
42
43#include "AliRun.h"
44#include "AliPDG.h"
45#include "AliLoader.h"
46#include "AliRunLoader.h"
47
48#include <stdlib.h>
49#include <Riostream.h>
50#include <Riostream.h>
51
52ClassImp(AliFMDDigitizer)
53
54//___________________________________________
55 AliFMDDigitizer::AliFMDDigitizer() :AliDigitizer()
56{
57// Default ctor - don't use it
58 ;
59}
60
61//___________________________________________
62AliFMDDigitizer::AliFMDDigitizer(AliRunDigitizer* manager)
63 :AliDigitizer(manager)
64{
65 // ctor which should be used
66 // fDebug =0;
67 // if (GetDebug()>2)
68 // cerr<<"AliFMDDigitizer::AliFMDDigitizer"
69 // <<"(AliRunDigitizer* manager) was processed"<<endl;
70}
71
72//------------------------------------------------------------------------
73AliFMDDigitizer::~AliFMDDigitizer()
74{
75// Destructor
76}
77
78 //------------------------------------------------------------------------
79Bool_t AliFMDDigitizer::Init()
80{
81// Initialization
82// cout<<"AliFMDDigitizer::Init"<<endl;
83 return kTRUE;
84}
85
86
87//---------------------------------------------------------------------
88
89void AliFMDDigitizer::Exec(Option_t * /*option*/)
90{
91
92 /*
93 Conver hits to digits:
94 - number of detector;
95 - number of ring;
96 - number of sector;
97 - ADC signal in this channel
98 */
99
100 AliRunLoader *inRL, *outRL;//in and out Run Loaders
101 AliLoader *ingime, *outgime;// in and out ITSLoaders
102
103 outRL = AliRunLoader::GetRunLoader(fManager->GetOutputFolderName());
104 outgime = outRL->GetLoader("FMDLoader");
105
106#ifdef DEBUG
107 cout<<"AliFMDDigitizer::>SDigits2Digits start...\n";
108#endif
109
110
111 Int_t volume, sector, ring, charge;
112 Float_t e;
113 Float_t de[10][50][520];
114 Int_t hit;
115 Int_t digit[5];
116 Int_t ivol, iSector, iRing;
117 for (Int_t i=0; i<10; i++)
118 for(Int_t j=0; j<50; j++)
119 for(Int_t ij=0; ij<520; ij++)
120 de[i][j][ij]=0;
121 Int_t numberOfRings[5]=
122 {512,256,512,256,512};
123 Int_t numberOfSector[5]=
124 {20,40,20,40,20};
125
126 AliFMDhit *fmdHit=0;
127 TTree *tH=0;
128 TBranch *brHits=0;
129 TBranch *brD=0;
130
131 inRL = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(0));
132 if (inRL == 0x0)
133 {
134 Error("Exec","Can not find Run Loader for input stream 0");
135 return;
136 }
137 // Info("Exec","inRL->GetAliRun() %#x",inRL->GetAliRun());
138
139 if (!inRL->GetAliRun()) inRL->LoadgAlice();
140
141 AliFMD * fFMD = (AliFMD *) inRL->GetAliRun()->GetDetector("FMD");
142 // Info("Exec","inRL->GetAliRun(): %#x, FMD: %#x, InRL %#x.",inRL->GetAliRun(),fFMD,inRL);
143 if (fFMD == 0x0)
144 {
145 Error("Exec","Can not get FMD from gAlice");
146 return;
147 }
148// Loop over files to digitize
149
150 Int_t nFiles=GetManager()->GetNinputs();
151 for (Int_t inputFile=0; inputFile<nFiles;inputFile++)
152 {
153 // cout<<" event "<<fManager->GetOutputEventNr()<<endl;
154 if (fFMD)
155 {
156
157 inRL = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(inputFile));
158 ingime = inRL->GetLoader("FMDLoader");
159 ingime->LoadHits("READ");//probably it is necessary to load them before
160
161
162 tH = ingime->TreeH();
163 if (tH == 0x0)
164 {
165 ingime->LoadHits("read");
166 tH = ingime->TreeH();
167 }
168 brHits = tH->GetBranch("FMD");
169 if (brHits) {
170 // brHits->SetAddress(&fHits);
171 fFMD->SetHitsAddressBranch(brHits);
172 }else{
173 Fatal("Exec","EXEC Branch FMD hit not found");
174 }
175 TClonesArray *fFMDhits = fFMD->Hits ();
176
177 Int_t ntracks = (Int_t) tH->GetEntries();
178 // cout<<"Number of tracks TreeH"<<ntracks<<endl;
179 for (Int_t track = 0; track < ntracks; track++)
180 {
181 brHits->GetEntry(track);
182 Int_t nhits = fFMDhits->GetEntries ();
183 // if(nhits>0) cout<<"nhits "<<nhits<<endl;
184 for (hit = 0; hit < nhits; hit++)
185 {
186 fmdHit = (AliFMDhit *) fFMDhits->UncheckedAt(hit);
187
188 volume = fmdHit->Volume ();
189 sector = fmdHit->NumberOfSector ();
190 ring = fmdHit->NumberOfRing ();
191 e = fmdHit->Edep ();
192 de[volume][sector][ring] += e;
193 // if (fManager->GetOutputEventNr()>1)
194 // cout<<" "<<volume<<" "<<sector<<" "<<ring<<endl;
195 } //hit loop
196 } //track loop
197 }
198//if FMD
199
200
201 // Put noise and make ADC signal
202 Float_t mipI = 1.664 * 0.04 * 2.33 / 22400; // = 6.923e-6;
203 for ( ivol=1; ivol<=5; ivol++){
204 for ( iSector=1; iSector<=numberOfSector[ivol-1]; iSector++){
205 for ( iRing=1; iRing<=numberOfRings[ivol-1]; iRing++){
206 digit[0]=ivol;
207 digit[1]=iSector;
208 digit[2]=iRing;
209 charge = Int_t (de[ivol][iSector][iRing] / mipI);
210 Int_t pedestal=Int_t(gRandom->Gaus(500,250));
211 // digit[3]=PutNoise(charge);
212 digit[3]=charge + pedestal;
213 if(digit[3]<= 500) digit[3]=500;
214 //dynamic range from MIP(0.155MeV) to 30MIP(4.65MeV)
215 //1024 ADC channels
216 Float_t channelWidth=(22400*50)/1024;
217 digit[4]=Int_t(digit[3]/channelWidth);
218 if (digit[4]>1024) digit[4]=1024;
219 fFMD->AddDigit(digit);
220 } //ivol
221 } //iSector
222 } //iRing
223
224 TTree* treeD = outgime->TreeD();
225 // cout<<" treeD "<<treeD;
226 if (treeD == 0x0) {
227 outgime->MakeTree("D");
228 treeD = outgime->TreeD();
229 // cout<<" After MakeTree "<<treeD<<endl;
230 }
231 // cout<<" Before reset "<<treeD<<endl;
232 // treeD->Clear();
233 treeD->Reset();
234 fFMD->MakeBranchInTreeD(treeD);
235 brD = treeD->GetBranch("FMD");
236 // cout<<" Make branch "<<brD<<endl;
237
238 treeD->Fill(); //this operator does not work for events >1
239 //PH treeD->Print();
240 outgime->WriteDigits("OVERWRITE");
241
242 gAlice->ResetDigits();
243 }
244}
245
246
247
248
249