| /belle2/masterclass/index.php |
|---|
| 12,6 → 12,21 |
| <script src="js/belle2_gen.js"></script> |
| <script src="js/workspace.js"></script> |
| <script src="js/FileSaver.min.js"></script> |
| <style> |
| table { |
| border-collapse: collapse; |
| width: 100%; |
| } |
| th, td { |
| padding: 0px; |
| text-align: right; |
| } |
| tr:hover{background-color:#ffffff} |
| </style> |
| <script src="js/Blob.js"></script> |
| /belle2/masterclass/js/belle2_def.js |
|---|
| 11,6 → 11,9 |
| .setAlign(Blockly.ALIGN_RIGHT) |
| .appendField("2. Particle"); |
| this.appendDummyInput() |
| .appendField("Same particle lists?") |
| .appendField(new Blockly.FieldDropdown([["No", "0"], ["Yes", "1"]]), "sameparticles"); |
| this.appendDummyInput() |
| .appendField("New Particle") |
| .appendField(new Blockly.FieldDropdown([["electron", "ELECTRON"], ["muon", "MUON"], ["pion", "PION"], ["kaon", "KAON"], ["proton", "PROTON"], ["photon", "PHOTON"], ["Ks", "KS"], ["D", "D"], ["D*", "DSTAR"], ["J/Psi", "JPSI"]]), "simplepid"); |
| this.appendDummyInput() |
| 27,7 → 30,7 |
| this.setInputsInline(false); |
| this.setOutput(true, "particle list"); |
| this.setColour(120); |
| this.setTooltip(''); |
| this.setTooltip('Combine two particles in the new particle by making combinations between particles in two input lists'); |
| this.setHelpUrl('http://www.example.com/'); |
| } |
| }; |
| 51,7 → 54,7 |
| this.setInputsInline(false); |
| this.setOutput(true, "particle list"); |
| this.setColour(65); |
| this.setTooltip(''); |
| this.setTooltip('Create a new list of particles based on the original particle list or any input particle list'); |
| this.setHelpUrl('http://www.example.com/'); |
| } |
| }; |
| 82,7 → 85,7 |
| this.setInputsInline(true); |
| this.setOutput(true, "histogram"); |
| this.setColour(20); |
| this.setTooltip(''); |
| this.setTooltip('This block handles the histogram creation and filling. Define a number of bins, minimum and maximum of the range and assign a variable to plot'); |
| this.setHelpUrl('http://www.example.com/'); |
| } |
| }; |
| 95,13 → 98,19 |
| .appendField("Number of events: ") |
| .appendField(new Blockly.FieldNumber(5000, 0), "neve"); |
| this.appendDummyInput() |
| .appendField("First event: ") |
| .appendField(new Blockly.FieldNumber(0, 0), "first"); |
| this.appendDummyInput() |
| .appendField("Data Source") |
| .appendField(new Blockly.FieldDropdown([["hadron-1", "1"], ["hadron-2", "2"]]), "datasource"); |
| this.appendDummyInput() |
| .appendField("Print particle list?") |
| .appendField(new Blockly.FieldDropdown([["No", "0"], ["Yes", "1"]]), "print"); |
| this.appendValueInput("list") |
| .setCheck("particle list") |
| .appendField("Particle List"); |
| this.setColour(230); |
| this.setTooltip(''); |
| this.setTooltip('Run the analysis, specify data source, number of events, first event and a list of particles to process.'); |
| this.setHelpUrl('http://www.example.com/'); |
| } |
| }; |
| 130,7 → 139,7 |
| this.setInputsInline(true); |
| this.setOutput(true, "particle list"); |
| this.setColour(180); |
| this.setTooltip(''); |
| this.setTooltip('Create a list of primary particles, if not used, the primary particles are used in the empty particle list connectors'); |
| this.setHelpUrl('http://www.example.com/'); |
| } |
| }; |
| /belle2/masterclass/js/belle2_gen.js |
|---|
| 4,12 → 4,13 |
| var value_list2 = Blockly.JavaScript.valueToCode(block, 'list2', Blockly.JavaScript.ORDER_ATOMIC); |
| if (value_list2.length==0) value_list2='""'; |
| var dropdown_simplepid = block.getFieldValue('simplepid'); |
| var dropdown_sameparticles = block.getFieldValue('sameparticles'); |
| var number_mass0 = block.getFieldValue('mass0'); |
| var number_mass1 = block.getFieldValue('mass1'); |
| var value_histogram = Blockly.JavaScript.valueToCode(block, 'histogram', Blockly.JavaScript.ORDER_ATOMIC); |
| if (value_histogram.length==0) value_histogram='""'; |
| // TODO: Assemble JavaScript into code variable. |
| var code = '{"combiner":{"list1":' + value_list1 + ',"list2":' + value_list2 + ',"pid":"' + dropdown_simplepid + '","m0":"' + number_mass0 + '","m1":"' + number_mass1 + '","histogram":' + value_histogram + '}}\n'; |
| var code = '{"combiner":{"list1":' + value_list1 + ',"list2":' + value_list2 + ',"sameparticles":"'+ dropdown_sameparticles +'","pid":"' + dropdown_simplepid + '","m0":"' + number_mass0 + '","m1":"' + number_mass1 + '","histogram":' + value_histogram + '}}\n'; |
| // TODO: Change ORDER_NONE to the correct strength. |
| return [code, Blockly.JavaScript.ORDER_NONE]; |
| }; |
| 42,11 → 43,14 |
| Blockly.JavaScript['simple_analysis'] = function(block) { |
| var number_neve = block.getFieldValue('neve'); |
| var number_first= block.getFieldValue('first'); |
| var number_print= block.getFieldValue('print'); |
| var dropdown_datasource = block.getFieldValue('datasource'); |
| var value_list = Blockly.JavaScript.valueToCode(block, 'list', Blockly.JavaScript.ORDER_ATOMIC); |
| if (value_list.length==0) value_list='""'; |
| // TODO: Assemble JavaScript into code variable. |
| var code = '{"analysis":{"neve":"' + number_neve + '","datasource":"' + dropdown_datasource + '","list":' + value_list + '}}\n'; |
| var code = '{"analysis":{"neve":"' + number_neve + '","first":"' + number_first + '","print":"' + number_print + '","datasource":"' + dropdown_datasource + '","list":' + value_list + '}}\n'; |
| return code; |
| }; |
| 66,4 → 70,4 |
| var code = '{"primary":' + '{"histogram":' + value_histogram + '}}\n'; |
| // TODO: Change ORDER_NONE to the correct strength. |
| return [code, Blockly.JavaScript.ORDER_NONE]; |
| }; |
| }; |
| /belle2/masterclass/js/belle2_gen_mod.js |
|---|
| 52,10 → 52,11 |
| Blockly.JavaScript['simple_analysis'] = function(block) { |
| var number_neve = block.getFieldValue('neve'); |
| var number_first = block.getFieldValue('first'); |
| var dropdown_datasource = block.getFieldValue('datasource'); |
| var value_list = Blockly.JavaScript.valueToCode(block, 'list', Blockly.JavaScript.ORDER_ATOMIC); |
| // TODO: Assemble JavaScript into code variable. |
| var code = 'simple_analysis(' + ' neve ' + number_neve + ' datasource ' + dropdown_datasource + ' list ' + value_list + ')\n'; |
| var code = 'simple_analysis(' + ' neve ' + number_neve ' + ' first ' + number_first + ' datasource ' + dropdown_datasource + ' list ' + value_list + ')\n'; |
| //var code = '...'; |
| return code; |
| }; |
| 75,4 → 76,4 |
| //var code = '...'; |
| // TODO: Change ORDER_NONE to the correct strength. |
| return [code, Blockly.JavaScript.ORDER_NONE]; |
| }; |
| }; |
| /belle2/masterclass/runscript.php |
|---|
| 178,6 → 178,8 |
| $data = json_decode($code, true); |
| $neve = $data['analysis']['neve']; |
| $first = $data['analysis']['first']; |
| $evprint = $data['analysis']['print']; |
| $source= $data['analysis']['datasource']; |
| $xml = '<?xml version="1.0" encoding="utf-8"?>' . xmlWalker($data,'start'); |
| 197,6 → 199,10 |
| $el = $dom->getElementsByTagName('neve')->item(0); |
| $fstart->appendChild($el); |
| $el = $dom->getElementsByTagName('first')->item(0); |
| $fstart->appendChild($el); |
| $el = $dom->getElementsByTagName('print')->item(0); |
| $fstart->appendChild($el); |
| $el = $dom->getElementsByTagName('datasource')->item(0); |
| $fstart->appendChild($el); |
| 255,7 → 261,9 |
| $nodelist = $fstart->getElementsByTagName('h1d'); |
| $init = PHP_EOL . "void Blab2::Init(){" . PHP_EOL ; |
| $init .="fNeve=$neve;" . PHP_EOL ; |
| $init .="fNfirst=$first;" . PHP_EOL ; |
| $init .="fData=$source;" . PHP_EOL ; |
| $init .="fPrint=$evprint;" . PHP_EOL ; |
| foreach ($nodelist as $node) { |
| $init .= $node->nodeName . "("; |
| $cnt=0; |
| /belle2/masterclass/src/BParticle.cc |
|---|
| 67,7 → 67,7 |
| return nprt; |
| } |
| int CombineParticles(TClonesArray *plist1 ,TClonesArray *plist2 , float masslow, float massup, SIMPLEPID pid, TClonesArray *pout){ |
| int CombineParticles(TClonesArray *plist1 ,TClonesArray *plist2 , int same, float masslow, float massup, SIMPLEPID pid, TClonesArray *pout){ |
| // Loop over all the particles in both lists. |
| pout->Clear(); |
| int nprt=0; |
| 74,7 → 74,7 |
| for(TIter next1(plist1);BParticle * p1 =(BParticle *) next1();) { |
| // the second loop |
| for(TIter next2(plist2); BParticle * p2 =(BParticle *) next2();) { |
| for( TIter next2 = (plist1!=plist2 && same==0) ? TIter(plist2): TIter(next1) ; BParticle * p2 =(BParticle *) next2();) { |
| BParticle p = *p1 + *p2; // Combine two particles into a new particle |
| if (p.InMassRange(masslow, massup)){ |
| p.SetPid(pid); |
| /belle2/masterclass/src/BParticle.h |
|---|
| 73,7 → 73,7 |
| }; |
| int SelectParticles(TClonesArray *pin , int charge, SIMPLEPID type, TClonesArray *pout); |
| int CombineParticles(TClonesArray *plist1 ,TClonesArray *plist2 , float masslow, float massup, SIMPLEPID pid, TClonesArray *pout); |
| int CombineParticles(TClonesArray *plist1 ,TClonesArray *plist2 , int same, float masslow, float massup, SIMPLEPID pid, TClonesArray *pout); |
| #endif |
| /belle2/masterclass/src/Blab2.cc |
|---|
| 23,6 → 23,7 |
| public: |
| UInt_t fNeve; |
| UInt_t fNfirst; |
| UInt_t fPrint; |
| int fData; |
| TH1F *fH[100]; |
| UInt_t fHtype[100]; |
| 35,7 → 36,7 |
| void Process(); |
| void h1d(const char *varname, const char *name, int nbins, double min, double max, int id ); |
| int selector(int pin, int charge, SIMPLEPID particlename, int hid, int pout ); |
| int combiner(int id0 ,int id1 , SIMPLEPID particlename, double min, double max, int hid, int id ); |
| int combiner(int id0 ,int id1 , int same, SIMPLEPID particlename, double min, double max, int hid, int id ); |
| int fix_mass(int id); |
| int Fill(int hid, BParticle *p); |
| void plist(int i); |
| 46,7 → 47,7 |
| ClassImp(Blab2) |
| Blab2::Blab2():fNfirst(0), fNeve(0), fData(0){ |
| Blab2::Blab2():fNfirst(0), fNeve(0), fData(0), fPrint(0) { |
| Process(); |
| }; |
| 78,7 → 79,7 |
| return 0; |
| } |
| int Blab2::combiner(int _p0, int _p1,SIMPLEPID pid, double min, double max, int hid, int _p2 ){ |
| int Blab2::combiner(int _p0, int _p1,int same, SIMPLEPID pid, double min, double max, int hid, int _p2 ){ |
| // Loop over all the particles in both lists. |
| if (_p0 < 0 ) _p0 =0; |
| if (_p1 < 0 ) _p1 =0; |
| 89,13 → 90,12 |
| for(TIter next1(fList[_p0]);BParticle * p1 =(BParticle *) next1();) { |
| // the second loop |
| for(TIter next2 = (_p0!=_p1) ? TIter(fList[_p1]): TIter(next1) ; BParticle * p2 =(BParticle *) next2();) { |
| if (p1==p2) continue; |
| // in the case the second parti |
| for(TIter next2 = (_p0!=_p1 && same==0) ? TIter(fList[_p1]): TIter(next1) ; BParticle * p2 =(BParticle *) next2();) { |
| if (p1==p2) continue; // do not use the same particle in the combinations |
| BParticle p = *p1 + *p2; // Combine two particles into a new particle |
| if (p.InMassRange(min, max)){ |
| //SIMPLEPID pid = PION; // should be set to particlename |
| p.SetPid(pid); |
| p.SetPid(pid); // set PID to particlename to fix the particle mass |
| TClonesArray& list = *fList[_p2]; |
| new (list[nprt++]) BParticle ( p ); // create a new entry in kslist list of particles |
| Fill(hid, &p); |
| 152,6 → 152,7 |
| void Blab2::Process(){ |
| char sList[0xFFFF]; |
| for (int i=0;i<100;i++) fH[i]=NULL; |
| for (int i=0;i<100;i++) fHtype[i]=0; |
| for (int i=0;i<100;i++) fList[i]=NULL; |
| 165,14 → 166,14 |
| TBranch * branch = t-> GetBranch( "BEvent"); // Obtain a branch for "BEvent" in the tree |
| branch-> SetAddress(&mevent); // Register created "BEvent" object to the branch |
| TH1F *fHnprt= new TH1F("h100", "Number of particles in the event;N particles;N events", 50, -0.5, 49.5); |
| TH1F *fHid= new TH1F("h101", "Particle type;ID;N particles", 6, -0, 6); |
| const char *names[6]={"PHOTON", "ELECTRON", "PION", "MUON", "KAON", "PROTON"}; |
| TH1F *fHid= new TH1F("h101", "Particle types;ID;N particles", 6, -0, 6); |
| const char *names[12]={"PHOTON", "ELECTRON", "PION", "MUON", "KAON", "PROTON", "JPSI", "D", "DSTAR", "B","KS", "ALL" }; |
| for (int i=1;i<=6;i++) fHid->GetXaxis()->SetBinLabel(i,names[i-1]); |
| send_message(0, TString::Format("Number of Entries in the file %lld\n", t->GetEntries() ),0); |
| send_message(0, TString::Format("<br>Number of Events in the file %lld<br>\n", t->GetEntries() ),0); |
| TStopwatch timer; |
| timer.Start(); |
| int nev = 0; |
| int i =TMath::Min(fNfirst, (UInt_t) t-> GetEntries()); |
| int cNeve=TMath::Min(fNfirst+fNeve, (UInt_t) t-> GetEntries()); |
| while (i<cNeve){ |
| 181,15 → 182,23 |
| event(); |
| if (i%10000==0) send_message(2, TString::Format("Event %d\n",i), (100*i)/cNeve); |
| int progress = (100*i)/cNeve; |
| if (i%10000==0) send_message(2, TString::Format("Event %d\n",i), progress); |
| int nprt=0; |
| if (nev>100) fPrint = 0; // disable particle prints for huge numer of events |
| if (fPrint) sprintf(sList,"Primary particle list for Event %d<br/><table class='plist' ><tr><th>N<th>px(GeV/c)<th>py(GeV/c)<th>pz(GeV/c)<th>p(GeV/c)<th>Energy(GeV)<th>Charge<th>ID<th></tr>", i); |
| for(TIter next(fList[0]); BParticle * p =(BParticle *) next();) { |
| nprt++; |
| fHid->Fill(p->pid()); |
| if (fPrint) sprintf(sList,"%s<tr><td>%d<td>%g<td>%g<td>%g<td>%g<td>%g<td>%1.0f<td>%s</tr>",sList,nprt, p->px(),p->py(),p->pz(),p->GetMomentum(),p->e(), p->charge(),names[p->pid()] ); |
| } |
| fHnprt->Fill(nprt); |
| if (fPrint) { |
| sprintf(sList,"%s</table>",sList); |
| send_message(0, TString(sList),progress); |
| nev++; |
| } |
| mevent-> Clear(); // Clear the memory. |
| for (int k=0;k<100;k++) if (fList[k]!=0) fList[k]->Clear(); |
| i++; |