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

From: Stefano Dusini <stefano.dusini_at_pd.infn.it>
Date: Wed, 22 Apr 2009 15:49:15 +0200


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 Wed Apr 22 2009 - 15:49:17 CEST

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