Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

CandRmMu.cxx

Go to the documentation of this file.
00001 
00002 // $Id: CandRmMu.cxx,v 1.6 2008/09/17 02:56:19 tjyang Exp $
00003 //
00004 // CandRmMu
00005 //
00007 
00008 #include "TClass.h"
00009 #include "Algorithm/AlgHandle.h"
00010 #include "MuonRemoval/CandRmMu.h"
00011 #include "MuonRemoval/CandRmMuHandle.h"
00012 #include "MessageService/MsgService.h"
00013 #include "CandDigit/CandDigitHandle.h"
00014 #include "CandDigit/CandDigit.h"
00015 
00016 ClassImp(CandRmMu)
00017 
00018 //______________________________________________________________________
00019 CVSID("$Id: CandRmMu.cxx,v 1.6 2008/09/17 02:56:19 tjyang Exp $");
00020 
00021 //______________________________________________________________________
00022 CandRmMu::CandRmMu() 
00023   : shwvtxx(0),shwvtxy(0),shwvtxz(0),shwendx(0),shwendy(0),shwendz(0),
00024     shwvtxplane(0),shwendplane(0),shwnplane(0),shwcharge(0),
00025     vtxx(0),vtxy(0),vtxz(0),vtxdistance(0),endx(0),endy(0),endz(0),enddistance(0),
00026     vtxp(0),endp(0),npln(0),prng(0),pcrv(0),pvdx(0),pvdy(0), pvdz(0),zenith(0),azimuth(0),
00027     fitp(0),endc(0),pass(0),pmux(0),pmuy(0),pmuz(0),qp(0),
00028     mrmpmux(0),mrmpmuy(0),mrmpmuz(0),mrmQ2(0),mrmEshw(0),
00029     fOrigEvtIndex(-1),fMaxTrkPlane(0),
00030     fNMuonDig(0),fNMuonDigRetained(0),fNShwDig(0),fNShwDigRetained(0),
00031     fNShwDigAtVtx(0),fNShwDigRetainedAtVtx(0),fNShwPE(0),fNShwPERetained(0),
00032     fNShwPEAtVtx(0),fNShwPERetainedAtVtx(0),fNRetained(0),fNRetainedMuon(0),
00033     fNRetainedShw(0),fNRetainedBoth(0),fPERetained(0),fPERetainedMuon(0),
00034     fPERetainedShw(0),fPERetainedBoth(0),fNRejected(0),fNRejectedMuon(0),
00035     fNRejectedShw(0),fNRejectedBoth(0),fNRejShw(0),fNRejShwMaxTrk(0),
00036     fNRejShwFakeTrk(0),fNRejShwMix(0)
00037 {
00038   MSG("Cand", Msg::kDebug)
00039     << "Begin CandRmMu::CandRmMu() ctor: " << endl
00040     << "UidInt = " << GetUidInt()
00041     << ", ArchUidInt " << GetArchUidInt() << endl
00042     << "No. of links = " << GetNLinks() << endl
00043     << "End CandRmMu::CandRmMu() ctor." << endl;  
00044 }
00045 
00046 //______________________________________________________________________
00047 CandRmMu::CandRmMu(AlgHandle &ah) :
00048   CandBase(ah),     // Should be the next class up on inheritance chain
00049   shwvtxx(0),shwvtxy(0),shwvtxz(0),shwendx(0),shwendy(0),shwendz(0),
00050   shwvtxplane(0),shwendplane(0),shwnplane(0),shwcharge(0),
00051   vtxx(0),vtxy(0),vtxz(0),vtxdistance(0),endx(0),endy(0),endz(0),enddistance(0),
00052   vtxp(0),endp(0),npln(0),prng(0),pcrv(0),pvdx(0),pvdy(0),pvdz(0),zenith(0),azimuth(0),
00053   fitp(0),endc(0),pass(0),pmux(0),pmuy(0),pmuz(0),qp(0),
00054   mrmpmux(0),mrmpmuy(0),mrmpmuz(0),mrmQ2(0),mrmEshw(0),
00055   fOrigEvtIndex(-1),fMaxTrkPlane(0),
00056   fNMuonDig(0),fNMuonDigRetained(0),fNShwDig(0),fNShwDigRetained(0),
00057   fNShwDigAtVtx(0),fNShwDigRetainedAtVtx(0),fNShwPE(0),fNShwPERetained(0),
00058   fNShwPEAtVtx(0),fNShwPERetainedAtVtx(0),fNRetained(0),fNRetainedMuon(0),
00059   fNRetainedShw(0),fNRetainedBoth(0),fPERetained(0),fPERetainedMuon(0),
00060   fPERetainedShw(0),fPERetainedBoth(0),fNRejected(0),fNRejectedMuon(0),
00061   fNRejectedShw(0),fNRejectedBoth(0),fNRejShw(0),fNRejShwMaxTrk(0),
00062   fNRejShwFakeTrk(0),fNRejShwMix(0)
00063 {
00064 
00065 // The sole purpose of this constructor is to transmit the AlgHandle
00066 // up the inheritance chain to CandBase without having to invoke the
00067 // full constructor of an intermediate Candidate type which the highest
00068 // level Candidate might inherit from.  One only wants to create the
00069 // LocalHandle and invoke the RunAlg() method in the lowest level class.
00070 
00071 }
00072 
00073 //______________________________________________________________________
00074 CandRmMu::CandRmMu(AlgHandle &ah, CandHandle &ch,
00075                    CandContext &cx) :
00076   CandBase(ah),     // Should be the next class up on inheritance chain
00077   shwvtxx(0),shwvtxy(0),shwvtxz(0),shwendx(0),shwendy(0),shwendz(0),
00078   shwvtxplane(0),shwendplane(0),shwnplane(0),shwcharge(0),
00079   vtxx(0),vtxy(0),vtxz(0),vtxdistance(0),endx(0),endy(0),endz(0),enddistance(0),
00080   vtxp(0),endp(0),npln(0),prng(0),pcrv(0),pvdx(0),pvdy(0),pvdz(0),zenith(0),azimuth(0),
00081   fitp(0),endc(0),pass(0),pmux(0),pmuy(0),pmuz(0),qp(0),
00082   mrmpmux(0),mrmpmuy(0),mrmpmuz(0),mrmQ2(0),mrmEshw(0),
00083   fOrigEvtIndex(-1),fMaxTrkPlane(0),
00084   fNMuonDig(0),fNMuonDigRetained(0),fNShwDig(0),fNShwDigRetained(0),
00085   fNShwDigAtVtx(0),fNShwDigRetainedAtVtx(0),fNShwPE(0),fNShwPERetained(0),
00086   fNShwPEAtVtx(0),fNShwPERetainedAtVtx(0),fNRetained(0),fNRetainedMuon(0),
00087   fNRetainedShw(0),fNRetainedBoth(0),fPERetained(0),fPERetainedMuon(0),
00088   fPERetainedShw(0),fPERetainedBoth(0),fNRejected(0),fNRejectedMuon(0),
00089   fNRejectedShw(0),fNRejectedBoth(0),fNRejShw(0),fNRejShwMaxTrk(0),
00090   fNRejShwFakeTrk(0),fNRejShwMix(0)
00091 {
00092   CreateLocalHandle();
00093   MSG("Cand", Msg::kDebug)
00094        << "Begin CandRmMu::CandRmMu(AlgHandle &, CandHandle &, "
00095                                       << "CandContext &) ctor: " << endl
00096                                            << "UidInt = " << GetUidInt()
00097                            << ", ArchUidInt " << GetArchUidInt() << endl
00098                              << "No. of links = " << GetNLinks() << endl
00099          << "End CandRmMu::CandRmMu(AlgHandle &, CandHandle &, "
00100                                       << "CandContext &) ctor." << endl;
00101   
00102   // Run Algorithm to construct Candidate
00103   {                                                    // Start of scope
00104     CandRmMuHandle csh(this);            // csh will go out of scope
00105     ch = csh;                                       // after setting ch.
00106   }                                                      // End of scope
00107   ah.RunAlg(ch, cx);
00108 
00109 }
00110 
00111 //______________________________________________________________________
00112 CandRmMu::CandRmMu(const CandRmMu &rhs) :
00113   CandBase(rhs),    // Should be the next class up on inheritance chain
00114   shwvtxx(0),shwvtxy(0),shwvtxz(0),shwendx(0),shwendy(0),shwendz(0),
00115   shwvtxplane(0),shwendplane(0),shwnplane(0),shwcharge(0),
00116   vtxx(0),vtxy(0),vtxz(0),vtxdistance(0),endx(0),endy(0),endz(0),enddistance(0),
00117   vtxp(0),endp(0),npln(0),prng(0),pcrv(0),pvdx(0),pvdy(0),pvdz(0),zenith(0),azimuth(0),
00118   fitp(0),endc(0),pass(0),pmux(0),pmuy(0),pmuz(0),qp(0),
00119   mrmpmux(0),mrmpmuy(0),mrmpmuz(0),mrmQ2(0),mrmEshw(0),
00120   fOrigEvtIndex(-1),fMaxTrkPlane(0),
00121   fNMuonDig(0),fNMuonDigRetained(0),fNShwDig(0),fNShwDigRetained(0),
00122   fNShwDigAtVtx(0),fNShwDigRetainedAtVtx(0),fNShwPE(0),fNShwPERetained(0),
00123   fNShwPEAtVtx(0),fNShwPERetainedAtVtx(0),fNRetained(0),fNRetainedMuon(0),
00124   fNRetainedShw(0),fNRetainedBoth(0),fPERetained(0),fPERetainedMuon(0),
00125   fPERetainedShw(0),fPERetainedBoth(0),fNRejected(0),fNRejectedMuon(0),
00126   fNRejectedShw(0),fNRejectedBoth(0),fNRejShw(0),fNRejShwMaxTrk(0),
00127   fNRejShwFakeTrk(0),fNRejShwMix(0)
00128 {
00129 
00130   MSG("Cand", Msg::kDebug)
00131     << "Begin CandRmMu::CandRmMu(const CandRmMu &rhs) ctor:"
00132     << endl << "UidInt = " << GetUidInt()
00133     << ", ArchUidInt " << GetArchUidInt() << endl
00134     << "No. of links = " << GetNLinks() << endl
00135     << "End CandRmMu::CandRmMu(const CandRmMu &rhs) ctor."
00136     << endl;
00137 
00138   fReasonForKeeping.erase(fReasonForKeeping.begin(),
00139                           fReasonForKeeping.end());  
00140   TIter digitItr(rhs.GetDaughterIterator());
00141   while (const CandDigitHandle *digithandle =
00142          dynamic_cast<CandDigitHandle*>(digitItr())) {
00143     const CandDigit *digit = dynamic_cast<const CandDigit*> (digithandle->GetCandBase());
00144     fReasonForKeeping[digit] = rhs.fReasonForKeeping[digit];
00145   }
00146   
00147   shwvtxx = rhs.shwvtxx;
00148   shwvtxy = rhs.shwvtxy;
00149   shwvtxz = rhs.shwvtxz;
00150   shwendx = rhs.shwendx;
00151   shwendy = rhs.shwendy; 
00152   shwendz = rhs.shwendz;
00153   shwvtxplane = rhs.shwvtxplane; 
00154   shwendplane = rhs.shwendplane;
00155   shwnplane = rhs.shwnplane;
00156   shwcharge = rhs.shwcharge;
00157 
00158   vtxx = rhs.vtxx;
00159   vtxy = rhs.vtxy;
00160   vtxz = rhs.vtxz;
00161   vtxdistance = rhs.vtxdistance;
00162   endx = rhs.endx;
00163   endy = rhs.endy;
00164   endz = rhs.endz;
00165   enddistance = rhs.enddistance; 
00166   vtxp = rhs.vtxp;
00167   endp = rhs.endp;
00168   npln = rhs.npln;
00169   prng = rhs.prng;
00170   pcrv = rhs.pcrv;
00171   pvdx = rhs.pvdx;
00172   pvdy = rhs.pvdy;
00173   pvdz = rhs.pvdz;
00174   zenith = rhs.zenith;
00175   azimuth = rhs.azimuth; 
00176   fitp = rhs.fitp;
00177   endc = rhs.endc;
00178   pass = rhs.pass;
00179   pmux = rhs.pmux;
00180   pmuy = rhs.pmuy;
00181   pmuz = rhs.pmuz;
00182   qp = rhs.qp;
00183   mrmpmux = rhs.mrmpmux;
00184   mrmpmuy = rhs.mrmpmuy;
00185   mrmpmuz = rhs.mrmpmuz;
00186   mrmQ2 = rhs.mrmQ2;
00187   mrmEshw = rhs.mrmEshw;
00188   fOrigEvtIndex = rhs.fOrigEvtIndex;
00189   fMaxTrkPlane = rhs.fMaxTrkPlane;
00190   fNMuonDig = rhs.fNMuonDig;
00191   fNMuonDigRetained = rhs.fNMuonDigRetained;
00192   fNShwDig = rhs.fNShwDig;
00193   fNShwDigRetained = rhs.fNShwDigRetained;
00194   fNShwDigAtVtx = rhs.fNShwDigAtVtx;
00195   fNShwDigRetainedAtVtx = rhs.fNShwDigRetainedAtVtx;
00196   fNShwPE = rhs.fNShwPE;
00197   fNShwPERetained = rhs.fNShwPERetained;
00198   fNShwPEAtVtx = rhs.fNShwPEAtVtx;
00199   fNShwPERetainedAtVtx = rhs.fNShwPERetainedAtVtx;
00200   fNRetained = rhs.fNRetained;
00201   fNRetainedMuon = rhs.fNRetainedMuon;
00202   fNRetainedShw = rhs.fNRetainedShw;
00203   fNRetainedBoth = rhs.fNRetainedBoth;
00204   fPERetained = rhs.fPERetained;
00205   fPERetainedMuon = rhs.fPERetainedMuon;
00206   fPERetainedShw = rhs.fPERetainedShw;
00207   fPERetainedBoth = rhs.fPERetainedBoth;
00208   fNRejected = rhs.fNRejected;
00209   fNRejectedMuon = rhs.fNRejectedMuon;
00210   fNRejectedShw = rhs.fNRejectedShw;
00211   fNRejectedBoth = rhs.fNRejectedBoth;
00212   fNRejShw = rhs.fNRejShw;
00213   fNRejShwMaxTrk = rhs.fNRejShwMaxTrk;
00214   fNRejShwFakeTrk = rhs.fNRejShwFakeTrk;
00215   fNRejShwMix = rhs.fNRejShwMix;
00216 }
00217 
00218 //______________________________________________________________________
00219 CandRmMu::~CandRmMu()
00220 {
00221   MSG("Cand", Msg::kDebug)
00222                  << "Begin CandRmMu::~CandRmMu() dtor: " << endl
00223                                            << "UidInt = " << GetUidInt()
00224                            << ", ArchUidInt " << GetArchUidInt() << endl
00225                              << "No. of links = " << GetNLinks() << endl
00226                    << "End CandRmMu::~CandRmMu() dtor." << endl;
00227 
00228 }
00229 
00230 //______________________________________________________________________
00231 void CandRmMu::CreateLocalHandle()
00232 {
00233   SetLocalHandle(new CandRmMuHandle(this));
00234 }
00235 
00236 //______________________________________________________________________
00237 CandRmMu *CandRmMu::Dup() const
00238 {
00239 
00240 // Base copy ctor dups owned pointers, but defers copying Daughter List.
00241 // Daughter List copy is made in the derived class Dup() function.
00242 // This is because base class copy constructor hasn't yet created
00243 // fLocalHandle with a CandHandle* of the full derived type.
00244   CandRmMu *cb = new CandRmMu(*this);     // Copy-ctor dups ptrs
00245   cb->CreateLocalHandle();   // Initializes fLocalHandle after copy-ctor
00246   TIter iterdau = GetDaughterIterator();
00247   CandHandle *dau;
00248   while ((dau=(CandHandle *) iterdau())) cb->AddDaughterLink(*dau);
00249   return cb;
00250 }
00251 
00252 //______________________________________________________________________
00253 Bool_t CandRmMu::IsEquivalent(const TObject *rhs) const
00254 {
00255   if (!CandBase::IsEquivalent(rhs)) return false; // superclass test
00256   TestDisplayCandBanner("CandRmMu");
00257   const CandRmMu* rCnd = dynamic_cast<const CandRmMu*>(rhs);
00258   if (rCnd == NULL) return false;
00259 
00260   if(!TestEquality("fReasonForKeeping",
00261                    this->fReasonForKeeping,
00262                    rCnd->fReasonForKeeping)) return false;
00263  
00264   if(dynamic_cast<const CandRmMu*>(rhs)->shwvtxx!=shwvtxx) return false;
00265   if(dynamic_cast<const CandRmMu*>(rhs)->shwvtxy!=shwvtxy) return false;
00266   if(dynamic_cast<const CandRmMu*>(rhs)->shwvtxz!=shwvtxz) return false;
00267   if(dynamic_cast<const CandRmMu*>(rhs)->shwendx!=shwendx) return false;
00268   if(dynamic_cast<const CandRmMu*>(rhs)->shwendy!=shwendy) return false;
00269   if(dynamic_cast<const CandRmMu*>(rhs)->shwendz!=shwendz) return false;
00270   if(dynamic_cast<const CandRmMu*>(rhs)->shwvtxplane!=shwvtxplane) return false;
00271   if(dynamic_cast<const CandRmMu*>(rhs)->shwendplane!=shwendplane) return false;
00272   if(dynamic_cast<const CandRmMu*>(rhs)->shwnplane!=shwnplane) return false;
00273   if(dynamic_cast<const CandRmMu*>(rhs)->shwcharge!=shwcharge) return false; 
00274 
00275   if(dynamic_cast<const CandRmMu*>(rhs)->vtxx!=vtxx) return false;
00276   if(dynamic_cast<const CandRmMu*>(rhs)->vtxy!=vtxy) return false;
00277   if(dynamic_cast<const CandRmMu*>(rhs)->vtxz!=vtxz) return false;
00278   if(dynamic_cast<const CandRmMu*>(rhs)->vtxdistance!=vtxdistance) return false;
00279   if(dynamic_cast<const CandRmMu*>(rhs)->endx!=endx) return false;
00280   if(dynamic_cast<const CandRmMu*>(rhs)->endy!=endy) return false;
00281   if(dynamic_cast<const CandRmMu*>(rhs)->endz!=endz) return false;
00282   if(dynamic_cast<const CandRmMu*>(rhs)->enddistance!=enddistance) return false;
00283   if(dynamic_cast<const CandRmMu*>(rhs)->vtxp!=vtxp) return false;
00284   if(dynamic_cast<const CandRmMu*>(rhs)->endp!=endp) return false;
00285   if(dynamic_cast<const CandRmMu*>(rhs)->npln!=npln) return false;
00286   if(dynamic_cast<const CandRmMu*>(rhs)->prng!=prng) return false;
00287   if(dynamic_cast<const CandRmMu*>(rhs)->pcrv!=pcrv) return false;
00288   if(dynamic_cast<const CandRmMu*>(rhs)->pvdx!=pvdx) return false;
00289   if(dynamic_cast<const CandRmMu*>(rhs)->pvdy!=pvdy) return false;
00290   if(dynamic_cast<const CandRmMu*>(rhs)->pvdz!=pvdz) return false;
00291   if(dynamic_cast<const CandRmMu*>(rhs)->zenith!=zenith)   return false;
00292   if(dynamic_cast<const CandRmMu*>(rhs)->azimuth!=azimuth) return false;
00293   if(dynamic_cast<const CandRmMu*>(rhs)->fitp!=fitp) return false;
00294   if(dynamic_cast<const CandRmMu*>(rhs)->endc!=endc) return false;
00295   if(dynamic_cast<const CandRmMu*>(rhs)->pass!=pass) return false;
00296   if(dynamic_cast<const CandRmMu*>(rhs)->pmux!=pmux) return false;
00297   if(dynamic_cast<const CandRmMu*>(rhs)->pmuy!=pmuy) return false;
00298   if(dynamic_cast<const CandRmMu*>(rhs)->pmuz!=pmuz) return false;
00299   if(dynamic_cast<const CandRmMu*>(rhs)->qp!=qp) return false;
00300   if(dynamic_cast<const CandRmMu*>(rhs)->mrmpmux!=mrmpmux) return false;
00301   if(dynamic_cast<const CandRmMu*>(rhs)->mrmpmuy!=mrmpmuy) return false;
00302   if(dynamic_cast<const CandRmMu*>(rhs)->mrmpmuz!=mrmpmuz) return false;
00303   if(dynamic_cast<const CandRmMu*>(rhs)->mrmQ2!=mrmQ2) return false;
00304   if(dynamic_cast<const CandRmMu*>(rhs)->mrmEshw!=mrmEshw) return false;
00305   if(dynamic_cast<const CandRmMu*>(rhs)->fOrigEvtIndex!=fOrigEvtIndex) return false;
00306   if(dynamic_cast<const CandRmMu*>(rhs)->fMaxTrkPlane!=fMaxTrkPlane) return false;
00307   if(dynamic_cast<const CandRmMu*>(rhs)->fNMuonDig!=fNMuonDig) return false;
00308   if(dynamic_cast<const CandRmMu*>(rhs)->fNMuonDigRetained!=fNMuonDigRetained) return false;
00309   if(dynamic_cast<const CandRmMu*>(rhs)->fNShwDig!=fNShwDig) return false;
00310   if(dynamic_cast<const CandRmMu*>(rhs)->fNShwDigRetained!=fNShwDigRetained) return false;
00311   if(dynamic_cast<const CandRmMu*>(rhs)->fNShwDigAtVtx!=fNShwDigAtVtx) return false;
00312   if(dynamic_cast<const CandRmMu*>(rhs)->fNShwDigRetainedAtVtx!=fNShwDigRetainedAtVtx) return false;
00313   if(dynamic_cast<const CandRmMu*>(rhs)->fNShwPE!=fNShwPE) return false;
00314   if(dynamic_cast<const CandRmMu*>(rhs)->fNShwPERetained!=fNShwPERetained) return false;
00315   if(dynamic_cast<const CandRmMu*>(rhs)->fNShwPEAtVtx!=fNShwPEAtVtx) return false;
00316   if(dynamic_cast<const CandRmMu*>(rhs)->fNShwPERetainedAtVtx!=fNShwPERetainedAtVtx) return false;
00317   if(dynamic_cast<const CandRmMu*>(rhs)->fNRetained!=fNRetained) return false;
00318   if(dynamic_cast<const CandRmMu*>(rhs)->fNRetainedMuon!=fNRetainedMuon) return false;
00319   if(dynamic_cast<const CandRmMu*>(rhs)->fNRetainedShw!=fNRetainedShw) return false;
00320   if(dynamic_cast<const CandRmMu*>(rhs)->fNRetainedBoth!=fNRetainedBoth) return false;
00321   if(dynamic_cast<const CandRmMu*>(rhs)->fPERetained!=fPERetained) return false;
00322   if(dynamic_cast<const CandRmMu*>(rhs)->fPERetainedMuon!=fPERetainedMuon) return false;
00323   if(dynamic_cast<const CandRmMu*>(rhs)->fPERetainedShw!=fPERetainedShw) return false;
00324   if(dynamic_cast<const CandRmMu*>(rhs)->fPERetainedBoth!=fPERetainedBoth) return false;
00325   if(dynamic_cast<const CandRmMu*>(rhs)->fNRejected!=fNRejected) return false;
00326   if(dynamic_cast<const CandRmMu*>(rhs)->fNRejectedMuon!=fNRejectedMuon) return false;
00327   if(dynamic_cast<const CandRmMu*>(rhs)->fNRejectedShw!=fNRejectedShw) return false;
00328   if(dynamic_cast<const CandRmMu*>(rhs)->fNRejectedBoth!=fNRejectedBoth) return false;
00329   if(dynamic_cast<const CandRmMu*>(rhs)->fNRejShw!=fNRejShw) return false;
00330   if(dynamic_cast<const CandRmMu*>(rhs)->fNRejShwMaxTrk!=fNRejShwMaxTrk) return false;
00331   if(dynamic_cast<const CandRmMu*>(rhs)->fNRejShwFakeTrk!=fNRejShwFakeTrk) return false;
00332   if(dynamic_cast<const CandRmMu*>(rhs)->fNRejShwMix!=fNRejShwMix) return false;
00333 
00334   return true;
00335 }
00336 
00337 //______________________________________________________________________
00338 CandRmMuHandle CandRmMu::MakeCandidate(AlgHandle &ah,
00339                                                         CandContext &cx)
00340 {
00341   CandRmMuHandle csh;
00342   new CandRmMu(ah, csh, cx);        // csh owns the new CandRmMu
00343   return csh;
00344 }
00345 

Generated on Mon Feb 15 11:06:28 2010 for loon by  doxygen 1.3.9.1