#include <TH1F.h>
#include <TH2F.h>
#include <TArrayF.h>
-#include <TRandom.h>
#include <TClonesArray.h>
#include "AliFastJetFinder.h"
#include "AliFastJetHeaderV1.h"
#include "AliJetReaderHeader.h"
#include "AliJetReader.h"
-#include "AliJet.h"
#include "AliJetUnitArray.h"
+#include "AliFastJetInput.h"
+#include "AliJetBkg.h"
+#include "AliAODJetEventBackground.h"
+#include "AliAODTrack.h"
#include "fastjet/PseudoJet.hh"
#include "fastjet/ClusterSequenceArea.hh"
//____________________________________________________________________________
AliFastJetFinder::AliFastJetFinder():
- AliJetFinder()
+ AliJetFinder(),
+ fInputFJ(new AliFastJetInput()),
+ fJetBkg(new AliJetBkg())
{
// Constructor
}
AliFastJetFinder::~AliFastJetFinder()
{
// destructor
+ delete fInputFJ; fInputFJ = 0;
+ delete fJetBkg; fJetBkg = 0;
}
//______________________________________________________________________________
void AliFastJetFinder::FindJets()
{
-
+
//pick up fastjet header
AliFastJetHeaderV1 *header = (AliFastJetHeaderV1*)fHeader;
- Bool_t debug = header->GetDebug(); // debug option
+ Int_t debug = header->GetDebug(); // debug option
Bool_t bgMode = header->GetBGMode(); // choose to subtract BG or not
- Int_t fOpt = fReader->GetReaderHeader()->GetDetector();
+ if(debug)cout<<"----------in AliFastJetFinder::FindJets() ------------------"<<endl;
// check if we are reading AOD jets
+ /* NOT used
TRefArray *refs = 0;
Bool_t fromAod = !strcmp(fReader->ClassName(),"AliJetAODReader");
if (fromAod) { refs = fReader->GetReferences(); }
-
+ */
// RUN ALGORITHM
// read input particles -----------------------------
- vector<fastjet::PseudoJet> inputParticles;
- if(fOpt==0)
- {
- TClonesArray *lvArray = fReader->GetMomentumArray();
- if(lvArray == 0) { cout << "Could not get the momentum array" << endl; return; }
- Int_t nIn = lvArray->GetEntries();
- if(nIn == 0) { if (debug) cout << "entries = 0 ; Event empty !!!" << endl ; return; }
- fJets->SetNinput(nIn) ; // number of input objects
- Float_t px,py,pz,en;
- // load input vectors
- for(Int_t i = 0; i < nIn; i++){ // loop for all input particles
- TLorentzVector *lv = (TLorentzVector*) lvArray->At(i);
- px = lv->Px();
- py = lv->Py();
- pz = lv->Pz();
- en = lv->Energy();
-
- fastjet::PseudoJet inputPart(px,py,pz,en); // create PseudoJet object
- inputPart.set_user_index(i); //label the particle into Fastjet algortihm
- inputParticles.push_back(inputPart); // back of the inputParticles vector
- } // end loop
- }
- else {
- TClonesArray* fUnit = fReader->GetUnitArray();
- if(fUnit == 0) { cout << "Could not get the momentum array" << endl; return; }
- Int_t nCandidate = fReader->GetNumCandidate();
- Int_t nIn = fUnit->GetEntries();
- if(nIn == 0) { if (debug) cout << "entries = 0 ; Event empty !!!" << endl ; return; }
- fJets->SetNinput(nCandidate); // number of input objects // ME
- // Information extracted from fUnitArray
- // load input vectors and calculate total energy in array
- Float_t pt,eta,phi,theta,px,py,pz,en;
- Int_t ipart = 0;
- for(Int_t i=0; i<nIn; i++)
- {
- AliJetUnitArray *uArray = (AliJetUnitArray*)fUnit->At(i);
-
- if(uArray->GetUnitEnergy()>0.){
-
- // It is not necessary anymore to cut on particle pt
- pt = uArray->GetUnitEnergy();
- eta = uArray->GetUnitEta();
- phi = uArray->GetUnitPhi();
- theta = EtaToTheta(eta);
- en = (TMath::Abs(TMath::Sin(theta)) == 0) ? pt : pt/TMath::Abs(TMath::Sin(theta));
- px = TMath::Cos(phi)*pt;
- py = TMath::Sin(phi)*pt;
- pz = en*TMath::TanH(eta);
- if(debug) cout << "pt: " << pt << ", eta: " << eta << ", phi: " << phi << ", en: " << en << ", px: " << px << ", py: " << py << ", pz: " << pz << endl;
-
- fastjet::PseudoJet inputPart(px,py,pz,en); // create PseudoJet object
- inputPart.set_user_index(ipart); //label the particle into Fastjet algortihm
- inputParticles.push_back(inputPart); // back of the inputParticles vector
- ipart++;
- }
- } // End loop on UnitArray
+
+ vector<fastjet::PseudoJet> inputParticles=fInputFJ->GetInputParticles();
+ if(inputParticles.size()==0){
+ if(debug)Printf("%s:%d No input particles found, skipping event",(char*)__FILE__,__LINE__);
+ return;
}
-
+
// create an object that represents your choice of jet algorithm, and
// the associated parameters
double rParam = header->GetRparam();
fastjet::Strategy strategy = header->GetStrategy();
fastjet::RecombinationScheme recombScheme = header->GetRecombScheme();
fastjet::JetAlgorithm algorithm = header->GetAlgorithm();
- fastjet::JetDefinition jet_def(algorithm, rParam, recombScheme, strategy);
+ fastjet::JetDefinition jetDef(algorithm, rParam, recombScheme, strategy);
// create an object that specifies how we to define the area
fastjet::AreaDefinition areaDef;
int activeAreaRepeats = header->GetActiveAreaRepeats();
// now create the object that holds info about ghosts
- fastjet::GhostedAreaSpec ghost_spec(ghostEtamax, activeAreaRepeats, ghostArea);
+ fastjet::GhostedAreaSpec ghostSpec(ghostEtamax, activeAreaRepeats, ghostArea);
// and from that get an area definition
fastjet::AreaType areaType = header->GetAreaType();
- areaDef = fastjet::AreaDefinition(areaType,ghost_spec);
+ areaDef = fastjet::AreaDefinition(areaType,ghostSpec);
- if(bgMode) // BG subtraction
+
+
+
+
+ if(bgMode) // BG subtraction!!!!!!!!!! Not entering here
{
//***************************** JETS FINDING AND EXTRACTION
// run the jet clustering with the above jet definition
- fastjet::ClusterSequenceArea clust_seq(inputParticles, jet_def, areaDef);
+ fastjet::ClusterSequenceArea clust_seq(inputParticles, jetDef, areaDef);
// save a comment in the header
TString comment = "Running FastJet algorithm with the following setup. ";
comment+= "Jet definition: ";
- comment+= TString(jet_def.description());
+ comment+= TString(jetDef.description());
comment+= ". Area definition: ";
comment+= TString(areaDef.description());
comment+= ". Strategy adopted by FastJet: ";
double area = clust_seq.area(jets[j]);
double areaError = clust_seq.area_error(jets[j]);
- printf("Jet found %5d %9.5f %8.5f %10.3f %8.3f +- %6.3f\n", (Int_t)j,jets[j].rap(),jets[j].phi(),jets[j].perp(), area, areaError);
+ if(debug) printf("Jet found %5d %9.5f %8.5f %10.3f %8.3f +- %6.3f\n", (Int_t)j,jets[j].rap(),jets[j].phi(),jets[j].perp(), area, areaError);
// go to write AOD info
AliAODJet aodjet (jets[j].px(), jets[j].py(), jets[j].pz(), jets[j].E());
}
}
- else { // No BG subtraction
- fastjet::ClusterSequence clust_seq(inputParticles, jet_def);
+
+
+
+
+ else { // No BG subtraction!!!!!!!! Default header is bgmode=0.
+
+ TClonesArray* fUnit = fReader->GetUnitArray(); //Big mmentum array
+ if(fUnit == 0) { cout << "Could not get the momentum array" << endl; return; }
+ Int_t nIn = fUnit->GetEntries();
+
+
+ //fastjet::ClusterSequence clust_seq(inputParticles, jetDef);
+ fastjet::ClusterSequenceArea clust_seq(inputParticles, jetDef, areaDef);
+
// save a comment in the header
TString comment = "Running FastJet algorithm with the following setup. ";
comment+= "Jet definition: ";
- comment+= TString(jet_def.description());
+ comment+= TString(jetDef.description());
comment+= ". Strategy adopted by FastJet: ";
comment+= TString(clust_seq.strategy_string());
header->SetComment(comment);
vector<fastjet::PseudoJet> jets = sorted_by_pt(inclusiveJets); // Added by me
for (size_t j = 0; j < jets.size(); j++) { // loop for jets // Added by me
- printf("Jet found %5d %9.5f %8.5f %10.3f \n",(Int_t)j,jets[j].rap(),jets[j].phi(),jets[j].perp());
-
+ if(debug) printf("Jet found %5d %9.5f %8.5f %10.3f \n",(Int_t)j,jets[j].rap(),jets[j].phi(),jets[j].perp());
+
+ vector<fastjet::PseudoJet> constituents = clust_seq.constituents(jets[j]);
+ int nCon= constituents.size();
+ TArrayI ind(nCon);
+ Double_t area=clust_seq.area(jets[j]);
// go to write AOD info
AliAODJet aodjet (jets[j].px(), jets[j].py(), jets[j].pz(), jets[j].E());
+ aodjet.SetEffArea(area,0);
//cout << "Printing jet " << endl;
if(debug) aodjet.Print("");
- //cout << "Adding jet ... " ;
+ Int_t count=0;
+ for (int i=0; i < nCon; i++)
+ {
+ fastjet::PseudoJet mPart=constituents[i];
+ ind[i]=mPart.user_index();
+ // cout<<i<<" index="<<ind[i]<<endl;
+
+ //internal loop over all the unit cells
+ Int_t ipart = 0;
+ // count=0;
+ for(Int_t ii=0; ii<nIn; ii++)
+ {
+ AliJetUnitArray *uArray = (AliJetUnitArray*)fUnit->At(ii);
+ if(uArray->GetUnitEnergy()>0.){
+ uArray->SetUnitTrackID(ipart);//used to have the index available in AliJEtBkg
+ if(ipart==ind[i]){
+ TRefArray* trackArray = (TRefArray*)uArray->GetUnitTrackRef();
+ Int_t tracksInCell = trackArray->GetEntries();
+ for(int ji = 0; ji < tracksInCell; ji++){
+ AliAODTrack * track = (AliAODTrack*)trackArray->At(ji);
+ aodjet.AddTrack(track);
+ }
+
+ count++;
+ }
+ ipart++;
+ }
+ }
+ }
+
+
+
AddJet(aodjet);
- //cout << "added \n" << endl;
-
+
} // end loop for jets
}
double rParam = 1.0;
fastjet::Strategy strategy = fastjet::Best;
fastjet::RecombinationScheme recombScheme = fastjet::BIpt_scheme;
- fastjet::JetDefinition jet_def(fastjet::kt_algorithm, rParam, recombScheme, strategy);
+ fastjet::JetDefinition jetDef(fastjet::kt_algorithm, rParam, recombScheme, strategy);
// now create the object that holds info about ghosts
- fastjet::GhostedAreaSpec ghost_spec(ghostEtamax, activeAreaRepeats, ghostArea);
+ fastjet::GhostedAreaSpec ghostSpec(ghostEtamax, activeAreaRepeats, ghostArea);
// and from that get an area definition
- areaDef = fastjet::AreaDefinition(fastjet::active_area,ghost_spec);
+ areaDef = fastjet::AreaDefinition(fastjet::active_area,ghostSpec);
// run the jet clustering with the above jet definition
- fastjet::ClusterSequenceArea clust_seq(inputParticles, jet_def, areaDef);
+ fastjet::ClusterSequenceArea clust_seq(inputParticles, jetDef, areaDef);
// tell the user what was done
cout << "--------------------------------------------------------" << endl;
- cout << "Jet definition was: " << jet_def.description() << endl;
+ cout << "Jet definition was: " << jetDef.description() << endl;
cout << "Area definition was: " << areaDef.description() << endl;
cout << "Strategy adopted by FastJet was "<< clust_seq.strategy_string()<<endl<<endl;
cout << "--------------------------------------------------------" << endl;
//____________________________________________________________________________
-void AliFastJetFinder::WriteJHeaderToFile()
+void AliFastJetFinder::WriteJHeaderToFile() const
{
fHeader->Write();
}
fReader->CreateTasks(tree);
}
+
+
+Bool_t AliFastJetFinder::ProcessEvent()
+{
+ //
+ // Process one event
+ // from meomntum array
+
+ Bool_t ok = fReader->FillMomentumArray();
+
+ if (!ok) return kFALSE;
+ fInputFJ->SetHeader(fHeader);
+ fInputFJ->SetReader(fReader);
+ fInputFJ->FillInput();
+ // Jets
+ FindJets();
+
+
+ if( fAODEvBkg){
+ fJetBkg->SetHeader(fHeader);
+ fJetBkg->SetReader(fReader);
+ Double_t sigma1 = 0,meanarea1= 0,sigma2 = 0,meanarea2 = 0;
+ Double_t bkg1 = 0,bkg2 = 0;
+
+ fJetBkg->SetFastJetInput(fInputFJ);
+ fJetBkg->BkgFastJetb(bkg1,sigma1,meanarea1);
+ fJetBkg->BkgFastJetWoHardest(bkg2,sigma2,meanarea2);
+ fAODEvBkg->SetBackground(0,bkg1,sigma1,meanarea1);
+ fAODEvBkg->SetBackground(1,bkg2,sigma2,meanarea2);
+ }
+
+
+
+
+ /*
+ fJetBkg->SetFastJetInput(fInputFJ);
+ Double_t bkg1=fJetBkg->BkgFastJet();
+ Double_t bkg2=fJetBkg->BkgChargedFastJet();
+ Double_t bkg3=fJetBkg->BkgFastJetCone(fAODjets);
+ Double_t bkg4=fJetBkg->BkgRemoveJetLeading(fAODjets);
+
+ fAODEvBkg->SetBackground(0,bkg1);
+ fAODEvBkg->SetBackground(1,bkg2);
+ fAODEvBkg->SetBackground(2,bkg3);
+ fAODEvBkg->SetBackground(3,bkg4);
+ */
+ Reset();
+ return kTRUE;
+
+}
+
+Bool_t AliFastJetFinder::ProcessEvent2()
+{
+ //
+ // Process one event
+ // Charged only or charged+neutral jets
+ //
+
+ TRefArray* ref = new TRefArray();
+ Bool_t procid = kFALSE;
+ Bool_t ok = fReader->ExecTasks(procid,ref);
+
+ // Delete reference pointer
+ if (!ok) {delete ref; return kFALSE;}
+
+ // Leading particles
+ fInputFJ->SetHeader(fHeader);
+ fInputFJ->SetReader(fReader);
+ fInputFJ->FillInput();
+
+ // Jets
+ FindJets();
+
+ if( fAODEvBkg){
+ fJetBkg->SetHeader(fHeader);
+ fJetBkg->SetReader(fReader);
+ fJetBkg->SetFastJetInput(fInputFJ);
+ Double_t sigma1,meanarea1,sigma2,meanarea2;
+ Double_t bkg1,bkg2;
+ fJetBkg->BkgFastJetb(bkg1,sigma1,meanarea1);
+ fJetBkg->BkgFastJetWoHardest(bkg2,sigma2,meanarea2);
+ fAODEvBkg->SetBackground(0,bkg1,sigma1,meanarea1);
+ fAODEvBkg->SetBackground(1,bkg2,sigma2,meanarea2);
+ }
+
+
+// Double_t bkg1=fJetBkg->BkgFastJet();
+// Double_t bkg2=fJetBkg->BkgChargedFastJet();
+// Double_t bkg3=fJetBkg->BkgFastJetCone(fAODjets);
+// Double_t bkg4=fJetBkg->BkgRemoveJetLeading(fAODjets);
+
+// fAODEvBkg->SetBackground(0,bkg1);
+// fAODEvBkg->SetBackground(1,bkg2);
+// fAODEvBkg->SetBackground(2,bkg3);
+// fAODEvBkg->SetBackground(3,bkg4);
+
+ Int_t nEntRef = ref->GetEntries();
+
+ for(Int_t i=0; i<nEntRef; i++)
+ {
+ // Reset the UnitArray content which were referenced
+ ((AliJetUnitArray*)ref->At(i))->SetUnitTrackID(0);
+ ((AliJetUnitArray*)ref->At(i))->SetUnitEnergy(0.);
+ ((AliJetUnitArray*)ref->At(i))->SetUnitCutFlag(kPtSmaller);
+ ((AliJetUnitArray*)ref->At(i))->SetUnitCutFlag2(kPtSmaller);
+ ((AliJetUnitArray*)ref->At(i))->SetUnitSignalFlag(kBad);
+ ((AliJetUnitArray*)ref->At(i))->SetUnitSignalFlagC(kTRUE,kBad);
+ ((AliJetUnitArray*)ref->At(i))->SetUnitDetectorFlag(kTpc);
+ ((AliJetUnitArray*)ref->At(i))->SetUnitFlag(kOutJet);
+ ((AliJetUnitArray*)ref->At(i))->ClearUnitTrackRef();
+
+ // Reset process ID
+ AliJetUnitArray* uA = (AliJetUnitArray*)ref->At(i);
+ uA->ResetBit(kIsReferenced);
+ uA->SetUniqueID(0);
+ }
+
+ // Delete the reference pointer
+ ref->Delete();
+ delete ref;
+
+ Reset();
+
+ return kTRUE;
+}