Hi experts,
I am using proof lite with 4 workers, and I get no performance speed-up. I am reading in a tree, and writing one out. There are ~100K events in the input tree, and I hope to extract event-level parallelism. It is a compiled executable, and all works fine with compilation and output. Just no speed-up.
In the .h file I have
class subAnalyzer : public TSelector {
private :
TTree *outTree;
public :
TChain *inTree;
Int_t fCurrent;
TString fMode;
TString fChannel;
Float_t outVariable;
Float_t inVariable;
TBranch *b_event_branch_inVariable; //!
subAnalyzer(TTree * /*tree*/ =0) { }
virtual ~subAnalyzer() { }
virtual void Begin(const TString mode, const TString channel,const TString inFileName,const TString outFileName);
virtual void SlaveBegin();
virtual void Init();
virtual Bool_t Notify();
virtual void Show(Long64_t entry = -1);
virtual Bool_t Process(Long64_t entry);
virtual void Loop();
virtual Int_t GetEntry(Long64_t entry);
virtual Long64_t LoadTree(Long64_t entry);
virtual void SetInputList(TList *input) { fInput = input; }
virtual TList *GetOutputList() const { return fOutput; }
virtual void SlaveTerminate();
virtual void Terminate();
};
void subAnalyzer::Init()
{
// Set branch addresses and branch pointers
fCurrent=-1;
if (!inTree) return;
inTree->SetMakeClass(1);
inTree->SetBranchAddress("inVariable", &inVariable, &b_event_branch_inVariable);
}
And in the .cxx file
void subAnalyzer::Begin(const TString mode, const TString channel, const TString inFileName,const TString outFileName)
{
TFile *inFile = TFile::Open(inFileName.Data());
TProof::Open("");
inTree = (TChain*)inFile->Get("usertree");
inTree->SetProof();
inTreeInit();
fMode=mode;
fChannel=channel;
}
void subAnalyzer::SlaveBegin()
{
outTree = new TTree("outTree","outTree");
outTree->Branch("outVariable", &outVariable);
fOutput->Add(outTree);
}
Int_t subAnalyzer::Cut(){
Int_t keep=1;
if( inVariable > someValue) return -1;
return keep;
}
Bool_t subAnalyzer::Process(Long64_t entry)
{
inTree->GetEntry(entry);
outVariable = inVariable;
outTree->Fill();
return kTRUE;
}
void subAnalyzer::Loop(){
if (inTree == 0) {cout << "no tree " << "\n"; return;}
Long64_t nentries = inTree->GetEntries();
Long64_t nbytes = 0, nb = 0;
for (Long64_t jentry=0; jentry<nentries;jentry++) {
Long64_t ientry = LoadTree(jentry);
if (ientry < 0){
cout<<"Warning: LoadTree(): centry = "<<ientry<<endl;
return;
}
nb = inTree->GetEntry(jentry); nbytes += nb;
if(Cut()<0) continue;
Process(jentry);
}// END OF ENTRIES LOOP
}
void subAnalyzer::SlaveTerminate()
{
}
void subAnalyzer::Terminate()
{
outTree = (TTree *) fOutput->FindObject("outTree");
if (outTree) {
cout << "-->successfully made the bush." << endl;
cout << "-->it has # of entries = " << outTree->GetEntries() << endl;
TFile *f = TFile::Open("testing.root", "RECREATE");
f->WriteObject(outTree, "bush");
delete f;
}
}
Am I missing something basic as to how to interface with proof to extract parallelism?
Many Thanks!