Index: trunk/MagicSoft/Mars/Changelog
===================================================================
--- trunk/MagicSoft/Mars/Changelog	(revision 5988)
+++ trunk/MagicSoft/Mars/Changelog	(revision 5989)
@@ -20,4 +20,11 @@
 
                                                  -*-*- END OF LINE -*-*-
+
+ 2005/01/25 Abelardo Moralejo
+
+   * macros/starmc2.C
+     - modified to allow double (train / test) output, for g/h 
+       separation studies. Added several missing containers to output.
+
 
  2005/01/25 Thomas Bretz
Index: trunk/MagicSoft/Mars/macros/starmc2.C
===================================================================
--- trunk/MagicSoft/Mars/macros/starmc2.C	(revision 5988)
+++ trunk/MagicSoft/Mars/macros/starmc2.C	(revision 5989)
@@ -38,8 +38,18 @@
 void starmc2()
 {
-  Char_t* AnalysisFilename = "calibrated_data.root"; // File to be analyzed
-  Char_t* OutFilename      = "star.root";        // Output file name
+  Char_t* AnalysisFilename = "calibrated_protons.root"; // File to be analyzed
 
-  Float_t CleanLev[2] = {4., 3.}; // Tail cuts for image analysis
+  TString* OutFilename1;
+  TString* OutFilename2;
+
+  // Change output file names as desired. If you want only one output, comment
+  // out the initialization of OutFilename2:
+//   OutFilename1 = new TString("star_train.root");   // Output file name 1 (test)
+//   OutFilename2 = new TString("star_test.root");    // Output file name 2 (train)
+
+   OutFilename1 = new TString("star.root");   // Output file name 1 (test)
+
+
+  Float_t CleanLev[2] = {3., 2.}; // Tail cuts for image analysis
 
   // ------------------------------------------------------------------
@@ -80,18 +90,70 @@
 
   //
-  // Open output file:
+  // Open output file(s):
   //
-  MWriteRootFile write(OutFilename); // Writes output
-  write.AddContainer("MRawRunHeader", "RunHeaders");
-  write.AddContainer("MMcRunHeader",  "RunHeaders", kFALSE);
-  write.AddContainer("MSrcPosCam",    "RunHeaders");
-  write.AddContainer("MMcEvt",        "Events", kFALSE);
-  write.AddContainer("MPointingPos",  "Events", kFALSE);
-  write.AddContainer("MHillas",       "Events");
-  write.AddContainer("MHillasExt",    "Events");
-  write.AddContainer("MHillasSrc",    "Events");
-  write.AddContainer("MNewImagePar",  "Events");
+  MWriteRootFile write1(OutFilename1->Data()); // Writes output   
+  //
+  // Add MC containers only if they exist. In this way you can also run on real calibrated data.
+  //
+  write1.AddContainer("MRawRunHeader", "RunHeaders");
+  write1.AddContainer("MMcRunHeader",  "RunHeaders", kFALSE); 
+  write1.AddContainer("MSrcPosCam",    "RunHeaders");
+  write1.AddContainer("MGeomCam",      "RunHeaders", kFALSE);
+  write1.AddContainer("MMcConfigRunHeader",  "RunHeaders", kFALSE);
+  write1.AddContainer("MMcCorsikaRunHeader", "RunHeaders", kFALSE);
+  write1.AddContainer("MMcFadcHeader",  "RunHeaders", kFALSE);
+  write1.AddContainer("MMcTrigHeader",  "RunHeaders", kFALSE);
 
-  tlist.AddToList(&write);            // Add task to write output.
+  write1.AddContainer("MMcEvt",        "Events", kFALSE);
+  write1.AddContainer("MPointingPos",  "Events", kFALSE);
+  write1.AddContainer("MMcTrig",       "Events", kFALSE);
+  write1.AddContainer("MRawEvtHeader", "Events");
+  write1.AddContainer("MHillas",       "Events");
+  write1.AddContainer("MHillasExt",    "Events");
+  write1.AddContainer("MHillasSrc",    "Events");
+  write1.AddContainer("MNewImagePar",  "Events");
+
+  if (OutFilename2) // Second output file, in case we want a split output
+    {
+      MWriteRootFile write2(OutFilename2->Data()); // Writes output
+      write2.AddContainer("MRawRunHeader", "RunHeaders");
+      write2.AddContainer("MMcRunHeader",  "RunHeaders", kFALSE);
+      write2.AddContainer("MSrcPosCam",    "RunHeaders");
+      write2.AddContainer("MGeomCam",      "RunHeaders", kFALSE);
+      write2.AddContainer("MMcConfigRunHeader",  "RunHeaders", kFALSE);
+      write2.AddContainer("MMcCorsikaRunHeader", "RunHeaders", kFALSE);
+      write2.AddContainer("MMcFadcHeader",  "RunHeaders", kFALSE);
+      write2.AddContainer("MMcTrigHeader",  "RunHeaders", kFALSE);
+
+      write2.AddContainer("MMcEvt",        "Events", kFALSE);
+      write2.AddContainer("MPointingPos",  "Events", kFALSE);
+      write2.AddContainer("MMcTrig",       "Events", kFALSE);
+      write2.AddContainer("MRawEvtHeader", "Events");
+      write2.AddContainer("MHillas",       "Events");
+      write2.AddContainer("MHillasExt",    "Events");
+      write2.AddContainer("MHillasSrc",    "Events");
+      write2.AddContainer("MNewImagePar",  "Events");
+
+      //
+      // Divide output in train and test samples, using the event number
+      // (odd/even) to achieve otherwise unbiased event samples:
+      //
+      
+      MF filter1("{MMcEvt.fEvtNumber%2}>0.5");
+      MF filter2("{MMcEvt.fEvtNumber%2}<0.5");
+
+      write1.SetFilter(&filter1);
+      write2.SetFilter(&filter2);
+
+      tlist.AddToList(&filter1);
+      tlist.AddToList(&filter2);
+    }
+
+
+  tlist.AddToList(&write1);
+
+  if (OutFilename2)
+    tlist.AddToList(&write2);   
+  
 
   //
