]> git.uio.no Git - u/mrichter/AliRoot.git/blame - JETAN/jetan2004/AliTkConeJet.cxx
A new function for calculating the mean crossed material (A.Dainese, A.Gheata)
[u/mrichter/AliRoot.git] / JETAN / jetan2004 / AliTkConeJet.cxx
CommitLineData
b9a6a391 1//$Id$
2
3#include <Riostream.h>
4#include <TROOT.h>
5#include <TClonesArray.h>
6#include <TParticle.h>
7#include <TMath.h>
8
9#include "AliTkTowerV2.h"
10#include "AliTkConeJet.h"
11
12#define Ntowers__ 100
13
14AliTkConeJet::AliTkConeJet() : TObject(),
15 fEta(-999),fPhi(-999),fEt(-999),fType(0),
16 fNTowers(0),fTowers(0),fPtCut(0.),
17 fCEta(-999),fCPhi(-999),fCEt(-999),
18 fPLength(0.),fXAxis(0.),fYAxis(0.),fZAxis(0.),
19 fPtLead(0.),fLeadPart(0),fNParts(0),fParts(0)
20{
21 fTowers = new TClonesArray("AliTkTowerV2",Ntowers__);
22}
23
24AliTkConeJet::AliTkConeJet(Float_t pt, Float_t eta, Float_t phi,Int_t type)
25 : TObject(),
26 fEta(eta),fPhi(phi),fEt(pt),fType(type),
27 fNTowers(0),fTowers(0),fPtCut(0.),
28 fCEta(eta),fCPhi(phi),fCEt(pt),
29 fPLength(0.),fXAxis(0.),fYAxis(0.),fZAxis(0.),
30 fPtLead(0.),fLeadPart(0),fNParts(0),fParts(0)
31{
32 fTowers = new TClonesArray("AliTkTowerV2",0);
33}
34
35AliTkConeJet::AliTkConeJet(const AliTkConeJet &j)
36 : TObject(),
37 fEta(-999), fPhi(-999), fEt(-999),fType(0),
38 fNTowers(0),fTowers(0),fPtCut(0.),
39 fCEta(-999),fCPhi(-999),fCEt(-999),
40 fPLength(0.),fXAxis(0.),fYAxis(0.),fZAxis(0.),
41 fPtLead(0.),fLeadPart(0),fNParts(0),fParts(0)
42{
43 fEta = j.getEta();
44 fPhi = j.getPhi();
45 fEt = j.getEt();
46 fCEta = j.getCEta();
47 fCPhi = j.getCPhi();
48 fCEt = j.getCEt();
49 fNTowers = j.getNTowers();
50 fPtCut = j.getPtCut();
51 fCEta = j.getCEta();
52 fCPhi = j.getCPhi();
53 fCEt = j.getCEt();
54 fPLength = j.getPLength();
55 fXAxis = j.getXAxis();
56 fYAxis = j.getYAxis();
57 fZAxis = j.getZAxis();
58 fPtLead = j.getPtLead();
59 fLeadPart = new TParticle(*j.getLeadPart());
60 fNParts = j.getNParts();
61
62 // need to build a copy of the old TClonesArray...
63 fTowers = new TClonesArray("AliTkTowerV2",Ntowers__);
64 TClonesArray *otherTowers = j.getTowerList();
65 AliTkTowerV2 *myTower;
66 TIterator *iter = otherTowers->MakeIterator();
67 Int_t i =0;
68 while ((myTower = (AliTkTowerV2 *) iter->Next()) != NULL) {
69 new ((*fTowers)[i]) AliTkTowerV2(*myTower);
70 i++;
71 }
72 if(i!=fNTowers)
73 cerr << "AliTkConeJet: should not happen " << i << " " << fNTowers << endl;
74 delete iter;
75
76 // need to build a copy of the old TClonesArray...
77 fParts = new TClonesArray("TParticle",j.getNParts());
78 TClonesArray *otherParts = j.getParts();
79 TParticle *myParticle;
80 iter = otherParts->MakeIterator();
81 i =0;
82 while ((myParticle = (TParticle *) iter->Next()) != NULL) {
83 new ((*fParts)[i]) TParticle(*myParticle);
84 i++;
85 }
86 if(i!=fNParts)
87 cerr << "AliTkConeJet: should not happen " << i << " " << fNParts << endl;
88 delete iter;
89}
90
91AliTkConeJet::~AliTkConeJet()
92{
93 delete fTowers;
94 if(fLeadPart) delete fLeadPart;
95 if(fParts) delete fParts;
96}
97
98void AliTkConeJet::addTower(AliTkTowerV2 *tower)
99{
100 new ((*fTowers)[fNTowers]) AliTkTowerV2(*tower);
101 fNTowers++;
102}
103
104void AliTkConeJet::Clear(Option_t *option)
105{
106 TObject::Clear(option);
107 fTowers->Delete();
108 fNTowers=0;
109 if(fParts) delete fParts;
110 fParts=0;
111 if(fLeadPart) delete fLeadPart;
112 fLeadPart=0;
113 fEta=-999;
114 fPhi=-999;
115 fEt=-999;
116 fPtCut=0.;
117 fCEta=-999;
118 fCPhi=-999;
119 fCEt=-999;
120 fPLength=0.;
121 fXAxis=0.;
122 fYAxis=0.;
123 fZAxis=0.;
124 fPtLead=0.;
125 fLeadPart=0;
126 fNParts=0;
127 fParts=0;
128}
129
130void AliTkConeJet::calculateFromParticles(Float_t &et, Float_t &eta, Float_t &phi, Float_t ptcut)
131{
132 Float_t px=0.,py=0.,pz=0.;
133 TIterator *titer = fTowers->MakeIterator();
134 AliTkTowerV2 *tower = NULL;
135 while ((tower = (AliTkTowerV2 *)titer->Next()) != NULL) {
136 TClonesArray *particles = tower->getParticleList();
137 TParticle *particle = NULL;
138 TIterator *part = particles->MakeIterator();
139 while ((particle = (TParticle *)part->Next()) != NULL) {
140 if(particle->Pt()<ptcut) continue;
141 px+=particle->Px();
142 py+=particle->Py();
143 pz+=particle->Pz();
144 }
145 delete part;
146 }
147 delete titer;
148
149 et = TMath::Sqrt(px*px+py*py);
150 Float_t p = TMath::Sqrt(px*px+py*py+pz*pz);
151 Float_t theta = (pz==0)?TMath::PiOver2():TMath::ACos(pz/p);
152 phi = TMath::Pi()+TMath::ATan2(-py,-px);
153 eta = -TMath::Log(TMath::Tan(theta/2.));
154}
155
156/* or take e = p_t * cosh(eta) */
157Float_t AliTkConeJet::getE(Float_t ptcut) const
158{
159 Float_t e=0.;
160
161 TIterator *iter = fTowers->MakeIterator();
162 AliTkTowerV2 *tower = NULL;
163 while ((tower = (AliTkTowerV2 *)iter->Next()) != NULL) {
164 TClonesArray *particles = tower->getParticleList();
165 TParticle *particle = NULL;
166 TIterator *part = particles->MakeIterator();
167 while ((particle = (TParticle *)part->Next()) != NULL) {
168 if(particle->Pt()<ptcut) continue;
169 e+=particle->P();
170 }
171 delete part;
172 }
173 delete iter;
174 return e;
175}
176
177/* or take e = p_t * cosh(eta) */
178Float_t AliTkConeJet::getECharged(Float_t ptcut) const
179{
180 Float_t e=0.;
181
182 TIterator *iter = fTowers->MakeIterator();
183 AliTkTowerV2 *tower = NULL;
184 while ((tower = (AliTkTowerV2 *)iter->Next()) != NULL) {
185 TClonesArray *particles = tower->getChargedParticleList();
186 TParticle *particle = NULL;
187 TIterator *part = particles->MakeIterator();
188 while ((particle = (TParticle *)part->Next()) != NULL) {
189 if(particle->Pt()<ptcut) continue;
190 e+=particle->P();
191 }
192 particles->Delete();
193 delete particles;
194 delete part;
195 }
196 delete iter;
197 return e;
198}
199
200Float_t AliTkConeJet::getEtCharged() const
201{
202 Float_t EtCharged = 0;
203 TIterator *iter = fTowers->MakeIterator();
204 AliTkTowerV2 *tower = NULL;
205 while ((tower = (AliTkTowerV2 *)iter->Next()) != NULL) {
206 EtCharged += tower->getEtCharged();
207 }
208 delete iter;
209 return EtCharged;
210}
211
212/* use to get fake rate if
213 in mixed case particles were marked */
214Float_t AliTkConeJet::getEtChargedMarked(Float_t ptcut) const
215{
216 Float_t et=0.;
217
218 TIterator *iter = fTowers->MakeIterator();
219 AliTkTowerV2 *tower = NULL;
220 while ((tower = (AliTkTowerV2 *)iter->Next()) != NULL) {
221 TClonesArray *particles = tower->getChargedParticleList();
222 TParticle *particle = NULL;
223 TIterator *part = particles->MakeIterator();
224 while ((particle = (TParticle *)part->Next()) != NULL) {
225 if(particle->GetWeight()>-100) continue; //(-123)
226 if(particle->Pt()<ptcut) continue;
227 et+=particle->Pt();
228 }
229 particles->Delete();
230 delete particles;
231 delete part;
232 }
233 delete iter;
234 return et;
235}
236
237/* use to get fake rate if
238 in mixed case particles were marked */
239Float_t AliTkConeJet::getEtMarked(Float_t ptcut) const
240{
241 Float_t et=0.;
242 TIterator *iter = fTowers->MakeIterator();
243 AliTkTowerV2 *tower = NULL;
244 while ((tower = (AliTkTowerV2 *)iter->Next()) != NULL) {
245 TClonesArray *particles = tower->getParticleList();
246 TParticle *particle = NULL;
247 TIterator *part = particles->MakeIterator();
248 while ((particle = (TParticle *)part->Next()) != NULL) {
249 if(particle->GetWeight()>-100) continue; //(-123)
250 if(particle->Pt()<ptcut) continue;
251 et+=particle->Pt();
252 }
253 delete part;
254 }
255 delete iter;
256 return et;
257}
258
259Float_t AliTkConeJet::getEtMarkedFrac(Float_t ptcut) const
260{
261 Float_t et=0.,etall=0.;
262 TIterator *iter = fTowers->MakeIterator();
263 AliTkTowerV2 *tower = NULL;
264 while ((tower = (AliTkTowerV2 *)iter->Next()) != NULL) {
265 TClonesArray *particles = tower->getParticleList();
266 TParticle *particle = NULL;
267 TIterator *part = particles->MakeIterator();
268 while ((particle = (TParticle *)part->Next()) != NULL) {
269 if(particle->Pt()<ptcut) continue;
270 etall+=particle->Pt();
271 if(particle->GetWeight()>-100) continue; //(-123)
272 et+=particle->Pt();
273 }
274 delete part;
275 }
276 delete iter;
277 if(etall>0) return et/etall;
278 return 1;
279}
280
281Float_t AliTkConeJet::getEtEM() const
282{
283 Float_t EtEM = 0;
284 TIterator *iter = fTowers->MakeIterator();
285 AliTkTowerV2 *tower = NULL;
286 while ((tower = (AliTkTowerV2 *)iter->Next()) != NULL) {
287 EtEM += tower->getEtEM();
288 }
289 delete iter;
290 return EtEM;
291}
292
293TClonesArray *AliTkConeJet::getParticles(Float_t ptcut) const
294{
295 TClonesArray *allParticles = new TClonesArray("TParticle",10000);
296 Int_t nParticles = 0;
297 TIterator *iter = fTowers->MakeIterator();
298 AliTkTowerV2 *tower = NULL;
299 while ((tower = (AliTkTowerV2 *)iter->Next()) != NULL) {
300 TClonesArray *particles = tower->getParticleList();
301 TParticle *particle = NULL;
302 TIterator *part = particles->MakeIterator();
303 while ((particle = (TParticle *)part->Next()) != NULL) {
304 if(particle->Pt()<ptcut) continue;
305 new ((*allParticles)[nParticles]) TParticle(*particle);
306 nParticles++;
307 }
308 delete part;
309 }
310 delete iter;
311 return allParticles;
312}
313
314TClonesArray *AliTkConeJet::getChargedParticles(Float_t ptcut) const
315{
316 TClonesArray *chargedParticles = new TClonesArray("TParticle",10000);
317 Int_t nChargedParticles = 0;
318 TIterator *iter = fTowers->MakeIterator();
319 AliTkTowerV2 *tower = NULL;
320 while ((tower = (AliTkTowerV2 *)iter->Next()) != NULL) {
321 TClonesArray *particles = tower->getChargedParticleList();
322 TParticle *particle = NULL;
323 TIterator *part = particles->MakeIterator();
324 while ((particle = (TParticle *)part->Next()) != NULL) {
325 if(particle->Pt()<ptcut) continue;
326 new ((*chargedParticles)[nChargedParticles]) TParticle(*particle);
327 nChargedParticles++;
328 }
329 particles->Delete();
330 delete particles;
331 delete part;
332 }
333 delete iter;
334 return chargedParticles;
335}
336
337TClonesArray *AliTkConeJet::getNeutralParticles(Float_t ptcut) const
338{
339 TClonesArray *neutralParticles = new TClonesArray("TParticle",10000);
340 Int_t nNeutralParticles = 0;
341 TIterator *iter = fTowers->MakeIterator();
342 AliTkTowerV2 *tower = NULL;
343 while ((tower = (AliTkTowerV2 *)iter->Next()) != NULL) {
344 TClonesArray *particles = tower->getNeutralParticleList();
345 TParticle *particle = NULL;
346 TIterator *part = particles->MakeIterator();
347 while ((particle = (TParticle *)part->Next()) != NULL) {
348 if(particle->Pt()<ptcut) continue;
349 new ((*neutralParticles)[nNeutralParticles]) TParticle(*particle);
350 nNeutralParticles++;
351 }
352 particles->Delete();
353 delete particles;
354 delete part;
355 }
356 delete iter;
357 return neutralParticles;
358}
359
360Int_t AliTkConeJet::getNParticles() const
361{
362 Int_t n = -1;
363 TClonesArray *p = getParticles();
364 n = p->GetEntries();
365 p->Delete();
366 delete p;
367 return n;
368}
369
370Int_t AliTkConeJet::getNChargedParticles() const
371{
372 Int_t n = -1;
373 TClonesArray *p = getChargedParticles();
374 n = p->GetEntries();
375 p->Delete();
376 delete p;
377 return n;
378}
379
380Int_t AliTkConeJet::getNNeutralParticles() const
381{
382 Int_t n = -1;
383 TClonesArray *p = getNeutralParticles();
384 n = p->GetEntries();
385 p->Delete();
386 delete p;
387 return n;
388}
389
390Int_t AliTkConeJet::getNParticles(Float_t ptCut) const
391{
392 Int_t n = 0;
393 TClonesArray *particles = getParticles();
394 TIterator *iter = particles->MakeIterator();
395 TParticle *particle;
396 while ((particle = (TParticle *)iter->Next()) != NULL) {
397 if (particle->Pt() > ptCut) {
398 n++;
399 }
400 }
401 delete iter;
402 particles->Delete();
403 delete particles;
404 return n;
405}
406
407Int_t AliTkConeJet::getNChargedParticles(Float_t ptCut) const
408{
409 Int_t n = 0;
410 TClonesArray *particles = getChargedParticles();
411 TIterator *iter = particles->MakeIterator();
412 TParticle *particle;
413 while ((particle = (TParticle *)iter->Next()) != NULL) {
414 if (particle->Pt() > ptCut) {
415 n++;
416 }
417 }
418 delete iter;
419 particles->Delete();
420 delete particles;
421 return n;
422}
423
424Int_t AliTkConeJet::getNNeutralParticles(Float_t ptCut) const
425{
426 Int_t n = 0;
427 TClonesArray *particles = getNeutralParticles();
428 TIterator *iter = particles->MakeIterator();
429 TParticle *particle;
430 while ((particle = (TParticle *)iter->Next()) != NULL) {
431 if (particle->Pt() > ptCut) {
432 n++;
433 }
434 }
435 delete iter;
436 particles->Delete();
437 delete particles;
438 return n;
439}
440
441void AliTkConeJet::getAxis(Float_t &x,Float_t &y,Float_t &z,Float_t ptcut) const
442{
443 x=0.;
444 y=0.;
445 z=0.;
446
447 TIterator *iter = fTowers->MakeIterator();
448 AliTkTowerV2 *tower = NULL;
449 while ((tower = (AliTkTowerV2 *)iter->Next()) != NULL) {
450 TClonesArray *particles = tower->getParticleList();
451 TParticle *particle = NULL;
452 TIterator *part = particles->MakeIterator();
453 while ((particle = (TParticle *)part->Next()) != NULL) {
454 if(particle->Pt()<ptcut) continue;
455 x+=particle->Px();
456 y+=particle->Py();
457 z+=particle->Pz();
458 }
459 delete part;
460 }
461 delete iter;
462}
463
464void AliTkConeJet::getChAxis(Float_t &x,Float_t &y,Float_t &z,Float_t ptcut) const
465{
466 x=0.;
467 y=0.;
468 z=0.;
469
470 TIterator *iter = fTowers->MakeIterator();
471 AliTkTowerV2 *tower = NULL;
472 while ((tower = (AliTkTowerV2 *)iter->Next()) != NULL) {
473 TClonesArray *particles = tower->getChargedParticleList();
474 TParticle *particle = NULL;
475 TIterator *part = particles->MakeIterator();
476 while ((particle = (TParticle *)part->Next()) != NULL) {
477 if(particle->Pt()<ptcut) continue;
478 x+=particle->Px();
479 y+=particle->Py();
480 z+=particle->Pz();
481 }
482 particles->Delete();
483 delete particles;
484 delete part;
485 }
486 delete iter;
487 Float_t length=TMath::Sqrt(x*x+y*y+z*z);
488 if(length!=0){
489 x/=length;
490 y/=length;
491 z/=length;
492 }
493}
494
495TParticle* AliTkConeJet::getLeadingPart(Float_t ptcut) const
496{
497 TParticle* plead=new TParticle;
498 Float_t ptlead=0;
499
500 TIterator *iter = fTowers->MakeIterator();
501 AliTkTowerV2 *tower = NULL;
502 while ((tower = (AliTkTowerV2 *)iter->Next()) != NULL) {
503 TClonesArray *particles = tower->getParticleList();
504 TParticle *particle = NULL;
505 TIterator *part = particles->MakeIterator();
506 while ((particle = (TParticle *)part->Next()) != NULL) {
507 if(particle->Pt()<ptcut) continue;
508 if(particle->Pt()>ptlead){
509 ptlead=particle->Pt();
510 delete plead;
511 plead=new TParticle(*particle);
512 }
513 }
514 delete part;
515 }
516 delete iter;
517 return plead;
518}
519
520TParticle* AliTkConeJet::getLeadingChPart(Float_t ptcut) const
521{
522 TParticle* plead=new TParticle;
523 Float_t ptlead=0;
524
525 TIterator *iter = fTowers->MakeIterator();
526 AliTkTowerV2 *tower = NULL;
527 while ((tower = (AliTkTowerV2 *)iter->Next()) != NULL) {
528 TClonesArray *particles = tower->getChargedParticleList();
529 TParticle *particle = NULL;
530 TIterator *part = particles->MakeIterator();
531 while ((particle = (TParticle *)part->Next()) != NULL) {
532 if(particle->Pt()<ptcut) continue;
533 if(particle->Pt()>ptlead){
534 ptlead=particle->Pt();
535 delete plead;
536 plead=new TParticle(*particle);
537 }
538 }
539 particles->Delete();
540 delete particles;
541 delete part;
542 }
543 delete iter;
544 return plead;
545}
546
547void AliTkConeJet::calculateValues(Float_t ptcut)
548{
549 fPtCut=ptcut;
550 if(fParts) delete fParts;
551 fParts=new TClonesArray("TParticle",fNTowers*25);
552
553 Float_t px=0.,py=0.,pz=0.;
554 TParticle* plead=new TParticle;
555 Float_t ptlead=0;
556 Int_t counter=0;
557 TIterator *titer = fTowers->MakeIterator();
558 AliTkTowerV2 *tower = NULL;
559 while ((tower = (AliTkTowerV2 *)titer->Next()) != NULL) {
560 TClonesArray *particles = tower->getParticleList();
561
562 TParticle *particle = NULL;
563 TIterator *part = particles->MakeIterator();
564 while ((particle = (TParticle *)part->Next()) != NULL) {
565 if(particle->Pt()<ptcut) continue;
566 px+=particle->Px();
567 py+=particle->Py();
568 pz+=particle->Pz();
569 new ((*fParts)[counter]) TParticle(*particle);
570 counter++;
571 if(particle->Pt()>ptlead){
572 ptlead=particle->Pt();
573 delete plead;
574 plead=new TParticle(*particle);
575 }
576 }
577 delete part;
578 }
579 delete titer;
580
581 fCEt = TMath::Sqrt(px*px+py*py);
582 Float_t p = TMath::Sqrt(px*px+py*py+pz*pz);
583 fPLength = p;
584 //Float_t theta = ((pz==0)||(p==0))?TMath::PiOver2():TMath::ACos(pz/p);
585 fCPhi = TMath::Pi()+TMath::ATan2(-py,-px);
586 //fCEta = (theta==0)?-100:TMath::Log(TMath::Tan(theta/2.));
587 fCEta = (p==pz)?-100:0.5*TMath::Log((p+pz)/(p-pz));
588 if(p){
589 fXAxis= px/p;
590 fYAxis= py/p;
591 fZAxis= pz/p;
592 }
593 fPtLead=ptlead;
594 if(fLeadPart) delete fLeadPart;
595 fLeadPart=new TParticle(*plead);
596 delete plead;
597 fNParts=counter;
598}
599
600Int_t AliTkConeJet::Compare(const TObject *obj) const
601{
602 Double_t val=((AliTkConeJet*)obj)->getEt();
603
604 if(fEt>val) return -1; //qsort is ascending
605 else if (fEt<val) return 1;
606 else return 0;
607}
608
609ostream& operator<<(ostream& s,const AliTkConeJet &p)
610{
611 return s << "AliTkConeJet info: eta=" << p.getEta()
612 << " phi=" << p.getPhi() << " Et=" << p.getEt();
613}
614
615Float_t AliTkConeJet::Diff(const AliTkConeJet *jet1, const AliTkConeJet *jet2, Float_t &etdiff, Float_t &phidiff, Float_t &etadiff)
616{
617 Float_t ret=0;
618 phidiff=TMath::Abs(jet1->getPhi()-jet2->getPhi());
619 if(phidiff>TMath::Pi()) ret=TMath::TwoPi()-phidiff;
620 etadiff=TMath::Abs(jet1->getEta()-jet2->getEta());
621 ret=TMath::Sqrt(phidiff*phidiff+etadiff*etadiff);
622 etdiff=jet1->getEt()-jet2->getEt();
623 return ret;
624}
625
626ClassImp(AliTkConeJet)