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)
{
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-8137991Received on Wed Apr 22 2009 - 15:49:17 CEST
- application/x-pkcs7-signature attachment: S/MIME Cryptographic Signature
This archive was generated by hypermail 2.2.0 : Wed Apr 22 2009 - 17:25:01 CEST