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

From: Andrei Gheata <Andrei.Gheata_at_cern.ch>
Date: Wed, 22 Apr 2009 14:36:54 +0200


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
>>>>
>>>
>>>

>
>
Received on Wed Apr 22 2009 - 14:36:56 CEST

This archive was generated by hypermail 2.2.0 : Wed Apr 22 2009 - 17:25:01 CEST