Rev 266 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
#include <TClonesArray.h>#include <TH1F.h>#include <TStopwatch.h>#include <TDatime.h>#include <TString.h>#include <TFile.h>#include <TTree.h>#include <TBranch.h>#include <TClonesArray.h>#include "BParticle.h"#include "BEvent.h"class Hdr{public:int id;int len;int progress;};class Blab2 {public:UInt_t fNeve;int fData;TH1F *fH[100];TClonesArray *fList[100];Blab2();~Blab2();void Init();void event();void Process();void h1d(const char *varname, const char *name, int nbins, double min, double max, int id );int selector(int pin, int charge, SIMPLEPID particlename, int hid, int pout );int combiner(int id0 ,int id1 , SIMPLEPID particlename, double min, double max, int hid, int id );int fix_mass(int id);void plist(int i);ClassDef ( Blab2, 1 )};ClassImp(Blab2)Blab2::Blab2():fNeve(0), fData(0){Process();};void Blab2::h1d(const char *varname, const char *name, int nbins, double min, double max, int id ){fH[id]= new TH1F(TString::Format("h%d",id), name, nbins, min, max);}int Blab2::combiner(int _p0, int _p1,SIMPLEPID pid, double min, double max, int hid, int _p2 ){// Loop over all the particles in both lists.if (_p0 < 0 ) _p0 =0;if (_p1 < 0 ) _p1 =0;fList[_p2]->Clear();int nprt=0;for(TIter next1(fList[_p0]);BParticle * p1 =(BParticle *) next1();) {// the second loopfor(TIter next2 = (_p0!=_p1) ? TIter(fList[_p1]): TIter(next1) ; BParticle * p2 =(BParticle *) next2();) {if (p1==p2) continue;BParticle p = *p1 + *p2; // Combine two particles into a new particleif (p.InMassRange(min, max)){//SIMPLEPID pid = PION; // should be set to particlenamep.SetPid(pid);TClonesArray& list = *fList[_p2];new (list[nprt++]) BParticle ( p ); // create a new entry in kslist list of particlesif (hid>=0 && fH[hid]) fH[hid]->Fill(p.GetMass());}}}return _p2;}int Blab2::selector(int pin, int charge, SIMPLEPID type , int hid, int pout ){if (pin < 0 ) pin =0;fList[pout]->Clear();int nprt=0;for(TIter next(fList[pin]); BParticle * p =(BParticle *) next();) {if (p->charge()== charge && p->pid()== type ) {TClonesArray& list = *fList[pout];new (list[nprt++]) BParticle ( *p );if (hid>=0 && fH[hid]) fH[hid]->Fill(p->GetMass());}}return pout;}int Blab2::fix_mass(int pin){if (pin < 0 ) pin =0;for(TIter next(fList[pin]); BParticle * p =(BParticle *) next();) p->SetEnergyFromPid();return pin;}void Blab2::plist(int i){fList[i]= new TClonesArray( "BParticle", 500 );}Blab2::~Blab2(){};void send_message(int id, TString msg, int progress){static Hdr hdr;hdr.id = id;hdr.len= msg.Length();hdr.progress= progress;fwrite(&hdr,3*sizeof(int),1,stdout);fwrite(msg.Data(),hdr.len,1,stdout);fflush(stdout);}void Blab2::Process(){for (int i=0;i<100;i++) fH[i]=NULL;for (int i=0;i<100;i++) fList[i]=NULL;Init();TFile * f = new TFile(TString::Format("../../data/hadron-%d.root",fData)); // Open a data fileif(f->IsZombie()) { send_message(0,TString::Format("File %d not found\n",fData), 0 ); return; }TTree * t =(TTree *) f-> Get( "T"); // Obtain a pointer to a tree of "event" data in the fileBEvent * mevent = new BEvent(); // Create a "BEvent" object where data from the file will be loadedTBranch * branch = t-> GetBranch( "BEvent"); // Obtain a branch for "BEvent" in the treebranch-> SetAddress(&mevent); // Register created "BEvent" object to the branchsend_message(0, TString::Format("Number of Entries in the file %lld\n", t->GetEntries() ),0);TStopwatch timer;timer.Start();int i=0;int cNeve=TMath::Min(fNeve, (UInt_t) t-> GetEntries());while (i<cNeve){t-> GetEntry(i); // Read the content of the event from the filefList[0]= mevent->GetParticleList();event();if (i%10000==0) send_message(2, TString::Format("Event %d\n",i), (100*i)/cNeve);mevent-> Clear(); // Clear the memory.for (int k=0;k<100;k++) if (fList[k]!=0) fList[k]->Clear();i++;}send_message(2, TString::Format("Number of events processed %d\n", i ),100);for (int i=0;i<100;i++) if (fH[i]!=0) send_message(1,TBufferJSON::ConvertToJSON(fH[i]),100 );TDatime d;timer.Stop();send_message(3, TString::Format("'%s', %d, %f, %f", d.AsSQLString(),i, timer.RealTime(), timer.CpuTime() ),100);}