]> git.uio.no Git - u/mrichter/AliRoot.git/blob - VZERO/AliVZEROTriggerSimulator.cxx
Corrections implemented into AliAnalysisHadEtReconstructed, simulated hadronic and...
[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 #include <TParameter.h>\r
26 \r
27 #include "AliLog.h"\r
28 #include "AliCDBManager.h"\r
29 #include "AliCDBEntry.h"\r
30 #include "AliCDBStorage.h"\r
31 #include "AliCDBId.h"\r
32 #include "AliVZEROTriggerData.h"\r
33 #include "AliVZEROLogicalSignal.h"\r
34 #include "AliVZEROTriggerSimulator.h"\r
35 #include "AliVZEROdigit.h"\r
36 #include "AliVZEROCalibData.h"\r
37 #include "AliVZEROConst.h"\r
38 \r
39 ClassImp(AliVZEROTriggerSimulator)\r
40 \r
41 //_____________________________________________________________________________\r
42 AliVZEROTriggerSimulator::AliVZEROTriggerSimulator(TTree * digitsTree, TClonesArray* digits) : \r
43 TObject(),fTriggerData(NULL),fDigitsTree(digitsTree),fDigits(digits),fTriggerWord(0)\r
44 {\r
45         // constructor\r
46         fTriggerData = LoadTriggerData();\r
47         \r
48         for(int i=0;i<64;i++) {\r
49                 fBBFlags[i] = fBGFlags[i] = kFALSE;\r
50                 fCharges[i] = 0.;\r
51         }\r
52         GenerateBBWindows();\r
53         GenerateBGWindows();\r
54         for (int i=0; i<AliVZEROTriggerData::kNCIUBoards; i++) {\r
55                 fBBLatch[i] = new AliVZEROLogicalSignal(fTriggerData->GetLatchWin1(i),0); \r
56                 fBGLatch[i] = new AliVZEROLogicalSignal(fTriggerData->GetLatchWin2(i),0); \r
57                 fBBReset[i] = new AliVZEROLogicalSignal(fTriggerData->GetResetWin1(i),0);\r
58                 fBGReset[i] = new AliVZEROLogicalSignal(fTriggerData->GetResetWin2(i),0);               \r
59         }\r
60 }\r
61 //_____________________________________________________________________________\r
62 AliVZEROTriggerSimulator::AliVZEROTriggerSimulator() : \r
63 TObject(),fTriggerData(NULL),fDigitsTree(NULL),fDigits(NULL),fTriggerWord(0)\r
64 {\r
65         // Default constructor\r
66         fTriggerData = LoadTriggerData();\r
67 \r
68         for(int i=0;i<64;i++) {\r
69                 fBBFlags[i] = fBGFlags[i] = kFALSE;\r
70                 fCharges[i] = 0;\r
71         }\r
72         GenerateBBWindows();\r
73         GenerateBGWindows();\r
74         for (int i=0; i<AliVZEROTriggerData::kNCIUBoards; i++) {\r
75                 fBBLatch[i] = new AliVZEROLogicalSignal(fTriggerData->GetLatchWin1(i),0); \r
76                 fBGLatch[i] = new AliVZEROLogicalSignal(fTriggerData->GetLatchWin2(i),0); \r
77                 fBBReset[i] = new AliVZEROLogicalSignal(fTriggerData->GetResetWin1(i),0);\r
78                 fBGReset[i] = new AliVZEROLogicalSignal(fTriggerData->GetResetWin2(i),0);               \r
79         }\r
80 }\r
81 \r
82 //_____________________________________________________________________________\r
83 AliVZEROTriggerSimulator::~AliVZEROTriggerSimulator(){\r
84 // Destructor\r
85   for (Int_t i=0; i<AliVZEROTriggerData::kNCIUBoards; i++) {\r
86     delete fBBGate[i];\r
87     delete fBGGate[i];\r
88     delete fBBLatch[i];\r
89     delete fBBReset[i];\r
90     delete fBGLatch[i];\r
91     delete fBGReset[i];\r
92   }\r
93 }\r
94 \r
95 //_____________________________________________________________________________\r
96 void AliVZEROTriggerSimulator::GenerateBBWindows() \r
97 {\r
98         // Generates the BB observation window\r
99         for (int i=0; i<AliVZEROTriggerData::kNCIUBoards; i++) {\r
100                 AliVZEROLogicalSignal clk1BB(fTriggerData->GetClk1Win1(i),fTriggerData->GetDelayClk1Win1(i));\r
101                 AliVZEROLogicalSignal clk2BB(fTriggerData->GetClk2Win1(i),fTriggerData->GetDelayClk2Win1(i));\r
102                 fBBGate[i] = new AliVZEROLogicalSignal(clk1BB & clk2BB);\r
103         }\r
104 }\r
105 //_____________________________________________________________________________\r
106 void AliVZEROTriggerSimulator::GenerateBGWindows() \r
107 {\r
108         // Generates the BG observation window\r
109         for (int i=0; i<AliVZEROTriggerData::kNCIUBoards; i++) {\r
110                 AliVZEROLogicalSignal clk1BG(fTriggerData->GetClk1Win2(i),fTriggerData->GetDelayClk1Win2(i));\r
111                 AliVZEROLogicalSignal clk2BG(fTriggerData->GetClk2Win2(i),fTriggerData->GetDelayClk2Win2(i));\r
112                 fBGGate[i] = new AliVZEROLogicalSignal(clk1BG & clk2BG);\r
113         }\r
114 }\r
115 \r
116 //_____________________________________________________________________________\r
117 AliVZEROTriggerData * AliVZEROTriggerSimulator::LoadTriggerData() const \r
118 {\r
119         // Gets Trigger object for VZERO set\r
120         AliDebug(1,"Loading Trigger parameters");\r
121         AliCDBManager *man = AliCDBManager::Instance();\r
122         \r
123         \r
124         AliCDBEntry *entry=0;\r
125         \r
126         entry = man->Get("VZERO/Trigger/Data");\r
127         if(!entry){\r
128                 AliWarning("Load of calibration data from default storage failed!");\r
129                 AliWarning("Calibration data will be loaded from local storage ($ALICE_ROOT)");\r
130                 \r
131                 man->SetDefaultStorage("local://$ALICE_ROOT/OCDB");\r
132                 entry = man->Get("VZERO/Trigger/Data",0);\r
133         }\r
134         \r
135         // Retrieval of data in directory VZERO/Calib/Trigger:\r
136         \r
137         AliVZEROTriggerData *triggerData = NULL;\r
138         \r
139         if (entry) triggerData = (AliVZEROTriggerData*) entry->GetObject();\r
140         if (!triggerData)  AliError("No Trigger data from database !");\r
141         \r
142         return triggerData;\r
143 }\r
144 \r
145 //_____________________________________________________________________________\r
146 void AliVZEROTriggerSimulator::Run() {\r
147         //AliInfo("Generating VZERO Triggers");\r
148         \r
149         // Loop over VZERO entries\r
150         Int_t nEntries = (Int_t)fDigitsTree->GetEntries();\r
151         for (Int_t ievt=0; ievt<nEntries; ievt++) {\r
152                 fDigitsTree->GetEvent(ievt);\r
153                 \r
154                 Int_t nDigits = fDigits->GetEntriesFast();\r
155                 \r
156                 for (Int_t iDigit=0; iDigit<nDigits; iDigit++) {\r
157                         AliVZEROdigit* digit = (AliVZEROdigit*)fDigits->At(iDigit);\r
158                         \r
159                         Int_t integrator = digit->Integrator();\r
160                         Int_t pmNumber   = digit->PMNumber();\r
161                         Int_t board   = AliVZEROCalibData::GetBoardNumber(pmNumber);\r
162                         Int_t channel = AliVZEROCalibData::GetFEEChannelNumber(pmNumber);\r
163                         \r
164                         if(fTriggerData->GetEnableCharge(board,channel)) {\r
165                                 fCharges[pmNumber] = digit->ChargeADC(AliVZEROdigit::kNClocks/2);\r
166                                 if(fTriggerData->GetPedestalSubtraction(board)) {\r
167                                         if(fCharges[pmNumber]>=(Float_t) fTriggerData->GetPedestalCut(integrator,board,channel)){ \r
168                                                 fCharges[pmNumber] -= (Float_t) fTriggerData->GetPedestal(integrator,board,channel);\r
169                                         } else {\r
170                                                 fCharges[pmNumber] = 0.;\r
171                                         }\r
172                                 }\r
173                         } else {\r
174                                 fCharges[pmNumber] = 0.;\r
175                         }\r
176                         \r
177                         Float_t time = digit->Time();\r
178                         time -= kClockOffset;\r
179 \r
180                         AliDebug(10,Form(" Digit: %f %d %d %d %d %d %d %d %d",digit->Time(),\r
181                                          digit->ChargeADC(8),digit->ChargeADC(9),digit->ChargeADC(10),\r
182                                          digit->ChargeADC(11),digit->ChargeADC(12),digit->ChargeADC(13),\r
183                                          digit->ChargeADC(14),digit->ChargeADC(15)));\r
184                         AliDebug(10,Form(" PM nb : %d ; TDC= %f(%f)  Enable Time %d charge %d inCoin %d charge %f",\r
185                                          pmNumber,time,digit->Time(),\r
186                                          fTriggerData->GetEnableTiming(board,channel),fTriggerData->GetEnableCharge(board,channel),\r
187                                          fBBGate[board]->IsInCoincidence(time),fCharges[pmNumber]));\r
188                         fBBFlags[pmNumber] = fTriggerData->GetEnableTiming(board,channel) && fBBGate[board]->IsInCoincidence(time);\r
189                         fBGFlags[pmNumber] = fTriggerData->GetEnableTiming(board,channel) && fBGGate[board]->IsInCoincidence(time);\r
190                         \r
191                 } // end of loop over digits\r
192         } // end of loop over events in digits tree\r
193         \r
194         Int_t nBBflagsV0A = 0;\r
195         Int_t nBBflagsV0C = 0;\r
196         Int_t nBGflagsV0A = 0;\r
197         Int_t nBGflagsV0C = 0;\r
198         Float_t chargeV0A   = 0.;\r
199         Float_t chargeV0C   = 0.;\r
200         Int_t aBBflagsV0A = 0;\r
201         Int_t aBBflagsV0C = 0;\r
202         Int_t aBGflagsV0A = 0;\r
203         Int_t aBGflagsV0C = 0;\r
204 \r
205         for(int i=0;i<64;i++) {\r
206                 if(i<32) {\r
207                         nBBflagsV0C += fBBFlags[i]; \r
208                         nBGflagsV0C += fBGFlags[i];\r
209                         chargeV0C += fCharges[i];\r
210                         if (fBBFlags[i]) aBBflagsV0C |= (1 << i);\r
211                         if (fBGFlags[i]) aBGflagsV0C |= (1 << i);\r
212                 } else {\r
213                         nBBflagsV0A += fBBFlags[i]; \r
214                         nBGflagsV0A += fBGFlags[i];\r
215                         chargeV0A += fCharges[i];\r
216                         if (fBBFlags[i]) aBBflagsV0A |= (1 << (i-32));\r
217                         if (fBGFlags[i]) aBGflagsV0A |= (1 << (i-32));\r
218                 }\r
219                 //AliInfo(Form("Ch %d BB=%d BG=%d",i,fBBFlags[i],fBGFlags[i] )); \r
220         }\r
221 \r
222         // Store the BB and BG flags in the digits tree (user info)\r
223         fDigitsTree->GetUserInfo()->Add(new TParameter<int>("BBflagsV0A",aBBflagsV0A));\r
224         fDigitsTree->GetUserInfo()->Add(new TParameter<int>("BBflagsV0C",aBBflagsV0C));\r
225         fDigitsTree->GetUserInfo()->Add(new TParameter<int>("BGflagsV0A",aBGflagsV0A));\r
226         fDigitsTree->GetUserInfo()->Add(new TParameter<int>("BGflagsV0C",aBGflagsV0C));\r
227         \r
228         // BBA\r
229         if(nBBflagsV0A>=fTriggerData->GetBBAThreshold())  SetBBA();\r
230         \r
231         // BBC\r
232         if(nBBflagsV0C>=fTriggerData->GetBBCThreshold())  SetBBC();\r
233 \r
234         // BBA_AND_BBC\r
235         if(GetBBA() && GetBBC())  SetBBAandBBC();\r
236         \r
237         // BBA_OR_BBC\r
238         if(GetBBA() || GetBBC()) SetBBAorBBC();\r
239 \r
240         // BGA\r
241         if(nBGflagsV0A>=fTriggerData->GetBGAThreshold()) SetBGA();\r
242 \r
243         // BGC\r
244         if(nBGflagsV0C>=fTriggerData->GetBGCThreshold()) SetBGC();\r
245         \r
246         // BGA_AND_BBC (Beam Gas from RB24 side)\r
247         if(nBBflagsV0C>=fTriggerData->GetBBCForBGThreshold() && GetBGA()) SetBGAandBBC();\r
248         \r
249         // BGC_AND_BBA (Beam Gas from RB26 side)\r
250         if(nBBflagsV0A>=fTriggerData->GetBBAForBGThreshold() && GetBGC()) SetBGCandBBA();\r
251 \r
252         // CTA1_AND_CTC1 (Centrality trigger 1)\r
253         if(chargeV0A>=fTriggerData->GetCentralityV0AThrLow() && chargeV0C>=fTriggerData->GetCentralityV0CThrLow()) SetCTA1andCTC1();\r
254 \r
255         // CTA1_OR_CTC1 (Centrality trigger 1)\r
256         if(chargeV0A>=fTriggerData->GetCentralityV0AThrLow() || chargeV0C>=fTriggerData->GetCentralityV0CThrLow()) SetCTA1orCTC1();\r
257         \r
258         // CTA2_AND_CTC2 (Centrality trigger 2)\r
259         if(chargeV0A>=fTriggerData->GetCentralityV0AThrHigh() && chargeV0C>=fTriggerData->GetCentralityV0CThrHigh()) SetCTA2andCTC2();\r
260         \r
261         // CTA2_OR_CTC2 (Centrality trigger 2)\r
262         if(chargeV0A>=fTriggerData->GetCentralityV0AThrHigh() || chargeV0C>=fTriggerData->GetCentralityV0CThrHigh()) SetCTA2orCTC2();\r
263         \r
264         // MTA_AND_MTC (Multiplicity Trigger)\r
265         if((nBBflagsV0A<=fTriggerData->GetMultV0AThrHigh() && nBBflagsV0A>=fTriggerData->GetMultV0AThrLow())\r
266            && (nBBflagsV0C<=fTriggerData->GetMultV0CThrHigh() && nBBflagsV0C>=fTriggerData->GetMultV0CThrLow()) ) \r
267                 SetMTAandMTC();\r
268         \r
269         // MTA_OR_MTC (Multiplicity Trigger)\r
270         if((nBBflagsV0A<=fTriggerData->GetMultV0AThrHigh() && nBBflagsV0A>=fTriggerData->GetMultV0AThrLow())\r
271            || (nBBflagsV0C<=fTriggerData->GetMultV0CThrHigh() && nBBflagsV0C>=fTriggerData->GetMultV0CThrLow()) ) \r
272                 SetMTAorMTC();\r
273         \r
274         // BGA_OR_BGC\r
275         if(GetBGA() || GetBGC()) SetBGAorBGC();\r
276         \r
277         // (BGA and BBC) or (BGC and BBA) (Beam Gas from one of the two sides)\r
278         if(GetBGAandBBC() || GetBGCandBBA()) SetBeamGas();\r
279 \r
280 //      AliInfo(Form("BB Flags : V0A = %d  V0C = %d ",nBBflagsV0A, nBBflagsV0C )); \r
281 //      AliInfo(Form("BG Flags : V0A = %d  V0C = %d ",nBGflagsV0A, nBGflagsV0C )); \r
282 //      AliInfo(Form("Charges  : V0A = %d  V0C = %d ",chargeV0A, chargeV0C )); \r
283         \r
284 }\r
285 \r
286 \r
287 \r