Re: Re: [ROOT] geant3_vmc undefined symbol: _ZN10TVirtualMC14DefineParticleEiPKc15TMCParticleTypeddd

From: Stefano Dusini <stefano.dusini_at_pd.infn.it>
Date: Thu, 23 Apr 2009 21:50:36 +0200


Yes with the long interface the problem is solved.

Thanks
Stefano

Ivana Hrivnacova wrote:
> Indeed, the long interface was added in order to provide
> all particle characteristics needed to define it in Geant4.
> We have now to remove the old method as, as you realized,
> it is not working properly anymore.
>
> Regards,
>
> Ivana
>
> Andrei Gheata wrote:

>> Yes, looks like the interface forces you to use the prototype with 
>> more parameters. Please try that one.
>>
>> regards,
>> Andrei
>>
>> Stefano Dusini wrote:
>>> But the geant3/TGeant3/TGeant3.cxx implementation is
>>>
>>>  //______________________________________________________________________ 
>>>
>>> Bool_t TGeant3::DefineParticle(Int_t pdg,const char* 
>>> name,TMCParticleType type,
>>>                       Double_t mass, Double_t charge, Double_t lifetime)
>>> {
>>> // Old function definition, now replaced with more arguments
>>>
>>>   TVirtualMC::DefineParticle(pdg, name, type, mass, charge, lifetime);
>>>
>>>   return false;
>>> }
>>>
>>> and so DefineParticle is undefined...
>>>
>>> regards, Stefano
>>>
>>> Andrei Gheata wrote:
>>>> Hi Stefano,
>>>>
>>>> In C++ when a function prototype has ' = 0' it means it is pure 
>>>> virtual, i.e. it is only an interface that has to be implemented 
>>>> mandatory by the derived classes. You can never instantiate an 
>>>> object of the base class type, but only the derived ones. You will 
>>>> find the method implementation in geant3/TGeant3/TGeant3.cxx for G3 
>>>> case. Of course it has to match the base class prototype.
>>>>
>>>> Cheers,
>>>> Andrei
>>>>
>>>> Stefano Dusini wrote:
>>>>> Hi Andrei
>>>>>
>>>>> but TVirtualMC::DefineParticle(pdg, name, type, mass, charge, 
>>>>> lifetime);
>>>>> dose not exist in ROOT there is only the prototype but the 
>>>>> implementation, or at least I did not find. At the moment I'm using 
>>>>> root_v5.23/02
>>>>>
>>>>> regards, Stefano
>>>>>
>>>>> Andrei Gheata wrote:
>>>>>> Hi Stefano,
>>>>>>
>>>>>> TVirtualMC is a root class (in vmc library) and defines the 2 
>>>>>> prototypes for the virtual function DefineParticle() that are 
>>>>>> implemented in the derived TGeant3 (a class in the G3 library). In 
>>>>>> your case apparently the TVirtualMC class version is not in sync 
>>>>>> with the TGeant3 one. Most likely you have to upgrade ROOT to at 
>>>>>> least 5.23/02 (as specified at 
>>>>>> http://root.cern.ch/drupal/content/how-use-virtual-monte-carlo#Download) 
>>>>>>
>>>>>>
>>>>>> Cheers,
>>>>>> Andrei
>>>>>>
>>>>>> Stefano Dusini wrote:
>>>>>>> I have check inside the code of geant3_vmc_1.10 and 
>>>>>>> DefineParticle has two implementation
>>>>>>>  //______________________________________________________________________ 
>>>>>>>
>>>>>>> Bool_t TGeant3::DefineParticle(Int_t pdg,const char* 
>>>>>>> name,TMCParticleType type,
>>>>>>>                       Double_t mass, Double_t charge, Double_t 
>>>>>>> lifetime)
>>>>>>> {
>>>>>>> // Old function definition, now replaced with more arguments
>>>>>>>
>>>>>>>   TVirtualMC::DefineParticle(pdg, name, type, mass, charge, 
>>>>>>> lifetime);
>>>>>>>
>>>>>>>   return false;
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>> //______________________________________________________________________ 
>>>>>>>
>>>>>>> Bool_t TGeant3::DefineParticle(Int_t pdg,const char* name, 
>>>>>>> TMCParticleType mcType,
>>>>>>>                       Double_t mass, Double_t charge, Double_t 
>>>>>>> lifetime,
>>>>>>>                       const TString& /*pType*/, Double_t /*width*/,
>>>>>>>                       Int_t /*iSpin*/, Int_t /*iParity*/, Int_t 
>>>>>>> /*iConjugation*/,
>>>>>>>                       Int_t /*iIsospin*/, Int_t /*iIsospinZ*/, 
>>>>>>> Int_t /*gParity*/,
>>>>>>>                       Int_t /*lepton*/, Int_t /*baryon*/,
>>>>>>>                       Bool_t /*stable*/, Bool_t /*shortlived*/,
>>>>>>>                       const TString& /*subType*/,
>>>>>>>                       Int_t /*antiEncoding*/, Double_t 
>>>>>>> /*magMoment*/,
>>>>>>>                       Double_t /*excitation*/)
>>>>>>> {
>>>>>>> //
>>>>>>> // Set a user defined particle
>>>>>>> // Function is ignored if particle with specified pdg
>>>>>>> // already exists and error report is printed.
>>>>>>> // ---
>>>>>>>
>>>>>>>   // Check if particle with specified pdg already exists
>>>>>>>   // in TGeant3
>>>>>>>   if (IdFromPDG(pdg) > 0) {
>>>>>>>     Error("SetParticle", "Particle already exists.");
>>>>>>>     return kFALSE;
>>>>>>>   }
>>>>>>>
>>>>>>>   // Check if particle type is known to Geant3
>>>>>>>   Int_t itrtyp = TransportMethod(mcType);
>>>>>>>   if (itrtyp < 0) {
>>>>>>>     Error("SetParticle", "Unknown particle transport.");
>>>>>>>     return kFALSE;
>>>>>>>   }
>>>>>>>
>>>>>>>   // Add particle to Geant3
>>>>>>>   Gspart(fNG3Particles++, name, itrtyp, mass, charge, lifetime);
>>>>>>>
>>>>>>>   // Add particle to TDatabasePDG
>>>>>>>   // (if it does not yet exist here)
>>>>>>>   if (!TDatabasePDG::Instance()->GetParticle(pdg))
>>>>>>>     TDatabasePDG::Instance()
>>>>>>>       ->AddParticle(name, name, mass, kTRUE, 0, charge*3,
>>>>>>>                     ParticleClass(mcType).Data(), pdg);
>>>>>>>
>>>>>>>   // Resize fPDGCode table if needed
>>>>>>>   if ( fNPDGCodes >= fPDGCode.GetSize() )
>>>>>>>     fPDGCode.Set( fPDGCode.GetSize() + 100);
>>>>>>>
>>>>>>>   fPDGCode[fNPDGCodes++] = pdg;
>>>>>>>
>>>>>>>   return kTRUE;
>>>>>>> }
>>>>>>>
>>>>>>> In my code I use the first implementation.
>>>>>>>
>>>>>>> To my understanding (sorry but I'm not a c++ expert) the first 
>>>>>>> one points to ROOT while the second not. I have check inside root 
>>>>>>> src code but I did not find any implementation of 
>>>>>>> TVirtualMC::DefineParticle only the definition in TVirtualMC.h.
>>>>>>>
>>>>>>> Do I have to use in my code the second implementation of 
>>>>>>> TGeant3::DefineParticle ?
>>>>>>>
>>>>>>> Thanks
>>>>>>> Stefano
>>>>>>> Andrei Gheata wrote:
>>>>>>>> Stefano, looks like your G3 compilation is inconsistent. Just 
>>>>>>>> refresh the geant3 directory and recompile it from scratch. Make 
>>>>>>>> also sure that the library you compile is the first one 
>>>>>>>> accessible in LD_LIBRARY_PATH in case you have multiple versions.
>>>>>>>>
>>>>>>>> Cheers,
>>>>>>>> Andrei
>>>>>>>>
>>>>>>>> Stefano Dusini wrote:
>>>>>>>>> Hi,
>>>>>>>>>
>>>>>>>>> I have recompiled root with
>>>>>>>>>
>>>>>>>>> --enable-pythia6 --with-pythia-libdir=$KITS_DIR/pythia6
>>>>>>>>>
>>>>>>>>> recompiled geant3_vmc_1.10
>>>>>>>>>
>>>>>>>>> but the keep crash with the same error
>>>>>>>>>
>>>>>>>>> /sps/opera/scratch/dusini/sw/OpRelease/3.1/OpSim/v7r4/Linux/opsim.exe: 
>>>>>>>>> symbol lookup error: 
>>>>>>>>> /sps/opera/scratch/dusini/sw/OpRelease_fluka/kits/geant3_vmc_1.10/lib/tgt_linux/libgeant321vmc.so: 
>>>>>>>>> undefined symbol: 
>>>>>>>>> _ZN10TVirtualMC14DefineParticleEiPKc15TMCParticleTypeddd
>>>>>>>>>
>>>>>>>>> This error occur at the point where I define a new particle
>>>>>>>>>
>>>>>>>>> //   DefineParticle(PDGCode, Name, Type, Mass, Charge, Lifetime)
>>>>>>>>> gMC->DefineParticle(kOpPDGDPlus, "OPERA D +", kPTMuon, 
>>>>>>>>> kOpMassDPlus, 1., 1e+12);
>>>>>>>>>
>>>>>>>>> where gMC is a TGeant3TGeo object.
>>>>>>>>>
>>>>>>>>> regards,
>>>>>>>>> Stefano
>>>>>>>>>
>>>>>>>>> Rene Brun wrote:
>>>>>>>>>> TMCParticle class is in libEGPythia6.
>>>>>>>>>> see top right corner of: 
>>>>>>>>>> http://root.cern.ch/root/html/TMCParticle.html
>>>>>>>>>>
>>>>>>>>>> Rene Brun
>>>>>>>>>>
>>>>>>>>>> Stefano Dusini wrote:
>>>>>>>>>>> I'm trying to upgrade our (OPERA) detector simulation 
>>>>>>>>>>> software to use ROOT v5.23 and therefore I have also upgraded 
>>>>>>>>>>> the geant3_vmc version to v1.10. I have also modify the code 
>>>>>>>>>>> to use TVirtualMC as the only interface to the MC 
>>>>>>>>>>> transportation code. But at run time I get this error
>>>>>>>>>>>
>>>>>>>>>>> /sps/opera/scratch/dusini/sw/OpRelease/3.1/OpSim/v7r4/Linux/opsim.exe: 
>>>>>>>>>>> symbol lookup error: 
>>>>>>>>>>> /sps/opera/scratch/dusini/sw/OpRelease_fluka/kits/geant3_vmc_1.10/lib/tgt_linux/libgeant321vmc.so: 
>>>>>>>>>>> undefined symbol: 
>>>>>>>>>>> _ZN10TVirtualMC14DefineParticleEiPKc15TMCParticleTypeddd
>>>>>>>>>>>
>>>>>>>>>>> In fact using
>>>>>>>>>>>
>>>>>>>>>>> nm -u libgeant321vmc.so
>>>>>>>>>>>
>>>>>>>>>>> I see that
>>>>>>>>>>>
>>>>>>>>>>> U _ZN10TVirtualMC14DefineParticleEiPKc15TMCParticleTypeddd
>>>>>>>>>>>
>>>>>>>>>>> where the U means (from nm man page) that the symbol is 
>>>>>>>>>>> undefined.
>>>>>>>>>>>
>>>>>>>>>>> What is wrong?
>>>>>>>>>>>
>>>>>>>>>>> The geant3_vmc library has been build just with
>>>>>>>>>>>
>>>>>>>>>>> gmake
>>>>>>>>>>>
>>>>>>>>>>> and the environmental variable $ROOTSYS pointing to the ROOT 
>>>>>>>>>>> v5.23 directory and $ROOTSYS/lib added to the 
>>>>>>>>>>> $LD_LIBRARY_PATH and $ROOTSYS/bin added to $PATH.
>>>>>>>>>>>
>>>>>>>>>>> Do I have to specify something else when I compile geant3_vmc?
>>>>>>>>>>> Do I have to use some special switch when I compile root?
>>>>>>>>>>>
>>>>>>>>>>> Thanks a lot
>>>>>>>>>>> Stefano
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>
>>>>>
>>>
>>>
>>
>>

>
-- 
__________________________________________________________________
Stefano Dusini, INFN Padova, Via Marzolo, 8 I-35131 Padova, Italy
Phones: +39-049-827-7312 +39-049-789-7676. Handy +39-348-8137991

Received on Thu Apr 23 2009 - 21:50:48 CEST

This archive was generated by hypermail 2.2.0 : Mon Jun 01 2009 - 23:25:01 CEST