Re: strange macro behaviour

From: Rene Brun (Rene.Brun@cern.ch)
Date: Tue Sep 15 1998 - 23:09:53 MEST


Thierry,
In your macro below, I assume that you have dynamically linked
the CLHEP shared library.
If not, then clearly your macro cannot work.
If yes, then I do not understand why CINT complains at the line:

             HepLorentzVector proton_out((Double_t)tproton->Px(),
I see, however, a possible problem in your macro. You should change:
   TClasEvent      *event;
to
   TClasEvent      *event = 0;

Now a general hint about tracing problems in CINT macros.
I realize that not many people know that by simply activating
the CINT trace option, you can discover a lot of problems.
To activate the trace option, in a ROOT session, just type .T at
the Root prompt:
  Root > .T
CINT also includes a step by step debugger (style dbx/gdb).

I would like to know, in your particular example, where Root crashes.
Send me the log file generated by the ".T" activation.

Rene Brun



T Auger wrote:
> 
> Hi Rooters,
> we observed a strange behaviour in one of our macro using CLHEP. The
> macro processed once failed at the byte-compilation and gave a break
> seg fault. Then just hiting return made it work! Could someone give me
> a hint on what we are doing wrong or is this a bug?
> (the macro follows the prints).
> cheers,
> Thierry.
> 
> root [0] .x phi.C
> Error: non class,struct,union object $proton_out used with . or ->
> FILE:/home/crash17/marchand/root/macro/./phi.C LINE:83
> alors 0
> nmatch 2
> nmatch 0
> nmatch 0
> nmatch 1
>  proton 0.000000
> nmatch 1
>  proton 0.000000
> nmatch 1
>  proton 0.000000
> nmatch 1
>  proton 0.000000
> nmatch 1
>  proton 0.000000
> nmatch 2
> nmatch 0
> nmatch 1
>  proton 0.000000
> 
>  *** Break *** segmentation violation
> 
> alors 0
> nmatch 2
> nmatch 0
> nmatch 0
> nmatch 1
>  proton 1.008929
> nmatch 1
>  proton 0.984921
> nmatch 1
>  proton 1.515583
> nmatch 1
>  proton 1.088752
> nmatch 1
>  proton 1.352676
> nmatch 2
> nmatch 0
> nmatch 1
>  proton 1.114028
> nmatch 0
> nmatch 1
>  proton 1.449203
> nmatch 1
>  proton 1.760664
> nmatch 0
> nmatch 1
>  proton 1.586831
> nmatch 1
>  proton 1.116349
> nmatch 1
>  proton 1.130289
> nmatch 4
> nmatch 1
>  proton 1.148586
> nmatch 0
> nmatch 1
>  proton 0.969677
> nmatch 1
>  proton 1.014140
> 
> {
> //
> // macro pour lire un tree et looper sur les particules chargees
> // histogramme la masse apres notre pid.
> //
> gROOT->Reset();
> TFile f("/home/crash17/marchand/root/macro/g6-opp.root");
> 
>    TTree *T = (TTree*)gDirectory->Get("T");
> //Declaration of leaves types
>    TClasEvent      *event;
>    class HepLorentzVector;
> 
> TH1F histo1("histo1","mass",100,-0.5,1.5);
> TH1F histo2("histo2","mass kaon m",150,-1.,1.5);
> 
> //Set branch addresses
>    T->SetBranchAddress("event",&event);
>    Int_t nentries = T->GetEntries();
>    nentries = 1000000;
>    TClonesArray *tab;
>    Int_t nbytes = 0;
>    TTrack *track;
>    TTrack *tproton;
>    TTrack *tkaonp;
>    Int_t npro = 0;
>    Int_t nkp = 0;
>    Int_t indkp[10] = {0,0,0,0,0,0,0,0,0,0};
>    Int_t indpro[10] = {0,0,0,0,0,0,0,0,0,0};
>    Int_t iseckp[10] = {0,0,0,0,0,0,0,0,0,0};
>    Int_t isecpro[10] = {0,0,0,0,0,0,0,0,0,0};
> 
> 
>    for (Int_t i=0; i<nentries;i++) {
>      nbytes += T->GetEvent(i);
> 
>      tab = event->GetDetectedTracks();
>      Float_t egamma = event->GetE();
> 
>     HepLorentzVector photon(0,0,egamma,egamma);
>     HepLorentzVector proton_in(0,0,0,0.93827);
>           npro = 0;
>           nkp = 0;
>         for(Int_t j=0;j<=tab->GetLast();j++) {
>          track = (TTrack*)tab->At(j);
> 
> //       recuperer les protons et K+ en gardant leur index
>          if(track->Id()==2212) {
>          indpro[npro] = j;
>          isecpro[npro] = track->GetSectorId();
>          npro++;
>          }
>          if(track->Id()==321) {
>          indkp[nkp] = j;
>          iseckp[nkp] = track->GetSectorId();
>          nkp++;
>          }
>          histo1->Fill(track->GetMass());
>         }
> 
> //     printf("nproton %d nkaonp %d\n",npro,nkp);
> 
>      if(nkp*npro>=1) {
> 
> //       test sur secteurs opposes p-K+
>          Int_t nmatch = 0;
>          for(Int_t k=0;k<npro;k++) {
>             for(Int_t l=0;l<nkp;l++) {
>                if(fabs(isecpro[k]-iseckp[l])==3) {
>                   Int_t indprs=indpro[k];
>                   Int_t indkps=indkp[l];
>                   nmatch++;
>                }
>             }
>          }
> 
>          if(nmatch==1) printf("nmatch %d\n",nmatch);
>          if(nmatch==1){
>              tproton = (TTrack*)tab->At(indprs);
> //       printf("%f %f %f %f\n",tproton->Px(),tproton->Py(),tproton->Pz(),tproton->E_id());
>              HepLorentzVector proton_out((Double_t)tproton->Px(),
>                                         (Double_t)tproton->Py(),
>                                         (Double_t)tproton->Pz(),
>                                         (Double_t)tproton->E_id());
>              tkaonp = (TTrack*)tab->At(indkps);
> //             printf(" proton %f\n",proton_out.e());
>              HepLorentzVector kaonp(tkaonp->Px(),tkaonp->Py(),tkaonp->Pz(),tkaonp->E_id());
>             kaonm=photon+proton_in-proton_out-kaonp;
>             histo2->Fill(kaonm.mag2());
>          }
>      }
> 
>      event->Clear();
>      if(i%5000 == 0) printf("alors %d\n",i);
>   }
> 
> }



This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:34:37 MET