Fix for memory leaks in digits TClonesArrays (Matevz)
[u/mrichter/AliRoot.git] / VZERO / AliVZEROTriggerSimulator.cxx
1 /**************************************************************************\r
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *\r
3  *                                                                        *\r
4  * Author: The ALICE Off-line Project.                                    *\r
5  * Contributors are mentioned in the code where appropriate.              *\r
6  *                                                                        *\r
7  * Permission to use, copy, modify and distribute this software and its   *\r
8  * documentation strictly for non-commercial purposes is hereby granted   *\r
9  * without fee, provided that the above copyright notice appears in all   *\r
10  * copies and that both the copyright notice and this permission notice   *\r
11  * appear in the supporting documentation. The authors make no claims     *\r
12  * about the suitability of this software for any purpose. It is          *\r
13  * provided "as is" without express or implied warranty.                  *\r
14  **************************************************************************/\r
15 // \r
16 // Class AliVZEROTriggerSimulator\r
17 // ------------------------------\r
18 //  Simulate the VZERO Trigger response\r
19 // Use FEE parameters stored in Database\r
20 // Can work on real data or in simulation\r
21 //\r
22 \r
23 #include <TTree.h>\r
24 #include <TClonesArray.h>\r
25 \r
26 #include "AliLog.h"\r
27 #include "AliCDBManager.h"\r
28 #include "AliCDBEntry.h"\r
29 #include "AliCDBStorage.h"\r
30 #include "AliCDBId.h"\r
31 #include "AliVZEROTriggerData.h"\r
32 #include "AliVZEROLogicalSignal.h"\r
33 #include "AliVZEROTriggerSimulator.h"\r
34 #include "AliVZEROdigit.h"\r
35 \r
36 ClassImp(AliVZEROTriggerSimulator)\r
37 \r
38 //_____________________________________________________________________________\r
39 AliVZEROTriggerSimulator::AliVZEROTriggerSimulator(TTree * digitsTree, TClonesArray* digits) : \r
40 TObject(),fTriggerData(NULL),fDigitsTree(digitsTree),fDigits(digits),fTriggerWord(0)\r
41 {\r
42         // constructor\r
43         fTriggerData = LoadTriggerData();\r
44         \r
45         for(int i=0;i<64;i++) {\r
46                 fBBFlags[i] = fBGFlags[i] = kFALSE;\r
47                 fCharges[i] = 0.;\r
48         }\r
49         GenerateBBWindows();\r
50         GenerateBGWindows();\r
51         for (int i=0; i<AliVZEROTriggerData::kNCIUBoards; i++) {\r
52                 fBBLatch[i] = new AliVZEROLogicalSignal(fTriggerData->GetLatchWin1(i),0); \r
53                 fBGLatch[i] = new AliVZEROLogicalSignal(fTriggerData->GetLatchWin2(i),0); \r
54                 fBBReset[i] = new AliVZEROLogicalSignal(fTriggerData->GetResetWin1(i),0);\r
55                 fBGReset[i] = new AliVZEROLogicalSignal(fTriggerData->GetResetWin2(i),0);               \r
56         }\r
57 }\r
58 //_____________________________________________________________________________\r
59 AliVZEROTriggerSimulator::AliVZEROTriggerSimulator() : \r
60 TObject(),fTriggerData(NULL),fDigitsTree(NULL),fDigits(NULL),fTriggerWord(0)\r
61 {\r
62         // Default constructor\r
63         fTriggerData = LoadTriggerData();\r
64 \r
65         for(int i=0;i<64;i++) {\r
66                 fBBFlags[i] = fBGFlags[i] = kFALSE;\r
67                 fCharges[i] = 0;\r
68         }\r
69         GenerateBBWindows();\r
70         GenerateBGWindows();\r
71         for (int i=0; i<AliVZEROTriggerData::kNCIUBoards; i++) {\r
72                 fBBLatch[i] = new AliVZEROLogicalSignal(fTriggerData->GetLatchWin1(i),0); \r
73                 fBGLatch[i] = new AliVZEROLogicalSignal(fTriggerData->GetLatchWin2(i),0); \r
74                 fBBReset[i] = new AliVZEROLogicalSignal(fTriggerData->GetResetWin1(i),0);\r
75                 fBGReset[i] = new AliVZEROLogicalSignal(fTriggerData->GetResetWin2(i),0);               \r
76         }\r
77 }\r
78 \r
79 //_____________________________________________________________________________\r
80 AliVZEROTriggerSimulator::~AliVZEROTriggerSimulator(){\r
81 // Destructor\r
82         if(fBBGate) delete [] fBBGate;\r
83         if(fBGGate) delete [] fBGGate;\r
84         if(fBBLatch) delete [] fBBLatch;\r
85         if(fBBReset) delete [] fBBReset;\r
86         if(fBGLatch) delete [] fBGLatch;\r
87         if(fBGReset) delete [] fBGReset;\r
88 }\r
89 \r
90 //_____________________________________________________________________________\r
91 void AliVZEROTriggerSimulator::GenerateBBWindows() \r
92 {\r
93         // Generates the BB observation window\r
94         for (int i=0; i<AliVZEROTriggerData::kNCIUBoards; i++) {\r
95                 AliVZEROLogicalSignal clk1BB(fTriggerData->GetClk1Win1(i),fTriggerData->GetDelayClk1Win1(i));\r
96                 AliVZEROLogicalSignal clk2BB(fTriggerData->GetClk2Win1(i),fTriggerData->GetDelayClk2Win1(i));\r
97                 fBBGate[i] = new AliVZEROLogicalSignal(clk1BB & clk2BB);\r
98         }\r
99 }\r
100 //_____________________________________________________________________________\r
101 void AliVZEROTriggerSimulator::GenerateBGWindows() \r
102 {\r
103         // Generates the BG observation window\r
104         for (int i=0; i<AliVZEROTriggerData::kNCIUBoards; i++) {\r
105                 AliVZEROLogicalSignal clk1BG(fTriggerData->GetClk1Win2(i),fTriggerData->GetDelayClk1Win2(i));\r
106                 AliVZEROLogicalSignal clk2BG(fTriggerData->GetClk2Win2(i),fTriggerData->GetDelayClk2Win2(i));\r
107                 fBGGate[i] = new AliVZEROLogicalSignal(clk1BG & clk2BG);\r
108         }\r
109 }\r
110 \r
111 //_____________________________________________________________________________\r
112 AliVZEROTriggerData * AliVZEROTriggerSimulator::LoadTriggerData() const \r
113 {\r
114         // Gets Trigger object for VZERO set\r
115         AliDebug(1,"Loading Trigger parameters");\r
116         AliCDBManager *man = AliCDBManager::Instance();\r
117         \r
118         \r
119         AliCDBEntry *entry=0;\r
120         \r
121         entry = man->Get("VZERO/Trigger/Data");\r
122         if(!entry){\r
123                 AliWarning("Load of calibration data from default storage failed!");\r
124                 AliWarning("Calibration data will be loaded from local storage ($ALICE_ROOT)");\r
125                 \r
126                 man->SetDefaultStorage("local://$ALICE_ROOT/OCDB");\r
127                 entry = man->Get("VZERO/Trigger/Data",0);\r
128         }\r
129         \r
130         // Retrieval of data in directory VZERO/Calib/Trigger:\r
131         \r
132         AliVZEROTriggerData *triggerData = NULL;\r
133         \r
134         if (entry) triggerData = (AliVZEROTriggerData*) entry->GetObject();\r
135         if (!triggerData)  AliError("No Trigger data from database !");\r
136         \r
137         return triggerData;\r
138 }\r
139 \r
140 //_____________________________________________________________________________\r
141 void AliVZEROTriggerSimulator::Run() {\r
142         //AliInfo("Generating VZERO Triggers");\r
143         \r
144         // Loop over VZERO entries\r
145         Int_t nEntries = (Int_t)fDigitsTree->GetEntries();\r
146         for (Int_t ievt=0; ievt<nEntries; ievt++) {\r
147                 fDigitsTree->GetEvent(ievt);\r
148                 \r
149                 Int_t nDigits = fDigits->GetEntriesFast();\r
150                 \r
151                 for (Int_t iDigit=0; iDigit<nDigits; iDigit++) {\r
152                         AliVZEROdigit* digit = (AliVZEROdigit*)fDigits->At(iDigit);\r
153                         \r
154                         Int_t integrator = digit->Integrator();\r
155                         Int_t pmNumber   = digit->PMNumber();\r
156                         Int_t board   = pmNumber / 8;\r
157                         Int_t channel = pmNumber % 8;\r
158                         \r
159                         if(fTriggerData->GetEnableCharge(board,channel)) {\r
160                                 fCharges[pmNumber] = digit->ADC();\r
161                                 if(fTriggerData->GetPedestalSubtraction(board)) {\r
162                                         if(fCharges[pmNumber]>=(Float_t) fTriggerData->GetPedestalCut(integrator,board,channel)){ \r
163                                                 fCharges[pmNumber] -= (Float_t) fTriggerData->GetPedestal(integrator,board,channel);\r
164                                         } else {\r
165                                                 fCharges[pmNumber] = 0.;\r
166                                         }\r
167                                 }\r
168                         } else {\r
169                                 fCharges[pmNumber] = 0.;\r
170                         }\r
171                         \r
172                         Float_t time = digit->Time(); \r
173                         time += fTriggerData->GetDelayHit(board,channel);\r
174                         \r
175                         //AliInfo(Form(" PM nb : %d ; ADC= %d ; TDC= %f  Enable Time %d charge %d",pmNumber,digit->ADC(),time,fTriggerData->GetEnableTiming(board,channel),fTriggerData->GetEnableCharge(board,channel)));\r
176                         fBBFlags[pmNumber] = fTriggerData->GetEnableTiming(board,channel) && fBBGate[board]->IsInCoincidence(time);\r
177                         fBGFlags[pmNumber] = fTriggerData->GetEnableTiming(board,channel) && fBGGate[board]->IsInCoincidence(time);\r
178                         \r
179                 } // end of loop over digits\r
180         } // end of loop over events in digits tree\r
181         \r
182         Int_t nBBflagsV0A = 0;\r
183         Int_t nBBflagsV0C = 0;\r
184         Int_t nBGflagsV0A = 0;\r
185         Int_t nBGflagsV0C = 0;\r
186         Float_t chargeV0A   = 0.;\r
187         Float_t chargeV0C   = 0.;\r
188 \r
189         for(int i=0;i<64;i++) {\r
190                 if(i<32) {\r
191                         nBBflagsV0C += fBBFlags[i]; \r
192                         nBGflagsV0C += fBGFlags[i];\r
193                         chargeV0C += fCharges[i];\r
194                 } else {\r
195                         nBBflagsV0A += fBBFlags[i]; \r
196                         nBGflagsV0A += fBGFlags[i];\r
197                         chargeV0A += fCharges[i];\r
198                 }\r
199                 //AliInfo(Form("Ch %d BB=%d BG=%d",i,fBBFlags[i],fBGFlags[i] )); \r
200         }\r
201         \r
202         // BBA\r
203         if(nBBflagsV0A>=fTriggerData->GetBBAThreshold())  SetBBA();\r
204         \r
205         // BBC\r
206         if(nBBflagsV0C>=fTriggerData->GetBBCThreshold())  SetBBC();\r
207 \r
208         // BBA_AND_BBC\r
209         if(GetBBA() && GetBBC())  SetBBAandBBC();\r
210         \r
211         // BBA_OR_BBC\r
212         if(GetBBA() || GetBBC()) SetBBAorBBC();\r
213 \r
214         // BGA\r
215         if(nBGflagsV0A>=fTriggerData->GetBGAThreshold()) SetBGA();\r
216 \r
217         // BGC\r
218         if(nBGflagsV0C>=fTriggerData->GetBGCThreshold()) SetBGC();\r
219         \r
220         // BGA_AND_BBC (Beam Gas from RB24 side)\r
221         if(nBBflagsV0C>=fTriggerData->GetBBCForBGThreshold() && GetBGA()) SetBGAandBBC();\r
222         \r
223         // BGC_AND_BBA (Beam Gas from RB26 side)\r
224         if(nBBflagsV0A>=fTriggerData->GetBBAForBGThreshold() && GetBGC()) SetBGCandBBA();\r
225 \r
226         // CTA1_AND_CTC1 (Centrality trigger 1)\r
227         if(chargeV0A>=fTriggerData->GetCentralityV0AThrLow() && chargeV0C>=fTriggerData->GetCentralityV0CThrLow()) SetCTA1andCTC1();\r
228 \r
229         // CTA1_OR_CTC1 (Centrality trigger 1)\r
230         if(chargeV0A>=fTriggerData->GetCentralityV0AThrLow() || chargeV0C>=fTriggerData->GetCentralityV0CThrLow()) SetCTA1orCTC1();\r
231         \r
232         // CTA2_AND_CTC2 (Centrality trigger 2)\r
233         if(chargeV0A>=fTriggerData->GetCentralityV0AThrHigh() && chargeV0C>=fTriggerData->GetCentralityV0CThrHigh()) SetCTA2andCTC2();\r
234         \r
235         // CTA2_OR_CTC2 (Centrality trigger 2)\r
236         if(chargeV0A>=fTriggerData->GetCentralityV0AThrHigh() || chargeV0C>=fTriggerData->GetCentralityV0CThrHigh()) SetCTA2orCTC2();\r
237         \r
238         // MTA_AND_MTC (Multiplicity Trigger)\r
239         if((nBBflagsV0A<=fTriggerData->GetMultV0AThrHigh() && nBBflagsV0A>=fTriggerData->GetMultV0AThrLow())\r
240            && (nBBflagsV0C<=fTriggerData->GetMultV0CThrHigh() && nBBflagsV0C>=fTriggerData->GetMultV0CThrLow()) ) \r
241                 SetMTAandMTC();\r
242         \r
243         // MTA_OR_MTC (Multiplicity Trigger)\r
244         if((nBBflagsV0A<=fTriggerData->GetMultV0AThrHigh() && nBBflagsV0A>=fTriggerData->GetMultV0AThrLow())\r
245            || (nBBflagsV0C<=fTriggerData->GetMultV0CThrHigh() && nBBflagsV0C>=fTriggerData->GetMultV0CThrLow()) ) \r
246                 SetMTAorMTC();\r
247         \r
248         // BGA_OR_BGC\r
249         if(GetBGA() || GetBGC()) SetBGAorBGC();\r
250         \r
251         // (BGA and BBC) or (BGC and BBA) (Beam Gas from one of the two sides)\r
252         if(GetBGAandBBC() || GetBGCandBBA()) SetBeamGas();\r
253 \r
254 //      AliInfo(Form("BB Flags : V0A = %d  V0C = %d ",nBBflagsV0A, nBBflagsV0C )); \r
255 //      AliInfo(Form("BG Flags : V0A = %d  V0C = %d ",nBGflagsV0A, nBGflagsV0C )); \r
256 //      AliInfo(Form("Charges  : V0A = %d  V0C = %d ",chargeV0A, chargeV0C )); \r
257         \r
258 }\r
259 \r
260 \r
261 \r