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 //---------------------------------------------------------------------
20 // manages the search for jets
21 // Author: jgcn@mda.cinvestav.mx
22 // (code adapted from EMCAL directory)
23 //---------------------------------------------------------------------
25 #include <Riostream.h>
26 #include <TLorentzVector.h>
28 #include "AliUA1JetFinder.h"
29 #include "AliUA1JetHeader.h"
30 #include "UA1Common.h"
31 #include "AliJetReader.h"
35 ClassImp(AliUA1JetFinder)
37 ////////////////////////////////////////////////////////////////////////
39 AliUA1JetFinder::AliUA1JetFinder()
49 ////////////////////////////////////////////////////////////////////////
51 AliUA1JetFinder::~AliUA1JetFinder()
60 // reset and delete header
63 ////////////////////////////////////////////////////////////////////////
66 # define ua1_jet_finder ua1_jet_finder_
71 # define ua1_jet_finder UA1_JET_FINDER
73 # define type_of_call _stdcall
76 extern "C" void type_of_call
77 ua1_jet_finder(Int_t& ncell, Int_t& ncell_tot,
78 Float_t etc[60000], Float_t etac[60000],
80 Float_t& min_move, Float_t& max_move, Int_t& mode,
81 Float_t& prec_bg, Int_t& ierror);
83 extern "C" void type_of_call hf1(Int_t& id, Float_t& x, Float_t& wgt);
85 ////////////////////////////////////////////////////////////////////////
87 void AliUA1JetFinder::FindJets()
90 // initialize event, look for jets, download jet info
93 // initialization in 2 steps
94 // 1) transform input to pt,eta,phi plus lego
97 // 1) transform input to pt,eta,phi plus lego
98 TClonesArray *lvArray = fReader->GetMomentumArray();
99 Int_t nIn = lvArray->GetEntries();
100 if (nIn == 0) return;
102 // local arrays for input
103 Float_t* ptT = new Float_t[nIn];
104 Float_t* etaT = new Float_t[nIn];
105 Float_t* phiT = new Float_t[nIn];
107 // load input vectors
108 for (Int_t i = 0; i < nIn; i++){
109 TLorentzVector *lv = (TLorentzVector*) lvArray->At(i);
112 phiT[i] = ((lv->Phi() < 0) ? (lv->Phi()) + 2 * TMath::Pi() : lv->Phi());
113 fLego->Fill(etaT[i], phiT[i], ptT[i]);
115 fJets->SetNinput(nIn);
118 // check enough space! *to be done*
119 Float_t etCell[60000]; //! Cell Energy
120 Float_t etaCell[60000]; //! Cell eta
121 Float_t phiCell[60000]; //! Cell phi
124 TAxis* xaxis = fLego->GetXaxis();
125 TAxis* yaxis = fLego->GetYaxis();
127 for (Int_t i = 1; i <= fHeader->GetNbinEta(); i++) {
128 for (Int_t j = 1; j <= fHeader->GetNbinPhi(); j++) {
129 e = fLego->GetBinContent(i,j);
130 if (e > 0.0) e -= fHeader->GetMinCellEt();
132 Float_t eta = xaxis->GetBinCenter(i);
133 Float_t phi = yaxis->GetBinCenter(j);
135 etaCell[nCell] = eta;
136 phiCell[nCell] = phi;
141 // run the algo. Parameters from header
142 Int_t nTot = (fHeader->GetNbinEta())*(fHeader->GetNbinPhi());
143 Float_t minmove = fHeader->GetMinMove();
144 Float_t maxmove = fHeader->GetMaxMove();
145 Int_t mode = fHeader->GetMode();
146 Float_t precbg = fHeader->GetPrecBg();
148 ua1_jet_finder(nCell, nTot, etCell, etaCell, phiCell,
149 minmove, maxmove, mode, precbg, ierror);
151 // download jet info.
152 Int_t* mult = new Int_t[UA1JETS.njet];
154 Int_t * idx = new Int_t[UA1JETS.njet];
155 TMath::Sort(UA1JETS.njet, UA1JETS.etj, idx);
157 Int_t* injet = new Int_t[nIn];
158 for (Int_t i = 0; i < nIn; i++) injet[i]= -1;
160 for(Int_t i = 0; i < UA1JETS.njet; i++) {
161 Float_t px, py,pz,en; // convert to 4-vector
162 px = UA1JETS.etj[idx[i]] * TMath::Cos(UA1JETS.phij[1][idx[i]]);
163 py = UA1JETS.etj[idx[i]] * TMath::Sin(UA1JETS.phij[1][idx[i]]);
164 pz = UA1JETS.etj[idx[i]] /
165 TMath::Tan(2.0 * TMath::ATan(TMath::Exp(-UA1JETS.etaj[1][idx[i]])));
166 en = TMath::Sqrt(px * px + py * py + pz * pz);
168 fJets->AddJet(px, py, pz, en);
169 // find multiplicities and relationship jet-particle
171 for (Int_t j = 0; j < nIn; j++) {
172 Float_t deta = etaT[j] - UA1JETS.etaj[1][idx[i]];
173 Float_t dphi = phiT[j] - UA1JETS.phij[1][idx[i]];
174 if (dphi < -TMath::Pi()) dphi= -dphi - 2.0 * TMath::Pi();
175 if (dphi > TMath::Pi()) dphi = 2.0 * TMath::Pi() - dphi;
176 Float_t dr = TMath::Sqrt(deta * deta + dphi * dphi);
177 if (dr < fHeader->GetRadius() && injet[j] == -1) {
183 fJets->SetMultiplicities(mult);
184 fJets->SetInJet(injet);
187 ////////////////////////////////////////////////////////////////////////
189 void AliUA1JetFinder::Reset()
196 ////////////////////////////////////////////////////////////////////////
198 void AliUA1JetFinder::WriteJHeaderToFile()
205 ////////////////////////////////////////////////////////////////////////
207 void AliUA1JetFinder::Init()
209 // initializes some variables
211 dEta = (fHeader->GetEtaMax()-fHeader->GetEtaMin())
212 /((Float_t) fHeader->GetNbinEta());
213 dPhi = (fHeader->GetPhiMax()-fHeader->GetPhiMin())
214 /((Float_t) fHeader->GetNbinPhi());
216 UA1CELL.etaCellSize = dEta;
217 UA1CELL.phiCellSize = dPhi;
220 UA1PARA.coneRad = fHeader->GetRadius();
221 UA1PARA.etSeed = fHeader->GetEtSeed();
222 UA1PARA.ejMin = fHeader->GetMinJetEt();
223 UA1PARA.etMin = fHeader->GetMinCellEt();
227 TH2F("legoH","eta-phi",
228 fHeader->GetNbinEta(), fHeader->GetEtaMin(), fHeader->GetEtaMax(),
229 fHeader->GetNbinPhi(), fHeader->GetPhiMin(), fHeader->GetPhiMax());