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
>>>>>>
>>>>>
>>>>>
>>>
>>>
>
>
Received on Wed Apr 22 2009 - 15:01:03 CEST