#include using std::cout; using std::cerr; using std::cin; using std::endl; #include using std::valarray; #include using std::vector; #include using std::string; #include using std::list; #include #include using std::fstream; #include using std::pair; #include using std::map; //#include #include "TVector3.h" #include "TRandom.h" #include "TRotation.h" #include "TFile.h" #include "TH1F.h" #include "Math/Vector3D.h" using ROOT::Math::XYZVector; #include "Math/Point3D.h" using ROOT::Math::XYZPoint; #include "Math/Transform3D.h" using ROOT::Math::Transform3D; #include "Math/RotationX.h" using ROOT::Math::RotationX; #include "Math/RotationY.h" using ROOT::Math::RotationY; #include "Math/RotationZ.h" using ROOT::Math::RotationZ; #include "Math/Rotation3D.h" using ROOT::Math::Rotation3D; #include "PndDrcPhoton.h" #include "PndDrcOptReflAbs.h" #include "PndDrcSurfAbs.h" #include "PndDrcSurfPolyFlat.h" #include "PndDrcOptReflSilver.h" #include "PndDrcOptReflPerfect.h" #include "PndDrcOptMatAbs.h" #include "PndDrcOptMatLithotecQ0.h" #include "PndDrcOptDev.h" #include "PndDrcOptDevSys.h" #include "PndDrcOptVol.h" #include "PndDrcOptDevManager.h" int main() { /* check absorption routine in a bar and more directly output is test_absorption.root with spectra hp1 and hp2 hp1 is the range in meters of photons as it comes from the absorption routine directly hp2 is the spectrum of randomly emitted photons at the end of a 20m long bar which make it to the detector. The ordinate is pathlength. */ const double pi=3.1415926535; int verbosity = 0; // 0=quiet, 1=constructors,2=member,3=functionality // 4=photons, 5=everything. // 8 points define a bar, in this case a 1x1x2 m large volume XYZPoint p1(-500.0, +500.0,-1000); // p5----------p8 XYZPoint p2(-500.0, -500.0,-1000); // /| /| XYZPoint p3(+500.0, -500.0,-1000); // / | / | XYZPoint p4(+500.0, +500.0,-1000); // / p6-------/--p7 // / / / / // / / / / // / / / / // / / / / XYZPoint p5(-500.0, +500.0,+1000); // p1---------p4 / XYZPoint p6(-500.0, -500.0,+1000); // | / | / XYZPoint p7(+500.0, -500.0,+1000); // |/ |/ XYZPoint p8(+500.0, +500.0,+1000); // 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. PndDrcSurfPolyFlat a1,a2,a3,a4,a5,a6; a1.setVerbosity(verbosity); a1.addPoint(p1); a1.addPoint(p2); a1.addPoint(p3); a1.addPoint(p4); a1.setName("adown"); a2.setVerbosity(verbosity); a2.addPoint(p2); a2.addPoint(p6); a2.addPoint(p7); a2.addPoint(p3); a2.setName("aside1"); a3.setVerbosity(verbosity); a3.addPoint(p1); a3.addPoint(p5); a3.addPoint(p6); a3.addPoint(p2); a3.setName("aside2"); a4.setVerbosity(verbosity); a4.addPoint(p4); a4.addPoint(p3); a4.addPoint(p7); a4.addPoint(p8); a4.setName("aside3"); a5.setVerbosity(verbosity); a5.addPoint(p1); a5.addPoint(p4); a5.addPoint(p8); a5.addPoint(p5); a5.setName("aside4"); a6.setVerbosity(verbosity); a6.addPoint(p8); a6.addPoint(p7); a6.addPoint(p6); a6.addPoint(p5); a6.setName("aup"); PndDrcOptReflPerfect refl; a1.setReflectivity(refl); a2.setReflectivity(refl); a3.setReflectivity(refl); a4.setReflectivity(refl); a5.setReflectivity(refl); a6.setReflectivity(refl); // create a volume consiting of surfaces // create a material the bar will consist of PndDrcOptVol bar; PndDrcOptMatLithotecQ0 quartz; bar.setVerbosity(verbosity); bar.setOptMaterial(quartz); bar.addSurface(a1); bar.addSurface(a2); bar.addSurface(a3); bar.addSurface(a4); bar.addSurface(a5); bar.addSurface(a6); bar.setName("bar"); // 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. // See one of the forth comming test examples. PndDrcOptDevSys opt_system; opt_system.setName("opt_system"); opt_system.setVerbosity(verbosity); opt_system.addDevice(bar); // The manager must be created as pointer. It is created as singleton, that is only // one manager can exist per application. PndDrcOptDevManager* manager = new PndDrcOptDevManager(); manager->setVerbosity(verbosity); manager->addDeviceSystem(opt_system); fstream geo; geo.open("Geo.C",std::ios::out); geo<<"{"<SetRange(-5000,-5000,-5000,5000,5000,5000);"<SetView(0,90,90,i);"<print(geo); // // the intention is to play around with routines. double lambda=400; PndDrcPhoton ph; list list_photon; TRandom ran; cout<<" create 5000 photons ... "<setPhotonList(list_photon,"bar","opt_system",0,0); cout<<" done."<propagate(); // propagate photons cout<<" done."<photonList(); // get list // propagate writes to geo, that has finished, therefore, close geo geo<<"}"<::iterator iph; for(iph=list_photon.begin(); iph != list_photon.end(); ++iph) { if ((*iph).fate()==Drc::PhotMeasured) { icnt_measured++; } else if ((*iph).fate()==Drc::PhotFlying) { icnt_flying++; // should never happen. } else if ((*iph).fate()==Drc::PhotAbsorbed) { double n = quartz.refIndex(lambda); double dndl = quartz.refIndexDeriv(lambda); double v_phase = 299.792/n; double v_group = v_phase * ( 1.0 - lambda/n*dndl); double t = (*iph).time(); double len = t*v_group/1000; hp2->Fill(len); absorption += len; icnt_abs++; icnt_absorbed++; } else { icnt_lost++; } } cout<<" done."<Fill(length); absorption += length; icnt_abs++; } } } cout<<" done."<Write(); cout<<" result spectra in test_absorption.root"<