Could you replace the statement:
tree->Branch("FDEvent","FDEvent",&curEvent,64000,1);
by
tree->Branch("FDEvent","FDEvent",&curEvent,64000,0);
and let me know ?
Rene Brun
On Mon, 13 Mar 2000, Stefano Argiro' wrote:
>
> Hi Rooters,
>
> I know we went through this hundreds of times, but still ...
> The tree structure is created correctly with all the sub-branches, but it
> looks like I am filling it with empty objects, as if the pointer to
> curEvent pointed to an empty area (which is not, 'cause if I do
> curEvent->Printf() I can see that there are data).
>
> I am using root 2.22 on Debian with egcs.
>
> I would appreciate your help.
> Many thanks
> Stefano
>
>
> Stefano Argiro'
> Universita' di Milano, Dipartimento di Fisica delle Particelle
> and INFN
> ______________________________________________________________
> FDDaqMain.cxx
> -------------------------------------------------------------
> #include "TBranch.h"
> #include "TTree.h"
> #include "TFile.h"
> #include "TGraph.h"
> #include "TMapFile.h"
> #include "TArrayI.h"
> #include "TObjArray.h"
>
> #include "Pixel.h"
> #include "FDEvent.h"
> #include "NICSocket.h"
> #include "FDMon.h"
> #include "TROOT.h"
> #include <fstream.h>
> #include <iostream.h>
>
> int main(int argc, char **argv)
> {
> TROOT FDdaq("FDDaq","FD daq program");
>
> TFile * file= new TFile("EvTree.root","RECREATE");
> TTree * tree= new TTree("FDEventTree","Event Tree");
>
>
> Int_t evno=0;
> char filename[30];
>
> NICSocket * thisSocket = new NICSocket();
> FDMon * thisMonitor = new FDMon(thisSocket);
> FDEvent * curEvent = new FDEvent();
>
> thisSocket -> SetEventAddr(curEvent);
>
> tree->Branch("FDEvent","FDEvent",&curEvent,64000,1);
>
>
> while(evno<5){
>
> sprintf(filename,"event%d.dat",evno);
>
> cout<< "FDDaq : accepting connection " <<endl;
>
> thisSocket->AcceptData();
> thisSocket->UnpackData();
>
>
>
> curEvent-> Printf(); // event is filled OK
> tree->Fill();
> tree->Print();
>
> ofstream file(filename);
> curEvent-> Writef( file);
> thisMonitor->Update();
>
>
>
> evno++;
> }
> tree->Print();
>
>
> file->Write();
> file->Close();
> return 0;
> }
> ---------------------------------------------------------------------
> FDEvent.h
> ----------------------------------------------------------------------
>
> #ifndef FDEVENT_H
> #define FDEVENT_H
> #include "TObjArray.h"
> #include "TDatime.h"
>
> class Pixel;
>
>
> class FDEvent: public TObject {
>
> // in this version:
> // create event calling FDEvent();
> // fill header calling SetHeader;
> // fill traces
>
>
> private:
>
> TDatime fgDateOfEvent;
> Int_t keventNumber;
> Int_t kNPops;
> Int_t kNPMBs;
>
> TObjArray *fPixelList;
>
>
> public:
>
> FDEvent();
> FDEvent(TDatime dandt, Int_t npops,Int_t evno,Int_t npmb);
> FDEvent(const FDEvent & cevent);
> ~FDEvent();
>
> void SetHeader(TDatime dandt, Int_t npops,Int_t evno,Int_t
> npmb);
> void AddTrace(Int_t pixel_id, Int_t *trace);
> Int_t * GetTrace(Int_t pixel_id);
> Int_t GetNPops() {return kNPops;}
> Int_t GetNChannels(){return kNPMBs * 16;}
> void Printf();
> void Writef(ofstream& outfile);
>
> ClassDef(FDEvent,1)
> };
> #endif
> -------------------------------------------------------------------
> FDEvent.cxx
> ------------------------------------------------------------------
>
> #include "TObject.h"
> #include "TObjArray.h"
> #include "Pixel.h"
> #include "FDEvent.h"
> #include <iostream.h>
> #include <fstream.h>
> #include "TArrayI.h"
>
> ClassImp(FDEvent)
>
>
> FDEvent::FDEvent(){
>
> fgDateOfEvent.Set(2000,1,1,0,0,0);
> kNPops = 128;
> keventNumber = 1;
> kNPMBs = 1;
> fPixelList = NULL;
> }
>
>
> FDEvent::FDEvent(TDatime dandt,Int_t npops,Int_t evno,Int_t npmb)
>
> {fgDateOfEvent = dandt;
> kNPops = npops;
> keventNumber = evno;
> kNPMBs = npmb;
>
> fPixelList = new TObjArray(16*kNPMBs);
>
> }
>
>
> FDEvent::FDEvent(const FDEvent & cevent){
> fgDateOfEvent= cevent.fgDateOfEvent;
> kNPops = cevent.kNPops;
> keventNumber = cevent.keventNumber;
> kNPMBs = cevent.kNPMBs;
> fPixelList = cevent.fPixelList;
> }
>
> FDEvent::~FDEvent(){
>
> delete fPixelList;
> }
>
> void FDEvent::SetHeader(TDatime dandt, Int_t npops,Int_t evno,Int_t
> npmb){
> fgDateOfEvent = dandt;
> kNPops = npops;
> keventNumber = evno;
> kNPMBs = npmb;
>
> if (fPixelList==NULL) fPixelList = new
> TObjArray(16*kNPMBs);
>
> }
>
> void FDEvent::AddTrace(Int_t pixel_id, Int_t *trace)
> {
> Pixel * p = new Pixel(kNPops,trace);
> //printf("adding trace %d\n",pixel_id);
> fPixelList->AddAt(p,pixel_id);
> }
>
>
> Int_t* FDEvent::GetTrace(Int_t pixel_id)
> {
> Pixel * p = (Pixel *) fPixelList->At(pixel_id);
> return p->GetFADCTrace();
> }
>
>
>
>
>
> void FDEvent::Printf(){
> cout << "Event Infos" << endl;
> cout << keventNumber << " " <<
> fgDateOfEvent.GetDate() << " " <<
> fgDateOfEvent.GetTime() << " " <<
> kNPops << " " <<
> kNPMBs << endl;
>
>
> Int_t last_id =GetNChannels();
>
> cout <<"Last id :" << last_id <<endl;
> for (Int_t j=0; j<kNPops; j++){
> for (Int_t i=0; i<last_id; i++){
>
> Int_t * trace = GetTrace(i);
>
> cout << trace[j] << " ";
> }
> cout << endl;
> }
>
> ;}
>
> // Event-> Writef : coulumn = Channel, row= pop
>
> void FDEvent::Writef(ofstream& outfile){
> outfile << "Event Infos" << endl;
> outfile << keventNumber << " " <<
> fgDateOfEvent.GetDate() << " " <<
> fgDateOfEvent.GetTime() << " " <<
> kNPops << " " <<
> kNPMBs << endl;
>
>
> Int_t last_id =GetNChannels();
>
> outfile <<"Last id :" << last_id <<endl;
>
> for (Int_t j=0; j<kNPops; j++){
> for (Int_t i=0; i<last_id; i++){
>
> Int_t * trace = GetTrace(i);
>
> outfile << trace[j] << " ";
> }
> outfile << endl;
> }
> }
> ---------------------------------------------------------------
> Pixel.h
> --------------------------------------------------------------
>
>
> #ifndef PIXEL_H
> #define PIXEL_H
>
> #include "TArrayI.h"
> #include "TObject.h"
>
> class Pixel: public TObject {
>
> // a preliminary implementation
> // for each pixel, one FADC trace
>
>
> private:
>
> TArrayI *FADCTrace;
>
> public:
> Pixel() ;
> ~Pixel(){delete FADCTrace;};
> Pixel(Int_t n, Int_t *trace);
> Int_t * GetFADCTrace();
>
> ClassDef(Pixel,1)
> };
>
> #endif
> -----------------------------------------------------------------------
> Pixel.cxx
> -----------------------------------------------------------------------
> #include "Pixel.h"
>
> ClassImp(Pixel)
>
> Pixel::Pixel(){ FADCTrace = NULL; }
>
> Pixel::Pixel(Int_t n, Int_t *trace):TObject(){FADCTrace = new TArrayI(n,
> trace);}
>
> Int_t * Pixel::GetFADCTrace(){return FADCTrace->GetArray() ;}
>
> --------------------------------------------------------------------
> NICSocket.h
> ---------------------------------------------------------------
>
> #ifndef H_NICSocket
> #define H_NICSocket
>
> // A class for handling connections, unpack data and create FDEvents
>
>
>
> // Event header structure
>
> // word 0: Event Number
> // word 1: Event Day
> // word 2: Event Month
> // word 3: Event Year
> // word 4: Event h
> // word 5: Event mm
> // word 6: Event ss
> // word 7: Number of Pops
>
> class NICSocket{
>
> private:
>
> Int_t eventNumber;
> TDatime eventDate;
> Int_t eventNPops;
> Int_t eventNPMBs;
> Int_t *dataBuffer;
> Int_t **FADCtrace;
> int *headerBuffer;
> FDEvent *thisEvent;
>
> static const int kNBoaChannels = 16 ;
> static const int kAckSize = 100 ;
> int kAckBuf[kAckSize] ;
> static const Int_t kEventHeaderSize = 9 ;
> static const Int_t ktcp_port = 8000;
> Char_t kPeeraddr[20] ;
> static const Char_t kHostname[20] ;
>
>
> public:
>
> NICSocket();
> ~NICSocket();
>
> FDEvent * GetEvent(){return thisEvent;}
> void SetEventAddr(FDEvent * evaddr){thisEvent =
> evaddr;}
> void AcceptData();
> void UnpackData();
> // void AddtoTree(){tree->Fill();}
> void WriteTree();
> Int_t Swap2Bits(Int_t byte);
>
> };
>
>
> #endif
> --------------------------------------------------------
> NICSocket.cxx
> ------------------------------------------------------
>
>
> include "nic.h"
> #include "TObject.h"
> #include "TClonesArray.h"
> #include "TBranch.h"
> #include "TTree.h"
> #include "TBranch.h"
> #include "TArrayI.h"
> #include "TDatime.h"
>
> #include "TObjArray.h"
> #include "Pixel.h"
> #include "FDEvent.h"
> #include "NICSocket.h"
> #include <stdio.h>
>
>
> NICSocket::NICSocket(){ //constructor
>
> for (Int_t i = 0; i<kAckSize;i++) kAckBuf[i]= 1;
> //fill acknowledge buffer
> headerBuffer= new int[kEventHeaderSize];
>
>
> }
>
>
> /**********************************************************************************/
> // AcceptData:
> // 1:listen for clients
> // 2:accept connection
> // 3:receive event header, send ack
> // 4:receive data, send ack
> // 5:alloc memory for FADCtraces
>
> void NICSocket:: AcceptData(){
>
> Int_t year,month,day,hour,min,sec;
>
> //1.
> Int_t listenSocket= NIC_listen(ktcp_port, 0); //open listen
> socket
> if (listenSocket < 0) {
> fprintf(stderr,
> "NICSocket::AcceptData: %s\n",NIC_perror(listenSocket));
> return;
> }
> //2.
> Int_t socket = NIC_accept(listenSocket, 0); //accept
> connection;
> Int_t diag = NIC_close(listenSocket); //close
> listenSocket;
> if (diag < 0) {
> fprintf(stderr,
> "NICSocket::AcceptData: %s\n",NIC_perror(diag));
> return;
> }
>
> diag = NIC_peeraddress(socket,(char *)kPeeraddr );
> if (diag < 0) {
> fprintf(stderr,
> "NICSocket::AcceptData: %s\n",NIC_perror(diag));
> return;
> }
> fprintf(stderr, "Connected to : %s\n",kPeeraddr);
>
> /********* Receive message ***************************/
>
> //3. Read Event Header
>
> diag = NIC_ireceive((int*)headerBuffer, kEventHeaderSize, socket);
> if (diag < 0) {
> fprintf(stderr,
> "NICSocket::AcceptData: %s\n",NIC_perror(diag));
> return;
> }
>
> // Unpack Header
> eventNumber = (Int_t) headerBuffer[0];
> eventNPops = (Int_t) headerBuffer[7];
> eventNPMBs = (Int_t) headerBuffer[8];
> year = (Int_t) headerBuffer[3] +3000; // problems
> : root does not like year< 1995
> month = (Int_t) headerBuffer[2];
> day = (Int_t) headerBuffer[1];
> hour = (Int_t) headerBuffer[4];
> min = (Int_t) headerBuffer[5];
> sec = (Int_t) headerBuffer[6];
>
>
> eventDate.Set(year, month,day,hour,min,sec);
>
> //alloc databuffer
>
> Int_t eventLenght = eventNPops* eventNPMBs * kNBoaChannels;
> dataBuffer= new Int_t[eventLenght];
>
>
> //send acknoledge
>
> diag = NIC_isend((int *)kAckBuf, kAckSize, socket);
>
> if (diag < 0) {
> fprintf(stderr, "NICSocket::AcceptData: %s\n",
> NIC_perror(diag));
> return;
> }
>
> //4. receive data
>
>
> diag = NIC_ireceive(dataBuffer, eventLenght, socket);
>
>
> //send acknowledge
> diag = NIC_isend((int *)kAckBuf, kAckSize, socket);
>
> if (diag < 0) {
> fprintf(stderr, "NICSocket::AcceptData: %s\n",
> NIC_perror(diag));
> return;
> }
>
>
> #ifdef DEBUG
> // print header
> printf("Header: ");
> for(Int_t i=0; i<kEventHeaderSize; i++)printf("%d
> ",headerBuffer[i]);
> printf ("\n");
> #endif
>
> //5: alloc memory for FADCtraces
>
>
>
> FADCtrace= new Int_t*[kNBoaChannels* eventNPMBs];
>
> for (Int_t i=0; i<kNBoaChannels* eventNPMBs;i++) {
> FADCtrace[i] = new Int_t[eventNPops];
> }
>
> #ifdef DEBUG
> printf("AcceptData: Done \n");
> #endif
>
> }
>
>
> Int_t NICSocket::Swap2Bits(Int_t byte){
>
> Int_t temp1,temp3,temp;
>
>
> temp1 = (byte & (0x800)) >>3;
> temp3 = (byte & (0x100)) <<3;
>
> temp = (byte & (0x6ff)) |temp1 |temp3;
>
> return temp;
> };
>
> void NICSocket::UnpackData(){
>
> thisEvent->SetHeader(eventDate,eventNPops,eventNumber,eventNPMBs);
>
> for (Int_t j=0; j<eventNPMBs; j++){ //loop on boards
> for (Int_t i=0; i<eventNPops;i++){ //loop on pops
> for (Int_t k=0; k<kNBoaChannels; k++){ //loop on ch
>
> Int_t sample = dataBuffer[k + i*kNBoaChannels+
> j*kNBoaChannels*eventNPops];
> //unpack from
> message buffer
>
> if (k%2) sample = Swap2Bits(sample); //bit swapping
> for odd channels
> FADCtrace[k+ j*kNBoaChannels][i]= sample; //store in array
> }
> }
> }
>
> for (Int_t i=0; i<kNBoaChannels* eventNPMBs;i++) // fill Pixels
> thisEvent-> AddTrace(i,FADCtrace[i]);
>
> #ifdef DEBUG
> printf("Unpackdata : done\n");
> #endif
>
> }
>
> -----------------------------------------------------------
> Makefile
> ---------------------------------------------------------
>
>
>
> ObjSuf = o
>
> SrcSuf = cxx
> ExeSuf =
> DllSuf = so
>
> OutPutOpt = -o
>
> ROOTCFLAGS = $(shell root-config --cflags)
> ROOTLIBS = $(shell root-config --libs)
> ROOTGLIBS = $(shell root-config --glibs)
>
> # Linux with egcs
> CXX = g++
> CXXFLAGS = -O -Wall -fPIC -g
> LD = g++
> LDFLAGS = -g
> SOFLAGS = -shared
>
>
> CXXFLAGS += $(ROOTCFLAGS)
> LIBS = $(ROOTLIBS)
> GLIBS = $(ROOTGLIBS)
>
> NICLIB = -L/home/argiro/daq/NIC -lNIC
> #------------------------------------------------------------------------------
>
>
>
> NICSOCKETO = NICSocket.$(ObjSuf)
> NICSOCKETS = NICSocket.$(SrcSuf)
>
> FDEVENTO = FDEvent.$(ObjSuf)\
> FDEventDict.$(ObjSuf)
>
>
> FDEVENTS = FDEvent.$(SrcSuf)\
> FDEventDict.$(SrcSuf)
>
> PIXELS = Pixel.$(SrcSuf)
> PIXELO = Pixel.$(ObjSuf)
>
> FDEVENT =
> FDEVENTSO = FDEvent.$(DllSuf)
>
> FDMONO = FDMon.$(ObjSuf)
> FDMONS = FDMon.$(SrcSuf)
>
> FDDAQO = FDDaqMain.$(ObjSuf)
> FDDAQS = FDDaqMain.$(SrcSuf)
> FDDAQ = FDDaq$(ExeSuf)
>
> READTREE = readTree$(ExeSuf)
> READTREEO = readTree.$(ObjSuf)
> READTREES = readTree.$(SrcSuf)
>
> OBJS = $(NICSOCKETO) $(FDDAQO) $(FDMONO) $(PIXELO) $(FDEVENTO)
>
> all: $(FDDAQ) $(FDEVENTSO)
>
> $():
>
> $(FDDAQ): $(FDDAQO) $(NICSOCKETO) $(FDMONO) $(FDEVENTO) $(PIXELO)
>
> $(LD) $(LDFLAGS) $(NICSOCKETO) $(FDDAQO) $(FDMONO) $(FDEVENTO) $(PIXELO)\
> $(GLIBS) $(NICLIB)\
> $(OutPutOpt) $(FDDAQ)
> @echo "$(FDDAQ) done"
>
>
> $(READTREE): $(READTREEO) $(FDEVENTO) $(PIXELO)
> $(LD) $(LDFLAGS) $(FDEVENTO) $(PIXELO) $(READTREEO) $(GLIBS) \
> $(OutPutOpt) $(READTREE)
> @echo "$(FDDAQ) done"
>
>
> $(FDEVENTSO): $(FDEVENTO) $(PIXELO)
>
> $(LD) $(SOFLAGS) $(LDFLAGS) $(FDEVENTO) $(PIXELO) $(OutPutOpt) $(FDEVENTSO)
>
> clean:
> @rm -f $(OBJS) *Dict.* core
>
> .SUFFIXES: .$(SrcSuf)
>
> ###
>
>
> FDDaqMain.$(SrcSuf): NICSocket.h FDEvent.h Pixel.h
>
> NICSocket.$(SrcSuf): NICSocket.h FDEvent.h Pixel.h
>
> Pixel.$(SrcSuf) : Pixel.h
>
> FDEvent.$(SrcSuf) : FDEvent.h Pixel.h
>
> FDEventDict.$(SrcSuf): FDEvent.h FDEventLinkDef.h
> @echo "Generating dictionary EventDict..."
> @$(ROOTSYS)/bin/rootcint -f FDEventDict.$(SrcSuf) -c \
> Pixel.h FDEvent.h FDEventLinkDef.h
>
>
> FDMon.$(SrcSuf) : FDMon.h NICSocket.h FDEvent.h Pixel.h
>
>
> .$(SrcSuf).$(ObjSuf):
> $(CXX) $(CXXFLAGS) -c $<
>
>
This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:21 MET