source: branches/Mars_McMismatchStudy/fact/analysis/mc/ganymed.C@ 18100

Last change on this file since 18100 was 18100, checked in by ghughes, 10 years ago
Added code to reconstruct the energy using MC lookup tables
File size: 18.5 KB
Line 
1void SetupWriter(MWriteRootFile *write, const char *name, Bool_t ismc) const
2{
3 if (!write)
4 return;
5
6 write->SetName(name);
7 write->AddContainer("MHillas", "Events");
8 write->AddContainer("MHillasSrc", "Events");
9 write->AddContainer("MHillasExt", "Events");
10 write->AddContainer("MPointingPos", "Events");
11 write->AddContainer("MHillasSrcAnti", "Events", kFALSE);
12 write->AddContainer("MImagePar", "Events", kFALSE);
13 write->AddContainer("MNewImagePar", "Events", kFALSE);
14 write->AddContainer("MNewImagePar2", "Events", kFALSE);
15 write->AddContainer("Hadronness", "Events", kFALSE);
16 write->AddContainer("MSrcPosCam", "Events", kFALSE);
17 write->AddContainer("MSrcPosAnti", "Events", kFALSE);
18 write->AddContainer("ThetaSquared", "Events", kFALSE);
19 write->AddContainer("OpticalAxis", "Events", kFALSE);
20 write->AddContainer("Disp", "Events", kFALSE);
21 write->AddContainer("Ghostbuster", "Events", kFALSE);
22 write->AddContainer("MEnergyEst", "Events", kFALSE);
23 write->AddContainer("MTime", "Events", kFALSE);
24 write->AddContainer("MMcEvt", "Events", kFALSE);
25 //write->AddContainer("MEnergyEst", "Events", kFALSE);
26 //write->AddContainer("MEnergyTable", "Events", kFALSE);
27 write->AddContainer("DataType", "Events");
28 write->AddContainer("Weight", "Events");
29 write->AddContainer("FileId", "Events");
30 write->AddContainer("EvtNumber", "Events");
31
32 write->AddContainer("MMcRunHeader", "RunHeaders", kFALSE);
33 write->AddContainer("MMcCorsikaRunHeader", "RunHeaders", kFALSE);
34 write->AddContainer("MCorsikaRunHeader", "RunHeaders", kFALSE);
35
36 //if (ismc)
37 // write->AddCopySource("OriginalMC");
38}
39
40int ganymed(const char *dataset, const char *outfile, Float_t ra, Float_t dec, Bool_t ismc=false)
41{
42 MDirIter files;
43 if (files.ReadList(dataset)<=0)
44 return 2;
45 files.Sort();
46
47 // =============================================================
48
49 // Crab (05h34'32" 22d00'52")
50 MPointingPos source("MSourcePos");
51 //source.SetSkyPosition(5.5755, 22.0144); // ra[h], dec[deg]
52 //source.SetSkyPosition(12.356089, 30.176897); // ra[h], dec[deg]//1218
53 //source.SetSkyPosition(16.897867,39.760201);// mrk501
54 //source.SetSkyPosition(11.0742, 38.2089); // ra[h], dec[deg]//mrk421
55
56 if (ismc)
57 source.SetLocalPosition(ra, dec); // RA is ZD, DEC, is AZ!!!!
58 else
59 source.SetSkyPosition(ra, dec); // ra[h], dec[deg]//mrk421
60
61 UInt_t fNumOffSourcePos = 5;
62
63 // =============================================================
64
65 // FIXME: If fPathIn read cuts and energy estimator from file!
66 MContinue contq("MImagePar.fNumIslands>3.5"
67 "|| MNewImagePar.fNumUsedPixels<5.5"
68 "|| MNewImagePar.fLeakage1>0.1",
69 "CutQ");
70
71 MContinue cont0("MHillas.fSize<0"
72 "|| MHillasExt.fSlopeSpreadWeighted>0.68"
73 "|| MHillasExt.fSlopeSpreadWeighted<0.18"
74 "|| log10(MHillas.GetArea*MGeomCam.fConvMm2Deg^2)>(log10(MHillas.fSize)-2)*1.1-1.55"
75 "|| MNewImagePar.fConcCore < 0.13"
76 "|| MNewImagePar.fConcCOG < 0.15"
77 , "Cut0");
78
79 // Cuts before plots
80 MContinue cont2("0"
81 "|| MHillasExt.fM3Long*sign(MHillasSrc.fCosDeltaAlpha)*MGeomCam.fConvMm2Deg<-0.07"
82 "|| log10(MNewImagePar.fConc1)<-log10(MHillas.fSize)*0.57+0.13"
83 //"|| log10(MNewImagePar.fConc1)>-log10(MHillas.fSize)*0.57+0.5"
84 //"|| MHillasSrc.fDist*MGeomCam.fConvMm2Deg>log10(MHillas.fSize)*0.42+0.29"
85 "|| MHillas.GetArea*MGeomCam.fConvMm2Deg^2<0.01"
86 "|| MHillasSrc.fDist*MGeomCam.fConvMm2Deg>log10(MHillas.fSize)*0.5+0.095"
87 "|| MHillasSrc.fDist*MGeomCam.fConvMm2Deg<0.4"
88 "|| MHillasSrc.fDist*MGeomCam.fConvMm2Deg>1.2",
89 "Cut2");
90
91 TArrayD param(12);
92 // Parametrization of Disp
93 param[0] = 1.15136; // constant
94 param[8] = 0.0681437; // slope
95 param[9] = 2.62932; // leak
96 param[10] = 1.51279; // size-offset
97 param[11] = 0.0507821; // size-slope
98 // Parametrization for sign of disp (m3long, slope)
99 param[5] = -0.07;
100 param[6] = 7.2;
101 param[7] = 0.5;
102 // ThetaSq-Cut
103 param[1] = 0.11; // 0.215
104 // Area-Cut
105 param[2] = 0.215468;
106 param[3] = 5.63973;
107 param[4] = 0.0836169;
108
109 // --------------------------------------------------------------------------------
110
111 // Setup fitter and histograms
112 MAlphaFitter fit;
113 fit.SetBackgroundFitMin(0.09);
114 fit.SetBackgroundFitMax(0.25);
115 fit.SetPolynomOrder(1);
116 fit.SetSignalFunction(MAlphaFitter::kThetaSq);
117 fit.SetScaleUser(1./fNumOffSourcePos); // includes fit.SetScaleMode(MAlphaFitter::kUserScale);
118
119 // --------------------------------------------------------------------------------
120
121 MBinning bins3( 67, -0.005, 0.665, "BinningTheta", "asin");
122 MBinning binsD( 25, 0, 2.5, "BinningDist");
123 MBinning binsC( 25, 0, 2.5, "BinningDistC");
124 MBinning binsR( 60, 0, 300, "BinningRate");
125
126 // --------------------------------------------------------------------------------
127
128 MParList plist;
129 plist.AddToList(&source);
130 plist.AddToList(&fit);
131
132 // Initialize default binnings
133 plist.AddToList(&bins3);
134 plist.AddToList(&binsD);
135 plist.AddToList(&binsC);
136 plist.AddToList(&binsR);
137
138 MParameterI par("DataType");
139 MParameterD weight("Weight");
140 plist.AddToList(&par);
141 plist.AddToList(&weight);
142
143 // Setup Tasklist
144 MTaskList tlist;
145 plist.AddToList(&tlist);
146
147 // La Palma Magic1
148 MObservatory obs;
149 plist.AddToList(&obs);
150
151 // --------------------------------------------------------------------------------
152
153 MParameterD scale;
154 scale.SetVal(1./fNumOffSourcePos);
155
156 MHThetaSq *halphaoff = plist.FindCreateObj("MHThetaSq", "HistOff");
157 halphaoff->ForceUsingSize();
158
159 MFillH falpha(halphaoff, "", "FillHist");
160 MFillH fenergy1("HistEOff [MHThetaSq]", "", "FillHistE");
161
162 MFMagicCuts cuts;
163 cuts.SetHadronnessCut(MFMagicCuts::kNoCut);
164 cuts.SetVariables(param);
165
166 // Cuts before thetasq
167 MContinue cont1(&cuts, "Cut1");
168
169 // Energy estimation
170 MEnergyEstimate energyest;
171 energyest.SetRule("MHillas.fSize^0.815*pow(10, 0.0199*(MHillasSrc.fDist*1.17e-2 - (-6.95))^2*(MHillasSrc.fDist*1.17e-2>(-6.95)) + 0.5997 *(MHillasSrc.fDist*1.17e-2 - 0.7568)^2 * (MHillasSrc.fDist*1.17e-2>0.7568) )");
172 // energyest.SetRule("1737 * (MHillas.fSize / 300.)^0.810");
173
174 //MEnergyTable energytable;
175 // Tables available from GH
176 //energytable.SetTableFile("Table_standard_test.root");
177
178 // Cuts before writing
179 MContinue cont3("", "Cut3");
180 contq.SetAllowEmpty();
181 cont0.SetAllowEmpty();
182 cont1.SetAllowEmpty();
183 cont2.SetAllowEmpty();
184 cont3.SetAllowEmpty();
185
186 cont1.SetInverted();
187
188 // Filter for VsSize
189 MFDataPhrase ftheta("ThetaSquared.fVal < ThetaSquaredCut.fVal", "CutT");
190
191 // ------------- Loop Off Data --------------------
192 MRead *readoffdata = NULL;
193 if (ismc)
194 {
195 MReadMarsFile *read = new MReadMarsFile("Events");
196 read->DisableAutoScheme();
197 readoffdata = read;
198 }
199 else
200 {
201 MReadReports *read = new MReadReports;
202 read->AddTree("Events", "MTime.", MReadReports::kMaster);
203 read->AddTree("Drive",MReadReports::kRequired);
204 read->AddTree("Rates",MReadReports::kRequired);
205 readoffdata = read;
206 }
207
208 readoffdata->AddFiles(files);
209
210 TString fname0 = Form("%s-summary.root", outfile);
211 TString fname1 = Form("%s-analysis.root", outfile);
212
213 MWriteRootFile dummy0(fname0.Data(), "RECREATE");
214 MWriteRootFile dummy1(fname1.Data(), "RECREATE");
215
216 MWriteRootFile *write0 = &dummy0;
217 MWriteRootFile *write1 = &dummy1;
218 SetupWriter(write0, "WriteAfterCut0", ismc);
219 SetupWriter(write1, "WriteAfterCut3", ismc);
220
221 MWriteRootFile write2(fname1.Data(), "RECRATE");
222 write2.AddContainer("MReportRates", "Rates");
223 write2.AddContainer("MTimeRates", "Rates");
224
225 MParameterCalc setevtnum("MRawEvtHeader.fDAQEvtNumber", "SetEvtNumber");
226 setevtnum.SetNameParameter("EvtNumber");
227
228 MParameterCalc setrunnum("MRawRunHeader.GetFileID", "SetFileId");
229 setrunnum.SetNameParameter("FileId");
230
231 MFillH fill1a("MHHillasOffPre [MHHillas]", "MHillas", "FillHillasPre");
232 MFillH fill2a("MHHillasOffPost [MHHillas]", "MHillas", "FillHillasPost");
233 MFillH fill3a("MHVsSizeOffPost [MHVsSize]", "MHillasSrc", "FillVsSizePost");
234 MFillH fill3c("MHVsSizeOffTheta [MHVsSize]", "MHillasSrc", "FillVsSizeTheta");
235 MFillH fill4a("MHHilExtOffPost [MHHillasExt]", "MHillasSrc", "FillHilExtPost");
236 MFillH fill5a("MHHilSrcOffPost [MHHillasSrc]", "MHillasSrc", "FillHilSrcPost");
237 MFillH fill6a("MHImgParOffPost [MHImagePar]", "MImagePar", "FillImgParPost");
238 MFillH fill7a("MHNewParOffPost [MHNewImagePar]", "MNewImagePar", "FillNewParPost");
239 //MFillH fill9a("MHEffOffTime [MHEffectiveOnTime]", "MTime", "FillEffOnTime");
240 fill1a.SetNameTab("PreCut");
241 fill2a.SetNameTab("PostCut");
242 fill3a.SetNameTab("VsSize");
243 fill3c.SetNameTab("CutT");
244 fill4a.SetNameTab("HilExt");
245 fill5a.SetNameTab("HilSrc");
246 fill6a.SetNameTab("ImgPar");
247 fill7a.SetNameTab("NewPar");
248 //fill9a.SetNameTab("EffOffT");
249
250 fill3c.SetFilter(&ftheta);
251
252 //MFDataMember fbin("Bin.fVal", '>', 0);
253 //fill9a.SetFilter(&fbin);
254
255 MTaskList tlist2;
256 tlist2.SetNumPasses(fNumOffSourcePos);
257 fill2a.SetWeight(&scale);
258 fill3a.SetWeight(&scale);
259 fill3c.SetWeight(&scale);
260 fill4a.SetWeight(&scale);
261 fill5a.SetWeight(&scale);
262 fill6a.SetWeight(&scale);
263 fill7a.SetWeight(&scale);
264
265 // How to get source position from off- and on-data?
266 MSrcPosCalc scalc;
267 scalc.SetMode(MSrcPosCalc::kWobble);
268 scalc.SetCallback(&tlist2);
269
270 MSrcPosCorrect scor;
271
272 MHillasCalc hcalc;
273 MHillasCalc hcalc2("MHillasCalcAnti");
274 hcalc.SetFlags(MHillasCalc::kCalcHillasSrc);
275 hcalc2.SetFlags(MHillasCalc::kCalcHillasSrc);
276 hcalc2.SetNameHillasSrc("MHillasSrcAnti");
277 hcalc2.SetNameSrcPosCam("MSrcPosAnti");
278
279 MSrcPosRndm srcrndm;
280
281 tlist2.AddToList(&scalc);
282 //tlist2.AddToList(&scor);
283 tlist2.AddToList(&srcrndm);
284 tlist2.AddToList(&hcalc);
285 tlist2.AddToList(&hcalc2);
286 tlist2.AddToList(&setrunnum);
287 tlist2.AddToList(&setevtnum);
288 tlist2.AddToList(&cuts);
289 tlist2.AddToList(&energyest);
290 //tlist2.AddToList(&energytable);
291 tlist2.AddToList(write0);
292 tlist2.AddToList(&cont0); // Post/Pre shown cuts
293 tlist2.AddToList(&cont1); // Calculate ThetaSq
294 tlist2.AddToList(&fill2a);
295 tlist2.AddToList(&ftheta); // Calculate theta Cut
296 if (!ismc)
297 {
298 tlist2.AddToList(&falpha);
299 tlist2.AddToList(&fenergy1);
300 }
301 tlist2.AddToList(&fill3c); // With theta cut
302 tlist2.AddToList(&cont2);
303 tlist2.AddToList(&fill3a);
304 tlist2.AddToList(&fill4a);
305 tlist2.AddToList(&fill5a);
306 tlist2.AddToList(&fill6a);
307 tlist2.AddToList(&fill7a);
308 tlist2.AddToList(&cont3);
309 tlist2.AddToList(write1);
310
311 MPointingPosCalc pcalc;
312 MPointingDevCalc devcalc;
313
314 tlist.AddToList(readoffdata);
315 if (!ismc)
316 tlist.AddToList(&pcalc, "Drive");
317 tlist.AddToList(&contq, "Events");
318 tlist.AddToList(&fill1a, "Events");
319 tlist.AddToList(&tlist2, "Events");
320
321 // by setting it here it is distributed to all consecutive tasks
322 tlist.SetAccelerator(MTask::kAccDontReset|MTask::kAccDontTime);
323
324 par.SetVal(0);
325 weight.SetVal(-1./fNumOffSourcePos);
326
327 MStatusDisplay *d = new MStatusDisplay;
328
329 // Create and setup the eventloop
330 MEvtLoop evtloop("Off");
331 evtloop.SetParList(&plist);
332 evtloop.SetDisplay(d);
333
334 // Execute first analysis
335 if (!evtloop.Eventloop())
336 return 2;
337
338 if (!evtloop.GetDisplay())
339 return 2;
340
341 // ------------- Loop On Data --------------------
342 MRead *readondata = NULL;
343 if (ismc)
344 {
345 MReadMarsFile *read = new MReadMarsFile("Events");
346 read->DisableAutoScheme();
347 readondata = read;
348 }
349 else
350 {
351 MReadReports *read = new MReadReports;
352 read->AddTree("Events", "MTime.", MReadReports::kMaster);
353 read->AddTree("Drive", MReadReports::kRequired);
354 read->AddTree("Rates", MReadReports::kRequired);
355 read->AddTree("Humidity", MReadReports::kRequired);
356 read->AddTree("Temperatures", MReadReports::kRequired);
357 readondata = read;
358 }
359 readondata->AddFiles(files);
360
361 scalc.SetMode(MSrcPosCalc::kDefault);
362 scalc.SetNumRandomOffPositions(fNumOffSourcePos);
363
364 MFillH fill1b("MHHillasOnPre [MHHillas]", "MHillas", "FillHillasPre");
365 MFillH fill2b("MHHillasOnPost [MHHillas]", "MHillas", "FillHillasPost");
366 MFillH fill3b("MHVsSizeOnPost [MHVsSize]", "MHillasSrc", "FillVsSizePost");
367 MFillH fill3d("MHVsSizeOnTheta [MHVsSize]", "MHillasSrc", "FillVsSizeTheta");
368 MFillH fill4b("MHHilExtOnPost [MHHillasExt]", "MHillasSrc", "FillHilExtPost");
369 MFillH fill5b("MHHilSrcOnPost [MHHillasSrc]", "MHillasSrc", "FillHilSrcPost");
370 MFillH fill6b("MHImgParOnPost [MHImagePar]", "MImagePar", "FillImgParPost");
371 MFillH fill7b("MHNewParOnPost [MHNewImagePar]", "MNewImagePar", "FillNewParPost");
372 //MFillH fill9b("MHEffOnTime [MHEffectiveOnTime]", "MTime", "FillEffOnTime");
373 fill1b.SetNameTab("PreCut");
374 fill2b.SetNameTab("PostCut");
375 fill3b.SetNameTab("VsSize");
376 fill3d.SetNameTab("CutT");
377 fill4b.SetNameTab("HilExt");
378 fill5b.SetNameTab("HilSrc");
379 fill6b.SetNameTab("ImgPar");
380 fill7b.SetNameTab("NewPar");
381 //fill9b.SetNameTab("EffOnT");
382 fill1b.SetDrawOption("same");
383 fill2b.SetDrawOption("same");
384 fill3b.SetDrawOption("same");
385 fill3d.SetDrawOption("same");
386 fill4b.SetDrawOption("same");
387 fill5b.SetDrawOption("same");
388 fill6b.SetDrawOption("same");
389 fill7b.SetDrawOption("same");
390 //fill9b.SetFilter(&fbin);
391
392 fill3d.SetFilter(&ftheta);
393
394 MHThetaSq *halphaon = plist.FindCreateObj("MHThetaSq", "Hist");
395 halphaon->ForceUsingSize();
396
397 MFillH falpha2(halphaon, "", "FillHist");
398 MFillH fenergy2("HistE [MHThetaSq]", "", "FillHistE");
399
400 tlist2.SetNumPasses();
401
402 tlist.Replace(readondata);
403
404 MHSrcPosCam hsrcpos(kTRUE);
405
406 MFillH fillsrc(&hsrcpos, "MSrcPosCam", "FillSrcPosCam");
407 fillsrc.SetNameTab("SrcPos");
408
409 tlist2.AddToListBefore(&fillsrc, &hcalc);
410
411 MH3 hvs1("MPointingPos.fZd");
412 MH3 hvs2("MPointingPos.fZd");
413 MHVsTime hvstM("MTimeDrive.GetMjd");
414 MHVsTime hvst0("MPointingPos.fZd");
415 MHVsTime hvst1("MReportRates.fTriggerRate");
416 MH3 hvst2("MPointingPos.fZd", "MReportRates.fTriggerRate");
417 MHVsTime hvst("MReportTemperatures.GetTempMean");
418 MHVsTime hvsh("MReportHumidity.GetMean");
419 hvs1.SetName("ObsTime;Theta");
420 hvs2.SetName("OnTime;Theta");
421 hvstM.SetName("MJD");
422 hvst0.SetName("ZdTime");
423 hvst1.SetName("Rate");
424 hvst2.SetName("RateZd;Theta;Rate");
425 hvst.SetName("CamTemp");
426 hvsh.SetName("CamHum");
427 hvs1.SetTitle("Observation time vs. Zenith Angle;\\Theta [\\circ];T_{on} [s]");
428 hvs2.SetTitle("On-Time vs. Zenith Angle;\\Theta [\\circ];T_{on} [s]");
429 hvstM.SetTitle("MJD vs time;Time;MJD");
430 hvst0.SetTitle("Zenith distance vs time;Time;Zd [\\circ]");
431 hvst1.SetTitle("Camera trigger rate vs time;Time;Rate [Hz]");
432 hvst2.SetTitle("Camera trigger rate vs Zd; Zd [\\circ];Rate [Hz]");
433 hvst.SetTitle("Average sensor compartment temperature;Time;T [\\circ C]");
434 hvsh.SetTitle("Average camera humidity;Time;Hum [%]");
435
436 MFillH fillvs1(&hvs1, "", "FillObsTime");
437 MFillH fillvs2(&hvs2, "", "FillOnTime");
438 MFillH fillvstM(&hvstM, "MTime", "FillMjdVsTime");
439 MFillH fillvst0(&hvst0, "MTimeDrive", "FillZdVsTime");
440 MFillH fillvst1(&hvst1, "MTimeRates", "FillRate");
441 MFillH fillvst2(&hvst2, "", "FillRateVsZd");
442 MFillH fillvst(&hvst, "MTimeTemperatures", "FillCamTemp");
443 MFillH fillvsh(&hvsh, "MTimeHumidity", "FillCamHum");
444 fillvs1.SetNameTab("ObsTime");
445 fillvs2.SetNameTab("OnTime");
446 fillvst1.SetNameTab("Rate");
447 fillvst2.SetNameTab("RateZd");
448 fillvst.SetNameTab("CamTemp");
449 fillvsh.SetNameTab("CamHum");
450
451 hvs1.SetWeight("MReportRates.fElapsedTime");
452 hvs2.SetWeight("MReportRates.fElapsedOnTime");
453
454 hvst1.SetMinimum(0);
455 hvst2.SetDrawOption("colz");
456
457 MH3 hrate("MRawRunHeader.GetFileID"/*, "MRawEvtHeader.GetTriggerID"*/);
458 hrate.SetWeight("1./TMath::Max(MRawRunHeader.GetRunLength,1)");
459 hrate.SetName("RateVsRun");
460 hrate.SetTitle("Event rate after quality cuts;File Id;Event Rate [Hz];");
461 hrate.InitLabels(MH3::kLabelsX);
462 hrate.GetHist().SetMinimum(0);
463
464 MFillH fillr(&hrate, "", "FillRateVsRun");
465 tlist.AddToListAfter(&fillr, &contq, "Events");
466
467 tlist.Replace(&fill1b);
468
469 tlist2.Replace(&fill2b);
470 tlist2.Replace(&fill3b);
471 tlist2.Replace(&fill3d);
472 tlist2.Replace(&fill4b);
473 tlist2.Replace(&fill5b);
474 tlist2.Replace(&fill6b);
475 tlist2.Replace(&fill7b);
476 tlist2.Replace(&falpha2);
477 tlist2.Replace(&fenergy2);
478 if (!ismc)
479 {
480 tlist.AddToList(&fillvs1, "Rates");
481 tlist.AddToList(&fillvs2, "Rates");
482 tlist.AddToList(&fillvst1, "Rates");
483 tlist.AddToList(&fillvst2, "Rates");
484 tlist.AddToList(&write2, "Rates");
485 tlist.AddToList(&fillvst, "Temperatures");
486 tlist.AddToList(&fillvsh, "Humidity");
487 tlist.AddToList(&fillvst0, "Drive");
488 tlist.AddToList(&fillvstM, "Drive");
489 }
490
491 // by setting it here it is distributed to all consecutive tasks
492 tlist.SetAccelerator(MTask::kAccDontReset|MTask::kAccDontTime);
493
494 par.SetVal(1);
495 weight.SetVal(1);
496
497 // Execute first analysis
498 if (!evtloop.Eventloop())
499 return 2;
500
501 if (!evtloop.GetDisplay())
502 return 2;
503
504 delete readondata;
505 delete readoffdata;
506
507 TObjArray cont;
508 //cont.Add(const_cast<TEnv*>(GetEnv()));
509 //cont.Add(const_cast<MSequence*>(&fSequence));
510
511 //TNamed cmdline("CommandLine", fCommandLine.Data());
512 //cont.Add(&cmdline);
513
514 if (d)
515 {
516 TString title = "-- Analysis #";
517 title += dataset;
518 title += " --";
519 d->SetTitle(title, kFALSE);
520
521 cont.Add(d);
522 TString path;
523 path += fname1;
524
525 d->Write();
526 }
527
528// if (!WriteContainer(cont, fname1, "RECREATE"))
529// return;
530
531 return 0;
532}
Note: See TracBrowser for help on using the repository browser.