RE: [ROOT] Internal error

From: Philippe Canal (pcanal@fnal.gov)
Date: Wed Aug 20 2003 - 00:54:37 MEST


Hi,

>From the look of it you might be missing some implementation in Event.h
Since I do not have your Event.h file, I was unable to reproduce any
problem.

You macro is complex/long and use STL container, I strongly recommend that
you load it with ACLiC rather than the pure interpreter.

To debug your problem you could also try to do:

	root [] .trace
	root [] .L mymacro.C
etc.. to see where it fails.

Cheers,
Philippe.


-----Original Message-----
From: owner-roottalk@pcroot.cern.ch
[mailto:owner-roottalk@pcroot.cern.ch]On Behalf Of Erdinc Ulas Saka
Sent: Tuesday, August 19, 2003 8:14 AM
To: roottalk@pcroot.cern.ch
Subject: [ROOT] Internal error


Hi rooters:

When I execute m y macro,I get following  error message:

Internal error: template function call operator== failedInternal error:
template function call operator== failed FILE:function.h line 23
Error: Event() no default constructor FILE:/home/usaka/Cosmo/macros/gap.C
LINE:131

thanks and many regards
Ulas


here is my macro :


#include <list>
#include <iomanip>
#include <cmath>
#include <iostream>

#include <TTree.h>
#include <TFile.h>
#include <TH1F.h>

#include "event/Event.h"

void match(std::list<Event>& events, const char* out, const char*
p2file="p2file.root", const char* p4file="p4file.root");


void gap(const char* p2file, const char* p4file, const char* out)
{
  // Merge the events at P4 an P2 putting them into a list
  std::cout.setf(std::ios::fixed, std::ios::floatfield);
  std::cout << std::setprecision(9);

  // Open the P2 file
  TFile* p2 = new TFile(p2file);
  // Read the TTree
  TTree* p2Tree = (TTree*)p2->Get("Events");
  // Set the branch address
  Event* p2ev = 0;
  p2Tree->SetBranchAddress("event", &p2ev);

  // Make a list of events
  std::list<Event> p2events;
  std::list<Event> p4events;

  // Read the events at P2
  p2->cd();
  std::cout<<"File : "<<p2->GetName()<<'\n';
  for (Int_t i = 0; i < p2Tree->GetEntries(); i++ ) {
    p2Tree->GetEntry(i);
    p2events.push_back(*p2ev);
    if ( i < 138299) std::cout<<*p2ev;
  }
  // Print the contents of the list
  std::cout<<"P2 events : "<<p2events.size()<<'\n';
  // Sort the std:;list
  p2events.sort();

  // Open the P4 file
  //TFile* p4 = new TFile("/home/acorde/Data/P4/09/run01690.root");
  TFile* p4 = new TFile(p4file);
  // Read the TTree
  TTree* p4Tree = (TTree*)p4->Get("Events");
  // Set the branch address
  Event* p4ev = 0;
  p4Tree->SetBranchAddress("event", &p4ev);

  // read the events at P4
  p4->cd();
  std::cout<<"File : "<<p4->GetName()<<'\n';
  for (Int_t i = 0; i < p4Tree->GetEntries(); i++ ) {
    p4Tree->GetEntry(i);
    p4events.push_back(*p4ev);
    if ( i < 20000) std::cout<<*p4ev;
  }
  // Print the contents of the list
  std::cout<<"P4 events : "<<p4events.size()<<'\n';
  // Sort the list
  p4events.sort();

  // Delete the above files
  delete p4;
  delete p2;

  std::list<Event> events = p4events;
  // Merge the events
  events.merge(p2events);

  std::cout<<"First event: " <<events.front();
  std::cout<<"Last event: "<<events.back();
  std::cout<<"Total events: "<<events.size()<<'\n';

  match(events, out);
}

