diff --git a/test/Event.cxx b/test/Event.cxx index 2e5449e72df10e359936c59f9427e1d84d72e382..a9d938cfa8a2485ec3f9b0245f3c7dc4d567d217 100644 --- a/test/Event.cxx +++ b/test/Event.cxx @@ -70,12 +70,16 @@ // of histograms can be filled. The creation and handling of the // histograms is taken care of by the HistogramManager class. // +// Note: This version of the class Event (see EventMT.h and EventMT.cxx +// for an alternative) uses static variable to improve performance (by +// reducing memory allocation) and thus you can only one instance per +// process (a 2nd instance would shared the array of Tracks). +// //////////////////////////////////////////////////////////////////////// #include "TRandom.h" #include "TDirectory.h" #include "TProcessID.h" -#include "TThread.h" #include "Event.h" @@ -95,14 +99,8 @@ Event::Event() : fIsValid(kFALSE) // When the constructor is invoked for the first time, the class static // variable fgTracks is 0 and the TClonesArray fgTracks is created. - if (TThread::IsInitialized() && TThread::Self()) { - // If thread have been enabled and we are not in the main thread - // let's not share the TClonesArray! - fTracks = new TClonesArray("Track", 1000); - } else { - if (!fgTracks) fgTracks = new TClonesArray("Track", 1000); - fTracks = fgTracks; - } + if (!fgTracks) fgTracks = new TClonesArray("Track", 1000); + fTracks = fgTracks; fHighPt = new TRefArray; fMuons = new TRefArray; fNtrack = 0; @@ -228,14 +226,8 @@ void Event::SetHeader(Int_t i, Int_t run, Int_t date, Float_t random) { fNtrack = 0; fEvtHdr.Set(i, run, date); - if (TThread::IsInitialized() && TThread::Self()) { - // If thread have been enabled and we are not in the main thread - // let's not share the histogram! - fH = new TH1F("hstat","Event Histogram",100,0,1); - } else { - if (!fgHist) fgHist = new TH1F("hstat","Event Histogram",100,0,1); - fH = fgHist; - } + if (!fgHist) fgHist = new TH1F("hstat","Event Histogram",100,0,1); + fH = fgHist; fH->Fill(random); } diff --git a/test/EventMT.cxx b/test/EventMT.cxx new file mode 100644 index 0000000000000000000000000000000000000000..1f52601a4aa810a87ba48c115add1057dc29964b --- /dev/null +++ b/test/EventMT.cxx @@ -0,0 +1,407 @@ +// @(#)root/test:$Id$ +// Author: Rene Brun 19/08/96 + +//////////////////////////////////////////////////////////////////////// +// +// Event and Track classes +// ======================= +// +// The Event class is a naive/simple example of an event structure. +// public: +// char fType[20]; +// char *fEventName; //run+event number in character format +// Int_t fNtrack; +// Int_t fNseg; +// Int_t fNvertex; +// UInt_t fFlag; +// Double32_t fTemperature; +// Int_t fMeasures[10]; +// Double32_t fMatrix[4][4]; +// Double32_t *fClosestDistance; //[fNvertex] indexed array! +// EventHeader fEvtHdr; +// TClonesArray *fTracks; +// TRefArray *fHighPt; //array of High Pt tracks only +// TRefArray *fMuons; //array of Muon tracks only +// TRef fLastTrack; //pointer to last track +// TRef fHistoWeb; //EXEC:GetHistoWeb reference to an histogram in a TWebFile +// TH1F *fH; +// TBits fTriggerBits; //Bits triggered by this event. +// +// The EventHeader class has 3 data members (integers): +// public: +// Int_t fEvtNum; +// Int_t fRun; +// Int_t fDate; +// +// +// The Event data member fTracks is a pointer to a TClonesArray. +// It is an array of a variable number of tracks per event. +// Each element of the array is an object of class Track with the members: +// private: +// Float_t fPx; //X component of the momentum +// Float_t fPy; //Y component of the momentum +// Float_t fPz; //Z component of the momentum +// Float_t fRandom; //A random track quantity +// Float_t fMass2; //The mass square of this particle +// Float_t fBx; //X intercept at the vertex +// Float_t fBy; //Y intercept at the vertex +// Float_t fMeanCharge; //Mean charge deposition of all hits of this track +// Float_t fXfirst; //X coordinate of the first point +// Float_t fXlast; //X coordinate of the last point +// Float_t fYfirst; //Y coordinate of the first point +// Float_t fYlast; //Y coordinate of the last point +// Float_t fZfirst; //Z coordinate of the first point +// Float_t fZlast; //Z coordinate of the last point +// Double32_t fCharge; //Charge of this track +// Double32_t fVertex[3]; //Track vertex position +// Int_t fNpoint; //Number of points for this track +// Short_t fValid; //Validity criterion +// Int_t fNsp; //Number of points for this track with a special value +// Double32_t *fPointValue; //[fNsp] a special quantity for some point. +// TBits fTriggerBits; //Bits triggered by this track. +// +// An example of a batch program to use the Event/Track classes is given +// in this directory: MainEvent. +// Look also in the same directory at the following macros: +// - eventa.C an example how to read the tree +// - eventb.C how to read events conditionally +// +// During the processing of the event (optionally) also a large number +// of histograms can be filled. The creation and handling of the +// histograms is taken care of by the HistogramManager class. +// +// This version of the Event class is a simplified version suitable to +// use in multiple thread as each Event objects are independent for +// each other. +// +//////////////////////////////////////////////////////////////////////// + +#include "TRandom.h" +#include "TDirectory.h" +#include "TProcessID.h" + +#include "Event.h" + + +ClassImp(EventHeader) +ClassImp(Event) +ClassImp(Track) +ClassImp(HistogramManager) + +//______________________________________________________________________________ +Event::Event() : fIsValid(kFALSE) +{ + // Create an Event object. + + fTracks = new TClonesArray("Track", 1000); + fHighPt = new TRefArray; + fMuons = new TRefArray; + fNtrack = 0; + fH = 0; + Int_t i0,i1; + for (i0 = 0; i0 < 4; i0++) { + for (i1 = 0; i1 < 4; i1++) { + fMatrix[i0][i1] = 0.0; + } + } + for (i0 = 0; i0 <10; i0++) fMeasures[i0] = 0; + for (i0 = 0; i0 <20; i0++) fType[i0] = 0; + fClosestDistance = 0; + fEventName = 0; + fWebHistogram.SetAction(this); +} + +//______________________________________________________________________________ +Event::~Event() +{ + Clear(); + delete fH; fH = 0; + delete fHighPt; fHighPt = 0; + delete fMuons; fMuons = 0; + delete [] fClosestDistance; + if (fEventName) delete [] fEventName; +} + +//______________________________________________________________________________ +void Event::Build(Int_t ev, Int_t arg5, Float_t ptmin) { + fIsValid = kTRUE; + char etype[20]; + Float_t sigmat, sigmas; + gRandom->Rannor(sigmat,sigmas); + Int_t ntrack = Int_t(arg5 +arg5*sigmat/120.); + Float_t random = gRandom->Rndm(1); + + //Save current Object count + Int_t ObjectNumber = TProcessID::GetObjectCount(); + Clear(); + fHighPt->Delete(); + fMuons->Delete(); + + Int_t nch = 15; + if (ev >= 100) nch += 3; + if (ev >= 10000) nch += 3; + if (fEventName) delete [] fEventName; + fEventName = new char[nch]; + sprintf(fEventName,"Event%d_Run%d",ev,200); + sprintf(etype,"type%d",ev%5); + SetType(etype); + SetHeader(ev, 200, 960312, random); + SetNseg(Int_t(10*ntrack+20*sigmas)); + SetNvertex(Int_t(1+20*gRandom->Rndm())); + SetFlag(UInt_t(random+0.5)); + SetTemperature(random+20.); + + for(UChar_t m = 0; m < 10; m++) { + SetMeasure(m, Int_t(gRandom->Gaus(m,m+1))); + } + for(UChar_t i0 = 0; i0 < 4; i0++) { + for(UChar_t i1 = 0; i1 < 4; i1++) { + SetMatrix(i0,i1,gRandom->Gaus(i0*i1,1)); + } + } + + fTriggerBits.SetBitNumber((UInt_t)(64*gRandom->Rndm(1))); + fTriggerBits.SetBitNumber((UInt_t)(64*gRandom->Rndm(1))); + fTriggerBits.SetBitNumber((UInt_t)(64*gRandom->Rndm(1))); + + // Create and Fill the Track objects + for (Int_t t = 0; t < ntrack; t++) AddTrack(random,ptmin); + + //Restore Object count + //To save space in the table keeping track of all referenced objects + //we assume that our events do not address each other. We reset the + //object count to what it was at the beginning of the event. + TProcessID::SetObjectCount(ObjectNumber); +} + +//______________________________________________________________________________ +Track *Event::AddTrack(Float_t random, Float_t ptmin) +{ + // Add a new track to the list of tracks for this event. + // To avoid calling the very time consuming operator new for each track, + // the standard but not well know C++ operator "new with placement" + // is called. If tracks[i] is 0, a new Track object will be created + // otherwise the previous Track[i] will be overwritten. + + TClonesArray &tracks = *fTracks; + Track *track = new(tracks[fNtrack++]) Track(random); + //Save reference to last Track in the collection of Tracks + fLastTrack = track; + //Save reference in fHighPt if track is a high Pt track + if (track->GetPt() > ptmin) fHighPt->Add(track); + //Save reference in fMuons if track is a muon candidate + if (track->GetMass2() < 0.11) fMuons->Add(track); + return track; +} + +//______________________________________________________________________________ +void Event::Clear(Option_t * /*option*/) +{ + fTracks->Clear("C"); //will also call Track::Clear + fHighPt->Delete(); + fMuons->Delete(); + fTriggerBits.Clear(); +} + +///______________________________________________________________________________ +void Event::SetHeader(Int_t i, Int_t run, Int_t date, Float_t random) +{ + fNtrack = 0; + fEvtHdr.Set(i, run, date); + fH = new TH1F("hstat","Event Histogram",100,0,1); + fH->Fill(random); +} + +//______________________________________________________________________________ +void Event::SetMeasure(UChar_t which, Int_t what) { + if (which<10) fMeasures[which] = what; +} + +//______________________________________________________________________________ +void Event::SetRandomVertex() { + // This delete is to test the relocation of variable length array + if (fClosestDistance) delete [] fClosestDistance; + if (!fNvertex) { + fClosestDistance = 0; + return; + } + fClosestDistance = new Double32_t[fNvertex]; + for (Int_t k = 0; k < fNvertex; k++ ) { + fClosestDistance[k] = gRandom->Gaus(1,1); + } +} + +//______________________________________________________________________________ +Track::Track(const Track &orig) : TObject(orig) +{ + // Copy a track object + + fPx = orig.fPx; + fPy = orig.fPy; + fPz = orig.fPx; + fRandom = orig.fRandom; + fMass2 = orig.fMass2; + fBx = orig.fBx; + fBy = orig.fBy; + fMeanCharge = orig.fMeanCharge; + fXfirst = orig.fXfirst; + fXlast = orig.fXlast; + fYfirst = orig.fYfirst; + fYlast = orig.fYlast; + fZfirst = orig.fZfirst; + fZlast = orig.fZlast; + fCharge = orig.fCharge; + + fVertex[0] = orig.fVertex[0]; + fVertex[1] = orig.fVertex[1]; + fVertex[2] = orig.fVertex[2]; + fNpoint = orig.fNpoint; + fNsp = orig.fNsp; + if (fNsp) { + fPointValue = new Double32_t[fNsp]; + for(int i=0; i<fNsp; i++) { + fPointValue[i] = orig.fPointValue[i]; + } + } else { + fPointValue = 0; + } + fValid = orig.fValid; + + fTriggerBits = orig.fTriggerBits; + +} + +//______________________________________________________________________________ +Track::Track(Float_t random) : TObject(),fTriggerBits(64) +{ + // Create a track object. + // Note that in this example, data members do not have any physical meaning. + + Float_t a,b,px,py; + gRandom->Rannor(px,py); + fPx = px; + fPy = py; + fPz = TMath::Sqrt(px*px+py*py); + fRandom = 1000*random; + if (fRandom < 10) fMass2 = 0.106; + else if (fRandom < 100) fMass2 = 0.8; + else if (fRandom < 500) fMass2 = 4.5; + else if (fRandom < 900) fMass2 = 8.9; + else fMass2 = 9.8; + gRandom->Rannor(a,b); + fBx = 0.1*a; + fBy = 0.1*b; + fMeanCharge = 0.01*gRandom->Rndm(1); + gRandom->Rannor(a,b); + fXfirst = a*10; + fXlast = b*10; + gRandom->Rannor(a,b); + fYfirst = a*12; + fYlast = b*16; + gRandom->Rannor(a,b); + fZfirst = 50 + 5*a; + fZlast = 200 + 10*b; + fCharge = Double32_t(Int_t(3*gRandom->Rndm(1)) - 1); + + fTriggerBits.SetBitNumber((UInt_t)(64*gRandom->Rndm(1))); + fTriggerBits.SetBitNumber((UInt_t)(64*gRandom->Rndm(1))); + fTriggerBits.SetBitNumber((UInt_t)(64*gRandom->Rndm(1))); + + fVertex[0] = gRandom->Gaus(0,0.1); + fVertex[1] = gRandom->Gaus(0,0.2); + fVertex[2] = gRandom->Gaus(0,10); + fNpoint = Int_t(60+10*gRandom->Rndm(1)); + fNsp = Int_t(3*gRandom->Rndm(1)); + if (fNsp) { + fPointValue = new Double32_t[fNsp]; + for(int i=0; i<fNsp; i++) { + fPointValue[i] = i+1; + } + } else { + fPointValue = 0; + } + fValid = Int_t(0.6+gRandom->Rndm(1)); +} + +//______________________________________________________________________________ +void Track::Clear(Option_t * /*option*/) +{ + fTriggerBits.Clear(); + delete [] fPointValue; + fPointValue=0; +} + +//______________________________________________________________________________ +HistogramManager::HistogramManager(TDirectory *dir) +{ + // Create histogram manager object. Histograms will be created + // in the "dir" directory. + + // Save current directory and cd to "dir". + TDirectory *saved = gDirectory; + dir->cd(); + + fNtrack = new TH1F("hNtrack", "Ntrack",100,575,625); + fNseg = new TH1F("hNseg", "Nseg",100,5800,6200); + fTemperature = new TH1F("hTemperature","Temperature",100,19.5,20.5); + fPx = new TH1F("hPx", "Px",100,-4,4); + fPy = new TH1F("hPy", "Py",100,-4,4); + fPz = new TH1F("hPz", "Pz",100,0,5); + fRandom = new TH1F("hRandom", "Random",100,0,1000); + fMass2 = new TH1F("hMass2", "Mass2",100,0,12); + fBx = new TH1F("hBx", "Bx",100,-0.5,0.5); + fBy = new TH1F("hBy", "By",100,-0.5,0.5); + fMeanCharge = new TH1F("hMeanCharge","MeanCharge",100,0,0.01); + fXfirst = new TH1F("hXfirst", "Xfirst",100,-40,40); + fXlast = new TH1F("hXlast", "Xlast",100,-40,40); + fYfirst = new TH1F("hYfirst", "Yfirst",100,-40,40); + fYlast = new TH1F("hYlast", "Ylast",100,-40,40); + fZfirst = new TH1F("hZfirst", "Zfirst",100,0,80); + fZlast = new TH1F("hZlast", "Zlast",100,0,250); + fCharge = new TH1F("hCharge", "Charge",100,-1.5,1.5); + fNpoint = new TH1F("hNpoint", "Npoint",100,50,80); + fValid = new TH1F("hValid", "Valid",100,0,1.2); + + // cd back to original directory + saved->cd(); +} + +//______________________________________________________________________________ +HistogramManager::~HistogramManager() +{ + // Clean up all histograms. + + // Nothing to do. Histograms will be deleted when the directory + // in which tey are stored is closed. +} + +//______________________________________________________________________________ +void HistogramManager::Hfill(Event *event) +{ + // Fill histograms. + + fNtrack->Fill(event->GetNtrack()); + fNseg->Fill(event->GetNseg()); + fTemperature->Fill(event->GetTemperature()); + + for (Int_t itrack = 0; itrack < event->GetNtrack(); itrack++) { + Track *track = (Track*)event->GetTracks()->UncheckedAt(itrack); + fPx->Fill(track->GetPx()); + fPy->Fill(track->GetPy()); + fPz->Fill(track->GetPz()); + fRandom->Fill(track->GetRandom()); + fMass2->Fill(track->GetMass2()); + fBx->Fill(track->GetBx()); + fBy->Fill(track->GetBy()); + fMeanCharge->Fill(track->GetMeanCharge()); + fXfirst->Fill(track->GetXfirst()); + fXlast->Fill(track->GetXlast()); + fYfirst->Fill(track->GetYfirst()); + fYlast->Fill(track->GetYlast()); + fZfirst->Fill(track->GetZfirst()); + fZlast->Fill(track->GetZlast()); + fCharge->Fill(track->GetCharge()); + fNpoint->Fill(track->GetNpoint()); + fValid->Fill(track->GetValid()); + } +} diff --git a/test/EventMT.h b/test/EventMT.h new file mode 100644 index 0000000000000000000000000000000000000000..435669401b6cbaea29fdb0646e9b24fb94e1bf36 --- /dev/null +++ b/test/EventMT.h @@ -0,0 +1,200 @@ +#ifndef ROOT_Event +#define ROOT_Event + +////////////////////////////////////////////////////////////////////////// +// // +// Event // +// // +// Description of the event and track parameters // +// This version of the Event class is a simplified version suitable to // +// use in multiple thread as each Event objects are independent for // +// each other. // +// // +////////////////////////////////////////////////////////////////////////// + +#include "TObject.h" +#include "TClonesArray.h" +#include "TRefArray.h" +#include "TRef.h" +#include "TH1.h" +#include "TBits.h" +#include "TMath.h" + + +class TDirectory; + +class Track : public TObject { + +private: + Float_t fPx; //X component of the momentum + Float_t fPy; //Y component of the momentum + Float_t fPz; //Z component of the momentum + Float_t fRandom; //A random track quantity + Float16_t fMass2; //[0,0,8] The mass square of this particle + Float16_t fBx; //[0,0,10] X intercept at the vertex + Float16_t fBy; //[0,0,10] Y intercept at the vertex + Float_t fMeanCharge; //Mean charge deposition of all hits of this track + Float16_t fXfirst; //X coordinate of the first point + Float16_t fXlast; //X coordinate of the last point + Float16_t fYfirst; //Y coordinate of the first point + Float16_t fYlast; //Y coordinate of the last point + Float16_t fZfirst; //Z coordinate of the first point + Float16_t fZlast; //Z coordinate of the last point + Double32_t fCharge; //[-1,1,2] Charge of this track + Double32_t fVertex[3]; //[-30,30,16] Track vertex position + Int_t fNpoint; //Number of points for this track + Short_t fValid; //Validity criterion + Int_t fNsp; //Number of points for this track with a special value + Double32_t* fPointValue; //[fNsp][0,3] a special quantity for some point. + TBits fTriggerBits; //Bits triggered by this track. + +public: + Track() { fPointValue = 0; } + Track(const Track& orig); + Track(Float_t random); + virtual ~Track() {Clear();} + void Clear(Option_t *option=""); + Float_t GetPx() const { return fPx; } + Float_t GetPy() const { return fPy; } + Float_t GetPz() const { return fPz; } + Float_t GetPt() const { return TMath::Sqrt(fPx*fPx + fPy*fPy); } + Float_t GetRandom() const { return fRandom; } + Float_t GetBx() const { return fBx; } + Float_t GetBy() const { return fBy; } + Float_t GetMass2() const { return fMass2; } + Float_t GetMeanCharge() const { return fMeanCharge; } + Float_t GetXfirst() const { return fXfirst; } + Float_t GetXlast() const { return fXlast; } + Float_t GetYfirst() const { return fYfirst; } + Float_t GetYlast() const { return fYlast; } + Float_t GetZfirst() const { return fZfirst; } + Float_t GetZlast() const { return fZlast; } + Double32_t GetCharge() const { return fCharge; } + Double32_t GetVertex(Int_t i=0) {return (i<3)?fVertex[i]:0;} + Int_t GetNpoint() const { return fNpoint; } + TBits& GetTriggerBits() { return fTriggerBits; } + Short_t GetValid() const { return fValid; } + virtual void SetValid(Int_t valid=1) { fValid = valid; } + Int_t GetN() const { return fNsp; } + Double32_t GetPointValue(Int_t i=0) const { return (i<fNsp)?fPointValue[i]:0; } + + ClassDef(Track,2) //A track segment +}; + +class EventHeader { + +private: + Int_t fEvtNum; + Int_t fRun; + Int_t fDate; + +public: + EventHeader() : fEvtNum(0), fRun(0), fDate(0) { } + virtual ~EventHeader() { } + void Set(Int_t i, Int_t r, Int_t d) { fEvtNum = i; fRun = r; fDate = d; } + Int_t GetEvtNum() const { return fEvtNum; } + Int_t GetRun() const { return fRun; } + Int_t GetDate() const { return fDate; } + + ClassDef(EventHeader,1) //Event Header +}; + + +class Event : public TObject { + +private: + char fType[20]; //event type + char *fEventName; //run+event number in character format + Int_t fNtrack; //Number of tracks + Int_t fNseg; //Number of track segments + Int_t fNvertex; + UInt_t fFlag; + Double32_t fTemperature; + Int_t fMeasures[10]; + Double32_t fMatrix[4][4]; + Double32_t *fClosestDistance; //[fNvertex][0,0,6] + EventHeader fEvtHdr; + TClonesArray *fTracks; //->array with all tracks + TRefArray *fHighPt; //array of High Pt tracks only + TRefArray *fMuons; //array of Muon tracks only + TRef fLastTrack; //reference pointer to last track + TRef fWebHistogram; //EXEC:GetWebHistogram reference to an histogram in a TWebFile + TH1F *fH; //-> + TBits fTriggerBits; //Bits triggered by this event. + Bool_t fIsValid; // + +public: + Event(); + virtual ~Event(); + void Build(Int_t ev, Int_t arg5=600, Float_t ptmin=1); + void Clear(Option_t *option =""); + Bool_t IsValid() const { return fIsValid; } + void ResetHistogramPointer() {fH=0;} + void SetNseg(Int_t n) { fNseg = n; } + void SetNtrack(Int_t n) { fNtrack = n; } + void SetNvertex(Int_t n) { fNvertex = n; SetRandomVertex(); } + void SetFlag(UInt_t f) { fFlag = f; } + void SetTemperature(Double32_t t) { fTemperature = t; } + void SetType(char *type) {strcpy(fType,type);} + void SetHeader(Int_t i, Int_t run, Int_t date, Float_t random); + Track *AddTrack(Float_t random, Float_t ptmin=1); + void SetMeasure(UChar_t which, Int_t what); + void SetMatrix(UChar_t x, UChar_t y, Double32_t what) { if (x<3&&y<3) fMatrix[x][y]=what;} + void SetRandomVertex(); + + Float_t GetClosestDistance(Int_t i) {return fClosestDistance[i];} + char *GetType() {return fType;} + Int_t GetNtrack() const { return fNtrack; } + Int_t GetNseg() const { return fNseg; } + Int_t GetNvertex() const { return fNvertex; } + UInt_t GetFlag() const { return fFlag; } + Double32_t GetTemperature() const { return fTemperature; } + EventHeader *GetHeader() { return &fEvtHdr; } + TClonesArray *GetTracks() const {return fTracks;} + TRefArray *GetHighPt() const {return fHighPt;} + TRefArray *GetMuons() const {return fMuons;} + Track *GetLastTrack() const {return (Track*)fLastTrack.GetObject();} + TH1F *GetHistogram() const {return fH;} + TH1 *GetWebHistogram() const {return (TH1*)fWebHistogram.GetObject();} + Int_t GetMeasure(UChar_t which) { return (which<10)?fMeasures[which]:0; } + Double32_t GetMatrix(UChar_t x, UChar_t y) { return (x<4&&y<4)?fMatrix[x][y]:0; } + TBits& GetTriggerBits() { return fTriggerBits; } + + ClassDef(Event,1) //Event structure +}; + + +class HistogramManager { + +private: + TH1F *fNtrack; + TH1F *fNseg; + TH1F *fTemperature; + TH1F *fPx; + TH1F *fPy; + TH1F *fPz; + TH1F *fRandom; + TH1F *fMass2; + TH1F *fBx; + TH1F *fBy; + TH1F *fMeanCharge; + TH1F *fXfirst; + TH1F *fXlast; + TH1F *fYfirst; + TH1F *fYlast; + TH1F *fZfirst; + TH1F *fZlast; + TH1F *fCharge; + TH1F *fNpoint; + TH1F *fValid; + +public: + HistogramManager(TDirectory *dir); + virtual ~HistogramManager(); + + void Hfill(Event *event); + + ClassDef(HistogramManager,1) //Manages all histograms +}; + +#endif diff --git a/test/Makefile b/test/Makefile index b81160a664fcb6c35effd42cb155bb946a24c967..a71b73089920b2eb5d6bcd81d00dac788879196b 100644 --- a/test/Makefile +++ b/test/Makefile @@ -21,6 +21,15 @@ else EVENTLIB = $(shell pwd)/$(EVENTSO) endif +EVENTMTO = EventMT.$(ObjSuf) EventMTDict.$(ObjSuf) +EVENTMTS = EventMT.$(SrcSuf) EventMTDict.$(SrcSuf) +EVENTMTSO = libEventMT.$(DllSuf) +ifeq ($(PLATFORM),win32) +EVENTLIB = libEventMT.lib +else +EVENTLIB = $(shell pwd)/$(EVENTSMTO) +endif + MAINEVENTO = MainEvent.$(ObjSuf) MAINEVENTS = MainEvent.$(SrcSuf) @@ -225,7 +234,7 @@ STRESSHISTS = stressHistogram.$(SrcSuf) STRESSHIST = stressHistogram$(ExeSuf) -OBJS = $(EVENTO) $(MAINEVENTO) $(HWORLDO) $(HSIMPLEO) $(MINEXAMO) \ +OBJS = $(EVENTO) $(MAINEVENTO) $(EVENTMTO) $(HWORLDO) $(HSIMPLEO) $(MINEXAMO) \ $(TSTRINGO) $(TCOLLEXO) $(VVECTORO) $(VMATRIXO) $(VLAZYO) \ $(HELLOO) $(ACLOCKO) $(STRESSO) $(TBENCHO) $(BENCHO) \ $(STRESSSHAPESO) $(TCOLLBMO) $(STRESSGEOMETRYO) $(STRESSLO) \ @@ -289,6 +298,40 @@ endif endif @echo "$@ done" +$(EVENTMTSO): $(EVENTMTO) +ifeq ($(ARCH),aix) + /usr/ibmcxx/bin/makeC++SharedLib $(OutPutOpt) $@ $(LIBS) -p 0 $^ +else +ifeq ($(ARCH),aix5) + /usr/vacpp/bin/makeC++SharedLib $(OutPutOpt) $@ $(LIBS) -p 0 $^ +else +ifeq ($(PLATFORM),macosx) +# We need to make both the .dylib and the .so + $(LD) $(SOFLAGS)$@ $(LDFLAGS) $^ $(OutPutOpt) $@ +ifneq ($(subst $(MACOSX_MINOR),,1234),1234) +ifeq ($(MACOSX_MINOR),4) + ln -sf $@ $(subst .$(DllSuf),.so,$@) +else + $(LD) -bundle -undefined $(UNDEFOPT) $(LDFLAGS) $^ \ + $(OutPutOpt) $(subst .$(DllSuf),.so,$@) +endif +endif +else +ifeq ($(PLATFORM),win32) + bindexplib $* $^ > $*.def + lib -nologo -MACHINE:IX86 $^ -def:$*.def \ + $(OutPutOpt)$(EVENTMTLIB) + $(LD) $(SOFLAGS) $(LDFLAGS) $^ $*.exp $(LIBS) \ + $(OutPutOpt)$@ + $(MT_DLL) +else + $(LD) $(SOFLAGS) $(LDFLAGS) $^ $(OutPutOpt) $@ $(EXPLLINKLIBS) +endif +endif +endif +endif + @echo "$@ done" + $(EVENT): $(EVENTSO) $(MAINEVENTO) $(LD) $(LDFLAGS) $(MAINEVENTO) $(EVENTO) $(LIBS) $(OutPutOpt)$@ $(MT_EXE) @@ -670,12 +713,17 @@ distclean: clean stressIterators.$(ObjSuf): stressIterators.h Event.$(ObjSuf): Event.h +EventMT.$(ObjSuf): EventMT.h MainEvent.$(ObjSuf): Event.h EventDict.$(SrcSuf): Event.h EventLinkDef.h @echo "Generating dictionary $@..." $(ROOTCINT) -f $@ -c $^ +EventMTDict.$(SrcSuf): EventMT.h EventLinkDef.h + @echo "Generating dictionary $@..." + $(ROOTCINT) -f $@ -c $^ + Hello.$(ObjSuf): Hello.h HelloDict.$(SrcSuf): Hello.h @echo "Generating dictionary $@..."