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

SwimObj3.cxx

Go to the documentation of this file.
00001 #include <iostream>
00002 #include <string>
00003 
00004 #include "TObjArray.h"
00005 
00006 #include "CandFitTrackSR/BFieldSR.h"
00007 #include "CandFitTrack3/SwimObj3.h"
00008 #include "Swimmer/SwimGeo.h"
00009 #include "Swimmer/SwimSwimmer.h"
00010 #include "Swimmer/SwimStepper.h"
00011 #include "Swimmer/SwimPrintStepAction.h"
00012 #include "Swimmer/SwimParticle.h"
00013 #include "Swimmer/SwimZCondition.h"
00014 #include "Swimmer/SwimPlaneInterface.h"
00015 #include "TVector3.h"                 
00016 #include "Conventions/Munits.h"
00017 #include "RerootExodus/RerootExodus.h"
00018 #include "UgliGeometry/UgliGeomHandle.h"
00019 #include "UgliGeometry/UgliScintPlnHandle.h"
00020 #include "UgliGeometry/UgliSteelPlnHandle.h"
00021 #include "Validity/VldContext.h"
00022 #include "MessageService/MsgService.h"
00023 #include "Conventions/MinosMaterial.h"
00024 #include <cassert>
00025 #include <cmath>
00026 #include "TMath.h"
00027 
00028 
00029 static const Double_t radfe=13.84e-2;
00030 static const Double_t radsc=43.8e-2;
00031 static const Double_t radair=30420e-2;
00032 
00033 static const MinosMaterial::StdMaterial_t fmatSc=MinosMaterial::ePolystyreneMinos;
00034 static const MinosMaterial::StdMaterial_t fmatSteel=MinosMaterial::eIronMinos;
00035 
00036 static const Double_t rhofe=MinosMaterial::Density(fmatSteel)*1e3; // used to be 7.87e3;
00037 
00038 static const Double_t rhosc=MinosMaterial::Density(fmatSc)*1e3; // used to be 0.86e3 or 1.032e3 as in Roys code
00039 
00040 static const Double_t rhoair=1.2;
00041 
00042 
00043 //______________________________________________________________________
00044 CVSID("$Id: SwimObj3.cxx,v 1.7 2008/06/02 16:00:40 rhatcher Exp $");
00045 
00046 //______________________________________________________________________
00047 SwimObj3::SwimObj3(Double_t u,Double_t v,Double_t z,Double_t dudz,Double_t dvdz,Double_t qp,Int_t izfor,const VldContext *vldc)
00048 {
00049    MSG("FitTrack3",Msg::kVerbose)
00050         << "SwimObj3::SwimObj3( "
00051         << "u= "  << u << " , "
00052         << "v= "  << v << " , "
00053         << "z= "  << z << " , "
00054         << "dudz= "  << dudz << " , "
00055         << "dvdz= "  << dvdz << " , "
00056         << "qp= "  << qp << " , "
00057         << "izfor= "  << izfor << endl;
00058       
00059       
00060 
00061 
00062   fu = u;
00063   fv = v;
00064   fz = z;
00065   fdudz = dudz;
00066   fdvdz = dvdz;
00067   fqp = qp;
00068   fizfor = izfor;
00069   
00070   fTfe=0;
00071   fTair=0;
00072   fTsc=0;
00073 
00074   fvldc = const_cast<VldContext*>(vldc);
00075   fugh = new UgliGeomHandle(*fvldc);
00076 
00077   Int_t iplnmax = 0;
00078   Int_t iplngap0 = 9999;
00079   Int_t iplngap1 = -1;
00080   switch(fvldc->GetDetector()) {
00081   case Detector::kFar:
00082     iplnmax = 482;
00083     iplngap0 = 240;
00084     iplngap1 = 243;
00085     break;
00086   case Detector::kNear:
00087     iplnmax = 281;
00088     break;
00089   case Detector::kCalib:
00090     iplnmax = 60;
00091     break;
00092   default:
00093      MSG("FitTrack3",Msg::kError)
00094         << "BFieldSR does not support the "
00095         << Detector::AsString(vldc->GetDetector())
00096         << " detector " << endl;
00097      assert(0);
00098 
00099   }
00100 
00101 }
00102 
00103 SwimObj3::~SwimObj3()
00104 {
00105   assert(fugh);
00106   delete fugh;
00107 }
00108 
00109 Double_t SwimObj3::GetPath() {
00110    MSG("FitTrack3",Msg::kVerbose)
00111         << "tfe= "  << fTfe << " , "
00112         << "tair= "  << fTair << " , "
00113         << "tsc= "  << fTsc << endl;
00114    MSG("FitTrack3",Msg::kVerbose)
00115       << "fu "  << fu << " startU " << fStartu << endl
00116       << "fv "  << fv << " startV " << fStartv << endl
00117       << "fz "  << fz << " startZ " << fStartz << endl;
00118    
00119     Double_t dtot=fTfe+fTair+fTsc;
00120     if(dtot==0) return 0; //Maybe do something cleverer
00121 
00122     double path = TMath::Sqrt(TMath::Power((fu-fStartu),2)+
00123                               TMath::Power((fv-fStartv),2)+
00124                               TMath::Power((fz-fStartz),2));
00125    return path;
00126 
00127 }
00128 
00129 
00130 Double_t SwimObj3::GetRange() {
00131    MSG("FitTrack3",Msg::kVerbose)
00132         << "tfe= "  << fTfe << " , "
00133         << "tair= "  << fTair << " , "
00134         << "tsc= "  << fTsc << endl;
00135    MSG("FitTrack3",Msg::kVerbose)
00136       << "fu "  << fu << " startU " << fStartu << endl
00137       << "fv "  << fv << " startV " << fStartv << endl
00138       << "fz "  << fz << " startZ " << fStartz << endl;
00139    
00140     Double_t dtot=fTfe+fTair+fTsc;
00141     if(dtot==0) return 0; //Maybe do something cleverer
00142 
00143     double path = TMath::Sqrt(TMath::Power((fu-fStartu),2)+
00144                               TMath::Power((fv-fStartv),2)+
00145                               TMath::Power((fz-fStartz),2));
00146 
00147     Double_t tfe=fTfe;
00148     //Double_t tair=fTair;
00149     Double_t tsc=fTsc;
00150     Double_t ffe = tfe/dtot;
00151     //Double_t fair = tair/dtot;
00152     Double_t fsc = tsc/dtot;
00153     Double_t dsc = fsc*path;
00154     //    Double_t dair = fair*path;
00155     Double_t dfe = ffe*path;
00156 
00157     Double_t range=0;
00158     range+=(dsc*rhosc)/10.0; //Converting from kg/m^2 -> g/cm^2
00159     range+=(dfe*rhofe)/10.0;
00160 
00161     MSG("FitTrack3",Msg::kVerbose)
00162        << "Returning Range: " << range << endl;
00163     return range;
00164 
00165 }
00166 
00167 Double_t SwimObj3::GetTheta() {
00168 
00169     Double_t dtot=fTfe+fTair+fTsc;
00170     if(dtot==0) return 0; //Maybe do something cleverer
00171 
00172     double path = TMath::Sqrt(TMath::Power((fu-fStartu),2)+
00173                               TMath::Power((fv-fStartv),2)+
00174                               TMath::Power((fz-fStartz),2));
00175     if(path==0) return 0;
00176     Double_t tfe=fTfe;
00177     Double_t tair=fTair;
00178     Double_t tsc=fTsc;
00179 
00180     
00181     Double_t ffe = tfe/dtot;
00182     Double_t fair = tair/dtot;
00183     Double_t fsc = tsc/dtot;
00184     Double_t dsc = fsc*path;
00185     Double_t dair = fair*path;
00186     Double_t dfe = ffe*path;
00187 
00188     Double_t wtot = tfe*rhofe+tsc*rhosc+tair*rhoair;
00189     Double_t rfe = tfe*rhofe/wtot;
00190     Double_t rsc = tsc*rhosc/wtot;
00191     Double_t rair = tair*rhoair/wtot;
00192 
00193     Double_t beta = fPmag/TMath::Sqrt(fPmag*fPmag+(0.105*0.105));
00194     Double_t rhoav = ffe*rhofe+fsc*rhosc+fair*rhoair;
00195     Double_t radlen = 1.0/(rfe/radfe+rsc/radsc+rair/radair)/rhoav;
00196 
00197     Double_t theta = (0.0136/(fPmag*beta))*TMath::Sqrt((dfe+dsc+dair)/radlen)*
00198         (1.0+0.038*TMath::Log((dfe+dsc+dair)/radlen));
00199 
00200     return theta;
00201 }
00202 
00203 Int_t SwimObj3::SwimTo(Double_t zfin, Bool_t docheck)
00204 {
00205    if(docheck) {
00206    }
00207    
00208    MSG("FitTrack3",Msg::kVerbose)
00209       << "SwimTo(Double_t " << zfin << ") From " << fz << endl;
00210    if (fz==zfin) return 0;
00211    fTfe=0;
00212    fTair=0;
00213    fTsc=0;
00214    fStartu=fu;
00215    fStartv=fv;
00216    fStartz=fz;
00217    fPmag=fqp;
00218    Double_t charge=1;
00219    if(fPmag<0) {
00220       fPmag*=-1.0;
00221       charge=-1;
00222    }
00223    
00224    SwimSwimmer s(*fvldc);
00225    TVector3 position(fu,fv,fz);
00226    
00227    Double_t bottom=sqrt(1.0 + fdudz*fdudz+fdvdz*fdvdz);
00228    Double_t pu=fPmag*fizfor*fdudz/bottom;
00229    Double_t pv=fPmag*fizfor*fdvdz/bottom;
00230    Double_t pz=fPmag*fizfor/bottom;
00231    
00232    TVector3 momentum(pu,pv,pz);
00233    
00234    SwimParticle muon(position,momentum);
00235    muon.SetCharge(charge);
00236    SwimZCondition zc(zfin);
00237    
00238    
00239    bool done;
00240    done = s.SwimForward(muon,zc);
00241 
00242    Double_t newfu=muon.GetPosition().X();
00243    Double_t newfv=muon.GetPosition().Y();
00244    Double_t newfz=muon.GetPosition().Z();
00245    Double_t newpu=muon.GetMomentum().X();
00246    Double_t newpv=muon.GetMomentum().Y();
00247    Double_t newpz=muon.GetMomentum().Z();
00248    Double_t newpmag=muon.GetMomentumModulus();
00249    Double_t newdz=muon.GetDirection().Z();
00250    Double_t newdudz;
00251    Double_t newdvdz;
00252    if(newdz!=0) {
00253       newdudz=muon.GetDirection().X()/newdz;
00254       newdvdz=muon.GetDirection().Y()/newdz;
00255    }
00256    MSG("FitTrack3",Msg::kVerbose)
00257       << "newfu "  << newfu << " startU " << fStartu << endl
00258       << "newfv "  << newfv << " startV " << fStartv << endl
00259       << "newfz "  << newfz << " startZ " << fStartz << endl
00260       << "newpu "  << newpu << " startpu " << pu << endl
00261       << "newpv "  << newpv << " startpv " << pv << endl
00262       << "newpz "  << newpz << " startpz " << pz << endl
00263       << "newdudz " << newdudz << endl
00264       << "newdvdz " << newdvdz << endl
00265       << "newpmag " << newpmag << endl;
00266    
00267 
00268    fu=newfu;
00269    fv=newfv;
00270    fz=newfz;
00271    fdudz=newdudz;
00272    fdvdz=newdvdz;
00273    fqp=charge*newpmag;
00274    
00275 
00276 
00277 
00278    //Now look at what we just swam through
00279    Double_t oldfz=fStartz;
00280    Int_t idir = 1;
00281    if (zfin<oldfz) {
00282       idir = -1;
00283    }
00284 
00285    SwimGeo* sgeo = SwimGeo::Instance(*fvldc);
00286    
00287    Int_t found=0;
00288    SwimGeo::SwimMaterial_t begmat = SwimGeo::kAir;
00289    SwimGeo::SwimMaterial_t endmat = SwimGeo::kAir;
00290    Int_t ibeg=0;
00291    Int_t iend=0;
00292    const TObjArray& interfaces = sgeo->GetInterfaces();
00293    
00294    if (idir>0) {
00295       for (Int_t i=0; i <= interfaces.GetLast() && found<2; i++) {
00296          SwimPlaneInterface *spi = 
00297             dynamic_cast<SwimPlaneInterface*>(interfaces.At(i));
00298          if (!found && oldfz<spi->GetZ()) {
00299             begmat = spi->GetMaterialBefore();
00300             found++;
00301             ibeg = i;
00302          }
00303          if (found==1 && zfin<spi->GetZ()) {
00304             endmat = spi->GetMaterialAfter();
00305             found++;
00306             iend = i+1;
00307          }
00308       }
00309    }
00310    else {
00311       for (Int_t i = interfaces.GetLast(); i>=0 && found<2; i--) {
00312          SwimPlaneInterface *spi = 
00313             dynamic_cast<SwimPlaneInterface*>(interfaces.At(i));
00314          MSG("FitTrack3",Msg::kVerbose) 
00315             << "i " << i << " spi->GetZ " << spi->GetZ() 
00316             << " oldfz " << oldfz << " zfin " << zfin << endl;
00317          if (!found && oldfz>spi->GetZ()) {
00318             begmat = spi->GetMaterialAfter();
00319             found++;
00320             ibeg = i;
00321          }
00322          if (found==1 && zfin>spi->GetZ()) {
00323             endmat = spi->GetMaterialBefore();
00324             found++;
00325             iend = i-1;
00326          }
00327       }
00328    }
00329    
00330    if (found<2) return 1;
00331    
00332    for (Int_t i=ibeg; i!=iend; i+=idir) {
00333       SwimPlaneInterface *spi = 
00334          dynamic_cast<SwimPlaneInterface*>(interfaces.At(i));
00335       Double_t zend = spi->GetZ();
00336       if (i==iend-idir) {
00337          zend = zfin;
00338       }
00339       
00340       SwimGeo::SwimMaterial_t imat = 
00341          (idir>0) ? spi->GetMaterialBefore() : spi->GetMaterialAfter();
00342       MSG("FitTrack3",Msg::kVerbose) 
00343          << "imat " << imat << " zend " << zend << " oldfz " << oldfz << endl;
00344       Int_t flag = 0;
00345       switch (imat) {
00346       case 0: // air
00347          fTair+=fabs(zend-oldfz);
00348          oldfz=zend;
00349          break;
00350       case 1: // scintillator
00351          fTsc+=fabs(zend-oldfz);
00352          oldfz=zend;
00353          break;
00354       case 2: // iron
00355          fTfe+=fabs(zend-oldfz);
00356          oldfz=zend;
00357          break;
00358       default:
00359          MSG("FitTrack3",Msg::kError) << "undefined type " << imat << "\n";
00360          break;
00361       }
00362       if (flag!=0) return flag;
00363    }
00364    
00365    
00366   return 0;
00367 }

Generated on Mon Nov 23 05:28:31 2009 for loon by  doxygen 1.3.9.1