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