1 / 18

DIRC photon propagation software

DIRC photon propagation software. Set of routines to play with photon propagation C++, STL, root (nothing else) Doxygen documentation examples available included in pandaroot easy to include in pandaroot Surfaces, volumes, materials can be connected accessible by a “manager”

arissa
Download Presentation

DIRC photon propagation software

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. DIRC photon propagation software • Set of routines to play with photon propagation • C++, STL, root (nothing else) • Doxygen documentation • examples available • included in pandaroot • easy to include in pandaroot • Surfaces, volumes, materials • can be connected • accessible by a “manager” • abstract base classes

  2. pandaroot/drc/drcprop

  3. test_disk.cc Examples test_simple_bar.cc test_sheet.cc test_cylinder.cc

  4. // 8 points define a bar TVector3 p1(-10.0, +5.0, 0); // p5----------p8 TVector3 p2(-10.0, -5.0, 0); // /| /| TVector3 p3(+10.0, -5.0, 0); // / | / | TVector3 p4(+10.0, +5.0, 0); // / p6--------/--p7 // / / / / // / / / / // / / / / // / / / / TVector3 p5(-10.0, +5.0, -40); // p1----------p4 / TVector3 p6(-10.0, -5.0, -40); // | / | / TVector3 p7(+10.0, -5.0, -40); // |/ |/ TVector3 p8(+10.0, +5.0, -40);//p2----------p3 // Define from points 6 surfaces of the bar. The points have to be given in // the sequence going around the surface, clock- or counterclock-wise. // There are 2 additional surfaces, a mirror and a screen. // How to produce surfaces by shift and rotate operation is for sake of clearness // not shown here, but in one of the other examples. // Declare flat surfaces with arbitrary number of points. DrcSurfPolyFlat a1; a1.addPoint(p1); a1.addPoint(p2); a1.addPoint(p3); a1.addPoint(p4); a1.setName("pfront"); surface

  5. volume // create a volume consiting of surfaces // create a material the bar will consist of DrcOptVol bar; DrcOptMatLithotecQ0 quartz; bar.setOptMaterial(quartz); bar.addSurface(a1); bar.addSurface(a2); bar.addSurface(a3); bar.addSurface(a4); bar.addSurface(a5); bar.addSurface(a6); bar.setName("bar");

  6. connections // Build a optical system consisting out of several volumes, // mirrors and screens. // This layer has the advantage, that a device consisting out // of many equal subsystems // like a bar box, easily can be reproduced. DrcOptDevSys opt_system; opt_system.addDevice(bar); opt_system.addDevice(screen); opt_system.addDevice(mirror); // couple surface 1 of device 1 with surface 2 of device 2 // dev1 dev2 surf1 surf2 opt_system.coupleDevice("bar","screen","pback","screen_front"); opt_system.coupleDevice("bar","mirror","pfront","mirror_front");

  7. managing // The manager must be created as pointer. It is created as singleton, that is only // one manager can exist per application. DrcOptDevManager* manager = new DrcOptDevManager(); manager->addDeviceSystem(opt_system); fstream geo; geo.open("Geo.C",std::ios::out); geo<<"{"<<endl; geo<<" TCanvas *c1 = new TCanvas(\"c1\"); "<<endl; geo<<" TView *view = new TView(1);"<<endl; geo<<" view->SetRange(-50,-50,-50,50,50,50);"<<endl; geo<<" Int_t i;"<<endl; geo<<" view->SetView(0,90,90,i);"<<endl; // the following command sets a flag within the manager and all photons from // now on will be traced and can be plotted by calling within root // .x Geo.C // .x Screen.C // manager->print(geo);

  8. photon generation - propagation // create a list of photons in bar TVector3 pos(0,-7,-20); TVector3 dir(0,7, 10); double beta = 0.75; bool photons_exist = manager->cerenkov(pos,dir,beta); // generate photons if (photons_exist) { manager->propagate(); // propagate photons } list<DrcPhoton> list_photon = manager->photonList(); // get list DrcOptDevManager is a instanton, easy access from everywhere by DrcOptDevManager* manager = DrcOptDevManager::getInstance(); He knows everything, since he holds copies from all objects.

  9. clones // DrcOptDevManager manager; // reproduce the system nsegs times (system = segment + mirror) DrcOptDevSys psys[nsegs]; TRotation rot; rot.RotateZ(-angle); // clockwise otherwise pleft=pright coupling below fails... for (int i=0; i<nsegs; i++) { psys[i] = psystem; manager.addDeviceSystem(psys[i],i); psystem.rotate(rot); } // couple systems side at side for (int i=1; i<nsegs; i++) { manager.coupleDevice("segment","segment","pleft","pright",i,(i-1)); } // connect last with first. manager.coupleDevice("segment","segment","pleft","pright",0,nsegs-1);

  10. enum PhotonFate { //! Photon is still propagating PhotFlying, //! Photon has hit measuring device. PhotMeasured, //! Photon got lost outside. PhotLost, //! Photon got lost inside. PhotAbsorbed }; photons class DrcPhoton { private: //! Wavelength in nm. double m_lambda; //! Actual position of photon. TVector3 m_position; //! Old position of photon. TVector3 m_positionOld; //! Normalized direction of photon. TVector3 m_direction; //! The fate of the photon. Drc::PhotonFate m_fate; //! Number of suffered reflections. int m_reflections; //! Verbosity level 0-5. int m_verbosity; //! Pointer to device where photon is. DrcOptDev* m_dev; //! Time of flight. double m_time;

  11. Particle in disk Total photons: 844 measured: 521 absorbed: 4 lost: 319 beta=0.99

  12. screen (pixel)

  13. sheet and cylinder nph=20 b=.99 nph=1000 b=.99

  14. sheet and cylinder nph=20 b=.99 nph=1000 b=.99

  15. dispersion b=0.69 sheet of fused silica b=0.71

  16. extending by deriving from base class DrcOptMatbs.h virtual double refIndex(const double lambda) const = 0; virtual double refIndexDeriv(const double lambda) const = 0; virtual double refIndexDeriv2(const double lambda) const = 0; virtual bool absorptionFlag(double lambda, double& length) const = 0; DrcOptMatLithotecQ0.h class DrcOptMatLithotecQ0 : public DrcOptMatAbs DrcOptMatLithotecQ0.cxx

  17. extending by deriving from base class bool DrcOptMatLithotecQ0::absorptionFlag(double lambda, double& length) const { // Rayleigh scattering. static const double clarity = 2100*1000; // @ 633 nm in mm (2100 m) // (=278m at 400nm) double trans = exp(-(length)/(clarity*pow(lambda/663,4))); double cmp = m_ran.Uniform(1.0); if (cmp>trans) { length *= trans; // eg. trans = 0.5 : 50% of way. return true; } return false; // no absorption. }

  18. summary • optical volumes defined by surfaces can be coupled and generate optical device system • manager holds one or several device system • manager generates cherenkov photons and propagates them • manager holds the propagated photon list • easy to include new materials, surfaces...

More Related