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 **************************************************************************/
16 //-------------------------------------------------------------------------
18 // AOD reader for jet analysis
19 // This is the reader which must be used if the jet analysis task
20 // is executed after the ESD filter task, in order to read its output
22 // Author: Davide Perrino <davide.perrino@cern.ch>
23 //-------------------------------------------------------------------------
26 #include <Riostream.h>
28 #include <TLorentzVector.h>
33 #include <TGeoManager.h>
35 #include "AliJetAODReader.h"
36 #include "AliJetAODReaderHeader.h"
37 #include "AliAODEvent.h"
38 #include "AliAODTrack.h"
39 #include "AliAODMCParticle.h"
40 #include "AliJetDummyGeo.h"
41 #include "AliJetAODFillUnitArrayTracks.h"
42 #include "AliJetAODFillUnitArrayEMCalDigits.h"
43 #include "AliJetHadronCorrectionv1.h"
44 #include "AliJetUnitArray.h"
46 ClassImp(AliJetAODReader)
48 AliJetAODReader::AliJetAODReader():
63 fApplyElectronCorrection(kFALSE),
64 fApplyMIPCorrection(kTRUE),
65 fApplyFractionHadronicCorrection(kFALSE),
66 fFractionHadronicCorrection(0.3),
80 //____________________________________________________________________________
82 AliJetAODReader::~AliJetAODReader()
100 //____________________________________________________________________________
102 void AliJetAODReader::OpenInputFiles()
104 // Open the necessary input files
105 // chain for the AODs
106 fChain = new TChain("aodTree");
108 // get directory and pattern name from the header
109 const char* dirName=fReaderHeader->GetDirectory();
110 const char* pattern=fReaderHeader->GetPattern();
112 // // Add files matching patters to the chain
114 void *dir = gSystem->OpenDirectory(dirName);
115 const char *name = 0x0;
116 int naod = ((AliJetAODReaderHeader*) fReaderHeader)->GetNaod();
118 while ((name = gSystem->GetDirEntry(dir))){
119 if (a>=naod) continue;
121 if (strstr(name,pattern)){
122 fChain->AddFile(Form("%s/%s/aod.root",dirName,name));
127 gSystem->FreeDirectory(dir);
130 fChain->SetBranchAddress("AOD",&fAOD);
132 int nMax = fChain->GetEntries();
134 printf("\n AliJetAODReader: Total number of events in chain= %d \n",nMax);
136 // set number of events in header
137 if (fReaderHeader->GetLastEvent() == -1)
138 fReaderHeader->SetLastEvent(nMax);
140 Int_t nUsr = fReaderHeader->GetLastEvent();
141 fReaderHeader->SetLastEvent(TMath::Min(nMax,nUsr));
145 //____________________________________________________________________________
147 void AliJetAODReader::ConnectTree(TTree* tree, TObject* /*data*/) {
149 // For AOD reader it's needed only to set the number of events
150 fChain = (TChain*) tree;
152 Int_t nMax = fChain->GetEntries();
153 printf("\n AliJetAODReader: Total number of events in chain= %5d \n", nMax);
154 // set number of events in header
155 if (fReaderHeader->GetLastEvent() == -1)
156 fReaderHeader->SetLastEvent(nMax);
158 Int_t nUsr = fReaderHeader->GetLastEvent();
159 fReaderHeader->SetLastEvent(TMath::Min(nMax,nUsr));
164 Bool_t AliJetAODReader::AcceptAODMCParticle(AliAODMCParticle *mcP,Short_t flag){
167 // filter for charge and for charged and neutral, no detector
169 // physical priamries already selected
171 Int_t pdg = TMath::Abs(mcP->GetPdgCode());
173 // exclude neutrinos anyway
174 if((pdg == 12 || pdg == 14 || pdg == 16)) return kFALSE;
176 if(flag==AliJetAODReaderHeader::kAllMC)return kTRUE;
177 if(flag==AliJetAODReaderHeader::kChargedMC){
178 if(mcP->Charge()==0)return kFALSE;
187 Bool_t AliJetAODReader::FillMomentumArrayMC(){
190 // This routine fetches the MC particles from the AOD
191 // Depending on the flag all particles except neurinos are use
192 // or only charged particles
195 TClonesArray *mcArray = (TClonesArray*)fAOD->FindListObject(AliAODMCParticle::StdBranchName());
197 Printf("%s:%d No MC particle branch found",(char*)__FILE__,__LINE__);
201 Int_t nMC = mcArray->GetEntriesFast();
203 // get number of tracks in event (for the loop)
204 if(fDebug>0)printf("AOD MC tracks: %5d \t", nMC);
206 // temporary storage of signal and pt cut flag
207 Int_t* sflag = new Int_t[nMC];
208 Int_t* cflag = new Int_t[nMC];
210 // get cuts set by user
211 Float_t ptMin = fReaderHeader->GetPtCut();
212 Float_t etaMin = fReaderHeader->GetFiducialEtaMin();
213 Float_t etaMax = fReaderHeader->GetFiducialEtaMax();
218 Short_t readerFlag = ((AliJetAODReaderHeader*)fReaderHeader)->GetReadAODMC();
221 for (Int_t it = 0; it < nMC; it++) {
222 AliAODMCParticle *track = (AliAODMCParticle*)mcArray->At(it);
223 if(!track->IsPhysicalPrimary())continue;
225 p3.SetXYZ(track->Px(),track->Py(),track->Pz());
227 if ( (eta > etaMax) || (eta < etaMin)) continue; // checking eta cut
228 if(!AcceptAODMCParticle(track,readerFlag))continue;
235 fRef->Delete(); // make sure to delete before placement new...
236 new(fRef) TRefArray(TProcessID::GetProcessWithUID(track));
238 new ((*fMomentumArray)[mcTrack]) TLorentzVector(p3,p3.Mag());
240 cflag[mcTrack] = ( pt > ptMin ) ? 1: 0;
244 if(fDebug>0)printf("Used MC tracks: %5d \n", mcTrack);
245 // set the signal flags
246 fSignalFlag.Set(mcTrack,sflag);
247 fCutFlag.Set(mcTrack,cflag);
255 //____________________________________________________________________________
257 Bool_t AliJetAODReader::FillMomentumArray()
259 // Clear momentum array
262 fDebug = fReaderHeader->GetDebug();
268 // get cuts set by user
269 Float_t ptMin = fReaderHeader->GetPtCut();
270 Float_t etaMin = fReaderHeader->GetFiducialEtaMin();
271 Float_t etaMax = fReaderHeader->GetFiducialEtaMax();
272 UInt_t filterMask = ((AliJetAODReaderHeader*)fReaderHeader)->GetTestFilterMask();
274 // ----- number of tracks -----
275 Int_t nTracksStd = 0;
276 Short_t mcReaderFlag = ((AliJetAODReaderHeader*)fReaderHeader)->GetReadAODMC();
277 TClonesArray *mcArray = 0x0;
278 // check if we have to read from MC branch
279 if (((AliJetAODReaderHeader*)fReaderHeader)->GetReadStdBranch()) {
281 mcArray = (TClonesArray*)fAOD->FindListObject(AliAODMCParticle::StdBranchName());
283 Printf("%s:%d No MC particle branch found",(char*)__FILE__,__LINE__);
285 nTracksStd = mcArray->GetEntriesFast();
288 nTracksStd = fAOD->GetNTracks();
289 // printf("no. of standard tracks: %i\n", nTracksStd);
292 Int_t nTracksNonStd = 0;
293 TClonesArray *nonStdTracks = 0x0;
294 if (((AliJetAODReaderHeader*)fReaderHeader)->GetReadNonStdBranch()) {
296 (TClonesArray*) fAOD->FindListObject(((AliJetAODReaderHeader*)fReaderHeader)->GetNonStdBranch());
298 nTracksNonStd = nonStdTracks->GetEntries();
299 // printf("no. of non-standard tracks: %i\n", nTracksNonStd);
301 Int_t nTracks = nTracksStd + nTracksNonStd;
303 // temporary storage of signal and pt cut flag
304 Int_t* sflag = new Int_t[nTracks];
305 Int_t* cflag = new Int_t[nTracks];
312 // ----- looping over standard branch -----
314 for (Int_t iTrack = 0; iTrack < nTracksStd; iTrack++) {
315 AliAODMCParticle *track = (AliAODMCParticle*)mcArray->At(iTrack);
316 if(!track->IsPhysicalPrimary())continue;
318 p3.SetXYZ(track->Px(),track->Py(),track->Pz());
320 if ( (eta > etaMax) || (eta < etaMin)) continue; // checking eta cut
321 if(!AcceptAODMCParticle(track,mcReaderFlag))continue;
325 fRef->Delete(); // make sure to delete before placement new...
326 new(fRef) TRefArray(TProcessID::GetProcessWithUID(track));
328 new ((*fMomentumArray)[aodTrack]) TLorentzVector(p3,p3.Mag());
330 cflag[aodTrack] = ( pt > ptMin ) ? 1: 0;
336 for (Int_t iTrack = 0; iTrack < nTracksStd; iTrack++) {
337 AliAODTrack *track = fAOD->GetTrack(iTrack);
338 UInt_t status = track->GetStatus();
340 Double_t mom[3] = {track->Px(),track->Py(),track->Pz()};
341 p3.SetXYZ(mom[0],mom[1],mom[2]);
344 if (status == 0) continue;
345 if((filterMask>0)&&!(track->TestFilterBit(filterMask)))continue;
346 if ( (eta > etaMax) || (eta < etaMin)) continue; // checking eta cut
349 fRef->Delete(); // make sure to delete before placement new...
350 new(fRef) TRefArray(TProcessID::GetProcessWithUID(track));
352 new ((*fMomentumArray)[aodTrack]) TLorentzVector(p3,p3.Mag());
353 sflag[aodTrack] = (TMath::Abs(track->GetLabel()) < 10000) ? 1 : 0;
354 cflag[aodTrack] = ( pt > ptMin ) ? 1: 0;
360 // ----- reading of non-standard branch -----
361 for (Int_t iTrack = 0; iTrack < nTracksNonStd; iTrack++) {
362 AliVParticle *track = dynamic_cast<AliVParticle*> ((*nonStdTracks)[iTrack]);
366 Double_t mom[3] = {track->Px(),track->Py(),track->Pz()};
367 p3.SetXYZ(mom[0],mom[1],mom[2]);
371 // which cuts to apply if not AOD track (e.g. MC) ???
372 AliAODTrack *trackAOD = dynamic_cast<AliAODTrack*> (track);
374 if (trackAOD->GetStatus() == 0)
376 if ((filterMask > 0) && !(trackAOD->TestFilterBit(filterMask)))
379 if ((eta > etaMax) || (eta < etaMin)) continue; // checking eta cut
382 fRef->Delete(); // make sure to delete before placement new...
383 new(fRef) TRefArray(TProcessID::GetProcessWithUID(track));
385 new ((*fMomentumArray)[aodTrack]) TLorentzVector(p3,p3.Mag());
386 sflag[aodTrack] = (TMath::Abs(track->GetLabel()) < 10000) ? 1 : 0;
387 cflag[aodTrack] = ( pt > ptMin ) ? 1 : 0;
390 // printf("added non-standard track\n");
393 // set the signal flags
394 fSignalFlag.Set(aodTrack,sflag);
395 fCutFlag.Set(aodTrack,cflag);
403 //__________________________________________________________
404 void AliJetAODReader::SetApplyMIPCorrection(Bool_t val)
407 // Set flag to apply MIP correction fApplyMIPCorrection
408 // - exclusive with fApplyFractionHadronicCorrection
411 fApplyMIPCorrection = val;
412 if(fApplyMIPCorrection == kTRUE)
414 SetApplyFractionHadronicCorrection(kFALSE);
415 printf("Enabling MIP Correction \n");
419 printf("Disabling MIP Correction \n");
423 //__________________________________________________________
424 void AliJetAODReader::SetApplyFractionHadronicCorrection(Bool_t val)
427 // Set flag to apply EMC hadronic correction fApplyFractionHadronicCorrection
428 // - exclusive with fApplyMIPCorrection
431 fApplyFractionHadronicCorrection = val;
432 if(fApplyFractionHadronicCorrection == kTRUE)
434 SetApplyMIPCorrection(kFALSE);
435 printf("Enabling Fraction Hadronic Correction \n");
439 printf("Disabling Fraction Hadronic Correction \n");
443 //__________________________________________________________
444 void AliJetAODReader::SetFractionHadronicCorrection(Double_t val)
447 // Set value to fFractionHadronicCorrection (default is 0.3)
448 // apply EMC hadronic correction fApplyFractionHadronicCorrection
449 // - exclusive with fApplyMIPCorrection
452 fFractionHadronicCorrection = val;
453 if(fFractionHadronicCorrection > 0.0 && fFractionHadronicCorrection <= 1.0)
455 SetApplyFractionHadronicCorrection(kTRUE);
456 printf("Fraction Hadronic Correction %1.3f \n",fFractionHadronicCorrection);
460 SetApplyFractionHadronicCorrection(kFALSE);
464 //____________________________________________________________________________
465 void AliJetAODReader::CreateTasks(TChain* tree)
468 // For reader task initialization
471 fDebug = fReaderHeader->GetDebug();
472 fDZ = fReaderHeader->GetDZ();
475 // Init EMCAL geometry and create UnitArray object
477 // cout << "In create task" << endl;
481 fFillUnitArray = new TTask("fFillUnitArray","Fill unit array jet finder");
482 fFillUAFromTracks = new AliJetAODFillUnitArrayTracks();
483 fFillUAFromTracks->SetReaderHeader(fReaderHeader);
484 fFillUAFromTracks->SetGeom(fGeom);
485 fFillUAFromTracks->SetTPCGrid(fTpcGrid);
486 fFillUAFromTracks->SetEMCalGrid(fEmcalGrid);
490 fFillUAFromTracks->SetGrid0(fGrid0);
491 fFillUAFromTracks->SetGrid1(fGrid1);
492 fFillUAFromTracks->SetGrid2(fGrid2);
493 fFillUAFromTracks->SetGrid3(fGrid3);
494 fFillUAFromTracks->SetGrid4(fGrid4);
496 fFillUAFromTracks->SetApplyMIPCorrection(fApplyMIPCorrection);
497 fFillUAFromTracks->SetHadCorrector(fHadCorr);
498 fFillUAFromEMCalDigits = new AliJetAODFillUnitArrayEMCalDigits();
499 fFillUAFromEMCalDigits->SetReaderHeader(fReaderHeader);
500 fFillUAFromEMCalDigits->SetGeom(fGeom);
501 fFillUAFromEMCalDigits->SetTPCGrid(fTpcGrid);
502 fFillUAFromEMCalDigits->SetEMCalGrid(fEmcalGrid);
503 fFillUAFromEMCalDigits->SetApplyFractionHadronicCorrection(fApplyFractionHadronicCorrection);
504 fFillUAFromEMCalDigits->SetFractionHadronicCorrection(fFractionHadronicCorrection);
505 fFillUAFromEMCalDigits->SetApplyElectronCorrection(fApplyElectronCorrection);
506 // Add the task to global task
507 fFillUnitArray->Add(fFillUAFromTracks);
508 fFillUnitArray->Add(fFillUAFromEMCalDigits);
509 fFillUAFromTracks->SetActive(kFALSE);
510 fFillUAFromEMCalDigits->SetActive(kFALSE);
512 cout << "Tasks instantiated at that stage ! " << endl;
513 cout << "You can loop over events now ! " << endl;
517 //____________________________________________________________________________
518 Bool_t AliJetAODReader::ExecTasks(Bool_t procid, TRefArray* refArray)
522 // Fill the reader part
526 fRefArray = refArray;
527 //(not used ?) Int_t nEntRef = fRefArray->GetEntries();
528 //(not used ?) Int_t nEntUnit = fUnitArray->GetEntries();
530 // clear momentum array
534 fDebug = fReaderHeader->GetDebug();
535 fOpt = fReaderHeader->GetDetector();
541 // TPC only or Digits+TPC or Clusters+TPC
542 if(fOpt%2==!0 && fOpt!=0){
543 fFillUAFromTracks->SetAOD(fAOD);
544 fFillUAFromTracks->SetActive(kTRUE);
545 fFillUAFromTracks->SetUnitArray(fUnitArray);
546 fFillUAFromTracks->SetRefArray(fRefArray);
547 fFillUAFromTracks->SetReferences(fRef);
548 fFillUAFromTracks->SetSignalFlag(fSignalFlag);
549 fFillUAFromTracks->SetCutFlag(fCutFlag);
550 fFillUAFromTracks->SetProcId(fProcId);
551 // fFillUAFromTracks->ExecuteTask("tpc"); // => Temporarily changed
552 fFillUAFromTracks->Exec("tpc");
554 fNumCandidate = fFillUAFromTracks->GetMult();
555 fNumCandidateCut = fFillUAFromTracks->GetMultCut();
557 fSignalFlag = fFillUAFromTracks->GetSignalFlag();
558 fCutFlag = fFillUAFromTracks->GetCutFlag();
561 // Digits only or Digits+TPC
562 if(fOpt>=2 && fOpt<=3){
563 fFillUAFromEMCalDigits->SetAOD(fAOD);
564 fFillUAFromEMCalDigits->SetActive(kTRUE);
565 fFillUAFromEMCalDigits->SetUnitArray(fUnitArray);
566 fFillUAFromEMCalDigits->SetRefArray(fRefArray);
567 fFillUAFromEMCalDigits->SetProcId(fFillUAFromTracks->GetProcId());
568 fFillUAFromEMCalDigits->SetInitMult(fFillUAFromTracks->GetMult());
569 fFillUAFromEMCalDigits->SetInitMultCut(fFillUAFromTracks->GetMultCut());
570 fFillUAFromEMCalDigits->Exec("digits"); // => Temporarily added
571 fNumCandidate = fFillUAFromEMCalDigits->GetMult();
572 fNumCandidateCut = fFillUAFromEMCalDigits->GetMultCut();
575 // fFillUnitArray->ExecuteTask(); // => Temporarily commented
580 //____________________________________________________________________________
581 Bool_t AliJetAODReader::SetEMCALGeometry()
584 // Set the EMCal Geometry
587 if (!fTree->GetFile())
590 TString geomFile(fTree->GetFile()->GetName());
591 geomFile.ReplaceAll("AliESDs", "geometry");
593 // temporary workaround for PROOF bug #18505
594 geomFile.ReplaceAll("#geometry.root#geometry.root", "#geometry.root");
595 if(fDebug>1) printf("Current geometry file %s \n", geomFile.Data());
597 // Define EMCAL geometry to be able to read ESDs
598 fGeom = AliJetDummyGeo::GetInstance();
600 fGeom = AliJetDummyGeo::GetInstance("EMCAL_COMPLETE","EMCAL");
602 // To be setted to run some AliEMCALGeometry functions
603 TGeoManager::Import(geomFile);
604 fGeom->GetTransformationForSM();
605 printf("\n EMCal Geometry set ! \n");
611 //____________________________________________________________________________
612 void AliJetAODReader::InitParameters()
614 // Initialise parameters
615 fOpt = fReaderHeader->GetDetector();
616 fNumUnits = fGeom->GetNCells(); // Number of cells in EMCAL
617 if(fDebug>1) printf("\n EMCal parameters initiated ! \n");
620 //____________________________________________________________________________
621 void AliJetAODReader::InitUnitArray()
623 //Initialises unit arrays
624 Int_t nElements = fTpcGrid->GetNEntries();
625 Float_t eta = 0., phi = 0., deltaEta = 0., deltaPhi = 0.;
626 if(fArrayInitialised) fUnitArray->Delete();
628 if(fTpcGrid->GetGridType()==0)
629 { // Fill the following quantities :
630 // Good track ID, (Eta,Phi) position ID, eta, phi, energy, px, py, pz, deltaEta, deltaPhi,
631 // detector flag, in/out jet, pt cut, mass, cluster ID)
632 for(Int_t nBin = 1; nBin < nElements+1; nBin++)
634 // fTpcGrid->GetEtaPhiFromIndex2(nBin,eta,phi);
635 fTpcGrid->GetEtaPhiFromIndex2(nBin,phi,eta);
636 phi = ((phi < 0) ? phi + 2. * TMath::Pi() : phi);
637 deltaEta = fTpcGrid->GetDeta();
638 deltaPhi = fTpcGrid->GetDphi();
639 new ((*fUnitArray)[nBin-1]) AliJetUnitArray(nBin-1,0,eta,phi,0.,deltaEta,deltaPhi,kTpc,kOutJet,kPtSmaller,kPtSmaller,kBad,0.,-1);
643 if(fTpcGrid->GetGridType()==1)
646 Int_t n0 = 0, n1 = 0, n2 = 0, n3 = 0, n4 = 0;
650 // Define a grid of cell for the gaps between SM
651 Double_t phimin0 = 0., phimin1 = 0., phimin2 = 0., phimin3 = 0., phimin4 = 0.;
652 Double_t phimax0 = 0., phimax1 = 0., phimax2 = 0., phimax3 = 0., phimax4 = 0.;
653 fGeom->GetPhiBoundariesOfSMGap(0,phimin0,phimax0);
654 fGrid0 = new AliJetGrid(0,95,phimin0,phimax0,-0.7,0.7); // 0.015 x 0.015
655 fGrid0->SetGridType(0);
656 fGrid0->SetMatrixIndexes();
657 fGrid0->SetIndexIJ();
658 n0 = fGrid0->GetNEntries();
659 fGeom->GetPhiBoundariesOfSMGap(1,phimin1,phimax1);
660 fGrid1 = new AliJetGrid(0,95,phimin1,phimax1,-0.7,0.7); // 0.015 x 0.015
661 fGrid1->SetGridType(0);
662 fGrid1->SetMatrixIndexes();
663 fGrid1->SetIndexIJ();
664 n1 = fGrid1->GetNEntries();
665 fGeom->GetPhiBoundariesOfSMGap(2,phimin2,phimax2);
666 fGrid2 = new AliJetGrid(0,95,phimin2,phimax2,-0.7,0.7); // 0.015 x 0.015
667 fGrid2->SetGridType(0);
668 fGrid2->SetMatrixIndexes();
669 fGrid2->SetIndexIJ();
670 n2 = fGrid2->GetNEntries();
671 fGeom->GetPhiBoundariesOfSMGap(3,phimin3,phimax3);
672 fGrid3 = new AliJetGrid(0,95,phimin3,phimax3,-0.7,0.7); // 0.015 x 0.015
673 fGrid3->SetGridType(0);
674 fGrid3->SetMatrixIndexes();
675 fGrid3->SetIndexIJ();
676 n3 = fGrid3->GetNEntries();
677 fGeom->GetPhiBoundariesOfSMGap(4,phimin4,phimax4);
678 fGrid4 = new AliJetGrid(0,95,phimin4,phimax4,-0.7,0.7); // 0.015 x 0.015
679 fGrid4->SetGridType(0);
680 fGrid4->SetMatrixIndexes();
681 fGrid4->SetIndexIJ();
682 n4 = fGrid4->GetNEntries();
684 nGaps = n0+n1+n2+n3+n4;
688 for(Int_t nBin = 0; nBin < fNumUnits+nElements+nGaps; nBin++)
692 fGeom->EtaPhiFromIndex(nBin, eta, phi); // From EMCal geometry
693 // fEmcalGrid->GetEtaPhiFromIndex2(nBin,phi,eta); // My function from Grid
694 phi = ((phi < 0) ? phi + 2. * TMath::Pi() : phi);
695 deltaEta = fEmcalGrid->GetDeta(); // Modify with the exact detector values
696 deltaPhi = fEmcalGrid->GetDphi(); // Modify with the exact detector values
697 new ((*fUnitArray)[nBin]) AliJetUnitArray(nBin,0,eta,phi,0.,deltaEta,deltaPhi,kTpc,kOutJet,kPtSmaller,kPtSmaller,kBad,0.,-1);
700 if(nBin>=fNumUnits && nBin<fNumUnits+nElements){
701 fTpcGrid->GetEtaPhiFromIndex2(nBin+1-fNumUnits,phi,eta);
702 phi = ((phi < 0) ? phi + 2. * TMath::Pi() : phi);
703 deltaEta = fTpcGrid->GetDeta();
704 deltaPhi = fTpcGrid->GetDphi();
705 new ((*fUnitArray)[nBin]) AliJetUnitArray(nBin,0,eta,phi,0.,deltaEta,deltaPhi,kTpc,kOutJet,kPtSmaller,kPtSmaller,kBad,0.,-1);
709 if(nBin>=fNumUnits+nElements && nBin<fNumUnits+nElements+nGaps){
710 if(nBin<fNumUnits+nElements+n0)
713 fGrid0->GetEtaPhiFromIndex2(nBin+1-(fNumUnits+nElements),phi,eta);
714 deltaEta = fGrid0->GetDeta();
715 deltaPhi = fGrid0->GetDphi();
716 new ((*fUnitArray)[nBin]) AliJetUnitArray(nBin,0,eta,phi,0.,deltaEta,deltaPhi,kTpc,kOutJet,kPtSmaller,kPtSmaller,kBad,0.,-1);
718 else if(nBin>=fNumUnits+nElements+n0 && nBin<fNumUnits+nElements+n0+n1)
721 fGrid1->GetEtaPhiFromIndex2(nBin+1-(fNumUnits+nElements+n0),phi,eta);
722 deltaEta = fGrid1->GetDeta();
723 deltaPhi = fGrid1->GetDphi();
724 new ((*fUnitArray)[nBin]) AliJetUnitArray(nBin,0,eta,phi,0.,deltaEta,deltaPhi,kTpc,kOutJet,kPtSmaller,kPtSmaller,kBad,0.,-1);
726 else if(nBin>=fNumUnits+nElements+n0+n1 && nBin<fNumUnits+nElements+n0+n1+n2)
729 fGrid2->GetEtaPhiFromIndex2(nBin+1-(fNumUnits+nElements+n0+n1),phi,eta);
730 deltaEta = fGrid2->GetDeta();
731 deltaPhi = fGrid2->GetDphi();
732 new ((*fUnitArray)[nBin]) AliJetUnitArray(nBin,0,eta,phi,0.,deltaEta,deltaPhi,kTpc,kOutJet,kPtSmaller,kPtSmaller,kBad,0.,-1);
734 else if(nBin>=fNumUnits+nElements+n0+n1+n2 && nBin<fNumUnits+nElements+n0+n1+n2+n3)
737 fGrid3->GetEtaPhiFromIndex2(nBin+1-(fNumUnits+nElements+n0+n1+n2),phi,eta);
738 deltaEta = fGrid3->GetDeta();
739 deltaPhi = fGrid3->GetDphi();
740 new ((*fUnitArray)[nBin]) AliJetUnitArray(nBin,0,eta,phi,0.,deltaEta,deltaPhi,kTpc,kOutJet,kPtSmaller,kPtSmaller,kBad,0.,-1);
742 else if(nBin>=fNumUnits+nElements+n0+n1+n2+n3 && nBin<fNumUnits+nElements+nGaps)
745 fGrid4->GetEtaPhiFromIndex2(nBin+1-(fNumUnits+nElements+n0+n1+n2+n3),phi,eta);
746 deltaEta = fGrid4->GetDeta();
747 deltaPhi = fGrid4->GetDphi();
748 new ((*fUnitArray)[nBin]) AliJetUnitArray(nBin,0,eta,phi,0.,deltaEta,deltaPhi,kTpc,kOutJet,kPtSmaller,kPtSmaller,kBad,0.,-1);
754 } // end loop on nBin
755 } // end grid type == 1
756 fArrayInitialised = 1;