void match(std::list<Event>& events, const char* out, const char* p2file,
const char* p4file)
{
  // Book the histograms
  TH1F* hgap1 = new TH1F("gap1", "Time gap (seconds)",      200, 0,   2);
  TH1F* hgap2 = new TH1F("gap2", "Time gap (seconds)",      400, 0,   2);
  TH1F* hgap3 = new TH1F("gap3", "Time gap (milliseconds)", 100, 0, 100);
  TH1F* hgap4 = new TH1F("gap4", "Time gap (milliseconds)", 100, 0,  10);
  TH1F* hgap5 = new TH1F("gap5", "Time gap (milliseconds)", 100, 0,   1);
  TH1F* hgap6 = new TH1F("gap64", "Time gap (microseconds)",  10, 0, 100);
  TH1F* hgap7 = new TH1F("gap7", "Time gap (microseconds)",   5, 0,  50);
  TH1F* hgap8 = new TH1F("gap8", "Time gap (microseconds)",   2, 0,  20);

  // Create the files with the selected events.
  TFile* p2 = new TFile(p2file, "RECREATE");
  Event* p2event = new Event;
  TTree* p2tree = new TTree("Events", "P2 selected events");
  p2tree->Branch("event", "Event", &p2event);

  TFile* p4 = new TFile(p4file, "RECREATE");
  Event* p4event = new Event;
  TTree* p4tree = new TTree("Events", "P4 selected events");
  p4tree->Branch("event", "Event", &p4event);


  std::list<Event>::iterator event = events.begin();
  Double_t gap = 0;
  int counts = 0;
  int countsgap = 0;

  while ( event != events.end() ) {
    std::list<Event>::iterator previous = event;
    if ( ++event != events.end() ) {

      if ( !( (counts++)%100000) ) std::cout<<"event: "<<counts<<'\n';

      if ( (*event).GetEventType() != (*previous).GetEventType() ) {
	countsgap++;

	// this is the kind of events that we need.
	// The situtation is the following
	// --event==(previous) is a event on a different site than the
event
	// than "event", now, you only need to check if the next event
	// is at different site.
	std::list<Event>::iterator next = event;

	if ( ++next != events.end() ) {

	  Event temp2;
	  Event temp4;
	  if ( (*next).GetEventType() != (*event).GetEventType() ) {

	    special++;
	    // this is an event on a different site, so you now have the
	    // folowing:
	    //
	    // previous and next are iterators to events in the
	    // same site, and event is an event on the other site
	    // and the only choices that we have are
	    //       event - previous
	    // or
	    //       next - event
	    //
	    //cout<<*event - *previous<<", "<<*next -
*event<<","<<index<<'\n';
	    //index++;
	    gap = TMath::Min( *event - *previous, *next - *event);

	    if ( (*next - *event) < (*event - *previous) ) {
	      // *next and *event are the nearest events.
	      // Check wich one was at P2
	      if ( (*event).GetEventType() == kP2 ) {
		temp2 = *event;
		temp4 = *next;
	      } else {
		temp2 = *next;
		temp4 = *event;
	      }
	      // Advance the iterator to not count double the *next event
	      next++;
	    } else {
	      // *event and *previous are the nearest events
	      // Check wich one was at P2
	      if ( (*event).GetEventType() == kP2 ) {
		temp2 = *event;
		temp4 = *previous;
	      } else {
		temp2 = *previous;
		temp4 = *event;
	      }
	    }

	  } else {s
	    // This is the case where we have more events in betwen
	    // than the other site in this moment
	    // so, the minimum time gap is
	    //        event - previous
	    //
	    //cout<<*event - *previous<<", "<<index<<'\n';
	    //index++;
	    gap = *event - *previous;
	    // Check wich one was at P2
	    if ( (*event).GetEventType() == kP2 ) {
	      temp2 = *event;
	      temp4 = *previous;
	    } else {
	      temp2 = *previous;
	      temp4 = *event;
	    }

	  }
	  hgap1->Fill(gap);
	  hgap2->Fill(gap);
	  // Round the time gap
	  double temp = rint(gap*1000000); // Microseconds scale
	  if ( gap <= 0.1     ) hgap3->Fill(gap*1000);   // 0-100
milliseconds
	  if ( gap <= 0.01    ) hgap4->Fill(gap*1000);   // 0-10
milliseconds
	  if ( gap <= 0.001   ) hgap5->Fill(gap*1000);   // 0-1
milliseconds
	  if ( temp <= 100    ) {
	    hgap6->Fill(temp); // 0-100 microseconds
	    // Save the events
	    p2->cd();
	    p2event = new Event(temp2);
	    p2tree->Fill();

	    p4->cd();
	    p4event = new Event(temp4);
	    p4tree->Fill();

	  }
	  if ( temp <= 50     ) hgap7->Fill(temp); // 0-50 microseconds
	  if ( temp <= 20     ) hgap8->Fill(temp); // 0-20 microseconds
	  event = next;

	  if (special >= 100 ) break;

	} // end of if ( ++next != last ) {

      } // end of if ( event != previous ) {

    } // end of if ( ++event != events.end() ) {

  } // end of while ( event != events.end() ) {

  TFile* f = new TFile(out, "RECREATE");
  f->cd();
  hgap1->Write();
  hgap2->Write();
  hgap3->Write();
  hgap4->Write();
  hgap5->Write();
  hgap6->Write();
  hgap7->Write();
  hgap8->Write();

  delete f;
  std::cout<<"Event: "<<countsgap<<'\n';

  // Write the files
  p2->cd();
  std::cout<<"Selected events at P2: "<<p2tree->GetEntries()<<'\n';
  p2tree->Write();
  delete p2;

  p4->cd();
  std::cout<<"Selected events at P4: "<<p4tree->GetEntries()<<'\n';
  p4tree->Write();
  delete p4;
}



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:14 MET