]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/QA/tasks/macros/drawTHnSparse.C
fixing compilation warnings
[u/mrichter/AliRoot.git] / HLT / QA / tasks / macros / drawTHnSparse.C
1 // $Id$
2 /*
3  * Drawing macro for reading the THnSparse output of the 
4  * HLT/QA/tasks/AliAnalysisTaskHLTCentralBarrel.cxx task.
5  * 
6  * The cuts are user defined in lines 167-168 as arguments of the 
7  * function cutStsudies(...).
8  * 
9  * The input file contains information about the run number
10  * and date that will appear in the canvas title.
11  * 
12  * The cuts are turned into strings and incorporated in the
13  * name of the output file, which contains canvases with event
14  * and track properties for HLT and offline.
15  *  
16  * Since the run information is available, there will be a new
17  * folder created and the canvas ROOT files will be saved in there.
18  *
19  * The macro should be compiled before running:
20  *
21  * root[0] .L drawTHnSparse.C++
22  * root[1] drawTHnSparse("HLT-OFFLINE-CentralBarrel-comparison.root")
23  *
24  * @ingroup alihlt_qa
25  * @author Kalliopi.Kanaki@ift.uib.no 
26  */
27
28 #if !defined(__CINT__) || defined(__MAKECINT__)
29 #include "TSystem.h"
30 #include "TROOT.h"
31 #include "TFile.h"
32 #include "TString.h"
33 #include "TList.h"
34 #include "THnSparse.h"
35 #include "TCanvas.h"
36 #include "TText.h"
37 #include "TPaveText.h"
38 #include "TPaveStats.h"
39 #include "TH1D.h"
40 #include "TH2D.h"
41 #include "TLegend.h"
42 #include "TStyle.h"
43 #include "TPad.h"
44
45 #include <iostream>
46 //#include <sstream>
47 #include <cstdlib>
48
49 //using std::stringstream;
50 using std::endl;
51 #endif
52
53
54 //---------- forward declerations ---------------//
55
56 TString cutStudies( TCanvas* can1, TCanvas* can2, TCanvas* can3, TString folder,
57                     THnSparse* htrackHLT, THnSparse* htrackOFF, TText* hText,
58                     double minEta,   double maxEta,
59                     int minTrackMult,int maxTrackMult,
60                     double minPt,    double maxPt,
61                     double minDCAr,  double maxDCAr,
62                     double minDCAz,  double maxDCAz,
63                     int minTPCclus,  int maxTPCclus,
64                     int minITSclus,  int maxITSclus,
65                     int vertexStatus
66                   );
67 void printStats(TH1D *hlt, TH1D *off);
68 void defineYaxisMax(TH1D *hlt, TH1D *off);
69 void printLegend(TLegend *l, TH1D *hlt, TH1D *off);
70 void plotAid(TCanvas* can, THnSparse* hHLT, THnSparse* hOFF, TText* hText, TH1D *hlt, TH1D *off, TLegend *l, int size);    
71 void plot2D(TCanvas* can, THnSparse* h,
72             double minEta,    double maxEta,
73             double minPt,     double maxPt,
74             double minDCAr,   double maxDCAr,
75             double minDCAz,   double maxDCAz,
76             int minTPCclus,   int maxTPCclus,
77             int minITSclus,   int maxITSclus, 
78             int minTrackMult, int maxTrackMult
79            );
80 void plotEventQuantities(TCanvas* can, THnSparse* heventHLT, THnSparse* heventOFF, TText* hText);
81 TString fix1DTitle(const char* c);
82 TString fix2DTitle(const char* c1, const char* c2);
83 TString cutsToString( double minEta,    double maxEta,
84                       double minPt,     double maxPt,
85                       double minDCAr,   double maxDCAr,
86                       double minDCAz,   double maxDCAz,
87                       int minTPCclus,   int maxTPCclus,
88                       int minITSclus,   int maxITSclus, 
89                       int minTrackMult, int maxTrackMult,
90                       int VS
91                     );
92 void plotTrackQuantities( TCanvas* can, THnSparse* htrackHLT, THnSparse* htrackOFF, TText* hText,
93                           double minEta,    double maxEta,
94                           double minPt,     double maxPt,
95                           double minDCAr,   double maxDCAr,
96                           double minDCAz,   double maxDCAz,
97                           int minTPCclus,   int maxTPCclus,
98                           int minITSclus,   int maxITSclus, 
99                           int minTrackMult, int maxTrackMult,
100                           int VS
101                         );
102                         
103 vector<TString> outputNames;
104
105 //------------------------------------------------------------------//          
106                         
107 void drawTHnSparse(TString inputFile){
108  
109   gROOT->SetStyle("Plain");
110   gStyle->SetPalette(1);
111   gStyle->SetOptStat(10);
112   TH1::AddDirectory(kFALSE);
113
114   TFile *file = TFile::Open(inputFile);
115   if(!file){
116     printf("Error: No file %s in folder.\n", inputFile.Data());
117     return;
118   }
119
120   TList *list = static_cast<TList*>(file->Get("esd_thnsparse"));
121   if(!list){
122     printf("Error: No List contained in file %s.\n", inputFile.Data());
123     return;
124   }
125
126   THnSparseF *heventHLT = (THnSparseF*)list->FindObject("fEventHLT"); 
127   if(!heventHLT){
128       printf("Error: There is no HLT THnSparse object in file %s\n", inputFile.Data());
129   }
130   THnSparseF *heventOFF = (THnSparseF*)list->FindObject("fEventOFF");  
131   if(!heventOFF){
132       printf("Error: There is no OFF THnSparse object in file %s\n", inputFile.Data());
133   } 
134   THnSparseF *htrackHLT = (THnSparseF*)list->FindObject("fTrackHLT");
135   if(!htrackHLT){
136       printf("Error: No HLT THnSparse object found\n");
137       return;
138   } 
139   THnSparseF *htrackOFF = (THnSparseF*)list->FindObject("fTrackOFF");  
140   if(!htrackOFF){
141       printf("Error: No OFF THnSparse object found\n");
142       return;
143   }
144       
145   TText *hText = (TText*)list->FindObject("text");
146   if(!hText) printf("No hText\n");
147   
148   TString t = "event properties for ";
149   t+=hText->GetTitle();
150   
151   TString folder = hText->GetTitle();
152   folder.ReplaceAll(" ",""); 
153   folder.Remove(0,3);
154   folder.Remove(6,15);
155    
156   gSystem->Exec("mkdir "+folder);
157   
158   TCanvas *can0 = new TCanvas("can0",t,                            900,600); can0->Divide(3,2);  
159   TCanvas *can1 = new TCanvas("can1","track properties",          1100,900); can1->Divide(4,3);
160   TCanvas *can2 = new TCanvas("can2","2-D HLT track correlations",1200,800); can2->Divide(4,2);
161   TCanvas *can3 = new TCanvas("can3","2-D OFF track correlations",1200,800); can3->Divide(4,2);
162
163   plotEventQuantities(can0,heventHLT,heventOFF,hText);
164   can0->SaveAs(folder+"/event_properties.root");
165   can0->SaveAs(folder+"/event_properties.png");
166     
167   TString s = "";                                                       // eta   mult      pt     DCAr    DCAz    TPCclus ITSclus  vertexStatus
168   s = cutStudies(can1, can2, can3, folder, htrackHLT, htrackOFF, hText, -2, 2, 0, 20000, 0, 200, -20, 20, -20, 20,  0, 200, 0, 6, 2); outputNames.push_back(s); 
169   //s = cutStudies(can1, can2, can3, folder, htrackHLT, htrackOFF, hText, -2, 2, 0, 20000, 0, 200, -20, 20, -20, 20,  0, 200, 1, 6, 2); outputNames.push_back(s); 
170   
171   TCanvas *ov = new TCanvas("ov","overlaid histograms of track properties",1100,900);
172   ov->Divide(4,3);
173
174   TCanvas *ca[outputNames.size()]; 
175   TFile   *ff[outputNames.size()]; 
176   TPad    *pad[12]; 
177   TH1D    *g[outputNames.size()];
178   
179   for(int j=1; j<12; j++){ // not 13, last pad is empty (TODO)        
180     for(UInt_t i=0; i<outputNames.size(); i++){  
181            
182         ff[i] = TFile::Open(outputNames[i].Data());   
183         if(!ff[i] || ff[i]->IsZombie()){
184            printf("Non-existent, corrupted or zombie file %s\n", outputNames[i].Data());
185            return;
186         } 
187         ca[i]  = (TCanvas*)ff[i]->GetObjectUnchecked("can1");               
188         if(!ca[i]){
189            printf("Empty canvas in file %s.\n", outputNames[i].Data());
190            continue;
191         }       
192         pad[j] = (TPad*)ca[i]->GetListOfPrimitives()->FindObject(Form("can1_%d",j));            
193         if(!pad[j]){
194            printf("Empty pad in canvas %s.\n", ca[i]->GetName());
195            continue;         
196         }
197         g[i] =(TH1D*)pad[j]->FindObject(Form("fTrackHLT_proj_%d",j-1));
198         if(!g[i]){
199            printf("Empty histogram for i=%d, file %s.\n", i, outputNames[i].Data());
200            continue;
201         }
202         
203         ov->cd(j);      
204         if(i==0) g[i]->Draw();
205         else { 
206           g[i]->SetLineColor(i+1); 
207           defineYaxisMax(g[0], g[i]);
208           g[i]->Draw("sames");
209         }
210         ff[i]->Close();                                  
211     }
212   }  
213   file->Close();  
214 }
215
216 TString cutStudies( TCanvas* can1, TCanvas* can2, TCanvas* can3, TString folder,
217                     THnSparse* htrackHLT, THnSparse* htrackOFF, TText* hText,
218                     double minEta,   double maxEta,
219                     int minTrackMult,int maxTrackMult,
220                     double minPt,    double maxPt,
221                     double minDCAr,  double maxDCAr,
222                     double minDCAz,  double maxDCAz,
223                     int minTPCclus,  int maxTPCclus,
224                     int minITSclus,  int maxITSclus,
225                     int vertexStatus
226                   )
227 {
228   plotTrackQuantities(can1, htrackHLT, htrackOFF, hText, 
229                       minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, vertexStatus);
230   
231   plot2D(can2, htrackHLT, minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult);
232   
233   plot2D(can3, htrackOFF, minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult);
234   
235   TString cuts = cutsToString(minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, 
236                               minITSclus, maxITSclus, minTrackMult, maxTrackMult, vertexStatus);
237
238   can1->SaveAs(folder+"/track_properties_"+cuts+".root");
239   can1->SaveAs(folder+"/track_properties_"+cuts+".png");  
240   can2->SaveAs(folder+"/HLT_2D_track_correlations_"+cuts+".root");
241   can2->SaveAs(folder+"/HLT_2D_track_correlations_"+cuts+".png");
242   can3->SaveAs(folder+"/OFF_2D_track_correlations_"+cuts+".root");
243   can3->SaveAs(folder+"/OFF_2D_track_correlations_"+cuts+".png");
244   
245   return folder+"/track_properties_"+cuts+".root";
246 }
247
248 void printStats(TH1D *hlt, TH1D *off){  
249   gPad->Update();
250   TPaveStats *st1 = (TPaveStats*)hlt->FindObject("stats");
251   st1->SetLineColor(0);
252
253   gPad->Update();
254   TPaveStats *st2 = (TPaveStats*)off->FindObject("stats");
255   st2->SetY2NDC(st1->GetY1NDC()-0.05);
256   st2->SetY1NDC(st2->GetY2NDC()-TMath::Abs(st1->GetY1NDC()-st1->GetY2NDC()));
257   st2->SetLineColor(0);
258   st2->SetTextColor(off->GetLineColor());
259   st2->SetFillStyle(0);
260   st2->Draw();
261 }
262
263 void defineYaxisMax(TH1D *hlt, TH1D *off){ 
264   if(hlt->GetMaximum() > off->GetMaximum()) off->SetMaximum(1.1*hlt->GetMaximum());
265   else hlt->SetMaximum(1.1*off->GetMaximum());
266 }
267
268 void printLegend(TLegend *l, TH1D *hlt, TH1D *off){  
269   l->SetFillColor(10); 
270   l->SetLineColor(10);
271   l->AddEntry(hlt, "HLT", "l");
272   l->AddEntry(off, "OFF", "l");
273   l->Draw("same");
274 }
275
276 //====================== for 1D distributions ===============================//
277
278 void plotAid(TCanvas* can, THnSparse* hHLT, THnSparse* hOFF, TText* /*hText*/, TH1D *hlt, TH1D *off, TLegend *l, int size,
279              double minEta,    double maxEta,
280              double minPt,     double maxPt,
281              double minDCAr,   double maxDCAr,
282              double minDCAz,   double maxDCAz,
283              int minTPCclus,   int maxTPCclus,
284              int minITSclus,   int maxITSclus, 
285              int minTrackMult, int maxTrackMult,
286              int VS
287            )
288 {     
289    hHLT->GetAxis(0)->SetRangeUser(minPt,maxPt);
290    hHLT->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus);
291    hHLT->GetAxis(3)->SetRangeUser(minEta, maxEta);
292    hHLT->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr);
293    hHLT->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz);
294    hHLT->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus);
295    hHLT->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult);
296    if(VS!=2) hHLT->GetAxis(12)->SetRangeUser(VS,VS);
297    
298    hOFF->GetAxis(0)->SetRangeUser(minPt,maxPt);
299    hOFF->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus);
300    hOFF->GetAxis(3)->SetRangeUser(minEta, maxEta);
301    hOFF->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr);
302    hOFF->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz);
303    hOFF->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus);
304    hOFF->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult);
305    if(VS!=2) hOFF->GetAxis(12)->SetRangeUser(VS,VS);
306        
307    for(int i=0; i<size; i++){
308   
309       hlt = hHLT->Projection(i); if(!hlt){ printf("plotAid: empty HLT histogram\n"); continue; }
310       off = hOFF->Projection(i); if(!off){ printf("plotAid: empty OFF histogram\n"); continue; }
311       
312       hlt->SetTitle(fix1DTitle(hHLT->Projection(i)->GetTitle())); 
313    
314       TString s = hlt->GetTitle();      
315       if(s.Contains("p_")){ 
316          s+=" (GeV/c)";
317          hlt->SetXTitle(s);     
318       }
319       else if(s.Contains("theta") || s.Contains("phi")){
320          s+=" (rad)"; 
321          hlt->SetXTitle(s);
322       }
323       else if(s.Contains("DCA")){
324          s+=" (cm)";
325          hlt->SetXTitle(s);
326       }
327         
328       defineYaxisMax(hlt, off);
329       off->SetLineColor(2);
330     
331       can->cd(i+1);
332       hlt->Draw();
333       off->Draw("sames");
334       printStats(hlt, off);
335       
336       if(i==0){
337          printLegend(l,hlt,off);
338          TPaveText *pave = new TPaveText(25,5600,140,36400);
339          pave->SetFillColor(kWhite);
340          pave->SetLineColor(kWhite);
341          pave->SetShadowColor(kWhite);
342          s=""; s+=minEta; s+=" < eta < "; s+=maxEta; pave->AddText(s);
343          s=""; s+=minPt; s+=" < pt (GeV/c) < "; s+=maxPt; pave->AddText(s);
344          s=""; s+=minTrackMult; s+=" < track mult < "; s+=maxTrackMult; pave->AddText(s);
345          s=""; s+=minDCAr; s+=" < DCAr (cm) < "; s+=maxDCAr; pave->AddText(s);
346          s=""; s+=minDCAz; s+=" < DCAz (cm) < "; s+=maxDCAz; pave->AddText(s);
347          s=""; s+=minTPCclus; s+=" < TPC clusters/track < "; s+=maxTPCclus; pave->AddText(s);
348          s=""; s+=minITSclus; s+=" < ITS clusters/track < "; s+=maxITSclus; pave->AddText(s);
349          if(VS!=2) { s=""; s+="vertex status "; s+=VS; pave->AddText(s); }
350          pave->Draw();
351          can->Update();
352       }      
353    } 
354 }
355
356 //====================== for 2D distributions ===============================//
357
358 void plot2D(TCanvas* can, THnSparse* h,
359             double minEta,    double maxEta,
360             double minPt,     double maxPt,
361             double minDCAr,   double maxDCAr,
362             double minDCAz,   double maxDCAz,
363             int minTPCclus,   int maxTPCclus,
364             int minITSclus,   int maxITSclus, 
365             int minTrackMult, int maxTrackMult
366            )
367 {
368   h->GetAxis(0)->SetRangeUser(minPt,maxPt);
369   h->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus);
370   h->GetAxis(3)->SetRangeUser(minEta, maxEta);
371   h->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr);
372   h->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz);
373   h->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus);
374   h->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult);
375   
376   can->cd(1);    
377   TH2D *ht = h->Projection(1,0);
378   ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(0)->GetTitle()));
379
380   TString s = "";
381   s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)";
382   ht->SetXTitle(s);
383   ht->Draw("colz");
384   
385   can->cd(2);
386   ht = h->Projection(1,3);
387   ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(3)->GetTitle()));
388   ht->Draw("colz");
389   
390   can->cd(3);
391   ht = h->Projection(1,5);
392   ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(5)->GetTitle()));
393   s = fix1DTitle(h->Projection(5)->GetTitle())+" (cm)";
394   ht->SetXTitle(s);
395   ht->Draw("colz");
396   
397   can->cd(4);
398   ht = h->Projection(1,6);
399   ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(6)->GetTitle()));
400   s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)";
401   ht->SetXTitle(s);
402   ht->Draw("colz");
403   
404   can->cd(5);
405   ht = h->Projection(6,0);
406   ht->SetTitle(fix2DTitle(h->Projection(6)->GetTitle(), h->Projection(0)->GetTitle()));
407   s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)";
408   ht->SetXTitle(s);
409   s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)";
410   ht->SetYTitle(s);
411   ht->Draw("colz");
412   
413   can->cd(6);
414   ht = h->Projection(6,3);
415   ht->SetTitle(fix2DTitle(h->Projection(6)->GetTitle(), h->Projection(3)->GetTitle()));
416   s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)";
417   ht->SetYTitle(s);
418   ht->Draw("colz");
419   
420   can->cd(7);
421   ht = h->Projection(3,0);
422   ht->SetTitle(fix2DTitle(h->Projection(3)->GetTitle(), h->Projection(0)->GetTitle()));
423   s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)";
424   ht->SetXTitle(s);
425   ht->Draw("colz");
426   
427   can->cd(8);
428   ht = h->Projection(3,4);
429   ht->SetTitle(fix2DTitle(h->Projection(3)->GetTitle(), h->Projection(4)->GetTitle()));
430   s = fix1DTitle(h->Projection(4)->GetTitle())+" (rad)";
431   ht->SetXTitle(s);
432   ht->Draw("colz"); 
433 }
434
435 void plotAid(TCanvas* can, THnSparse* hHLT, THnSparse* hOFF, TText* /*hText*/, TH1D *hlt, TH1D *off, TLegend *l, int size){
436  
437   for(int i=0; i<size; i++){         
438       hlt = hHLT->Projection(i);
439       off = hOFF->Projection(i); 
440       hlt->SetTitle(fix1DTitle(hHLT->Projection(i)->GetTitle()));      
441       TString s = hlt->GetTitle();      
442       if(s.Contains("primary")){ 
443          s+=" (cm)";
444          hlt->SetXTitle(s);     
445       }
446      
447       defineYaxisMax(hlt, off);
448       off->SetLineColor(2);
449      
450       can->cd(i+1);
451       hlt->Draw();
452       off->Draw("sames");
453       printStats(hlt, off);
454       
455       if(i==0) printLegend(l,hlt,off);
456    } 
457 }
458
459 void plotEventQuantities(TCanvas* can, THnSparse* heventHLT, THnSparse* heventOFF, TText* hText){
460
461   TH1D *hlt = NULL;
462   TH1D *off = NULL;
463  
464   TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8);
465  
466   plotAid(can, heventHLT, heventOFF, hText, hlt, off, leg1, 6);  
467   return;
468 }
469
470 void plotTrackQuantities( TCanvas* can, THnSparse* htrackHLT, THnSparse* htrackOFF, TText* hText,
471                           double minEta,    double maxEta,
472                           double minPt,     double maxPt,
473                           double minDCAr,   double maxDCAr,
474                           double minDCAz,   double maxDCAz,
475                           int minTPCclus,   int maxTPCclus,
476                           int minITSclus,   int maxITSclus, 
477                           int minTrackMult, int maxTrackMult,
478                           int VS
479                         )
480 {
481   TH1D *hlt = NULL;
482   TH1D *off = NULL;
483  
484   TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8);
485   plotAid(can, htrackHLT, htrackOFF, hText, hlt, off, leg1, 11, 
486           minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, VS);  
487   return;
488 }
489
490 TString fix1DTitle(const char* c){
491   TString tmp = c;
492   tmp.ReplaceAll("projection ","");
493   return tmp;   
494 }
495
496 TString fix2DTitle(const char* c1, const char* c2){
497   TString tmp = fix1DTitle(c1)+" vs."+fix1DTitle(c2);
498   return tmp;
499 }
500
501 TString cutsToString( double minEta,    double maxEta,
502                       double minPt,     double maxPt,
503                       double minDCAr,   double maxDCAr,
504                       double minDCAz,   double maxDCAz,
505                       int minTPCclus,   int maxTPCclus,
506                       int minITSclus,   int maxITSclus, 
507                       int minTrackMult, int maxTrackMult,
508                       int VS
509                     )
510 {
511   TString cuts = "";
512   char s[300]; sprintf(s, "eta%2g_%2g_Pt%2g_%2g_TM%d_%d_DCAr%2g_%2g_DCAz%2g_%2g_TPCclus%d_%d_ITSclus%d_%d", 
513                            minEta,maxEta,minPt,maxPt,minTrackMult,maxTrackMult,minDCAr,maxDCAr,minDCAz,maxDCAz,minTPCclus,maxTPCclus,minITSclus,maxITSclus);
514   cuts = s; cuts.ReplaceAll(" ","");
515  
516   if(VS!=2){
517     char v[10]; 
518     sprintf(v, "_VS%d",VS);
519     cuts+=v;
520   }
521   return cuts;
522 }