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 **************************************************************************/
19 //_________________________________________________________________________
20 // Class for JetFinder Input preparation from simulated data
22 //*-- Author: Mark Horner (LBL/UCT)
27 #include "AliEMCALJetFinderInputSimPrep.h"
29 #include <TParticle.h>
30 #include <TParticlePDG.h>
34 #include <TObjectTable.h>
40 #include "AliEMCALFast.h"
42 #include "AliEMCALHit.h"
43 #include "AliEMCALGeometry.h"
44 #include "AliEMCALGetter.h"
45 #include "AliEMCALLoader.h"
46 #include "AliGenEventHeader.h"
47 #include "AliGenPythiaEventHeader.h"
48 #include "AliGenerator.h"
49 #include "AliHeader.h"
54 ClassImp(AliEMCALJetFinderInputSimPrep)
56 AliEMCALJetFinderInputSimPrep::AliEMCALJetFinderInputSimPrep()
58 // Default constructor
59 if (fDebug > 0) Info("AliEMCALJetFinderInputSimPrep","Beginning Constructor");
62 fSmearType = kSmearEffic;
64 fTrackType = kCharged;
68 AliEMCALJetFinderInputSimPrep::~AliEMCALJetFinderInputSimPrep()
70 if (fDebug > 0) Info("~AliEMCALJetFinderInputSimPrep","Beginning Destructor");
74 void AliEMCALJetFinderInputSimPrep::Reset(AliEMCALJetFinderResetType_t resettype)
76 // Method to reset data
77 if (fDebug > 1) Info("Reset","Beginning Reset");
81 fInputObject.Reset(resettype);
84 fInputObject.Reset(resettype);
87 fInputObject.Reset(resettype);
89 case kResetParameters:
90 fSmearType = kSmearEffic;
92 fTrackType = kCharged;
95 fSmearType = kSmearEffic;
97 fTrackType = kCharged;
98 fInputObject.Reset(resettype);
101 Warning("FillFromFile", "kResetPartons not implemented") ;
103 case kResetParticles:
104 Warning("FillFromFile", "kResetParticles not implemented") ;
107 Warning("FillFromFile", "kResetJets not implemented") ;
113 Int_t AliEMCALJetFinderInputSimPrep::FillFromFile(TString *filename, AliEMCALJetFinderFileType_t filetype,Int_t EventNumber)
115 if (fDebug > 1) Info("FillFromFile","Beginning FillFromFile");
116 fFileType = filetype;
117 AliEMCALGetter *gime = AliEMCALGetter::Instance(filename->Data());
118 if (fDebug > 1) Info("FillFromFile","Instantiated Getter with %s as the file",filename->Data());
119 gime->Event(EventNumber,"XH") ;
120 if (fDebug > 1) Info("FillFromFile","Got event %i with option \"XH\"",EventNumber);
122 if ( fEMCALType == kHits ||
123 fEMCALType == kTimeCut ) FillHits();
124 if ( fTrackType != kNoTracks ) FillTracks();
125 if ( fFileType != kData){
128 /* gime->EmcalLoader()->UnloadRecParticles();
129 gime->EmcalLoader()->UnloadTracks();
134 void AliEMCALJetFinderInputSimPrep::FillHits()
136 // Fill from the hits to input object from simulation
137 if (fDebug > 1) Info("FillHits","Beginning FillHits");
139 // Access hit information
141 // AliEMCAL* pEMCAL = (AliEMCAL*) gAlice->GetModule("EMCAL");
142 // Info("AliEMCALJetFinderInputSimPrep","Title of the geometry is %s",pEMCAL->GetTitle());
143 AliEMCALGeometry* geom = AliEMCALGetter::Instance()->EMCALGeometry();
144 AliEMCALGetter *gime = AliEMCALGetter::Instance();
146 // TTree *treeH = AliEMCALGetter::Instance()->TreeH();
147 // Int_t ntracks = (Int_t) treeH->GetEntries();
153 /* for (Int_t track=0; track<ntracks;track++) {
155 nbytes += treeH->GetEvent(track);*/
159 for(Int_t i =0; i < gime->Hits()->GetEntries() ;i++)
162 if (fEMCALType == kTimeCut &&
163 (mHit->GetTime()>fTimeCut) ) continue;
164 Float_t x = mHit->X(); // x-pos of hit
165 Float_t y = mHit->Y(); // y-pos
166 Float_t z = mHit->Z(); // z-pos
167 Float_t eloss = mHit->GetEnergy(); // deposited energy
169 Float_t r = TMath::Sqrt(x*x+y*y);
170 Float_t theta = TMath::ATan2(r,z);
171 Float_t eta = -TMath::Log(TMath::Tan(theta/2.));
172 Float_t phi = TMath::ATan2(y,x);
173 etH = eloss*TMath::Sin(theta);
174 if (fDebug > 10) Info("FillHits","Values of hit energy %i",Int_t(1e7*etH));
175 if (geom->TowerIndexFromEtaPhi(eta,180.0/TMath::Pi()*phi) == -1)
179 Error("FillHits","Hit not inside EMCAL!");
184 fInputObject.AddEnergyToDigit(geom->TowerIndexFromEtaPhi(eta,180.0/TMath::Pi()*phi)-1,Int_t(1e7*etH));
190 void AliEMCALJetFinderInputSimPrep::FillTracks()
192 // Fill from particles simulating a TPC to input object from simulation
194 if (fDebug > 1) Info("FillTracks","Beginning FillTracks");
196 TParticlePDG* pdgP = 0;
198 Int_t npart = (gAlice->GetHeader())->GetNprimary();
199 if (fDebug > 1) Info("FillTracks","Header says there are %i primaries",npart);
200 //AliEMCALGetter *gime = AliEMCALGetter::Instance();
201 Float_t bfield,rEMCAL;
202 /* for (Int_t i =0; i<gime->NPrimaries(); i++)
204 cout<<gime->Primary(i)->GetFirstMother()<<endl;
205 if (gime->Primary(i)->GetFirstMother() == -1) {
207 gime->Primary(i)->Dump();
211 if (fDebug > 1) Info("FillTracks","Defining the geometry");
213 AliEMCAL* pEMCAL = (AliEMCAL*) gAlice->GetModule("EMCAL");
214 AliEMCALGeometry* geom = AliEMCALGeometry::GetInstance(pEMCAL->GetTitle(), "");
215 fEtaMax = geom->GetArm1EtaMax();
216 fEtaMin = geom->GetArm1EtaMin();
217 fPhiMax = TMath::Pi()/180.0*geom->GetArm1PhiMax();
218 fPhiMin = TMath::Pi()/180.0*geom->GetArm1PhiMin();
220 if (fDebug > 1) Info("FillTracks","Starting particle loop");
222 if (fDebug > 1) Info("FillTracks","Particle loop of %i",npart);
223 for (Int_t part = 0; part < npart; part++) {
224 mPart = gAlice->GetMCApp()->Particle(part);
225 //if (part%10) gObjectTable->Print();
226 pdgP = mPart->GetPDG();
228 if (fDebug > 5) Info("FillTracks","Checking if track is a primary");
230 if (fFileType == kPythia) {
231 if (mPart->GetStatusCode() != 1) continue;
232 } else if (fFileType == kHijing) {
233 if (mPart->GetFirstDaughter() >= 0 && mPart->GetFirstDaughter() < npart) continue;
236 if (fDebug > 15) Info("FillTracks","Checking if track (eta - %f, phi - %f) is in acceptance",mPart->Eta(),mPart->Phi());
237 if (fDebug > 10) Info("FillTracks","Checking if EMCAL acceptance ( %f < eta < %f, %f < phi < %f) is in acceptance",fEtaMin,fEtaMax,fPhiMin,fPhiMax);
239 if ((!fPythiaComparison)&&(mPart->Eta() > fEtaMax || mPart->Eta() < fEtaMin)) continue;
240 if ((!fPythiaComparison)&&(mPart->Phi() > fPhiMax || mPart->Phi() < fPhiMin)) continue;
243 {kProton, kProtonBar, kElectron, kPositron,
244 kNuE, kNuEBar, kGamma, kNeutron, kNeutronBar,
245 kMuonPlus, kMuonMinus, kK0Long , kPiPlus, kPiMinus,
246 kKPlus, kKMinus, kLambda0, kLambda0Bar, kK0Short,
247 kSigmaMinus, kSigmaPlus, kSigma0, kPi0, kK0, kK0Bar,
251 if (fDebug > 15) Info("FillTracks","Checking if track is rejected");
253 if ((fSmearType == kEfficiency ||
254 fSmearType == kSmearEffic) &&
256 if (AliEMCALFast::RandomReject(fEfficiency)) {
261 bfield = gAlice->Field()->SolenoidField();
262 rEMCAL = AliEMCALGeometry::GetInstance()->GetIPDistance();
263 Float_t rB = 3335.6 * mPart->Pt() / bfield; // [cm] (case of |charge|=1)
264 if (2.*rB < rEMCAL) continue; // track curls away
266 //if (part%10) gObjectTable->Print();
270 case kAllP: // All Stable particles to be included
271 if (fDebug > 5) Info("FillTracks","Storing track");
272 if (fSmearType == kSmear ||
273 fSmearType == kSmearEffic ){
275 TParticle *tmp = Smear(MPart);
276 fInputObject.AddTrack(Smear(MPart));
279 fInputObject.AddTrack(*mPart);
282 case kEM: // All Electromagnetic particles
283 if (mPart->GetPdgCode() == kElectron ||
284 mPart->GetPdgCode() == kMuonPlus ||
285 mPart->GetPdgCode() == kMuonMinus ||
286 mPart->GetPdgCode() == kPositron ){
287 if (fDebug > 5) Info("FillTracks","Storing electron or positron");
288 if (fSmearType == kSmear ||
289 fSmearType == kSmearEffic ){
291 TParticle *tmp = Smear(MPart);
292 fInputObject.AddTrack(tmp);
295 fInputObject.AddTrack(*mPart);
298 if ( mPart->GetPdgCode() == kGamma ){
299 fInputObject.AddTrack(*mPart);
300 if (fDebug > 5) Info("FillTracks","Storing gamma");
304 case kCharged: // All Particles with non-zero charge
305 if (pdgP->Charge() != 0) {
306 if (fDebug > 5) Info("FillTracks","Storing charged track");
307 if (fSmearType == kSmear ||
308 fSmearType == kSmearEffic ){
310 TParticle *tmp = Smear(MPart);
311 fInputObject.AddTrack(tmp);
314 fInputObject.AddTrack(*mPart);
318 case kNeutral: // All particles with no charge
319 if (pdgP->Charge() == 0){
320 fInputObject.AddTrack(*mPart);
321 if (fDebug > 5) Info("FillTracks","Storing neutral");
324 case kHadron: //All hadrons
325 if (mPart->GetPdgCode() != kElectron &&
326 mPart->GetPdgCode() != kPositron &&
327 mPart->GetPdgCode() != kMuonPlus &&
328 mPart->GetPdgCode() != kMuonMinus &&
329 mPart->GetPdgCode() != kGamma )
331 if (fDebug > 5) Info("FillTracks","Storing hadron");
332 if (pdgP->Charge() == 0){
333 fInputObject.AddTrack(*mPart);
335 if (fSmearType == kSmear ||
336 fSmearType == kSmearEffic ){
338 TParticle *tmp = Smear(MPart);
339 fInputObject.AddTrack(tmp);
342 fInputObject.AddTrack(*mPart);
347 case kChargedHadron: // only charged hadrons
348 if (mPart->GetPdgCode() != kElectron &&
349 mPart->GetPdgCode() != kPositron &&
350 mPart->GetPdgCode() != kGamma &&
351 mPart->GetPdgCode() != kMuonPlus &&
352 mPart->GetPdgCode() != kMuonMinus &&
353 pdgP->Charge() != 0 ){
354 if (fDebug > 5) Info("FillTracks","Storing charged hadron");
355 if (fSmearType == kSmear ||
356 fSmearType == kSmearEffic ){
358 TParticle *tmp = Smear(MPart);
359 fInputObject.AddTrack(tmp);
362 fInputObject.AddTrack(*mPart);
369 if (pdgP->Charge() != 0 || mPart->GetPdgCode() == kPi0 ||
370 mPart->GetPdgCode() == kGamma )
372 if (fDebug > 5) Info("FillTracks","Storing charged track");
373 if (fSmearType == kSmear ||
374 fSmearType == kSmearEffic ){
376 TParticle *tmp = Smear(MPart);
377 fInputObject.AddTrack(tmp);
380 fInputObject.AddTrack(*mPart);
384 case kNoNeutronNeutrinoKlong:
385 if ( mPart->GetPdgCode() != kNeutron &&
386 mPart->GetPdgCode() != kNeutronBar &&
387 mPart->GetPdgCode() != kK0Long &&
388 mPart->GetPdgCode() != kNuE &&
389 mPart->GetPdgCode() != kNuEBar &&
390 mPart->GetPdgCode() != kNuMu &&
391 mPart->GetPdgCode() != kNuMuBar &&
392 mPart->GetPdgCode() != kNuTau &&
393 mPart->GetPdgCode() != kNuTauBar )
395 if (fDebug > 5) Info("FillTracks","Storing charged track");
396 if (fSmearType == kSmear ||
397 fSmearType == kSmearEffic ){
399 TParticle *tmp = Smear(MPart);
400 fInputObject.AddTrack(tmp);
403 fInputObject.AddTrack(*mPart);
411 // Info("FillTracks","After Particle Storage");
412 //if (part%10) gObjectTable->Print();
414 } //end of particle loop
415 //gObjectTable->Print();
418 void AliEMCALJetFinderInputSimPrep::FillPartons()
421 // input object from simulation
422 if (fDebug > 1) Info("FillPartons","Beginning FillPartons");
424 AliGenEventHeader* evHeader = ((AliHeader*)(gAlice->GetHeader()))->GenEventHeader();
425 Float_t triggerJetValues[4];
426 AliEMCALParton tempParton;
428 if (fFileType == kPythia)
430 Int_t ntriggerjets = ((AliGenPythiaEventHeader*)evHeader)->NTriggerJets();
431 if (fDebug > 1) Info("FillPartons","Number of trigger jets --> %i",ntriggerjets);
432 for (Int_t jetcounter = 0 ; jetcounter < ntriggerjets; jetcounter++){
433 ((AliGenPythiaEventHeader*)evHeader)->TriggerJet(jetcounter,triggerJetValues);
434 TLorentzVector tempLParton;
435 tempLParton.SetPxPyPzE(triggerJetValues[0],triggerJetValues[1],triggerJetValues[2],triggerJetValues[3]);
436 tempParton.SetEnergy(tempLParton.Energy());
437 tempParton.SetEta(tempLParton.Eta());
438 tempParton.SetPhi(tempLParton.Phi());
439 FillPartonTracks(&tempParton);
440 fInputObject.AddParton(&tempParton);
446 void AliEMCALJetFinderInputSimPrep::FillParticles()
448 // Fill particles to input object from simulation
449 if (fDebug > 1) Info("FillParticles","Beginning FillParticles");
451 Int_t npart = (gAlice->GetHeader())->GetNprimary();
452 TParticlePDG* pdgP = 0;
454 for (Int_t part = 0; part < npart; part++) {
455 TParticle *mPart = gAlice->GetMCApp()->Particle(part);
456 pdgP = mPart->GetPDG();
458 if (fDebug > 10) Info("FillParticles","Checking if particle is a primary");
460 if (fFileType == kPythia) {
461 if (mPart->GetStatusCode() != 1) continue;
462 } else if (fFileType == kHijing) {
463 if (mPart->GetFirstDaughter() >= 0 && mPart->GetFirstDaughter() < npart) continue;
466 if (fDebug > 10) Info("FillParticles","Checking if particle is in acceptance");
468 if ((!fPythiaComparison)&&(mPart->Eta() > fEtaMax || mPart->Eta() < fEtaMin)) continue;
469 if ((!fPythiaComparison)&&(mPart->Phi() > fPhiMax || mPart->Phi() < fPhiMin)) continue;
473 {kProton, kProtonBar, kElectron, kPositron,
474 kNuE, kNuEBar, kGamma, kNeutron, kNeutronBar,
475 kMuonPlus, kMuonMinus, kK0Long , kPiPlus, kPiMinus,
476 kKPlus, kKMinus, kLambda0, kLambda0Bar, kK0Short,
477 kSigmaMinus, kSigmaPlus, kSigma0, kPi0, kK0, kK0Bar,
483 case kAllP: // All Stable particles to be included
484 if (fDebug > 5) Info("FillParticles","Storing particle");
485 fInputObject.AddParticle(mPart);
487 case kEM: // All Electromagnetic particles
488 if (mPart->GetPdgCode() == kElectron ||
489 mPart->GetPdgCode() == kPositron ||
490 mPart->GetPdgCode() == kGamma){
491 if (fDebug > 5) Info("FillParticles","Storing electromagnetic particle");
492 fInputObject.AddParticle(mPart);
495 case kCharged: // All Particles with non-zero charge
496 if (pdgP->Charge() != 0) {
497 if (fDebug > 5) Info("FillParticles","Storing charged particle");
498 fInputObject.AddParticle(mPart);
501 case kNeutral: // All particles with no charge
502 if (pdgP->Charge() == 0){
503 if (fDebug > 5) Info("FillParticles","Storing neutral particle");
504 fInputObject.AddParticle(mPart);
507 case kHadron: //All hadrons
508 if (mPart->GetPdgCode() != kElectron &&
509 mPart->GetPdgCode() != kPositron &&
510 mPart->GetPdgCode() != kGamma )
513 if (fDebug > 5) Info("FillParticles","Storing hadron");
514 fInputObject.AddParticle(mPart);
517 case kChargedHadron: // only charged hadrons
518 if (mPart->GetPdgCode() != kElectron &&
519 mPart->GetPdgCode() != kPositron &&
520 mPart->GetPdgCode() != kGamma &&
521 pdgP->Charge() != 0 ){
522 if (fDebug > 5) Info("FillParticles","Storing charged hadron");
523 fInputObject.AddParticle(mPart);
529 if (pdgP->Charge() != 0 || mPart->GetPdgCode() == kPi0 ||
530 mPart->GetPdgCode() == kGamma )
532 if (fDebug > 5) Info("FillTracks","Storing kEMChargedPi0 track");
533 if (fSmearType == kSmear ||
534 fSmearType == kSmearEffic ){
536 TParticle *tmp = Smear(MPart);
537 fInputObject.AddTrack(tmp);
540 fInputObject.AddTrack(*mPart);
544 case kNoNeutronNeutrinoKlong:
545 if ( mPart->GetPdgCode() != kNeutron &&
546 mPart->GetPdgCode() != kNeutronBar &&
547 mPart->GetPdgCode() != kK0Long &&
548 mPart->GetPdgCode() != kNuE &&
549 mPart->GetPdgCode() != kNuEBar &&
550 mPart->GetPdgCode() != kNuMu &&
551 mPart->GetPdgCode() != kNuMuBar &&
552 mPart->GetPdgCode() != kNuTau &&
553 mPart->GetPdgCode() != kNuTauBar )
555 if (fDebug > 5) Info("FillTracks","Storing kNoNeutronNeutrinoKlong track");
556 if (fSmearType == kSmear ||
557 fSmearType == kSmearEffic ){
559 TParticle *tmp = Smear(MPart);
560 fInputObject.AddTrack(tmp);
563 fInputObject.AddTrack(*mPart);
570 }// end of loop over particles
573 void AliEMCALJetFinderInputSimPrep::FillDigits()
575 // Fill digits to input object
579 void AliEMCALJetFinderInputSimPrep::Smear(TParticle *particle)
581 // Smear particle momentum
582 if (fDebug > 5) Info("Smear","Beginning Smear");
584 Float_t tmp = AliEMCALFast::SmearMomentum(1,particle->P());
585 Float_t tmpt = (tmp/particle->P()) * particle->Pt();
586 if (fDebug > 10) Info("Smear","Smearing changed P from %f to %f",particle->Pt(),tmpt);
587 TLorentzVector tmpvector;
588 tmpvector.SetPtEtaPhiM(tmpt,particle->Eta(), particle->Phi(), particle->GetMass());
589 // create a new particle with smearing momentum - and no daughter or parent information and the same
592 TParticle tmparticle(particle->GetPdgCode(), 1, 0, 0,0,0,
593 tmpvector.Px() , tmpvector.Py(), tmpvector.Pz(), tmpvector.Energy(),
594 particle->Vx(), particle->Vy(), particle->Vz(), particle->T());
595 fInputObject.AddTrack(tmparticle);
599 void AliEMCALJetFinderInputSimPrep::FillPartonTracks(AliEMCALParton *parton)
601 // Populate parton tracks for input distributions
602 if (fDebug>1) Info("FillPartonTracks","Beginning FillPartonTracks");
603 Int_t npart = (gAlice->GetHeader())->GetNprimary();
605 TParticlePDG *getpdg;
607 for (Int_t part = 0; part < npart; part++)
609 tempPart = gAlice->GetMCApp()->Particle(part);
610 if (tempPart->GetStatusCode() != 1) continue;
611 if ((!fPythiaComparison)&&(tempPart->Eta() > fEtaMax || tempPart->Eta() < fEtaMin ||
612 tempPart->Phi() > fPhiMax || tempPart->Phi() < fPhiMin) ){
613 if (fDebug>10) Info("FillPartonTracks","Excluding particle not pointing at the EMCAL");
616 getpdg = tempPart->GetPDG();
617 if (getpdg->Charge() == 0.0 ) {
618 if (fDebug>10) Info("FillPartonTracks","Excluding a neutral particle");
621 if ( (parton->Eta() - tempPart->Eta())*(parton->Eta() - tempPart->Eta()) +
622 (parton->Phi() - tempPart->Phi())*(parton->Phi() - tempPart->Phi()) < 1.0 ) ntracks++;
624 Float_t *energy = new Float_t[ntracks];
625 Float_t *eta = new Float_t[ntracks];
626 Float_t *phi = new Float_t[ntracks];
627 Int_t *pdg = new Int_t[ntracks];
629 for (Int_t part = 0; part < npart; part++)
631 tempPart = gAlice->GetMCApp()->Particle(part);
632 if (tempPart->GetStatusCode() != 1) continue;
633 if ((!fPythiaComparison)&&(tempPart->Eta() > fEtaMax || tempPart->Eta() < fEtaMin ||
634 tempPart->Phi() > fPhiMax || tempPart->Phi() < fPhiMin) ){
635 if (fDebug>10) Info("FillPartonTracks","Excluding particle not pointing at the EMCAL");
638 if (tempPart->GetStatusCode() != 1) continue;
639 getpdg = tempPart->GetPDG();
640 if (getpdg->Charge() == 0.0 ) {
641 if (fDebug>10) Info("FillPartonTracks","Excluding a neutral particle");
644 if ( (parton->Eta() - tempPart->Eta())*(parton->Eta() - tempPart->Eta()) +
645 (parton->Phi() - tempPart->Phi())*(parton->Phi() - tempPart->Phi()) < 1.0 )
647 energy[ntracks] = tempPart->Pt();
648 eta[ntracks] = tempPart->Eta();
649 phi[ntracks] = tempPart->Phi();
650 pdg[ntracks] = tempPart->GetPdgCode();
654 parton->SetTrackList(ntracks,energy,eta,phi,pdg);