/************************************************************************** * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * * Contributors are mentioned in the code where appropriate. * * * * Permission to use, copy, modify and distribute this software and its * * documentation strictly for non-commercial purposes is hereby granted * * without fee, provided that the above copyright notice appears in all * * copies and that both the copyright notice and this permission notice * * appear in the supporting documentation. The authors make no claims * * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ /* $Id$ */ /* Realisation of an AliVEventPool based on THnSparse Author Peter Hristov Peter.Hristov@cern.ch Possible usage: three steps 1) Creation of a XML tag collection in aliensh aliensh:> find -x charm /alice/sim/PDC_08/LHC08x/180001 tag.root > 180001.xml 2) Merging the tag files TGrid::Connect("alien://"); TAlienCollection *collection = TAlienCollection::Open(xmlfile); TGridResult* result = collection->GetGridResult("",0); AliTagCreator *t = new AliTagCreator(); t->MergeTags("ESD",result); 3) Chain the merged tag files and test the event pool void testpool(const char * dirname = ".", const char * pattern = "Run180001") { gSystem->Load("libANALYSIS.so"); gSystem->Load("libANALYSISalice.so"); // Create a chain TChain * fChain = new TChain("T"); // Chain the tag files in the working directory TString fTagFilename; // Open the working directory void * dirp = gSystem->OpenDirectory(dirname); const char * name = 0x0; // Add all files matching *pattern* to the chain while((name = gSystem->GetDirEntry(dirp))) { cout << name << endl; if (strstr(name,pattern)) { fTagFilename = dirname; fTagFilename += "/"; fTagFilename += name; fChain->Add(fTagFilename); }//pattern check }//directory loop Int_t nruns = fChain->GetEntries(); cout << nruns << " run(s) found in the tag chain." << endl; Int_t dim = 3; const char * vars[] = {"fNumberOfPositiveTracks","fNumberOfNegativeTracks","fPrimaryVertexZ"}; Int_t nbins[] = {10,10,10}; Double_t xmin[] ={-0.5,-0.5,-20}; Double_t xmax[] ={49/5,49.5,20}; Int_t chunksize = 100; AliEventPoolSparse * pool = new AliEventPoolSparse("test", "test", fChain, dim, vars, nbins, xmin, xmax, chunksize); pool->Init(); TChain * esdchain = 0x0; Int_t ichain = 0; while (esdchain=pool->GetNextChain()) { cout << "Chain: "<< ichain <<" Events: " << esdchain->GetEntries() << endl; ichain++; } delete fChain; } */ #include "AliEventPoolSparse.h" #include "AliRunTag.h" #include "AliEventTag.h" #include "AliLog.h" #include "AliRunTagCuts.h" #include "AliLHCTagCuts.h" #include "AliDetectorTagCuts.h" #include "AliEventTagCuts.h" #include #include #include #include #include #include #include ClassImp(AliEventPoolSparse) // _________________________________________________________________________ AliEventPoolSparse::AliEventPoolSparse() : fHnSparseI(), fChunkSize(1024 * 16), fN(0), fPool(0x0), fCurrentBin(-1), fTagChain(0x0), fVars(0x0), fRunCut(0x0), fLHCCut(0x0), fDetCut(0x0), fEvCut(0x0), fRunTagCut(0x0), fEventTagCut(0x0), fDetectorTagCut(0x0), fLHCTagCut(0x0), fBinNumber(0) { // Default constructor. Initializes the THnSparseI, // the initial size of the array and the array itself fN = fChunkSize; fPool = new TEntryList * [fN]; memset(fPool,0x0,fN*sizeof(TEntryList*)); } // _________________________________________________________________________ AliEventPoolSparse::AliEventPoolSparse(const char* name, const char* title, TChain * tagchain, Int_t dim, const char ** vars, const Int_t* nbins, const Double_t* xmin, const Double_t* xmax, Int_t chunksize): fHnSparseI(name, title, dim, nbins, xmin, xmax, chunksize), fChunkSize(chunksize), fN(0), fPool(0x0), fCurrentBin(-1), fTagChain(tagchain), fVars(0x0), fRunCut(0x0), fLHCCut(0x0), fDetCut(0x0), fEvCut(0x0), fRunTagCut(0x0), fEventTagCut(0x0), fDetectorTagCut(0x0), fLHCTagCut(0x0), fBinNumber(0){ // Constructor. Initializes the THnSparseI, // the initial size of the pool array and the array itself // It uses the provided array of variables to create TTreeFormulas // that are used when the pools are filled. This is the reason to require the input // tag chain in the constructor. fN = fChunkSize; fPool = new TEntryList * [fN]; memset(fPool,0x0,fN*sizeof(TArrayI*)); // Pool variables fVars = new TTreeFormula*[dim]; for (Int_t ivar=0; ivar0) delete [] fPool; Int_t ndim = fHnSparseI.GetNdimensions(); for (Int_t i=0; i=fHnSparseI.GetNbins()) { // Check if >= or > AliInfo("No more chains"); return 0x0; } fBinNumber++; fChain->SetEntryList(fPool[fCurrentBin++],"ne"); return fChain; } // _________________________________________________________________________ void AliEventPoolSparse::GetCurrentBin(Float_t* xbin) { // This method fills the center of the current bin in xbin if (fCurrentBin<0) { AliError("The event pool is not initialized"); return; } Int_t ndim = fHnSparseI.GetNdimensions(); Int_t * coord = new Int_t[ndim]; fHnSparseI.GetBinContent(fCurrentBin,coord); TObjArray * axes = fHnSparseI.GetListOfAxes(); for (Int_t i=0; iAt(i+1))->GetBinCenter(coord[i]); delete [] coord; } // _________________________________________________________________________ void AliEventPoolSparse::Init(){ // Loop on the tag chain and select the events according // to the Run, LHC, detector, and event cuts. // Fill the THnSparse bin and add the event to the corresponding pool // Taken and modified from AliAnalysisTag if (!fTagChain) { AliError("Please provide a tag chain!"); return; } Int_t ndim = fHnSparseI.GetNdimensions(); if (ndim<=0) return; Double_t * x = new Double_t[ndim]; // Tag objects. AliRunTag *tag = new AliRunTag; AliEventTag *evTag = 0; fTagChain->SetBranchAddress("AliTAG",&tag); TString guid(""); TString turl(""); TString path(""); Int_t current = -1; // Current tree number for(Int_t iTagFiles = 0; iTagFiles < fTagChain->GetEntries(); iTagFiles++) { fTagChain->GetEntry(iTagFiles); if (current != fTagChain->GetTreeNumber()) { // Update the formula leaves if a new file is processed by the chain // if (fRunCut) fRunCut->UpdateFormulaLeaves(); // if (fLHCCut) fLHCCut->UpdateFormulaLeaves(); // if (fDetCut) fDetCut->UpdateFormulaLeaves(); // if (fEvCut) fEvCut->UpdateFormulaLeaves(); if (fEventTagCut) fEventTagCut->InitializeTriggerClasses(tag->GetActiveTriggerClasses()); for (Int_t ivar=0; ivarUpdateFormulaLeaves(); // Create the ESD/AOD chain if not done if (!fChain) { // Decide if we have ESD or AOD TFile * tagfile = fTagChain->GetFile(); if (strstr(tagfile->GetName(),"ESD")) fChain = new TChain("esdTree"); else if (strstr(tagfile->GetName(),"AOD")) fChain = new TChain("aodTree"); else { AliError("Only ESD and AOD type is implemented!!!"); delete [] x; return; } } // Update the tree number current = fTagChain->GetTreeNumber(); } // Deprecated use of TTreeFormulas // // Apply Run, LHC, and detector cuts if they exist // if(!fRunCut || fRunCut->EvalInstance(iTagFiles) == 1) { // if(!fLHCCut || fLHCCut->EvalInstance(iTagFiles) == 1) { // if(!fDetCut || fDetCut->EvalInstance(iTagFiles) == 1) { // // Get access to the event data in the TTreeFormula // if (fEvCut) fEvCut->GetNdata(); // for (Int_t ivar=0; ivarGetNdata(); // // Loop on events // // const TClonesArray *tagList = tag->GetEventTags(); // Int_t iFiles = tag->GetNFiles(); // for (int ifs = 0; ifsGetFileTag(ifs); // guid = eftag->GetGUID(); // turl = eftag->GetTURL(); // path = eftag->GetPath(); // Int_t iEvents = eftag->GetNEvents(); // for(Int_t i = 0; i < iEvents; i++) { // evTag = (AliEventTag *) eftag->GetEventTag(i); // if(!fEvCut || fEvCut->EvalInstance(i) == 1) { // TEntryList *fLocalList = new TEntryList(); // fLocalList->SetTreeName(fChain->GetName()); // fLocalList->SetFileName(turl.Data()); // fLocalList->Enter(i); // // Add this event to the corresponding pool // { // // Increment the bin content corrresponding to the vector "x" by "w", // // and store the event index iev to the array associated with the bin, // // then return the bin index. // for (Int_t ivar=0; ivarEvalInstance(i); // Int_t bin = fHnSparseI.Fill(x); // // Check if we have to enlarge the array of pointers // if (bin>=fN) Set(bin+fChunkSize); // // Allocate the TEntryList if this is the first use of it // if (!fPool[bin]) fPool[bin] = new TEntryList(); // // Add the event iev to the corresponding bin // fPool[bin]->Add(fLocalList); // } // } // }//event loop // for (Int_t ipool=0; ipoolOptimizeStorage(); // // Add the current file to the ESD/AOD chain // if(!path.IsNull()) fChain->AddFile(path); // else if(!turl.IsNull()) fChain->AddFile(turl); // } // }//detector tag cuts // }//lhc tag cuts // }//run tag cut // Apply Run, LHC, and detector cuts if they exist if(!fRunTagCut || fRunTagCut->IsAccepted(tag)) { if(!fLHCTagCut || fLHCTagCut->IsAccepted(tag->GetLHCTag())) { if(!fDetectorTagCut || fDetectorTagCut->IsAccepted(tag->GetDetectorTags())) { // // Get access to the event data in the TTreeFormula // if (fEvCut) fEvCut->GetNdata(); for (Int_t ivar=0; ivarGetNdata(); // Loop on events // const TClonesArray *tagList = tag->GetEventTags(); Int_t iFiles = tag->GetNFiles(); for (int ifs = 0; ifsGetFileTag(ifs); guid = eftag->GetGUID(); turl = eftag->GetTURL(); path = eftag->GetPath(); Int_t iEvents = eftag->GetNEvents(); for(Int_t i = 0; i < iEvents; i++) { evTag = (AliEventTag *) eftag->GetEventTag(i); if(!fEventTagCut || fEventTagCut->IsAccepted(evTag)) { TEntryList *fLocalList = new TEntryList(); fLocalList->SetTreeName(fChain->GetName()); fLocalList->SetFileName(turl.Data()); fLocalList->Enter(i); // Add this event to the corresponding pool { // Increment the bin content corrresponding to the vector "x" by "w", // and store the event index iev to the array associated with the bin, // then return the bin index. for (Int_t ivar=0; ivarEvalInstance(i); Int_t bin = fHnSparseI.Fill(x); // Check if we have to enlarge the array of pointers if (bin>=fN) Set(bin+fChunkSize); // Allocate the TEntryList if this is the first use of it if (!fPool[bin]) fPool[bin] = new TEntryList(); // Add the event iev to the corresponding bin fPool[bin]->Add(fLocalList); } } }//event loop for (Int_t ipool=0; ipoolOptimizeStorage(); // Add the current file to the ESD/AOD chain if(!path.IsNull()) fChain->AddFile(path); else if(!turl.IsNull()) fChain->AddFile(turl); } }//detector tag cuts }//lhc tag cuts }//run tag cut }//tag file loop delete [] x; fCurrentBin = 0; // Initialize the current bin } // _________________________________________________________________________ void AliEventPoolSparse::SetRunCut(const char * cut){ // Run selection cuts if (fRunCut) delete fRunCut; fRunCut = new TTreeFormula("fRun",cut,fTagChain); } // _________________________________________________________________________ void AliEventPoolSparse::SetLHCCut(const char * cut){ // LHC selection cuts if (fLHCCut) delete fLHCCut; fLHCCut = new TTreeFormula("fLHC",cut,fTagChain); } // _________________________________________________________________________ void AliEventPoolSparse::SetDetCut(const char * cut){ // Detector selection cuts if (fDetCut) delete fDetCut; fDetCut = new TTreeFormula("fDet",cut,fTagChain); } // _________________________________________________________________________ void AliEventPoolSparse::SetEventCut(const char * cut){ // Event selection cuts if (fEvCut) delete fEvCut; fEvCut = new TTreeFormula("fEv",cut,fTagChain); } // _________________________________________________________________________ void AliEventPoolSparse::SetRunCut(AliRunTagCuts* cut) { fRunTagCut = cut; } // _________________________________________________________________________ void AliEventPoolSparse::SetEventCut(AliEventTagCuts* cut) { fEventTagCut = cut; } // _________________________________________________________________________ void AliEventPoolSparse::SetDetectorCut(AliDetectorTagCuts* cut) { fDetectorTagCut = cut; } // _________________________________________________________________________ void AliEventPoolSparse::SetLHCCut(AliLHCTagCuts* cut) { fLHCTagCut = cut; } // _________________________________________________________________________ void AliEventPoolSparse::Set(Int_t n){ // Set size of the array of pointers to n. // A new array is created, the old contents copied to the new array, // then the old array is deleted. // This function is taken from TArrayI if (n < 0) return; if (n != fN) { TEntryList **temp = fPool; if (n != 0) { fPool = new TEntryList*[n]; if (n < fN) memcpy(fPool,temp, n*sizeof(TEntryList*)); else { memcpy(fPool,temp,fN*sizeof(TEntryList*)); memset(&fPool[fN],0x0,(n-fN)*sizeof(TEntryList*)); } } else { fPool = 0x0; } if (fN) delete [] temp; fN = n; } }