]> git.uio.no Git - u/mrichter/AliRoot.git/blob - FIT/FITbase/AliFITDigitizer.cxx
Debug msg
[u/mrichter/AliRoot.git] / FIT / FITbase / AliFITDigitizer.cxx
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[240], besttime[240];
147   Int_t countE[240];
148   Int_t timeCFD, timeLED, timeQT1, timeQT0;
149
150   Int_t threshold = 0; //photoelectrons
151   Float_t channelWidth = 24.4 ; 
152   Int_t pmt, mcp, volume, qt; 
153   //eqailized distance from IP
154   Float_t zdetC = 84;
155   Float_t zdetA = 335.;
156   Float_t c = 0.0299792458; // cm/ps
157   Float_t eqdistance = (zdetA - zdetC) /c;
158   Float_t ph2Mip = 318; 
159   
160   AliFITHits  *startHit;
161   TBranch *brHits=0;
162  
163   Int_t nFiles=fDigInput->GetNinputs();
164   for (Int_t inputFile=0; inputFile<nFiles;  inputFile++) {
165     if (inputFile < nFiles-1) {
166       AliWarning(Form("ignoring input stream %d", inputFile));
167       continue;
168      }
169
170   for (Int_t i0=0; i0<240; i0++)
171       {
172         time[i0]=besttime[i0]=999999; countE[i0]=0;
173       }
174   AliRunLoader * inRL = AliRunLoader::GetRunLoader(fDigInput->GetInputFolderName(inputFile));
175   AliLoader * fitLoader = inRL->GetLoader("FITLoader");
176   if (!inRL->GetAliRun()) inRL->LoadgAlice();
177   Int_t numpmt;
178   //read Hits 
179   fitLoader->LoadHits("READ");//probably it is necessary to load them before
180   fHits = fFIT->Hits ();
181   TTree *th = fitLoader->TreeH();
182   brHits = th->GetBranch("FIT");
183   if (brHits) {
184     fFIT->SetHitsAddressBranch(brHits);
185   }else{
186     AliWarning("Branch FIT hit not found for this event");
187     continue;      
188   } 
189   Int_t ntracks    = (Int_t) th->GetEntries();
190   if (ntracks<=0) return;
191   // Start loop on tracks in the hits containers
192   for (Int_t track=0; track<ntracks;track++) {
193     brHits->GetEntry(track);
194     nhits = fHits->GetEntriesFast();
195     for (hit=0;hit<nhits;hit++) 
196       {
197         startHit   = (AliFITHits*) fHits->UncheckedAt(hit);
198         if (!startHit) {
199           AliError("The unchecked hit doesn't exist");
200           break;
201         }
202         Float_t ipart = startHit->Particle();
203         if (ipart<49) continue;
204         pmt = startHit->Pmt();
205         mcp = startHit->MCP();
206         volume = startHit->Volume();
207         if(volume==2) continue;
208         numpmt= 4*mcp + pmt;
209         besttime[numpmt] = startHit->Time();
210         if(besttime[numpmt]<time[numpmt]) time[numpmt]=besttime[numpmt];
211         countE[numpmt]++;
212       } //hits loop
213   } //track loop
214   
215   for (Int_t ipmt=0; ipmt<240; ipmt++)
216     {
217       if (countE[ipmt]>threshold && time[ipmt]<50000 && time[ipmt]>0 ) {
218         //fill ADC
219         // QTC procedure:
220         // 1MIP ->318phe  ;
221         qt= 1000* countE[ipmt] /ph2Mip;  // 318 ph/Mip 
222         //  fill TDC
223         if (ipmt>100) time[ipmt] = time[ipmt] + eqdistance;
224         timeCFD = Int_t (gRandom->Gaus(time[ipmt], 50)/channelWidth ); 
225         timeLED =  Int_t (time[ipmt]/channelWidth );
226         timeQT0 = 0;
227         timeQT1 = qt ;
228         AliDebug(1,Form("Digits:::::  numpmt %i  time CFD %i QTC  %i :: counts %i \n ",  ipmt, timeCFD, timeQT1,  countE[ipmt]) );
229         fFIT-> AddDigit(ipmt,   timeCFD, timeLED, timeQT0,  timeQT1, 0);
230       } //hitted PMTs
231     } //pmt loop
232   fitLoader->UnloadHits();
233   
234   }
235 }
236
237 //____________________________________________________________________________
238 void AliFITDigitizer::AddDigit(Int_t npmt,  
239                                 Int_t timeCFD, Int_t timeLED, Int_t timeQT0, 
240                                 Int_t timeQT1) 
241  { 
242  
243 // Adds Digit 
244  
245   TClonesArray &ldigits = *fDigits;  
246          
247   new(ldigits[fNdigits++]) AliFITDigit(npmt,  
248                                        timeCFD, timeLED, timeQT0, timeQT1);
249          
250 }
251 //____________________________________________________________________________
252 void AliFITDigitizer::ResetDigits()
253 {
254
255 // Clears Digits
256
257   fNdigits = 0;
258   if (fDigits) fDigits->Clear();
259 }