| 1 | void atmabs()
|
|---|
| 2 | {
|
|---|
| 3 | // =============================================================================
|
|---|
| 4 | // measured flux (lambda) = emitted flux (lambda) * trans(H, lambda)
|
|---|
| 5 | // =============================================================================
|
|---|
| 6 | TH2F hist1 ("TransCeres", "Ceres Transmission", 700-250, 250, 700, 50, 0, 50);
|
|---|
| 7 | TH2F hist1a("TransCeresRayleigh", "Ceres Transmission (Rayleigh)", 700-250, 250, 700, 50, 0, 50);
|
|---|
| 8 | TH2F hist1b("TransCeresOzone", "Ceres Transmission (Ozone)", 700-250, 250, 700, 50, 0, 50);
|
|---|
| 9 | TH2F hist1c("TransCeresAerosol", "Ceres Transmission (Aerosol)", 700-250, 250, 700, 50, 0, 50);
|
|---|
| 10 |
|
|---|
| 11 | const char *ozone = "resmc/atmosphere-ozone.txt";
|
|---|
| 12 | const char *aerosols = "resmc/atmosphere-aerosols.txt";
|
|---|
| 13 |
|
|---|
| 14 | MAtmosphere atm(ozone, aerosols);
|
|---|
| 15 |
|
|---|
| 16 | cout << atm.HasValidAerosol() << " " << atm.HasValidOzone() << endl;
|
|---|
| 17 |
|
|---|
| 18 | for (int h=0; h<50; h++)
|
|---|
| 19 | {
|
|---|
| 20 | for (int l=250; l<700; l++)
|
|---|
| 21 | {
|
|---|
| 22 | MPhotonData ph;
|
|---|
| 23 | ph.SetWavelength(l);
|
|---|
| 24 | ph.SetProductionHeight(h*1e3*1e2);
|
|---|
| 25 |
|
|---|
| 26 | hist1a.Fill(l, h, atm.CalcTransmission(h*1e5, l, 0));
|
|---|
| 27 | hist1b.Fill(l, h, atm.CalcOzoneAbsorption(h*1e5, l, 0));
|
|---|
| 28 | hist1c.Fill(l, h, atm.CalcAerosolAbsorption(h*1e5, l, 0));
|
|---|
| 29 | hist1.Fill(l, h, atm.GetTransmission(ph));
|
|---|
| 30 | }
|
|---|
| 31 | }
|
|---|
| 32 |
|
|---|
| 33 | // =============================================================================
|
|---|
| 34 | // The CCD Photometric Calibration Cookbook
|
|---|
| 35 | // 8 Atmospheric Extinction and Air Mass
|
|---|
| 36 | // http://star-www.rl.ac.uk/star/docs/sc6.htx/sc6se8.html
|
|---|
| 37 | //
|
|---|
| 38 | // measured magnitude (lambda) = emitted magnitude (lambda) + extco(lambda) * X(z)
|
|---|
| 39 | //
|
|---|
| 40 | // ==> measured flux = emitted flux * exp(extco * X(h))
|
|---|
| 41 | //
|
|---|
| 42 | // =============================================================================
|
|---|
| 43 |
|
|---|
| 44 | TH2F hist2("AtmAbs", "Corsika Atmosphere atmabs.txt", (700-180)/5+1, 178.5, 702.5, 51, -0.5, 50.5);
|
|---|
| 45 |
|
|---|
| 46 | ifstream fin("/home/tbretz/SW/corsika-76900/run/atmabs.dat");
|
|---|
| 47 |
|
|---|
| 48 | TString buf;
|
|---|
| 49 | buf.ReadLine(fin);
|
|---|
| 50 | cout << buf << endl;
|
|---|
| 51 |
|
|---|
| 52 | while (1)
|
|---|
| 53 | {
|
|---|
| 54 | double wl;
|
|---|
| 55 | fin >> wl;
|
|---|
| 56 | if (!fin)
|
|---|
| 57 | break;
|
|---|
| 58 |
|
|---|
| 59 | for (int h=0; h<51; h++)
|
|---|
| 60 | {
|
|---|
| 61 | double cc;
|
|---|
| 62 | fin >> cc;
|
|---|
| 63 | hist2.Fill(wl, h, cc);
|
|---|
| 64 | }
|
|---|
| 65 | }
|
|---|
| 66 |
|
|---|
| 67 | // =============================================================================
|
|---|
| 68 | hist1.SetMinimum(0);
|
|---|
| 69 | hist1.SetMaximum(1);
|
|---|
| 70 | hist1.SetContour(500);
|
|---|
| 71 |
|
|---|
| 72 | hist1a.SetMinimum(0);
|
|---|
| 73 | hist1a.SetMaximum(1);
|
|---|
| 74 | hist1a.SetContour(500);
|
|---|
| 75 |
|
|---|
| 76 | hist1b.SetMinimum(0);
|
|---|
| 77 | hist1b.SetMaximum(1);
|
|---|
| 78 | hist1b.SetContour(500);
|
|---|
| 79 |
|
|---|
| 80 | hist1c.SetMinimum(0);
|
|---|
| 81 | hist1c.SetMaximum(1);
|
|---|
| 82 | hist1c.SetContour(500);
|
|---|
| 83 |
|
|---|
| 84 | // =============================================================================
|
|---|
| 85 |
|
|---|
| 86 | gStyle->SetOptStat(11);
|
|---|
| 87 |
|
|---|
| 88 | TCanvas *c = new TCanvas;
|
|---|
| 89 | c->Divide(2, 2);
|
|---|
| 90 |
|
|---|
| 91 | c->cd(1);
|
|---|
| 92 | hist1a.DrawCopy("colz");
|
|---|
| 93 |
|
|---|
| 94 | c->cd(2);
|
|---|
| 95 | hist1b.DrawCopy("colz");
|
|---|
| 96 |
|
|---|
| 97 | c->cd(3);
|
|---|
| 98 | hist1c.DrawCopy("colz");
|
|---|
| 99 |
|
|---|
| 100 | c->cd(4);
|
|---|
| 101 | hist1.DrawCopy("colz");
|
|---|
| 102 |
|
|---|
| 103 | // =============================================================================
|
|---|
| 104 |
|
|---|
| 105 | c = new TCanvas;
|
|---|
| 106 | c->Divide(2, 2);
|
|---|
| 107 |
|
|---|
| 108 | c->cd(1);
|
|---|
| 109 | hist1.DrawCopy("colz");
|
|---|
| 110 |
|
|---|
| 111 | c->cd(2);
|
|---|
| 112 | hist2.SetMinimum(0);
|
|---|
| 113 | //hist2.SetMaximum(1);
|
|---|
| 114 | hist2.SetContour(500);
|
|---|
| 115 | hist2.DrawCopy("colz");
|
|---|
| 116 |
|
|---|
| 117 | // =============================================================================
|
|---|
| 118 | //
|
|---|
| 119 | // see CORSIKA ATABSO()
|
|---|
| 120 | //
|
|---|
| 121 | // CORSIKA calculates a coefficient COATEX which is the value interpolated
|
|---|
| 122 | // in wavelength and height from the table.
|
|---|
| 123 | //
|
|---|
| 124 | // From this value, the interpolated value at observation level is subtraced.
|
|---|
| 125 | //
|
|---|
| 126 | // The probability to survive (=transmission) is then exp(-COATEX/WEMIS)
|
|---|
| 127 | //
|
|---|
| 128 | // WEMIS defined as the particles z-direction cosine (-> correction for
|
|---|
| 129 | // zenith angle (flat atmosphere))
|
|---|
| 130 | //
|
|---|
| 131 | // =============================================================================
|
|---|
| 132 |
|
|---|
| 133 | TH2F hist4("TransCorsika", "Corsika Transmission", (700-180)/5+1, 178.5, 702.5, 51, -0.5, 50.5);
|
|---|
| 134 | for (int x=1; x<=hist2.GetNbinsX(); x++)
|
|---|
| 135 | {
|
|---|
| 136 | double sum = 0;
|
|---|
| 137 | for (int y=1; y<=hist2.GetNbinsY(); y++)
|
|---|
| 138 | {
|
|---|
| 139 | const double cosz = 1;
|
|---|
| 140 | hist4.SetBinContent(x, y, exp(-hist2.GetBinContent(x, y)/cosz));
|
|---|
| 141 | }
|
|---|
| 142 | }
|
|---|
| 143 |
|
|---|
| 144 | c->cd(4);
|
|---|
| 145 | hist4.SetMinimum(0);
|
|---|
| 146 | hist4.SetMaximum(1);
|
|---|
| 147 | hist4.SetContour(500);
|
|---|
| 148 | hist4.DrawCopy("colz");
|
|---|
| 149 |
|
|---|
| 150 | c->cd(3);
|
|---|
| 151 | TH1D *p1 = hist1.ProjectionX("TransCeres50km", hist1.GetNbinsY(), hist1.GetNbinsY());
|
|---|
| 152 | TH1D *p4 = hist4.ProjectionX("TransCorsika50km", hist4.GetNbinsY(), hist4.GetNbinsY());
|
|---|
| 153 | TH1D *p1b = hist1.ProjectionX("TransCeres5km", 5, 5);
|
|---|
| 154 | TH1D *p4b = hist4.ProjectionX("TransCorsika5km", 5, 5);
|
|---|
| 155 |
|
|---|
| 156 | p1->SetNameTitle("Trans", "Transmission");
|
|---|
| 157 |
|
|---|
| 158 | p4->SetLineColor(kBlue);
|
|---|
| 159 | p4b->SetLineColor(kBlue);
|
|---|
| 160 | p1->SetMinimum(0);
|
|---|
| 161 | p1->SetMaximum(1);
|
|---|
| 162 | p1->Draw();
|
|---|
| 163 | p4->Draw("same");
|
|---|
| 164 | p1b->Draw("same");
|
|---|
| 165 | p4b->Draw("same");
|
|---|
| 166 |
|
|---|
| 167 | TLatex text;
|
|---|
| 168 | text.DrawLatex(275, 0.850, "Ceres");
|
|---|
| 169 | text.DrawLatex(340, 0.250, "50km");
|
|---|
| 170 | text.DrawLatex(320, 0.650, "5km");
|
|---|
| 171 | text.SetTextColor(kBlue);
|
|---|
| 172 | text.DrawLatex(275, 0.925, "Corsika");
|
|---|
| 173 | }
|
|---|