1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 //-----------------------------------------------------------------------------
19 /// \class AliMUONTriggerLut
21 /// Local Trigger Look Up Table
22 /// reading interface LUT data is stored into TH3S histograms and readout
23 /// from the Local Trigger algorithm
25 /// Histograms structure is :
26 /// X 234 bins, 1 to 235 = local board number
27 /// Y 31 bins, 0 to 31 = x strip
28 /// Z 31 bins, 0 to 31 = x deviation
29 /// content = Short_t = y strip mask
31 /// overflow bin is used !
33 /// \author Philippe Crochet
34 //-----------------------------------------------------------------------------
36 #include "AliMUONTriggerLut.h"
43 #include <TObjString.h>
46 ClassImp(AliMUONTriggerLut)
49 //----------------------------------------------------------------------
50 AliMUONTriggerLut::AliMUONTriggerLut()
66 //----------------------------------------------------------------------
67 AliMUONTriggerLut::~AliMUONTriggerLut()
83 //----------------------------------------------------------------------
85 AliMUONTriggerLut::Compare(TH3* h1, TH3* h2) const
87 /// Return 0 if both histograms are strictly equal (at the bin-by-bin level)
89 AliDebug(1,Form("h1 %s h2 %s",h1 ? h1->GetName() : "null", h2 ? h2->GetName() : "null"));
96 for ( Int_t ix = 0; ix <= h1->GetNbinsX()+1; ix++ )
97 for ( Int_t iy = 0; iy <= h1->GetNbinsY()+1; iy++ )
98 for ( Int_t iz = 0; iz <= h1->GetNbinsZ()+1; iz++ )
102 bin = h1->GetBin(ix,iy,iz);
103 Double_t x1 = h1->GetBinContent(bin);
104 Double_t x2 = h2->GetBinContent(bin);
105 if ( x1 != x2 ) return 0;
115 //----------------------------------------------------------------------
117 AliMUONTriggerLut::Compare(const TObject* object) const
119 /// Return 0 if the two luts are strictly equal
121 const AliMUONTriggerLut* lut = static_cast<const AliMUONTriggerLut*>(object);
125 rvLpt += Compare(fLptPlus,lut->fLptPlus);
126 rvLpt += Compare(fLptMinu,lut->fLptMinu);
127 rvLpt += Compare(fLptUnde,lut->fLptUnde);
131 rvHpt += Compare(fHptPlus,lut->fHptPlus);
132 rvHpt += Compare(fHptMinu,lut->fHptMinu);
133 rvHpt += Compare(fHptUnde,lut->fHptUnde);
137 rv += Compare(fAptPlus,lut->fAptPlus);
138 rv += Compare(fAptMinu,lut->fAptMinu);
139 rv += Compare(fAptUnde,lut->fAptUnde);
141 AliDebug(1,Form("Same Lpt %d Hpt %d Apt %d",rvLpt,rvHpt,rv));
143 if ( rvLpt == 3 && rvHpt == 3 )
151 //----------------------------------------------------------------------
152 void AliMUONTriggerLut::ReadFromFile(const char* filename)
154 /// Return output of LuT for corresponding TH3S
160 AliFatal(Form("Could not open file %s",filename));
163 AliDebug(1,Form("filename=%s",filename));
165 fLptPlus = (TH3*)(f.Get("LptPlus"));
166 fLptMinu = (TH3*)(f.Get("LptMinu"));
167 fLptUnde = (TH3*)(f.Get("LptUnde"));
168 fHptPlus = (TH3*)(f.Get("HptPlus"));
169 fHptMinu = (TH3*)(f.Get("HptMinu"));
170 fHptUnde = (TH3*)(f.Get("HptUnde"));
171 fAptPlus = (TH3*)(f.Get("AptPlus"));
172 fAptMinu = (TH3*)(f.Get("AptMinu"));
173 fAptUnde = (TH3*)(f.Get("AptUnde"));
175 // insure we "detach" those histograms from file f
176 fLptPlus->SetDirectory(0);
177 fLptMinu->SetDirectory(0);
178 fLptUnde->SetDirectory(0);
179 fHptPlus->SetDirectory(0);
180 fHptMinu->SetDirectory(0);
181 fHptUnde->SetDirectory(0);
182 fAptPlus->SetDirectory(0);
183 fAptMinu->SetDirectory(0);
184 fAptUnde->SetDirectory(0);
189 //----------------------------------------------------------------------
191 AliMUONTriggerLut::RegisterHistos()
193 /// Add histos to our internal map
208 //----------------------------------------------------------------------
210 AliMUONTriggerLut::Add(TH3* h)
212 /// Update internal map
216 fMap->SetOwner(kTRUE);
219 if (h) fMap->Add(new TObjString(h->GetName()),h);
222 //----------------------------------------------------------------------
224 AliMUONTriggerLut::SetContent(const char* hname, Int_t icirc, UChar_t istripX,
225 UChar_t idev, Short_t value)
227 /// Set the content of one bin of one histogram
231 //..........................................circuit/stripX/deviation
232 fLptPlus = new TH3S("LptPlus","LptPlus",234,0,234,31,0,31,31,0,31);
233 fLptMinu = new TH3S("LptMinu","LptMinu",234,0,234,31,0,31,31,0,31);
234 fLptUnde = new TH3S("LptUnde","LptUnde",234,0,234,31,0,31,31,0,31);
236 fHptPlus = new TH3S("HptPlus","HptPlus",234,0,234,31,0,31,31,0,31);
237 fHptMinu = new TH3S("HptMinu","HptMinu",234,0,234,31,0,31,31,0,31);
238 fHptUnde = new TH3S("HptUnde","HptUnde",234,0,234,31,0,31,31,0,31);
240 fAptPlus = new TH3S("AptPlus","AptPlus",234,0,234,31,0,31,31,0,31);
241 fAptMinu = new TH3S("AptMinu","AptMinu",234,0,234,31,0,31,31,0,31);
242 fAptUnde = new TH3S("AptUnde","AptUnde",234,0,234,31,0,31,31,0,31);
247 TH3* h = static_cast<TH3*>(fMap->GetValue(hname));
249 Int_t bin = h->GetBin(icirc,istripX,idev);
250 h->SetBinContent(bin,value);
253 //----------------------------------------------------------------------
254 void AliMUONTriggerLut::GetLutOutput(Int_t circuit, Int_t xstrip, Int_t idev,
255 Int_t ystrip, Int_t lutLpt[2],
256 Int_t lutHpt[2]) const
258 /// Return output of LuT for corresponding TH3S
262 AliError("LUT not initialized");
263 // ReadFromFile("$(ALICE_ROOT)/MUON/data/MUONTriggerLut.root");
268 Int_t mask = GetMask(ystrip); // get ystrip mask
270 // Low pt..............................................
271 bin = fLptPlus->GetBin(circuit,xstrip,idev);
272 binc = (Short_t)fLptPlus->GetBinContent(bin);
273 if ((binc & mask)!=0) lutLpt[1]=1;
275 bin = fLptMinu->GetBin(circuit,xstrip,idev);
276 binc = (Short_t)fLptMinu->GetBinContent(bin);
277 if ((binc & mask)!=0) lutLpt[0]=1;
279 bin = fLptUnde->GetBin(circuit,xstrip,idev);
280 binc = (Short_t)fLptUnde->GetBinContent(bin);
281 if ((binc & mask)!=0) lutLpt[0]=lutLpt[1]=1;
283 // High pt.............................................
284 bin = fHptPlus->GetBin(circuit,xstrip,idev);
285 binc = (Short_t)fHptPlus->GetBinContent(bin);
286 if ((binc & mask)!=0) lutHpt[1]=1;
288 bin = fHptMinu->GetBin(circuit,xstrip,idev);
289 binc = (Short_t)fHptMinu->GetBinContent(bin);
290 if ((binc & mask)!=0) lutHpt[0]=1;
292 bin = fHptUnde->GetBin(circuit,xstrip,idev);
293 binc = (Short_t)fHptUnde->GetBinContent(bin);
294 if ((binc & mask)!=0) lutHpt[0]=lutHpt[1]=1;
296 // All pts.............................................
297 bin = fAptPlus->GetBin(circuit,xstrip,idev);
298 binc = (Short_t)fAptPlus->GetBinContent(bin);
299 if ((binc & mask)!=0) lutApt[1]=1;
301 bin = fAptMinu->GetBin(circuit,xstrip,idev);
302 binc = (Short_t)fAptMinu->GetBinContent(bin);
303 if ((binc & mask)!=0) lutApt[0]=1;
305 bin = fAptUnde->GetBin(circuit,xstrip,idev);
306 binc = (Short_t)fAptUnde->GetBinContent(bin);
307 if ((binc & mask)!=0) lutApt[0]=lutApt[1]=1;
311 //----------------------------------------------------------------------
312 Int_t AliMUONTriggerLut::GetMask(Int_t ystrip) const
314 /// Return the mask corresponding to ystrip
316 return (Int_t)(1<<ystrip);
319 //----------------------------------------------------------------------
320 void AliMUONTriggerLut::SetLutCode(const UChar_t lutCode)
322 /// Set the LUT code for the pair of cuts
323 /// see AliMUONTriggerIO::ReadLUT for the definitions
326 AliWarning("Nothing registered in the map ?... ");
329 TH3* h = static_cast<TH3*>(fMap->GetValue("LptPlus"));
330 h->SetTitle(Form("LptPlus 0x%02x",lutCode));
336 //----------------------------------------------------------------------
337 void AliMUONTriggerLut::PrintLutCode()
339 /// Print out the LUT code for the pair of cuts
340 /// see AliMUONTriggerIO::ReadLUT for the definitions
342 TString lutCode = fLptPlus->GetTitle();
344 if (lutCode.Length() == 0) {
345 AliInfo("No code stored (older version).");
347 AliInfo(lutCode.Data());
349 AliInfo("---------------------------------");
350 AliInfo("1st/2nd cut code pt cut [GeV/c]");
352 AliInfo(" 0 0.5 (a.k.a. Apt)");
353 AliInfo(" 1 1.0 (a.k.a. Lpt)");
354 AliInfo(" 2 1.7 (a.k.a. Hpt)");
355 AliInfo(" 3 4.2 (a.k.a. infinity)");
360 AliInfo("15 default (for backward compatibility)");
361 AliInfo("---------------------------------------");