+++ /dev/null
-/**************************************************************************
- * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
- * *
- * Author: The ALICE Off-line Project. *
- * Contributors are mentioned in the code where appropriate. *
- * *
- * Permission to use, copy, modify and distribute this software and its *
- * documentation strictly for non-commercial purposes is hereby granted *
- * without fee, provided that the above copyright notice appears in all *
- * copies and that both the copyright notice and this permission notice *
- * appear in the supporting documentation. The authors make no claims *
- * about the suitability of this software for any purpose. It is *
- * provided "as is" without express or implied warranty. *
- **************************************************************************/
-
-/* $Id$ */
-
-//-----------------------------------------------------------------------------
-/// \class AliMUONTriggerLut
-///
-/// Local Trigger Look Up Table
-/// reading interface LUT data is stored into TH3S histograms and readout
-/// from the Local Trigger algorithm
-///
-/// Histograms structure is :
-/// X 234 bins, 1 to 235 = local board number
-/// Y 31 bins, 0 to 31 = x strip
-/// Z 31 bins, 0 to 31 = x deviation
-/// content = Short_t = y strip mask
-///
-/// overflow bin is used !
-///
-/// \author Philippe Crochet
-//-----------------------------------------------------------------------------
-
-#include "AliMUONTriggerLut.h"
-
-#include "AliLog.h"
-
-#include <TFile.h>
-#include <TH3.h>
-#include <TMap.h>
-#include <TObjString.h>
-
-/// \cond CLASSIMP
-ClassImp(AliMUONTriggerLut)
-/// \endcond
-
-//----------------------------------------------------------------------
-AliMUONTriggerLut::AliMUONTriggerLut()
- : TNamed(),
- fLptPlus(0),
- fLptMinu(0),
- fLptUnde(0),
- fHptPlus(0),
- fHptMinu(0),
- fHptUnde(0),
- fAptPlus(0),
- fAptMinu(0),
- fAptUnde(0),
- fMap(0x0)
-{
-/// ctor
-}
-
-//----------------------------------------------------------------------
-AliMUONTriggerLut::~AliMUONTriggerLut()
-{
-/// Destructor
-
- delete fLptPlus;
- delete fLptMinu;
- delete fLptUnde;
- delete fHptPlus;
- delete fHptMinu;
- delete fHptUnde;
- delete fAptPlus;
- delete fAptMinu;
- delete fAptUnde;
- delete fMap;
-}
-
-//----------------------------------------------------------------------
-Int_t
-AliMUONTriggerLut::Compare(TH3* h1, TH3* h2) const
-{
-/// Return 0 if both histograms are strictly equal (at the bin-by-bin level)
-
- AliDebug(1,Form("h1 %s h2 %s",h1 ? h1->GetName() : "null", h2 ? h2->GetName() : "null"));
-
- if (!h1 || !h2)
- {
- return 0;
- }
- Int_t bin;
- for ( Int_t ix = 0; ix <= h1->GetNbinsX()+1; ix++ )
- for ( Int_t iy = 0; iy <= h1->GetNbinsY()+1; iy++ )
- for ( Int_t iz = 0; iz <= h1->GetNbinsZ()+1; iz++ )
- {
- {
- {
- bin = h1->GetBin(ix,iy,iz);
- Double_t x1 = h1->GetBinContent(bin);
- Double_t x2 = h2->GetBinContent(bin);
- if ( x1 != x2 ) return 0;
- }
- }
- }
-
- AliDebug(1,"same");
-
- return 1;
-}
-
-//----------------------------------------------------------------------
-Int_t
-AliMUONTriggerLut::Compare(const TObject* object) const
-{
-/// Return 0 if the two luts are strictly equal
-
- const AliMUONTriggerLut* lut = static_cast<const AliMUONTriggerLut*>(object);
-
- Int_t rvLpt(0);
-
- rvLpt += Compare(fLptPlus,lut->fLptPlus);
- rvLpt += Compare(fLptMinu,lut->fLptMinu);
- rvLpt += Compare(fLptUnde,lut->fLptUnde);
-
- Int_t rvHpt(0);
-
- rvHpt += Compare(fHptPlus,lut->fHptPlus);
- rvHpt += Compare(fHptMinu,lut->fHptMinu);
- rvHpt += Compare(fHptUnde,lut->fHptUnde);
-
- Int_t rv(0);
-
- rv += Compare(fAptPlus,lut->fAptPlus);
- rv += Compare(fAptMinu,lut->fAptMinu);
- rv += Compare(fAptUnde,lut->fAptUnde);
-
- AliDebug(1,Form("Same Lpt %d Hpt %d Apt %d",rvLpt,rvHpt,rv));
-
- if ( rvLpt == 3 && rvHpt == 3 )
- {
- return 0;
- }
-
- return 1;
-}
-
-//----------------------------------------------------------------------
-void AliMUONTriggerLut::ReadFromFile(const char* filename)
-{
-/// Return output of LuT for corresponding TH3S
-
- TFile f(filename);
-
- if ( f.IsZombie() )
- {
- AliFatal(Form("Could not open file %s",filename));
- }
-
- AliDebug(1,Form("filename=%s",filename));
-
- fLptPlus = (TH3*)(f.Get("LptPlus"));
- fLptMinu = (TH3*)(f.Get("LptMinu"));
- fLptUnde = (TH3*)(f.Get("LptUnde"));
- fHptPlus = (TH3*)(f.Get("HptPlus"));
- fHptMinu = (TH3*)(f.Get("HptMinu"));
- fHptUnde = (TH3*)(f.Get("HptUnde"));
- fAptPlus = (TH3*)(f.Get("AptPlus"));
- fAptMinu = (TH3*)(f.Get("AptMinu"));
- fAptUnde = (TH3*)(f.Get("AptUnde"));
-
- // insure we "detach" those histograms from file f
- fLptPlus->SetDirectory(0);
- fLptMinu->SetDirectory(0);
- fLptUnde->SetDirectory(0);
- fHptPlus->SetDirectory(0);
- fHptMinu->SetDirectory(0);
- fHptUnde->SetDirectory(0);
- fAptPlus->SetDirectory(0);
- fAptMinu->SetDirectory(0);
- fAptUnde->SetDirectory(0);
-
- RegisterHistos();
-}
-
-//----------------------------------------------------------------------
-void
-AliMUONTriggerLut::RegisterHistos()
-{
-/// Add histos to our internal map
-
- Add(fLptPlus);
- Add(fLptMinu);
- Add(fLptUnde);
-
- Add(fHptPlus);
- Add(fHptMinu);
- Add(fHptUnde);
-
- Add(fAptPlus);
- Add(fAptMinu);
- Add(fAptUnde);
-}
-
-//----------------------------------------------------------------------
-void
-AliMUONTriggerLut::Add(TH3* h)
-{
- /// Update internal map
- if (!fMap)
- {
- fMap = new TMap;
- fMap->SetOwner(kTRUE);
- }
-
- if (h) fMap->Add(new TObjString(h->GetName()),h);
-}
-
-//----------------------------------------------------------------------
-void
-AliMUONTriggerLut::SetContent(const char* hname, Int_t icirc, UChar_t istripX,
- UChar_t idev, Short_t value)
-{
- /// Set the content of one bin of one histogram
-
- if (!fMap)
- {
- //..........................................circuit/stripX/deviation
- fLptPlus = new TH3S("LptPlus","LptPlus",234,0,234,31,0,31,31,0,31);
- fLptMinu = new TH3S("LptMinu","LptMinu",234,0,234,31,0,31,31,0,31);
- fLptUnde = new TH3S("LptUnde","LptUnde",234,0,234,31,0,31,31,0,31);
-
- fHptPlus = new TH3S("HptPlus","HptPlus",234,0,234,31,0,31,31,0,31);
- fHptMinu = new TH3S("HptMinu","HptMinu",234,0,234,31,0,31,31,0,31);
- fHptUnde = new TH3S("HptUnde","HptUnde",234,0,234,31,0,31,31,0,31);
-
- fAptPlus = new TH3S("AptPlus","AptPlus",234,0,234,31,0,31,31,0,31);
- fAptMinu = new TH3S("AptMinu","AptMinu",234,0,234,31,0,31,31,0,31);
- fAptUnde = new TH3S("AptUnde","AptUnde",234,0,234,31,0,31,31,0,31);
-
- RegisterHistos();
- }
-
- TH3* h = static_cast<TH3*>(fMap->GetValue(hname));
-
- Int_t bin = h->GetBin(icirc,istripX,idev);
- h->SetBinContent(bin,value);
-}
-
-//----------------------------------------------------------------------
-void AliMUONTriggerLut::GetLutOutput(Int_t circuit, Int_t xstrip, Int_t idev,
- Int_t ystrip, Int_t lutLpt[2],
- Int_t lutHpt[2]) const
-{
-/// Return output of LuT for corresponding TH3S
-
- if ( !fLptPlus )
- {
- AliError("LUT not initialized");
-// ReadFromFile("$(ALICE_ROOT)/MUON/data/MUONTriggerLut.root");
- }
-
- Int_t bin;
- Short_t binc;
- Int_t mask = GetMask(ystrip); // get ystrip mask
-
- // Low pt..............................................
- bin = fLptPlus->GetBin(circuit,xstrip,idev);
- binc = (Short_t)fLptPlus->GetBinContent(bin);
- if ((binc & mask)!=0) lutLpt[1]=1;
-
- bin = fLptMinu->GetBin(circuit,xstrip,idev);
- binc = (Short_t)fLptMinu->GetBinContent(bin);
- if ((binc & mask)!=0) lutLpt[0]=1;
-
- bin = fLptUnde->GetBin(circuit,xstrip,idev);
- binc = (Short_t)fLptUnde->GetBinContent(bin);
- if ((binc & mask)!=0) lutLpt[0]=lutLpt[1]=1;
-
- // High pt.............................................
- bin = fHptPlus->GetBin(circuit,xstrip,idev);
- binc = (Short_t)fHptPlus->GetBinContent(bin);
- if ((binc & mask)!=0) lutHpt[1]=1;
-
- bin = fHptMinu->GetBin(circuit,xstrip,idev);
- binc = (Short_t)fHptMinu->GetBinContent(bin);
- if ((binc & mask)!=0) lutHpt[0]=1;
-
- bin = fHptUnde->GetBin(circuit,xstrip,idev);
- binc = (Short_t)fHptUnde->GetBinContent(bin);
- if ((binc & mask)!=0) lutHpt[0]=lutHpt[1]=1;
-/*
- // All pts.............................................
- bin = fAptPlus->GetBin(circuit,xstrip,idev);
- binc = (Short_t)fAptPlus->GetBinContent(bin);
- if ((binc & mask)!=0) lutApt[1]=1;
-
- bin = fAptMinu->GetBin(circuit,xstrip,idev);
- binc = (Short_t)fAptMinu->GetBinContent(bin);
- if ((binc & mask)!=0) lutApt[0]=1;
-
- bin = fAptUnde->GetBin(circuit,xstrip,idev);
- binc = (Short_t)fAptUnde->GetBinContent(bin);
- if ((binc & mask)!=0) lutApt[0]=lutApt[1]=1;
-*/
-}
-
-//----------------------------------------------------------------------
-Int_t AliMUONTriggerLut::GetMask(Int_t ystrip) const
-{
-/// Return the mask corresponding to ystrip
-
- return (Int_t)(1<<ystrip);
-}
-
-//----------------------------------------------------------------------
-void AliMUONTriggerLut::SetLutCode(const UChar_t lutCode)
-{
-/// Set the LUT code for the pair of cuts
-/// see AliMUONTriggerIO::ReadLUT for the definitions
-
- if (!fMap) {
- AliWarning("Nothing registered in the map ?... ");
- return;
- }
- TH3* h = static_cast<TH3*>(fMap->GetValue("LptPlus"));
- h->SetTitle(Form("LptPlus 0x%02x",lutCode));
-
-}
-
-
-
-//----------------------------------------------------------------------
-void AliMUONTriggerLut::PrintLutCode()
-{
-/// Print out the LUT code for the pair of cuts
-/// see AliMUONTriggerIO::ReadLUT for the definitions
-
- TString lutCode = fLptPlus->GetTitle();
- lutCode.Remove(0,8);
- if (lutCode.Length() == 0) {
- AliInfo("No code stored (older version).");
- } else {
- AliInfo(lutCode.Data());
-
- AliInfo("---------------------------------");
- AliInfo("1st/2nd cut code pt cut [GeV/c]");
- AliInfo(" ");
- AliInfo(" 0 0.5 (a.k.a. Apt)");
- AliInfo(" 1 1.0 (a.k.a. Lpt)");
- AliInfo(" 2 1.7 (a.k.a. Hpt)");
- AliInfo(" 3 4.2 (a.k.a. infinity)");
- AliInfo(" 4 free");
- AliInfo(" .");
- AliInfo(" .");
- AliInfo(" .");
- AliInfo("15 default (for backward compatibility)");
- AliInfo("---------------------------------------");
-
- }
-
-}